From 6ca547a082eb0e9f077b37c79bbd1b66e0cc925d Mon Sep 17 00:00:00 2001
From: Zach White MILC ObjectsMILC - An Opinionated Batteries Included Framework
def __init__(name, version, author)
+def __init__(name, version, author, logger=None)
Initialize the MILC object.
@@ -836,7 +836,7 @@ add_argumentWrapper to add arguments and track whether they were passed on the command line.
initialize_logging¶
-def initialize_logging()
+def initialize_logging(logger)
Prepare the defaults for the logging infrastructure.
diff --git a/1.6/metadata/index.html b/1.6/metadata/index.html
index 7f42022..9459d38 100644
--- a/1.6/metadata/index.html
+++ b/1.6/metadata/index.html
@@ -452,8 +452,8 @@
-
-
- Environment based setup
+
+ Custom Loggers
@@ -718,8 +718,8 @@
-Environment based setup¶
-Earlier versions of MILC used the environment variables MILC_APP_NAME
, MILC_APP_VERSION
, and MILC_AUTHOR_NAME
to set this information. While this is supported in MILC 1.4.x it will throw a DeprecationWarning
and will be removed in a later version of MILC.
-You can supress this warning by setting the environment variable MILC_IGNORE_DEPRECATED
.
+Custom Loggers¶
+You can also use this to pass in custom loggers.
+from milc import set_metadata
+
+from my_program import custom_logger
+
+set_metadata(logger=custom_logger)
+
+from milc import cli
+
diff --git a/1.6/search/search_index.json b/1.6/search/search_index.json
index 013478c..b0ba807 100644
--- a/1.6/search/search_index.json
+++ b/1.6/search/search_index.json
@@ -1 +1 @@
-{"config":{"indexing":"full","lang":["en"],"min_search_length":3,"prebuild_index":true,"separator":"[\\s\\-\\_]+"},"docs":[{"location":"","text":"MILC - An Opinionated Batteries-Included Python 3 CLI Framework \u00b6 MILC is a framework for writing CLI applications in Python 3.6+. It gives you all the features users expect from a modern CLI tool out of the box: CLI Argument Parsing, with or without subcommands Automatic tab-completion support through argcomplete Configuration file which can be overridden by CLI options ANSI color support- even on Windows- with colorama Logging to stderr and/or a file, with ANSI colors Easy method for printing to stdout with ANSI colors Labelling log output with colored emoji to easily distinguish message types Thread safety More than 60 built-in spinners with the ability to add your own Getting Started \u00b6 Read the tutorial to learn how to use MILC. Reporting Bugs and Requesting Features \u00b6 Please let us know about any bugs and/or feature requests you have: https://github.com/clueboard/milc/issues Short Example \u00b6 from milc import cli @cli . argument ( '-c' , '--comma' , action = 'store_boolean' , arg_only = True , default = True , help = 'comma in output' ) @cli . argument ( '-n' , '--name' , default = 'World' , help = 'Name to greet' ) @cli . entrypoint ( 'My useful CLI tool.' ) def main ( cli ): comma = ',' if cli . args . comma else '' cli . log . info ( 'Hello %s %s !' , comma , cli . config . general . name ) if __name__ == '__main__' : cli . run () Output \u00b6 $ ./hello \u2139 Hello, World! $ ./hello --no-unicode INFO Hello, World! $ ./hello --no-comma \u2139 Hello World! $ ./hello -h usage: hello [-h] [-V] [-v] [--datetime-fmt GENERAL_DATETIME_FMT] [--log-fmt GENERAL_LOG_FMT] [--log-file-fmt GENERAL_LOG_FILE_FMT] [--log-file GENERAL_LOG_FILE] [--color] [--no-color] [--config-file GENERAL_CONFIG_FILE] [--save-config] [-n GENERAL_NAME] [-c] [--no-comma] Greet a user. optional arguments: -h, --help show this help message and exit -V, --version Display the version and exit -v, --verbose Make the logging more verbose --datetime-fmt GENERAL_DATETIME_FMT Format string for datetimes --log-fmt GENERAL_LOG_FMT Format string for printed log output --log-file-fmt GENERAL_LOG_FILE_FMT Format string for log file. --log-file GENERAL_LOG_FILE File to write log messages to --color Enable color in output --no-color Disable color in output --unicode Enable unicode loglevels --no-unicode Disable unicode loglevels --interactive Force interactive mode even when stdout is not a tty. --config-file GENERAL_CONFIG_FILE The config file to read and/or write -n GENERAL_NAME, --name GENERAL_NAME Name to greet -c, --comma Enable comma in output --no-comma Disable comma in output Breaking Changes \u00b6 MILC follows Semantic Versioning . You can see a list of why we made major or minor releases on the Breaking Changes page.","title":"Home"},{"location":"#milc-an-opinionated-batteries-included-python-3-cli-framework","text":"MILC is a framework for writing CLI applications in Python 3.6+. It gives you all the features users expect from a modern CLI tool out of the box: CLI Argument Parsing, with or without subcommands Automatic tab-completion support through argcomplete Configuration file which can be overridden by CLI options ANSI color support- even on Windows- with colorama Logging to stderr and/or a file, with ANSI colors Easy method for printing to stdout with ANSI colors Labelling log output with colored emoji to easily distinguish message types Thread safety More than 60 built-in spinners with the ability to add your own","title":"MILC - An Opinionated Batteries-Included Python 3 CLI Framework"},{"location":"#getting-started","text":"Read the tutorial to learn how to use MILC.","title":"Getting Started"},{"location":"#reporting-bugs-and-requesting-features","text":"Please let us know about any bugs and/or feature requests you have: https://github.com/clueboard/milc/issues","title":"Reporting Bugs and Requesting Features"},{"location":"#short-example","text":"from milc import cli @cli . argument ( '-c' , '--comma' , action = 'store_boolean' , arg_only = True , default = True , help = 'comma in output' ) @cli . argument ( '-n' , '--name' , default = 'World' , help = 'Name to greet' ) @cli . entrypoint ( 'My useful CLI tool.' ) def main ( cli ): comma = ',' if cli . args . comma else '' cli . log . info ( 'Hello %s %s !' , comma , cli . config . general . name ) if __name__ == '__main__' : cli . run ()","title":"Short Example"},{"location":"#output","text":"$ ./hello \u2139 Hello, World! $ ./hello --no-unicode INFO Hello, World! $ ./hello --no-comma \u2139 Hello World! $ ./hello -h usage: hello [-h] [-V] [-v] [--datetime-fmt GENERAL_DATETIME_FMT] [--log-fmt GENERAL_LOG_FMT] [--log-file-fmt GENERAL_LOG_FILE_FMT] [--log-file GENERAL_LOG_FILE] [--color] [--no-color] [--config-file GENERAL_CONFIG_FILE] [--save-config] [-n GENERAL_NAME] [-c] [--no-comma] Greet a user. optional arguments: -h, --help show this help message and exit -V, --version Display the version and exit -v, --verbose Make the logging more verbose --datetime-fmt GENERAL_DATETIME_FMT Format string for datetimes --log-fmt GENERAL_LOG_FMT Format string for printed log output --log-file-fmt GENERAL_LOG_FILE_FMT Format string for log file. --log-file GENERAL_LOG_FILE File to write log messages to --color Enable color in output --no-color Disable color in output --unicode Enable unicode loglevels --no-unicode Disable unicode loglevels --interactive Force interactive mode even when stdout is not a tty. --config-file GENERAL_CONFIG_FILE The config file to read and/or write -n GENERAL_NAME, --name GENERAL_NAME Name to greet -c, --comma Enable comma in output --no-comma Disable comma in output","title":"Output"},{"location":"#breaking-changes","text":"MILC follows Semantic Versioning . You can see a list of why we made major or minor releases on the Breaking Changes page.","title":"Breaking Changes"},{"location":"ANSI/","text":"Working With ANSI In Your Script \u00b6 MILC supports colorizing your output with ANSI colors. You can colorize the text both for log output and when cli.echo() ing directly. Colorizing Log Output \u00b6 If you are using the built-in log facility it couldn't be easier- just add curly-braced delimited color names to your log strings. They will automatically output color or not as appropriate. Colored Log Example \u00b6 cli . log . error ( ' {bg_red}{fg_white} Could not open file %s !' , filename ) Colorizing Printed Output \u00b6 You can use cli.echo() to print strings to stdout in the same way as cli.log . Just add the ANSI token below to your string to colorize your output. Colored Print Example \u00b6 text = ' {bg_blue}{fg_white} |___| \\\\ ___| {style_reset_all} ' \\ ' {bg_red}{fg_white} SHARK ATTACK!' cli . echo ( text ) Available Colors \u00b6 Colors prefixed with 'fg' will affect the foreground (text) color. Colors prefixed with 'bg' will affect the background color. The included milc-color command will show you what the colors look like in your terminal. Color Background Extended Background Foreground Extended Foreground Black {bg_black} {bg_lightblack_ex} {fg_black} {fg_lightblack_ex} Blue {bg_blue} {bg_lightblue_ex} {fg_blue} {fg_lightblue_ex} Cyan {bg_cyan} {bg_lightcyan_ex} {fg_cyan} {fg_lightcyan_ex} Green {bg_green} {bg_lightgreen_ex} {fg_green} {fg_lightgreen_ex} Magenta {bg_magenta} {bg_lightmagenta_ex} {fg_magenta} {fg_lightmagenta_ex} Red {bg_red} {bg_lightred_ex} {fg_red} {fg_lightred_ex} White {bg_white} {bg_lightwhite_ex} {fg_white} {fg_lightwhite_ex} Yellow {bg_yellow} {bg_lightyellow_ex} {fg_yellow} {fg_lightyellow_ex} There are also control sequences that can be used to change the behavior of ANSI output: Control Sequences {style_bright} {style_dim} {style_normal} {style_reset_all} {bg_reset} {fg_reset}","title":"ANSI"},{"location":"ANSI/#working-with-ansi-in-your-script","text":"MILC supports colorizing your output with ANSI colors. You can colorize the text both for log output and when cli.echo() ing directly.","title":"Working With ANSI In Your Script"},{"location":"ANSI/#colorizing-log-output","text":"If you are using the built-in log facility it couldn't be easier- just add curly-braced delimited color names to your log strings. They will automatically output color or not as appropriate.","title":"Colorizing Log Output"},{"location":"ANSI/#colored-log-example","text":"cli . log . error ( ' {bg_red}{fg_white} Could not open file %s !' , filename )","title":"Colored Log Example"},{"location":"ANSI/#colorizing-printed-output","text":"You can use cli.echo() to print strings to stdout in the same way as cli.log . Just add the ANSI token below to your string to colorize your output.","title":"Colorizing Printed Output"},{"location":"ANSI/#colored-print-example","text":"text = ' {bg_blue}{fg_white} |___| \\\\ ___| {style_reset_all} ' \\ ' {bg_red}{fg_white} SHARK ATTACK!' cli . echo ( text )","title":"Colored Print Example"},{"location":"ANSI/#available-colors","text":"Colors prefixed with 'fg' will affect the foreground (text) color. Colors prefixed with 'bg' will affect the background color. The included milc-color command will show you what the colors look like in your terminal. Color Background Extended Background Foreground Extended Foreground Black {bg_black} {bg_lightblack_ex} {fg_black} {fg_lightblack_ex} Blue {bg_blue} {bg_lightblue_ex} {fg_blue} {fg_lightblue_ex} Cyan {bg_cyan} {bg_lightcyan_ex} {fg_cyan} {fg_lightcyan_ex} Green {bg_green} {bg_lightgreen_ex} {fg_green} {fg_lightgreen_ex} Magenta {bg_magenta} {bg_lightmagenta_ex} {fg_magenta} {fg_lightmagenta_ex} Red {bg_red} {bg_lightred_ex} {fg_red} {fg_lightred_ex} White {bg_white} {bg_lightwhite_ex} {fg_white} {fg_lightwhite_ex} Yellow {bg_yellow} {bg_lightyellow_ex} {fg_yellow} {fg_lightyellow_ex} There are also control sequences that can be used to change the behavior of ANSI output: Control Sequences {style_bright} {style_dim} {style_normal} {style_reset_all} {bg_reset} {fg_reset}","title":"Available Colors"},{"location":"api__in_argv/","text":"_in_argv \u00b6","title":"Api in argv"},{"location":"api__in_argv/#_in_argv","text":"","title":"_in_argv"},{"location":"api__sparkline/","text":"_sparkline \u00b6 Display sparklines from a sequence of numbers. is_number \u00b6 def is_number ( i ) Returns true if i is a number. Used to filter non-numbers from a list. sparkline \u00b6 def sparkline ( number_list , * , min_value = None , max_value = None , highlight_low =- inf , highlight_high = inf , highlight_low_color = '' , highlight_high_color = '' , negative_color = ' {fg_red} ' , positive_color = '' , highlight_low_reset = ' {fg_reset} ' , highlight_high_reset = ' {fg_reset} ' , negative_reset = ' {fg_reset} ' , positive_reset = ' {fg_reset} ' ) Display a sparkline from a sequence of numbers. If you wish to exclude extreme values, or you want to limit the set of characters used, you can adjust min_value and max_value to your own values. Values between your actual min/max will exclude datapoints, while values outside your actual min/max will compress your data into fewer sparks. If you want to highlight data that is too low or too high you can use 'highlight_low' and highlight_high to set this. You will also need to set your colors, see below for more details. By default this function will display negative numbers in red and positive numbers in the system default color. You can use negative_color , negative_reset , positive_color , and positive_reset to change this behavior. If you wish to color your sparkline according to other rules it is recommended to generate it without color and then add color yourself. Arguments \u00b6 min_value The lowest value in your sparkline. If not provided it will be determined automatically. max_value The highest value in your sparkline. If not provided it will be determined automatically. highlight_low When a number is less than this value it will be highlighted with `highlight_low_color`. highlight_high When a number is greater than this value it will be highlighted with `highlight_high_color`. highlight_low_color A MILC or ANSI color code to apply to integers greater than highlight_low. highlight_high_color A MILC or ANSI color code to apply to integers greater than highlight_high. negative_color A MILC or ANSI color code to apply to integers less than 0. positive_color A MILC or ANSI color code to apply to integers greater than 0. highlight_low_reset A MILC or ANSI color code to reset the color code applied in `highlight_low_color`. This is usually `{fg_reset}`, `{bg_reset}`, or `{style_reset_all}`. highlight_high_reset A MILC or ANSI color code to reset the color code applied in `highlight_high_color`. This is usually `{fg_reset}`, `{bg_reset}`, or `{style_reset_all}`. negative_reset A MILC or ANSI color code to reset the color code applied in `negative_color`. This is usually `{fg_reset}`, `{bg_reset}`, or `{style_reset_all}`. positive_reset A MILC or ANSI color code to reset the color code applied in `positive_color`. This is usually `{fg_reset}`, `{bg_reset}`, or `{style_reset_all}`.","title":"milc._sparkline"},{"location":"api__sparkline/#_sparkline","text":"Display sparklines from a sequence of numbers.","title":"_sparkline"},{"location":"api__sparkline/#arguments","text":"min_value The lowest value in your sparkline. If not provided it will be determined automatically. max_value The highest value in your sparkline. If not provided it will be determined automatically. highlight_low When a number is less than this value it will be highlighted with `highlight_low_color`. highlight_high When a number is greater than this value it will be highlighted with `highlight_high_color`. highlight_low_color A MILC or ANSI color code to apply to integers greater than highlight_low. highlight_high_color A MILC or ANSI color code to apply to integers greater than highlight_high. negative_color A MILC or ANSI color code to apply to integers less than 0. positive_color A MILC or ANSI color code to apply to integers greater than 0. highlight_low_reset A MILC or ANSI color code to reset the color code applied in `highlight_low_color`. This is usually `{fg_reset}`, `{bg_reset}`, or `{style_reset_all}`. highlight_high_reset A MILC or ANSI color code to reset the color code applied in `highlight_high_color`. This is usually `{fg_reset}`, `{bg_reset}`, or `{style_reset_all}`. negative_reset A MILC or ANSI color code to reset the color code applied in `negative_color`. This is usually `{fg_reset}`, `{bg_reset}`, or `{style_reset_all}`. positive_reset A MILC or ANSI color code to reset the color code applied in `positive_color`. This is usually `{fg_reset}`, `{bg_reset}`, or `{style_reset_all}`.","title":"Arguments"},{"location":"api_ansi/","text":"ansi \u00b6 ANSI color support for MILC. format_ansi \u00b6 def format_ansi ( text ) Return a copy of text with certain strings replaced with ansi. MILCFormatter Objects \u00b6 class MILCFormatter ( logging . Formatter ) Formats log records per the MILC configuration.","title":"milc.ansi"},{"location":"api_ansi/#ansi","text":"ANSI color support for MILC.","title":"ansi"},{"location":"api_ansi/#milcformatter-objects","text":"class MILCFormatter ( logging . Formatter ) Formats log records per the MILC configuration.","title":"MILCFormatter Objects"},{"location":"api_attrdict/","text":"attrdict \u00b6 AttrDict Objects \u00b6 class AttrDict ( object ) A dictionary that can also be accessed by attribute. __getitem__ \u00b6 def __getitem__ ( key ) Returns an item. SparseAttrDict Objects \u00b6 class SparseAttrDict ( AttrDict ) A dictionary that can also be accessed by attribute. This class never raises IndexError, instead it will return None if a key does not yet exist. __getitem__ \u00b6 def __getitem__ ( key ) Returns an item, creating it if it doesn't already exist","title":"milc.attrdict"},{"location":"api_attrdict/#attrdict","text":"","title":"attrdict"},{"location":"api_attrdict/#attrdict-objects","text":"class AttrDict ( object ) A dictionary that can also be accessed by attribute.","title":"AttrDict Objects"},{"location":"api_attrdict/#sparseattrdict-objects","text":"class SparseAttrDict ( AttrDict ) A dictionary that can also be accessed by attribute. This class never raises IndexError, instead it will return None if a key does not yet exist.","title":"SparseAttrDict Objects"},{"location":"api_configuration/","text":"configuration \u00b6 Configuration Objects \u00b6 class Configuration ( AttrDict ) Represents the running configuration. This class never raises IndexError, instead it will return None if a section or option does not yet exist. __getitem__ \u00b6 def __getitem__ ( key ) Returns a config section, creating it if it doesn't exist yet. ConfigurationSection Objects \u00b6 class ConfigurationSection ( Configuration ) __getitem__ \u00b6 def __getitem__ ( key ) Returns a config value, pulling from the user section as a fallback. This is called when the attribute is accessed either via the get method or through [ ] index. __getattr__ \u00b6 def __getattr__ ( key ) Returns the config value from the user section. This is called when the attribute is accessed via dot notation but does not exist. __setattr__ \u00b6 def __setattr__ ( key , value ) Sets dictionary value when an attribute is set. SubparserWrapper Objects \u00b6 class SubparserWrapper ( object ) Wrap subparsers so we can track what options the user passed. completer \u00b6 def completer ( completer ) Add an arpcomplete completer to this subcommand. add_argument \u00b6 def add_argument ( * args , ** kwargs ) Add an argument for this subcommand. This also stores the default for the argument in self.cli.default_arguments . get_argument_strings \u00b6 def get_argument_strings ( arg_parser , * args , ** kwargs ) Takes argparse arguments and returns a list of argument strings or positional names. get_argument_name \u00b6 def get_argument_name ( arg_parser , * args , ** kwargs ) Takes argparse arguments and returns the dest name. handle_store_boolean \u00b6 def handle_store_boolean ( self , * args , ** kwargs ) Does the add_argument for action='store_boolean'.","title":"milc.configuration"},{"location":"api_configuration/#configuration","text":"","title":"configuration"},{"location":"api_configuration/#configuration-objects","text":"class Configuration ( AttrDict ) Represents the running configuration. This class never raises IndexError, instead it will return None if a section or option does not yet exist.","title":"Configuration Objects"},{"location":"api_configuration/#configurationsection-objects","text":"class ConfigurationSection ( Configuration )","title":"ConfigurationSection Objects"},{"location":"api_configuration/#subparserwrapper-objects","text":"class SubparserWrapper ( object ) Wrap subparsers so we can track what options the user passed.","title":"SubparserWrapper Objects"},{"location":"api_emoji/","text":"emoji \u00b6 Emoji used by MILC when outputting logs Log Level Emoji CRITICAL {bg_red}{fg_white}\u00ac_\u00ac ERROR {fg_red}\u2612 WARNING {fg_yellow}\u26a0 INFO {fg_blue}\u2139 DEBUG {fg_cyan}\u2610 NOTSET {style_reset_all}\u00af\\_(o_o)_/\u00af If you'd like to use your own icon for a level instead you can simply redefine it: from milc.emoji import EMOJI_LOGLEVELS EMOJI_LOGLEVELS [ 'INFO' ] = { fg_green } \u2139 '","title":"milc.emoji"},{"location":"api_emoji/#emoji","text":"Emoji used by MILC when outputting logs Log Level Emoji CRITICAL {bg_red}{fg_white}\u00ac_\u00ac ERROR {fg_red}\u2612 WARNING {fg_yellow}\u26a0 INFO {fg_blue}\u2139 DEBUG {fg_cyan}\u2610 NOTSET {style_reset_all}\u00af\\_(o_o)_/\u00af If you'd like to use your own icon for a level instead you can simply redefine it: from milc.emoji import EMOJI_LOGLEVELS EMOJI_LOGLEVELS [ 'INFO' ] = { fg_green } \u2139 '","title":"emoji"},{"location":"api_milc/","text":"milc \u00b6 MILC Objects \u00b6 class MILC ( object ) MILC - An Opinionated Batteries Included Framework __init__ \u00b6 def __init__ ( name , version , author ) Initialize the MILC object. echo \u00b6 def echo ( text , * args , ** kwargs ) Print colorized text to stdout. ANSI color strings (such as {fg_blue}) will be converted into ANSI escape sequences, and the ANSI reset sequence will be added to all strings. If args or *kwargs are passed they will be used to %-format the strings. run \u00b6 def run ( command , capture_output = True , combined_output = False , text = True , ** kwargs ) Run a command using subprocess.run , but using some different defaults. Unlike subprocess.run you must supply a sequence of arguments. You can use shlex.split() to build this from a string. The **kwargs arguments get passed directly to subprocess.run . Arguments : command A sequence where the first item is the command to run, and any remaining items are arguments to pass. capture_output Set to False to have output written to the terminal instead of being available in the returned subprocess.CompletedProcess instance. combined_output When true STDERR will be written to STDOUT. Equivalent to the shell construct 2>&1 . text Set to False to disable encoding and get bytes() from .stdout and .stderr . initialize_argparse \u00b6 def initialize_argparse () Prepare to process arguments from sys.argv. print_help \u00b6 def print_help ( * args , ** kwargs ) Print a help message for the main program or subcommand, depending on context. print_usage \u00b6 def print_usage ( * args , ** kwargs ) Print brief description of how the main program or subcommand is invoked, depending on context. log_deprecated_warning \u00b6 def log_deprecated_warning ( item_type , name , reason ) Logs a warning with a custom message if a argument or command is deprecated. add_argument \u00b6 def add_argument ( * args , ** kwargs ) Wrapper to add arguments and track whether they were passed on the command line. initialize_logging \u00b6 def initialize_logging () Prepare the defaults for the logging infrastructure. acquire_lock \u00b6 def acquire_lock ( blocking = True ) Acquire the MILC lock for exclusive access to properties. release_lock \u00b6 def release_lock () Release the MILC lock. find_config_file \u00b6 @lru_cache ( maxsize = None ) def find_config_file () Locate the config file. argument \u00b6 def argument ( * args , ** kwargs ) Decorator to call self.add_argument or self. .add_argument. parse_args \u00b6 def parse_args () Parse the CLI args. read_config_file \u00b6 def read_config_file () Read in the configuration file and return Configuration objects for it and the config_source. initialize_config \u00b6 def initialize_config () Read in the configuration file and store it in self.config. merge_args_into_config \u00b6 def merge_args_into_config () Merge CLI arguments into self.config to create the runtime configuration. write_config_option \u00b6 def write_config_option ( section , option ) Save a single config option to the config file. save_config \u00b6 def save_config () Save the current configuration to the config file. __call__ \u00b6 def __call__ () Execute the entrypoint function. entrypoint \u00b6 def entrypoint ( description , deprecated = None ) Decorator that marks the entrypoint used when a subcommand is not supplied. Arguments : description A one-line description to display in --help deprecated Deprecation message. When set the subcommand will marked as deprecated and this message will be displayed in the help output. add_subcommand \u00b6 def add_subcommand ( handler , description , hidden = False , deprecated = None , ** kwargs ) Register a subcommand. Arguments : handler The function to exececute for this subcommand. description A one-line description to display in --help hidden When True don't display this command in --help deprecated Deprecation message. When set the subcommand will be marked as deprecated and this message will be displayed in help output. subcommand \u00b6 def subcommand ( description , hidden = False , ** kwargs ) Decorator to register a subcommand. Arguments : description A one-line description to display in --help hidden When True don't display this command in --help setup_logging \u00b6 def setup_logging () Called by enter () to setup the logging configuration. is_spinner \u00b6 def is_spinner ( name ) Returns true if name is a valid spinner. add_spinner \u00b6 def add_spinner ( name , spinner ) Adds a new spinner to the list of spinners. A spinner is a dictionary with two keys: interval An integer that sets how long (in ms) to wait between frames. frames A list of frames for this spinner spinner \u00b6 def spinner ( text , * args , spinner = None , animation = 'ellipsed' , placement = 'left' , color = 'blue' , interval =- 1 , stream = sys . stdout , enabled = True , ** kwargs ) Create a spinner object for showing activity to the user. This uses halo https://github.com/ManrajGrover/halo behind the scenes, most of the arguments map to Halo objects 1:1. There are 3 basic ways to use this: Instantiating a spinner and then using .start() and .stop() on your object. Using a context manager ( with cli.spinner(...): ) Decorate a function ( @cli.spinner(...) ) Instantiating a spinner \u00b6 spinner = cli . spinner ( text = 'Loading' , spinner = 'dots' ) spinner . start () # Do something here spinner . stop () Using a context manager \u00b6 with cli . spinner ( text = 'Loading' , spinner = 'dots' ): # Do something here Decorate a function \u00b6 @cli . spinner ( text = 'Loading' , spinner = 'dots' ) def long_running_function (): # Do something here Arguments \u00b6 text The text to display next to the spinner. ANSI color strings (such as {fg_blue}) will be converted into ANSI escape sequences, and the ANSI reset sequence will be added to the end of the string. If *args or **kwargs are passed they will be used to %-format the text. spinner The name of the spinner to use. Available names are here: animation The animation to apply to the text if it doesn't fit the terminal. One of `ellipsed`, `bounce`, `marquee`. placement Which side of the text to display the spinner on. One of `left`, `right`. color Color of the spinner. One of `blue`, `grey`, `red`, `green`, `yellow`, `magenta`, `cyan`, `white` interval How long in ms to wait between frames. Defaults to the spinner interval (recommended.) stream Stream to write the output. Defaults to sys.stdout. enabled Enable or disable the spinner. Defaults to `True`.","title":"milc.milc"},{"location":"api_milc/#milc","text":"","title":"milc"},{"location":"api_milc/#milc-objects","text":"class MILC ( object ) MILC - An Opinionated Batteries Included Framework","title":"MILC Objects"},{"location":"api_milc/#arguments","text":"text The text to display next to the spinner. ANSI color strings (such as {fg_blue}) will be converted into ANSI escape sequences, and the ANSI reset sequence will be added to the end of the string. If *args or **kwargs are passed they will be used to %-format the text. spinner The name of the spinner to use. Available names are here: animation The animation to apply to the text if it doesn't fit the terminal. One of `ellipsed`, `bounce`, `marquee`. placement Which side of the text to display the spinner on. One of `left`, `right`. color Color of the spinner. One of `blue`, `grey`, `red`, `green`, `yellow`, `magenta`, `cyan`, `white` interval How long in ms to wait between frames. Defaults to the spinner interval (recommended.) stream Stream to write the output. Defaults to sys.stdout. enabled Enable or disable the spinner. Defaults to `True`.","title":"Arguments"},{"location":"api_questions/","text":"questions \u00b6 Sometimes you need to ask the user a question. MILC provides basic functions for collecting and validating user input. You can find these in the milc.questions module. yesno \u00b6 def yesno ( prompt , * args , default = None , ** kwargs ) Displays prompt to the user and gets a yes or no response. Returns True for a yes and False for a no. Argument Description prompt The prompt to present to the user. Can include ANSI and format strings like milc's cli.echo() . default Whether to default to a Yes or No when the user presses enter. None- force the user to enter Y or N True- Default to yes False- Default to no If you add --yes and --no arguments to your program the user can answer questions by passing command line flags. @cli . argument ( '-y' , '--yes' , action = 'store_true' , arg_only = True , help = 'Answer yes to all questions.' ) @cli . argument ( '-n' , '--no' , action = 'store_true' , arg_only = True , help = 'Answer no to all questions.' ) password \u00b6 def password ( prompt = 'Enter password:' , * args , confirm = False , confirm_prompt = 'Confirm password:' , confirm_limit = 3 , validate = None , ** kwargs ) Securely receive a password from the user. Returns the password or None. Argument Description prompt The prompt to present to the user. Can include ANSI and format strings like milc's cli.echo() . confirm Prompt the user to type the password again and make sure they match. confirm_prompt The prompt to present to the user. Can include ANSI and format strings like milc's cli.echo() . confirm_limit Number of attempts to confirm before giving up. Default: 3 validate This is an optional function that can be used to validate the password, EG to check complexity. It should return True or False and have the following signature: def function_name(answer): question \u00b6 def question ( prompt , * args , default = None , confirm = False , answer_type = str , validate = None , ** kwargs ) Allow the user to type in a free-form string to answer. Argument Description prompt The prompt to present to the user. Can include ANSI and format strings like milc's cli.echo() . default The value to return when the user doesn't enter any value. Use None to prompt until they enter a value. confirm Present the user with a confirmation dialog before accepting their answer. answer_type Specify a type function for the answer. Will re-prompt the user if the function raises any errors. Common choices here include int, float, and decimal.Decimal. validate This is an optional function that can be used to validate the answer. It should return True or False and have the following signature: def function_name(answer, *args, **kwargs): choice \u00b6 def choice ( heading , options , * args , default = None , confirm = False , prompt = 'Please enter your choice: ' , ** kwargs ) Present the user with a list of options and let them select one. Users can enter either the number or the text of their choice. This will return the value of the item they choose, not the numerical index. Argument Description heading The text to place above the list of options. options A sequence of items to choose from. default The index of the item to return when the user doesn't enter any value. Use None to prompt until they enter a value. confirm When True present the user with a confirmation dialog before accepting their answer. prompt The prompt to present to the user. Can include color and format strings like milc's cli.echo() . Users can enter either the number or the text of their choice. Warning This will return the value of the item they choose, not the numerical index.","title":"milc.questions"},{"location":"api_questions/#questions","text":"Sometimes you need to ask the user a question. MILC provides basic functions for collecting and validating user input. You can find these in the milc.questions module.","title":"questions"},{"location":"api_subcommand_config/","text":"subcommand.config \u00b6 Read and write configuration settings print_config \u00b6 def print_config ( section , key ) Print a single config setting to stdout. show_config \u00b6 def show_config () Print the current configuration to stdout. parse_config_token \u00b6 def parse_config_token ( config_token ) Split a user-supplied configuration-token into its components. set_config \u00b6 def set_config ( section , option , value ) Set a config key in the running config. config \u00b6 @milc . cli . argument ( '-a' , '--all' , action = 'store_true' , help = 'Show all configuration options.' ) @milc . cli . argument ( '-ro' , '--read-only' , arg_only = True , action = 'store_true' , help = 'Operate in read-only mode.' ) @milc . cli . argument ( 'configs' , nargs = '*' , arg_only = True , help = 'Configuration options to read or write.' ) @milc . cli . subcommand ( \"Read and write configuration settings.\" ) def config ( cli ) Read and write config settings. This script iterates over the config_tokens supplied as argument. Each config_token has the following form: section[.key][=value] If only a section (EG 'compile') is supplied all keys for that section will be displayed. If section.key is supplied the value for that single key will be displayed. If section.key=value is supplied the value for that single key will be set. If section.key=None is supplied the key will be deleted. No validation is done to ensure that the supplied section.key is actually used by a subcommand.","title":"milc.subcommand.config"},{"location":"api_subcommand_config/#subcommandconfig","text":"Read and write configuration settings","title":"subcommand.config"},{"location":"argcomplete/","text":"Argument (Tab) Completion Support \u00b6 MILC supports argument completion out of the box using argcomplete . Getting argument completion to actually work can be a little fiddly, this page attempts to help you with that. Prerequisites \u00b6 Before argument completion will work your program must be registered with your shell. The most compatible way to do so is this: eval \"$(register-python-argcomplete my-program)\" If you have a new enough shell (EG bash 4.2 or later, zsh, fish) you can instead rely on activate-global-python-argcomplete , but in my experience that mechanism is fragile and easily broken. Using Tab Completion \u00b6 After running the command above you should be able to type the name of your program, type a partial flag name, and tab complete the rest. For many simple programs this is all you need. Adding Custom Completions \u00b6 In some cases you need to give argcomplete a custom list of completions. For example, if you want to complete hostnames out of a configuration file. You can specify this by setting completer in your argument decorator. You can use either callable or readline-style completers when you specify that. For example, to use an EnvironCompleter for an argument: def EnvironCompleter(**kwargs): return os.environ @cli.argument('-e', '--env', completer=EnvironCompleter, help='Environment Variable') @cli.entrypoint('My cool program') def my_program(cli): pass","title":"Argument (Tab) Completion"},{"location":"argcomplete/#argument-tab-completion-support","text":"MILC supports argument completion out of the box using argcomplete . Getting argument completion to actually work can be a little fiddly, this page attempts to help you with that.","title":"Argument (Tab) Completion Support"},{"location":"argcomplete/#prerequisites","text":"Before argument completion will work your program must be registered with your shell. The most compatible way to do so is this: eval \"$(register-python-argcomplete my-program)\" If you have a new enough shell (EG bash 4.2 or later, zsh, fish) you can instead rely on activate-global-python-argcomplete , but in my experience that mechanism is fragile and easily broken.","title":"Prerequisites"},{"location":"argcomplete/#using-tab-completion","text":"After running the command above you should be able to type the name of your program, type a partial flag name, and tab complete the rest. For many simple programs this is all you need.","title":"Using Tab Completion"},{"location":"argcomplete/#adding-custom-completions","text":"In some cases you need to give argcomplete a custom list of completions. For example, if you want to complete hostnames out of a configuration file. You can specify this by setting completer in your argument decorator. You can use either callable or readline-style completers when you specify that. For example, to use an EnvironCompleter for an argument: def EnvironCompleter(**kwargs): return os.environ @cli.argument('-e', '--env', completer=EnvironCompleter, help='Environment Variable') @cli.entrypoint('My cool program') def my_program(cli): pass","title":"Adding Custom Completions"},{"location":"argument_parsing/","text":"Argument Parsing \u00b6 MILC exposes the full power of argparse to you. It also extends argparse to make certain commonly used patterns easier to use. Reading Arguments \u00b6 In most cases you will want to use cli.config to read your argument. For example: cli.config.general.verbose In some cases (such as arg_only ) you will need to access the arguments directly using cli.args . You can access these using either attribute or dictionary notation: Attribute: cli.args.verbose Dictionary: cli.args['verbose'] Defining arguments \u00b6 Argument Decorators \u00b6 Argument decorators ( @argument() ) are used to define command line flags that the user has passed. For the most part the arguments passed to this decorator are passed to ArgumentParser.add_argument() directly. As such you can use all of those method arguments with MILC's @argument() decorator. arg_only \u00b6 Sometimes you want an argument to be a CLI flag only, and to not have a corresponding configuration option. With arg_only=True in your @argument() decorator this is possible. You will have to look in cli.args to find the value of that flag, it will not be populated to cli.config . completers \u00b6 You can specify argcomplete completers for your arguments by passing completers . For more detail see the argcomplete page. deprecated \u00b6 You can use the deprecated argument to mark a flag as deprecated. To use this you should set it to a string that will be displayed in --help. For example: @argument('--old', action='store_true', deprecated='Use --new instead', help='The old action for my command.') This will result in the following help output: --old The old action for my command. [Deprecated]: Use --new instead action: store_boolean \u00b6 In addition to the normal set of action= arguments that you can pass to @argument() , you can also pass a new action called store_boolean . This action behaves like store_true except that it adds a corresponding --no- flag that the user can pass as well.","title":"Argument Parsing"},{"location":"argument_parsing/#argument-parsing","text":"MILC exposes the full power of argparse to you. It also extends argparse to make certain commonly used patterns easier to use.","title":"Argument Parsing"},{"location":"argument_parsing/#reading-arguments","text":"In most cases you will want to use cli.config to read your argument. For example: cli.config.general.verbose In some cases (such as arg_only ) you will need to access the arguments directly using cli.args . You can access these using either attribute or dictionary notation: Attribute: cli.args.verbose Dictionary: cli.args['verbose']","title":"Reading Arguments"},{"location":"argument_parsing/#defining-arguments","text":"","title":"Defining arguments"},{"location":"argument_parsing/#argument-decorators","text":"Argument decorators ( @argument() ) are used to define command line flags that the user has passed. For the most part the arguments passed to this decorator are passed to ArgumentParser.add_argument() directly. As such you can use all of those method arguments with MILC's @argument() decorator.","title":"Argument Decorators"},{"location":"argument_parsing/#arg_only","text":"Sometimes you want an argument to be a CLI flag only, and to not have a corresponding configuration option. With arg_only=True in your @argument() decorator this is possible. You will have to look in cli.args to find the value of that flag, it will not be populated to cli.config .","title":"arg_only"},{"location":"argument_parsing/#completers","text":"You can specify argcomplete completers for your arguments by passing completers . For more detail see the argcomplete page.","title":"completers"},{"location":"argument_parsing/#deprecated","text":"You can use the deprecated argument to mark a flag as deprecated. To use this you should set it to a string that will be displayed in --help. For example: @argument('--old', action='store_true', deprecated='Use --new instead', help='The old action for my command.') This will result in the following help output: --old The old action for my command. [Deprecated]: Use --new instead","title":"deprecated"},{"location":"argument_parsing/#action-store_boolean","text":"In addition to the normal set of action= arguments that you can pass to @argument() , you can also pass a new action called store_boolean . This action behaves like store_true except that it adds a corresponding --no- flag that the user can pass as well.","title":"action: store_boolean"},{"location":"breaking_changes/","text":"Breaking Changes \u00b6 This is a list of breaking changes that have been made to MILC. If your script stops working after a minor or major version upgrade this document will tell you how to fix it. Version 1.6.0 \u00b6 Added support for Sparklines Moved documentation to Material for MkDocs Latest release documentation can always be found here: https://milc.clueboard.co/latest Latest in development documentation can always be found here: https://milc.clueboard.co/devel Legacy docsify documentation for MILC 1.5.0 can be found here: https://milc.clueboard.co/1.5.0 Version 1.5.0 \u00b6 Added cli.config_dir to find the location of the config directory. Arguments , commands , and subcommands can now be marked as deprecated. Version 1.4.0 \u00b6 The config subcommand now filters out configuration that has not been explicitly set. The new --all flag will allow you to see all possible configuration options and their default values. Setting program metadata through environment variables has been deprecated. In its place is the new set_metadata() function. See Metadata for more detail. MILC now tracks whether a script is running interactively or not with cli.interactive . You can pass --interactive to force a script into interactive mode even when stdout is not a TTY. milc.questions will always return the default answer when running non-interactively, unless --yes or --no are passed. Version 1.3.0 \u00b6 You can now set the program version number with os.environ['MILC_APP_VERSION'] = '1.2.3' New global arguments: --unicode and --no-unicode ANSIFormatter, ANSIStrippingFormatter, ANSIEmojiLoglevelFormatter, and ANSIStrippingEmojiLoglevelFormatter have been removed in favor of format_ansi() being color aware. The new MILCFormatter is being used in its place. Version 1.2.0 \u00b6 The config file is now resolved to the actual file which should avoid overwriting symlinks. https://github.com/qmk/qmk_cli/issues/43 Version 1.1.0 \u00b6 Configuration: 0 and 1 are now considered integers, not boolean Version 1.0.0 \u00b6 Initial Version","title":"Breaking Changes"},{"location":"breaking_changes/#breaking-changes","text":"This is a list of breaking changes that have been made to MILC. If your script stops working after a minor or major version upgrade this document will tell you how to fix it.","title":"Breaking Changes"},{"location":"breaking_changes/#version-160","text":"Added support for Sparklines Moved documentation to Material for MkDocs Latest release documentation can always be found here: https://milc.clueboard.co/latest Latest in development documentation can always be found here: https://milc.clueboard.co/devel Legacy docsify documentation for MILC 1.5.0 can be found here: https://milc.clueboard.co/1.5.0","title":"Version 1.6.0"},{"location":"breaking_changes/#version-150","text":"Added cli.config_dir to find the location of the config directory. Arguments , commands , and subcommands can now be marked as deprecated.","title":"Version 1.5.0"},{"location":"breaking_changes/#version-140","text":"The config subcommand now filters out configuration that has not been explicitly set. The new --all flag will allow you to see all possible configuration options and their default values. Setting program metadata through environment variables has been deprecated. In its place is the new set_metadata() function. See Metadata for more detail. MILC now tracks whether a script is running interactively or not with cli.interactive . You can pass --interactive to force a script into interactive mode even when stdout is not a TTY. milc.questions will always return the default answer when running non-interactively, unless --yes or --no are passed.","title":"Version 1.4.0"},{"location":"breaking_changes/#version-130","text":"You can now set the program version number with os.environ['MILC_APP_VERSION'] = '1.2.3' New global arguments: --unicode and --no-unicode ANSIFormatter, ANSIStrippingFormatter, ANSIEmojiLoglevelFormatter, and ANSIStrippingEmojiLoglevelFormatter have been removed in favor of format_ansi() being color aware. The new MILCFormatter is being used in its place.","title":"Version 1.3.0"},{"location":"breaking_changes/#version-120","text":"The config file is now resolved to the actual file which should avoid overwriting symlinks. https://github.com/qmk/qmk_cli/issues/43","title":"Version 1.2.0"},{"location":"breaking_changes/#version-110","text":"Configuration: 0 and 1 are now considered integers, not boolean","title":"Version 1.1.0"},{"location":"breaking_changes/#version-100","text":"Initial Version","title":"Version 1.0.0"},{"location":"configuration/","text":"Configuration \u00b6 MILC supports a config file out of the box. The format and structure of this file is exposed through cli.config and tied to command line arguments. If your program uses subcommands you can add a config subcommand with a single import. Structure \u00b6 MILC uses ConfigParser to store configuration values. We've mapped the section names to subcommands, and values passed as CLI arguments will be automatically populated to keys named after the argument. Configuration options for the main cli.entrypoint() are set in cli.config.general . If you do not have any subcommands you will find all of your config options here. Reading Config Values \u00b6 You can read config values using either attribute or dictionary notation. If a key does not exist in the configuration you will get None as the value. Attribute: cli.config.general.verbose Dictionary: cli.config['general']['verbose'] Setting Config Values \u00b6 You can create new values by simply assigning to them. This only with dictionary notation. cli.config['general']['verbose'] = True Writing Configuration Files \u00b6 Use cli.save_config() to save the user's configuration file. It will be written to the location specified by cli.config_file . Configuration File Location \u00b6 MILC uses appdirs to determine the configuration file location. You can set your application's name and author by using milc.set_metadata : from milc import set_metadata set_metadata ( 'Florzelbop' , '1.0.0' , 'Jane Doe' ) This will (usually) result in the following config file locations: Linux: ~/.local/share/Florzelbop macOS: ~/Library/Application Support/Florzelbop Windows: C:\\Documents and Settings\\\\Application Data\\Local Settings\\Florzelbop Jane Doe\\hello Where Did A Value Come From? \u00b6 Sometimes you need to know how a configuration value was set. You can use cli.config_source to find out. >>> cli.config_source.general.verbose 'argument' The possible values returned are: 'argument' The value was passed as an argument 'config_file' The value was read from the config file 'default' This is the default value Automatic Type Inference \u00b6 Under the hood all configuration options are stored as plain text. MILC converts your config values into appropriate data types when it can figure out how. Booleans yes , true , and on evaluate to True. no , false , and off evaluate to False. None Values set to None are considered deleted, and will be removed from the config file Integers Numbers without a decimal are converted to int() Decimal Numbers Numbers with a decimal are converted to decimal.Decimal()","title":"Configuration"},{"location":"configuration/#configuration","text":"MILC supports a config file out of the box. The format and structure of this file is exposed through cli.config and tied to command line arguments. If your program uses subcommands you can add a config subcommand with a single import.","title":"Configuration"},{"location":"configuration/#structure","text":"MILC uses ConfigParser to store configuration values. We've mapped the section names to subcommands, and values passed as CLI arguments will be automatically populated to keys named after the argument. Configuration options for the main cli.entrypoint() are set in cli.config.general . If you do not have any subcommands you will find all of your config options here.","title":"Structure"},{"location":"configuration/#reading-config-values","text":"You can read config values using either attribute or dictionary notation. If a key does not exist in the configuration you will get None as the value. Attribute: cli.config.general.verbose Dictionary: cli.config['general']['verbose']","title":"Reading Config Values"},{"location":"configuration/#setting-config-values","text":"You can create new values by simply assigning to them. This only with dictionary notation. cli.config['general']['verbose'] = True","title":"Setting Config Values"},{"location":"configuration/#writing-configuration-files","text":"Use cli.save_config() to save the user's configuration file. It will be written to the location specified by cli.config_file .","title":"Writing Configuration Files"},{"location":"configuration/#configuration-file-location","text":"MILC uses appdirs to determine the configuration file location. You can set your application's name and author by using milc.set_metadata : from milc import set_metadata set_metadata ( 'Florzelbop' , '1.0.0' , 'Jane Doe' ) This will (usually) result in the following config file locations: Linux: ~/.local/share/Florzelbop macOS: ~/Library/Application Support/Florzelbop Windows: C:\\Documents and Settings\\\\Application Data\\Local Settings\\Florzelbop Jane Doe\\hello","title":"Configuration File Location"},{"location":"configuration/#where-did-a-value-come-from","text":"Sometimes you need to know how a configuration value was set. You can use cli.config_source to find out. >>> cli.config_source.general.verbose 'argument' The possible values returned are: 'argument' The value was passed as an argument 'config_file' The value was read from the config file 'default' This is the default value","title":"Where Did A Value Come From?"},{"location":"configuration/#automatic-type-inference","text":"Under the hood all configuration options are stored as plain text. MILC converts your config values into appropriate data types when it can figure out how. Booleans yes , true , and on evaluate to True. no , false , and off evaluate to False. None Values set to None are considered deleted, and will be removed from the config file Integers Numbers without a decimal are converted to int() Decimal Numbers Numbers with a decimal are converted to decimal.Decimal()","title":"Automatic Type Inference"},{"location":"installation/","text":"MILC supports Python 3.6 or later. You can install MILC using standard python tooling: python3 -m pip install milc","title":"Installation"},{"location":"logging/","text":"MILC comes with a robust logging system based on python's logging module. All you have to worry about are log messages, let MILC worry about presenting those messages to the user in configurable ways. Writing Log Entries \u00b6 A python Logger Object is available as cli.log . You can use this to write messages at various log levels: cli.log.debug() cli.log.info() cli.log.warning() cli.log.error() cli.log.critical() cli.log.exception() As is standard for the python logging module you can use printf -style format string operations with these. Example: log.info('Hello, %s!', cli.config.general.name) ANSI color sequences are also available. For more information see the ANSI Color page. Verbose Mode \u00b6 All MILC programs have -v and --verbose flags by default. When this flag is passed DEBUG level messages will be printed to the screen. If you want to use this flag in your program you can check cli.config.general.verbose . It is True when -v / --verbose is passed and False otherwise. Controlling Log Output \u00b6 Users have several CLI arguments they can pass to control the output of logs. These are automatically added to your program, you do not have to do anything to make them available: --datetime-fmt , default: %Y-%m-%d %H:%M:%S Default date/time format. --log-fmt , default: %(levelname)s %(message)s Format string for printed log output --log-file-fmt , default: [%(levelname)s] [%(asctime)s] [file:%(pathname)s] [line:%(lineno)d] %(message)s Format string for log file. --log-file , default: None File to write log messages to --color and --no-color Enable or disable ANSI color --unicode and --no-unicode Enable or disable unicode icons","title":"Logging"},{"location":"logging/#writing-log-entries","text":"A python Logger Object is available as cli.log . You can use this to write messages at various log levels: cli.log.debug() cli.log.info() cli.log.warning() cli.log.error() cli.log.critical() cli.log.exception() As is standard for the python logging module you can use printf -style format string operations with these. Example: log.info('Hello, %s!', cli.config.general.name) ANSI color sequences are also available. For more information see the ANSI Color page.","title":"Writing Log Entries"},{"location":"logging/#verbose-mode","text":"All MILC programs have -v and --verbose flags by default. When this flag is passed DEBUG level messages will be printed to the screen. If you want to use this flag in your program you can check cli.config.general.verbose . It is True when -v / --verbose is passed and False otherwise.","title":"Verbose Mode"},{"location":"logging/#controlling-log-output","text":"Users have several CLI arguments they can pass to control the output of logs. These are automatically added to your program, you do not have to do anything to make them available: --datetime-fmt , default: %Y-%m-%d %H:%M:%S Default date/time format. --log-fmt , default: %(levelname)s %(message)s Format string for printed log output --log-file-fmt , default: [%(levelname)s] [%(asctime)s] [file:%(pathname)s] [line:%(lineno)d] %(message)s Format string for log file. --log-file , default: None File to write log messages to --color and --no-color Enable or disable ANSI color --unicode and --no-unicode Enable or disable unicode icons","title":"Controlling Log Output"},{"location":"metadata/","text":"MILC Metadata \u00b6 In order to initialize some things, such as the configuration file location and the version number reported by --version , MILC needs to know some basic information before you import cli . If you need to set the program's name, author name, and/or version number do it like this: from milc import set_metadata set_metadata ( name = 'Florzelbop' , version = '1.0.0' , author = 'Jane Doe' ) from milc import cli You should only do this once, and you should do it as early in your program's execution as possible. Danger Do not import set_metadata and cli at the same time! When you run set_metadata the cli object will be replaced, but your existing import will continue to reference the old cli object. Environment based setup \u00b6 Earlier versions of MILC used the environment variables MILC_APP_NAME , MILC_APP_VERSION , and MILC_AUTHOR_NAME to set this information. While this is supported in MILC 1.4.x it will throw a DeprecationWarning and will be removed in a later version of MILC. You can supress this warning by setting the environment variable MILC_IGNORE_DEPRECATED .","title":"Metadata"},{"location":"metadata/#milc-metadata","text":"In order to initialize some things, such as the configuration file location and the version number reported by --version , MILC needs to know some basic information before you import cli . If you need to set the program's name, author name, and/or version number do it like this: from milc import set_metadata set_metadata ( name = 'Florzelbop' , version = '1.0.0' , author = 'Jane Doe' ) from milc import cli You should only do this once, and you should do it as early in your program's execution as possible. Danger Do not import set_metadata and cli at the same time! When you run set_metadata the cli object will be replaced, but your existing import will continue to reference the old cli object.","title":"MILC Metadata"},{"location":"metadata/#environment-based-setup","text":"Earlier versions of MILC used the environment variables MILC_APP_NAME , MILC_APP_VERSION , and MILC_AUTHOR_NAME to set this information. While this is supported in MILC 1.4.x it will throw a DeprecationWarning and will be removed in a later version of MILC. You can supress this warning by setting the environment variable MILC_IGNORE_DEPRECATED .","title":"Environment based setup"},{"location":"sparklines/","text":"Sparklines \u00b6 A sparkline is a tool for displaying numerical information in a very compact format. You can read more about the general concept on the Wikipedia page and read about Unicode sparklines specifically in an article by Jon Udell . Usage \u00b6 Basic usage of a sparkline is simple: from milc import sparkline print ( sparkline ([ 5 , 9 , 2 , 3 , 6 , 9 , 3 , 5 , 6 ]) This will output the following text: \u2586\u2583\u2584\u2587\u2584\u2586\u2587 Whitespace \u00b6 Any item in your sparkline sequence that is not a number ( int , float , or decimal.Decimal ) will be rendered as a blank space. It is recommended that you consistently use the same object for this purpose, I prefer None . Input: from milc import sparkline print ( sparkline ([ 3 , 7 , None , 2 , 1 ]) Output: \u2583\u2588 \u2582\u2581 Color \u00b6 MILC supports coloring your sparkline in two different ways. You can combine these for a total of 4 colors per sparkline. Negative and Positive Numbers \u00b6 By default your sparkline will be un-colored for positive numbers and red for negative numbers. You can change the colors for these by passing the following parameters: negative_color negative_reset positive_color positive_reset These accept MILC color codes . Highlight Color \u00b6 If you want to highlight datapoints that higher or lower than a threshold you can do so by passing in highlight_low , highlight_high , and the associated color codes. These accept MILC color codes . You will need to set a color for your highlight, one is not set by default. The correct arguments to pass for each are listed below. By default the reset codes are set to {fg_reset} . If you are setting other attributes too you will need to adjust this by passing the correct reset code as well. highlight_low : highlight_low_color and highlight_low_reset highlight_high : highlight_high_color and highlight_high_reset Optimization \u00b6 If you need to optimize the performance of a sparkline, or you want to set the boundaries for your data, you can supply min and max values when creating your sparkline. This will avoid two iterations over the list to find min and max values. from milc import sparkline print ( sparkline ([ 5 , 9 , 2 , 3 , 6 , 9 , 3 , 5 , 6 ], 2 , 9 ) Any values that fall outside your min and max will be ignored.","title":"Sparklines"},{"location":"sparklines/#sparklines","text":"A sparkline is a tool for displaying numerical information in a very compact format. You can read more about the general concept on the Wikipedia page and read about Unicode sparklines specifically in an article by Jon Udell .","title":"Sparklines"},{"location":"sparklines/#usage","text":"Basic usage of a sparkline is simple: from milc import sparkline print ( sparkline ([ 5 , 9 , 2 , 3 , 6 , 9 , 3 , 5 , 6 ]) This will output the following text: \u2586\u2583\u2584\u2587\u2584\u2586\u2587","title":"Usage"},{"location":"sparklines/#whitespace","text":"Any item in your sparkline sequence that is not a number ( int , float , or decimal.Decimal ) will be rendered as a blank space. It is recommended that you consistently use the same object for this purpose, I prefer None . Input: from milc import sparkline print ( sparkline ([ 3 , 7 , None , 2 , 1 ]) Output: \u2583\u2588 \u2582\u2581","title":"Whitespace"},{"location":"sparklines/#color","text":"MILC supports coloring your sparkline in two different ways. You can combine these for a total of 4 colors per sparkline.","title":"Color"},{"location":"sparklines/#negative-and-positive-numbers","text":"By default your sparkline will be un-colored for positive numbers and red for negative numbers. You can change the colors for these by passing the following parameters: negative_color negative_reset positive_color positive_reset These accept MILC color codes .","title":"Negative and Positive Numbers"},{"location":"sparklines/#highlight-color","text":"If you want to highlight datapoints that higher or lower than a threshold you can do so by passing in highlight_low , highlight_high , and the associated color codes. These accept MILC color codes . You will need to set a color for your highlight, one is not set by default. The correct arguments to pass for each are listed below. By default the reset codes are set to {fg_reset} . If you are setting other attributes too you will need to adjust this by passing the correct reset code as well. highlight_low : highlight_low_color and highlight_low_reset highlight_high : highlight_high_color and highlight_high_reset","title":"Highlight Color"},{"location":"sparklines/#optimization","text":"If you need to optimize the performance of a sparkline, or you want to set the boundaries for your data, you can supply min and max values when creating your sparkline. This will avoid two iterations over the list to find min and max values. from milc import sparkline print ( sparkline ([ 5 , 9 , 2 , 3 , 6 , 9 , 3 , 5 , 6 ], 2 , 9 ) Any values that fall outside your min and max will be ignored.","title":"Optimization"},{"location":"spinners/","text":"Spinners \u00b6 Spinners let you tell the user that something is happening while you're processing. There are 3 basic ways to use a spinner: Instantiating a spinner and then using .start() and .stop() on your object. Using a context manager ( with cli.spinner(...): ) Decorate a function ( @cli.spinner(...) ) For full details see the cli.spinner api reference . Adding a Spinner \u00b6 If you'd like to create your own spinner animation you can do that. First you should define a dictionary with two keys, interval and frames : my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } You can use this in one of two ways- by passing it directly to cli.spinner() or by adding it to the list of available spinners using cli.add_spinner() . Example: Using a custom spinner directly \u00b6 my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } with cli . spinner ( text = 'Loading' , spinner = my_spinner ): time . sleep ( 10 ) Example: Adding a custom spinner \u00b6 my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } cli . add_spinner ( 'my_twirl' , my_spinner ) with cli . spinner ( text = 'Loading' , spinner = 'my_twirl' ): time . sleep ( 10 ) Example: Instantiating a Spinner \u00b6 spinner = cli . spinner ( text = 'Loading' , spinner = 'dots' ) spinner . start () # Do something here spinner . stop () Example: Using a Context Manager \u00b6 with cli . spinner ( text = 'Loading' , spinner = 'dots' ): # Do something here Example: Decorating a Function \u00b6 @cli . spinner ( text = 'Loading' , spinner = 'dots' ) def long_running_function (): # Do something here","title":"Spinners"},{"location":"spinners/#spinners","text":"Spinners let you tell the user that something is happening while you're processing. There are 3 basic ways to use a spinner: Instantiating a spinner and then using .start() and .stop() on your object. Using a context manager ( with cli.spinner(...): ) Decorate a function ( @cli.spinner(...) ) For full details see the cli.spinner api reference .","title":"Spinners"},{"location":"spinners/#adding-a-spinner","text":"If you'd like to create your own spinner animation you can do that. First you should define a dictionary with two keys, interval and frames : my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } You can use this in one of two ways- by passing it directly to cli.spinner() or by adding it to the list of available spinners using cli.add_spinner() .","title":"Adding a Spinner"},{"location":"spinners/#example-using-a-custom-spinner-directly","text":"my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } with cli . spinner ( text = 'Loading' , spinner = my_spinner ): time . sleep ( 10 )","title":"Example: Using a custom spinner directly"},{"location":"spinners/#example-adding-a-custom-spinner","text":"my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } cli . add_spinner ( 'my_twirl' , my_spinner ) with cli . spinner ( text = 'Loading' , spinner = 'my_twirl' ): time . sleep ( 10 )","title":"Example: Adding a custom spinner"},{"location":"spinners/#example-instantiating-a-spinner","text":"spinner = cli . spinner ( text = 'Loading' , spinner = 'dots' ) spinner . start () # Do something here spinner . stop ()","title":"Example: Instantiating a Spinner"},{"location":"spinners/#example-using-a-context-manager","text":"with cli . spinner ( text = 'Loading' , spinner = 'dots' ): # Do something here","title":"Example: Using a Context Manager"},{"location":"spinners/#example-decorating-a-function","text":"@cli . spinner ( text = 'Loading' , spinner = 'dots' ) def long_running_function (): # Do something here","title":"Example: Decorating a Function"},{"location":"subcommand_config/","text":"MILC config subcommand \u00b6 This document explains how the available config subcommand works. Introduction \u00b6 Configuration for MILC applications is a key/value system. Each key consists of a subcommand and an argument name separated by a period. This allows for a straightforward and direct translation between config keys and the arguments they set. You can provide your users with a subcommand for managing this configuration by importing the config subcommand: import milc.subcommand.config Read on to see how users can utilize this subcommand. Simple Example \u00b6 As an example let's look at the command my_cli foo --arg1 bar --arg2 bat . There are two command line arguments that could be read from configuration instead: foo.arg1 foo.arg2 Let's set these now: $ my_cli config foo.arg1=bar foo.arg2=bat foo.arg1 None -> bar foo.arg2 None -> bat i Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Now I can run my_cli foo without specifying --arg1 and --arg2 each time. Setting User Defaults \u00b6 Sometimes you want to share a setting between multiple subcommands. For example, multiple commands take the argument --arg1 . Rather than setting this value for every command you can set a user value which will be used by any command that takes that argument. Example: $ my_cli config user.arg1=baz user.arg1: None -> baz \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Subcommand reference ( config ) \u00b6 The config subcommand is used to interact with the underlying configuration. When run with no argument it shows the current configuration. When arguments are supplied they are assumed to be configuration tokens, which are strings containing no spaces with the following form: [.][=] Setting Configuration Values \u00b6 You can set configuration values by putting an equal sign (=) into your config key. The key must always be the full . form. Example: $ my_cli config user.arg1=default user.arg1: None -> default \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Reading Configuration Values \u00b6 You can read configuration values for all set options, the entire configuration, a single key, or for an entire section. You can also specify multiple keys to display more than one value. All Set Options Example \u00b6 my_cli config Entire Configuration Example \u00b6 my_cli config -a Whole Section Example \u00b6 my_cli config general Single Key Example \u00b6 my_cli config general.verbose Multiple Keys Example \u00b6 my_cli config user general.verbose general.log_format Deleting Configuration Values \u00b6 You can delete a configuration value by setting it to the special string None . Example: $ my_cli config general.log_format None general.log_format: %H:%M:%S -> None \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Multiple Operations \u00b6 You can combine multiple read and write operations into a single command. They will be executed and displayed in order: $ my_cli config foo user.arg1=default foo.arg2=None foo.arg3=peep user.arg1: None -> default foo.arg2: bar -> None \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Config Subcommand"},{"location":"subcommand_config/#milc-config-subcommand","text":"This document explains how the available config subcommand works.","title":"MILC config subcommand"},{"location":"subcommand_config/#introduction","text":"Configuration for MILC applications is a key/value system. Each key consists of a subcommand and an argument name separated by a period. This allows for a straightforward and direct translation between config keys and the arguments they set. You can provide your users with a subcommand for managing this configuration by importing the config subcommand: import milc.subcommand.config Read on to see how users can utilize this subcommand.","title":"Introduction"},{"location":"subcommand_config/#simple-example","text":"As an example let's look at the command my_cli foo --arg1 bar --arg2 bat . There are two command line arguments that could be read from configuration instead: foo.arg1 foo.arg2 Let's set these now: $ my_cli config foo.arg1=bar foo.arg2=bat foo.arg1 None -> bar foo.arg2 None -> bat i Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Now I can run my_cli foo without specifying --arg1 and --arg2 each time.","title":"Simple Example"},{"location":"subcommand_config/#setting-user-defaults","text":"Sometimes you want to share a setting between multiple subcommands. For example, multiple commands take the argument --arg1 . Rather than setting this value for every command you can set a user value which will be used by any command that takes that argument. Example: $ my_cli config user.arg1=baz user.arg1: None -> baz \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Setting User Defaults"},{"location":"subcommand_config/#subcommand-reference-config","text":"The config subcommand is used to interact with the underlying configuration. When run with no argument it shows the current configuration. When arguments are supplied they are assumed to be configuration tokens, which are strings containing no spaces with the following form: [.][=]","title":"Subcommand reference (config)"},{"location":"subcommand_config/#setting-configuration-values","text":"You can set configuration values by putting an equal sign (=) into your config key. The key must always be the full . form. Example: $ my_cli config user.arg1=default user.arg1: None -> default \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Setting Configuration Values"},{"location":"subcommand_config/#reading-configuration-values","text":"You can read configuration values for all set options, the entire configuration, a single key, or for an entire section. You can also specify multiple keys to display more than one value.","title":"Reading Configuration Values"},{"location":"subcommand_config/#all-set-options-example","text":"my_cli config","title":"All Set Options Example"},{"location":"subcommand_config/#entire-configuration-example","text":"my_cli config -a","title":"Entire Configuration Example"},{"location":"subcommand_config/#whole-section-example","text":"my_cli config general","title":"Whole Section Example"},{"location":"subcommand_config/#single-key-example","text":"my_cli config general.verbose","title":"Single Key Example"},{"location":"subcommand_config/#multiple-keys-example","text":"my_cli config user general.verbose general.log_format","title":"Multiple Keys Example"},{"location":"subcommand_config/#deleting-configuration-values","text":"You can delete a configuration value by setting it to the special string None . Example: $ my_cli config general.log_format None general.log_format: %H:%M:%S -> None \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Deleting Configuration Values"},{"location":"subcommand_config/#multiple-operations","text":"You can combine multiple read and write operations into a single command. They will be executed and displayed in order: $ my_cli config foo user.arg1=default foo.arg2=None foo.arg3=peep user.arg1: None -> default foo.arg2: bar -> None \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Multiple Operations"},{"location":"subprocesses/","text":"Executing commands in a subprocess \u00b6 MILC provides some tools to make running subcommands easier and more convienent to work with. Basic Subprocess Execution \u00b6 You can use cli.run() to easily and safely run shell commands. The first argument to cli.run() should be an argument list, which is a list or tuple containing the command and any arguments you want to pass in. For example, if you wanted to run a git command you might build this argument list: git_cmd = [ 'git' , '-C' , '/srv/web/htdocs' , 'pull' ] This is all you need to do to run that command: p = cli . run ( git_cmd ) This will return a subprocess.CompletedProcess instance. You can examine attributes such as p.returncode , p.stderr , and p.stdout to see the fate of the process. Supported Arguments \u00b6 Argument Default Description command A sequence of arguments for the command to be run. The first element is the command to be executed. capture_output True When False output from the subprocess is written directly to STDOUT and STDERR. combined_output False When True STDERR will be combined with STDOUT. text True When False STDOUT and STDERR will return binary data. **kwargs Any unrecognized argument will be passed to subprocess.run() Differences from subprocess.run \u00b6 MILC's cli.run() differs from subprocess.run() in some important ways. Windows Support \u00b6 When running inside a windows console (Powershell, DOS, Cygwin, Msys2) there are some quirks that MILC attempts to handle but which you need to be aware of: Commands are always run in a subshell, so that non-executable files and POSIX paths work seemlessly. Windows leaves stdin in a broken state after executing a subprocess. To avoid this MILC adds stdin=DEVNULL to the subprocess.run() call. If you need stdin to work in your executed process you can pass stdin=None . Building argument lists \u00b6 The most important way MILC differs from subprocess.run() is that it only accepts commands that have already been split into sequences. A lot of bugs are caused by mistakes in building command strings that are later split into a sequence of arguments in unexpected ways. Capture Output \u00b6 By default cli.run() captures STDOUT and STDERR. If you'd like that output to be written to the terminal instead you can pass capture_output=False . Combining STDERR with STDOUT \u00b6 If you'd like to combine STDOUT and STDERR into one stream (similar to the shell construct 2>&1 ) you can pass combined_output=True . Text Encoding \u00b6 By default STDOUT and STDERR will be opened as text. If you'd like these to be bytes instead of text you can pass text=False . Other Arguments \u00b6 All other arguments are passed directly to subprocess.run() . You can use these to further tweak the behavior of your subprocesses.","title":"Subprocesses"},{"location":"subprocesses/#executing-commands-in-a-subprocess","text":"MILC provides some tools to make running subcommands easier and more convienent to work with.","title":"Executing commands in a subprocess"},{"location":"subprocesses/#basic-subprocess-execution","text":"You can use cli.run() to easily and safely run shell commands. The first argument to cli.run() should be an argument list, which is a list or tuple containing the command and any arguments you want to pass in. For example, if you wanted to run a git command you might build this argument list: git_cmd = [ 'git' , '-C' , '/srv/web/htdocs' , 'pull' ] This is all you need to do to run that command: p = cli . run ( git_cmd ) This will return a subprocess.CompletedProcess instance. You can examine attributes such as p.returncode , p.stderr , and p.stdout to see the fate of the process.","title":"Basic Subprocess Execution"},{"location":"subprocesses/#supported-arguments","text":"Argument Default Description command A sequence of arguments for the command to be run. The first element is the command to be executed. capture_output True When False output from the subprocess is written directly to STDOUT and STDERR. combined_output False When True STDERR will be combined with STDOUT. text True When False STDOUT and STDERR will return binary data. **kwargs Any unrecognized argument will be passed to subprocess.run()","title":"Supported Arguments"},{"location":"subprocesses/#differences-from-subprocessrun","text":"MILC's cli.run() differs from subprocess.run() in some important ways.","title":"Differences from subprocess.run"},{"location":"subprocesses/#windows-support","text":"When running inside a windows console (Powershell, DOS, Cygwin, Msys2) there are some quirks that MILC attempts to handle but which you need to be aware of: Commands are always run in a subshell, so that non-executable files and POSIX paths work seemlessly. Windows leaves stdin in a broken state after executing a subprocess. To avoid this MILC adds stdin=DEVNULL to the subprocess.run() call. If you need stdin to work in your executed process you can pass stdin=None .","title":"Windows Support"},{"location":"subprocesses/#building-argument-lists","text":"The most important way MILC differs from subprocess.run() is that it only accepts commands that have already been split into sequences. A lot of bugs are caused by mistakes in building command strings that are later split into a sequence of arguments in unexpected ways.","title":"Building argument lists"},{"location":"subprocesses/#capture-output","text":"By default cli.run() captures STDOUT and STDERR. If you'd like that output to be written to the terminal instead you can pass capture_output=False .","title":"Capture Output"},{"location":"subprocesses/#combining-stderr-with-stdout","text":"If you'd like to combine STDOUT and STDERR into one stream (similar to the shell construct 2>&1 ) you can pass combined_output=True .","title":"Combining STDERR with STDOUT"},{"location":"subprocesses/#text-encoding","text":"By default STDOUT and STDERR will be opened as text. If you'd like these to be bytes instead of text you can pass text=False .","title":"Text Encoding"},{"location":"subprocesses/#other-arguments","text":"All other arguments are passed directly to subprocess.run() . You can use these to further tweak the behavior of your subprocesses.","title":"Other Arguments"},{"location":"threading/","text":"Thread Safety \u00b6 MILC provides a locking mechanism you can interact with for thread safety. It will acquire and release that lock when changing any objects in memory. You can utilize this same mechanism in your own programs as needed. Under the hood it uses an RLock object to do the locking. Acquire \u00b6 You can use cli.acquire_lock(blocking=True) to prevent all write operations from happening. Other threads that want to make any changes will block until they can acquire the lock, so it's important not to hold the lock longer than necessary. When invoked with the blocking argument set to False the call will always return right away. It will return True when the lock has been acquired and False otherwise. Release \u00b6 The cli.release_lock() function will release the lock so another thread can acquire it.","title":"Thread Safety"},{"location":"threading/#thread-safety","text":"MILC provides a locking mechanism you can interact with for thread safety. It will acquire and release that lock when changing any objects in memory. You can utilize this same mechanism in your own programs as needed. Under the hood it uses an RLock object to do the locking.","title":"Thread Safety"},{"location":"threading/#acquire","text":"You can use cli.acquire_lock(blocking=True) to prevent all write operations from happening. Other threads that want to make any changes will block until they can acquire the lock, so it's important not to hold the lock longer than necessary. When invoked with the blocking argument set to False the call will always return right away. It will return True when the lock has been acquired and False otherwise.","title":"Acquire"},{"location":"threading/#release","text":"The cli.release_lock() function will release the lock so another thread can acquire it.","title":"Release"},{"location":"tutorial/","text":"MILC Tutorial \u00b6 MILC is a framework for writing CLI tools. It's goal is to make getting started easy and to grow with your program as it grows. MILC is Batteries Included- it gives you all the functionality that your users demand out of the box. Argument parsing, configuration files, flexible and configurable log output, ANSI colors, spinners, and other nicities are combined into one easy to use module. Minimal Example \u00b6 MILC works by registering functions as either the entrypoint or a subcommand. The entrypoint can be thought of as your main() , or the place where program execution begins. A minimal MILC program looks like this: #!/usr/bin/env python3 \"\"\"Hello World implementation using MILC. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'Hello, World!' ) if __name__ == '__main__' : cli () Quick Program Overview \u00b6 Before we dive into the features our program is using let's take a look at the general structure of a MILC program. We start by importing the cli object- this is where most of MILC's functionality is exposed and where a lot of important state tracking happens. Next, we've decorated our main function with cli.entrypoint() . This is how we tell MILC what function to execute and set the help text for our program. Inside our main() function we print a simple message to the log file, which by default is also printed to the user's screen. Finally, we execute our cli() program inside the familiar if __name__ == '__main__': guard. Logging and Printing \u00b6 MILC provides two mechanisms for outputting text to the user, and which one you use depends a lot on the needs of your program. Both use the same API so switching between them should be simple. For writing to stdout you have cli.echo() . This differs from python print() in two important ways- It supports tokens for colorizing your text using ANSI and it supports format strings in the same way as logging . For writing to stderr and/or log files you have cli.log . You can use these to output log messages at different levels so the CLI user can easily adjust how much output they get. ANSI color tokens are also supported in log messages on the console, and will be stripped out of log files for easy viewing. You can still use python's built-in print() if you wish, but you will not get ANSI or string formatting support. More information: ANSI Color Logging Entrypoints \u00b6 MILC does the work of setting up your execution environment then it hands off control to your entrypoint. There are two types of entrypoints in MILC- the root entrypoint and subcommand entrypoints. When you think of subcommands think of programs like git, where the first argument that doesn't start with a dash indicates what mode the program is operating in. MILC entrypoints are python callables that take a single argument- cli . When you call cli() at the end of your script it will determine the correct entrypoint to call based on the arguments the user passed. Configuration and Argument Parsing \u00b6 MILC unifies arguments and configuration files. This unified config can be accessed under cli.config . You can access this as attributes or dictionaries. These two lines are equivalent, and will return True when the user passes -v or --verbose : cli.config.general.verbose cli.config['general']['verbose'] Under the hood MILC uses ConfigParser to read and write configuration files. If you are not familiar with ConfigParser this is a sample config file: [general] verbose=true MILC maps all of the arguments for the root entrypoint into the general section. Subcommand arguments are mapped into their own section. We'll talk about this more when we introduce subcommands, for now you just need to understand that arguments are added to the general section. Building on our program from earlier we can make our program more flexible about who it is greeting by adding a new flag, --name , or -n for short: #!/usr/bin/env python3 \"\"\"Hello World implementation using MILC. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'Hello, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli () One important thing to note is that decorators are processed from the bottom to the top. You must place @cli.entrypoint directly above the function definition, and then place any cli.argument() decorators above that to avoid a stack trace. More information: Argument Parsing Configuration Subcommands \u00b6 A lot of programs use a mode of operation where the first argument that doesn't begin with - or -- is a subcommand. Popular version control programs such as git and svn are the most well known example of this pattern. MILC uses argparser's native subcommand support to implement this for you. To use it you designate functions as subcommand entrypoints using cli.subcommand . Let's extend our program from earlier to use subcommands: #!/usr/bin/env python3 \"\"\"Example MILC program that shows off many features. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'No subcommand specified!' ) cli . print_usage () @cli . subcommand ( 'Say hello.' ) def hello ( cli ): cli . echo ( ' {fg_green} Hello, %s !' , cli . config . general . name ) @cli . subcommand ( 'Say goodbye.' ) def goodbye ( cli ): cli . echo ( ' {fg_blue} Goodbye, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli () Configuration and Subcommands \u00b6 Each subcommand gets its own section in the configuration. You can access a subcommand's config with cli.config. . Options for the root entrypoint can be found in the cli.config.general section of the config. We add flags to our subcommands by decorating them with @cli.argument : @cli . argument ( '--comma' , help = 'comma in output' , action = 'store_boolean' , default = True ) User Controlled Configuration \u00b6 Using the built-in config subcommand our user can permanently set certain options so they don't have to type them in each time. We do this by adding a single line to our program, import milc.subcommand.config . Let's take a look at our final program: #!/usr/bin/env python3 \"\"\"Example MILC program that shows off many features. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli import milc.subcommand.config @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'No subcommand specified!' ) cli . print_usage () @cli . argument ( '--comma' , help = 'comma in output' , action = 'store_boolean' , default = True ) @cli . subcommand ( 'Say hello.' ) def hello ( cli ): comma = ',' if cli . config . hello . comma else '' cli . echo ( ' {fg_green} Hello %s %s !' , comma , cli . config . general . name ) @cli . argument ( '-f' , '--flag' , help = 'Write it in a flag' , action = 'store_true' ) @cli . subcommand ( 'Say goodbye.' ) def goodbye ( cli ): if cli . config . goodbye . flag : cli . log . debug ( 'Drawing a flag.' ) colors = ( ' {bg_red} ' , ' {bg_lightred_ex} ' , ' {bg_lightyellow_ex} ' , ' {bg_green} ' , ' {bg_blue} ' , ' {bg_magenta} ' ) string = 'Goodbye, %s !' % cli . config . general . name for i , letter in enumerate ( string ): color = colors [ i % len ( colors )] cli . echo ( color + letter + ' ' * 39 ) else : cli . log . warning ( 'Parting is such sweet sorrow.' ) cli . echo ( ' {fg_blue} Goodbye, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli () Example Output \u00b6 Now that we've written our program and we have a better idea what is going on, let's explore how it works. We'll start by demonstrating it with no arguments passed. We'll demonstrate entering a subcommand here: So far so good. Now let's take a look at the help output: Finally, let's combine it all together to demonstrate the use of both general and subcommand flags: Doing More \u00b6 Our program does a lot in only a few lines, but there's a lot more you can do. Explore the rest of the documentation to see everything MILC can do.","title":"Tutorial"},{"location":"tutorial/#milc-tutorial","text":"MILC is a framework for writing CLI tools. It's goal is to make getting started easy and to grow with your program as it grows. MILC is Batteries Included- it gives you all the functionality that your users demand out of the box. Argument parsing, configuration files, flexible and configurable log output, ANSI colors, spinners, and other nicities are combined into one easy to use module.","title":"MILC Tutorial"},{"location":"tutorial/#minimal-example","text":"MILC works by registering functions as either the entrypoint or a subcommand. The entrypoint can be thought of as your main() , or the place where program execution begins. A minimal MILC program looks like this: #!/usr/bin/env python3 \"\"\"Hello World implementation using MILC. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'Hello, World!' ) if __name__ == '__main__' : cli ()","title":"Minimal Example"},{"location":"tutorial/#quick-program-overview","text":"Before we dive into the features our program is using let's take a look at the general structure of a MILC program. We start by importing the cli object- this is where most of MILC's functionality is exposed and where a lot of important state tracking happens. Next, we've decorated our main function with cli.entrypoint() . This is how we tell MILC what function to execute and set the help text for our program. Inside our main() function we print a simple message to the log file, which by default is also printed to the user's screen. Finally, we execute our cli() program inside the familiar if __name__ == '__main__': guard.","title":"Quick Program Overview"},{"location":"tutorial/#logging-and-printing","text":"MILC provides two mechanisms for outputting text to the user, and which one you use depends a lot on the needs of your program. Both use the same API so switching between them should be simple. For writing to stdout you have cli.echo() . This differs from python print() in two important ways- It supports tokens for colorizing your text using ANSI and it supports format strings in the same way as logging . For writing to stderr and/or log files you have cli.log . You can use these to output log messages at different levels so the CLI user can easily adjust how much output they get. ANSI color tokens are also supported in log messages on the console, and will be stripped out of log files for easy viewing. You can still use python's built-in print() if you wish, but you will not get ANSI or string formatting support. More information: ANSI Color Logging","title":"Logging and Printing"},{"location":"tutorial/#entrypoints","text":"MILC does the work of setting up your execution environment then it hands off control to your entrypoint. There are two types of entrypoints in MILC- the root entrypoint and subcommand entrypoints. When you think of subcommands think of programs like git, where the first argument that doesn't start with a dash indicates what mode the program is operating in. MILC entrypoints are python callables that take a single argument- cli . When you call cli() at the end of your script it will determine the correct entrypoint to call based on the arguments the user passed.","title":"Entrypoints"},{"location":"tutorial/#configuration-and-argument-parsing","text":"MILC unifies arguments and configuration files. This unified config can be accessed under cli.config . You can access this as attributes or dictionaries. These two lines are equivalent, and will return True when the user passes -v or --verbose : cli.config.general.verbose cli.config['general']['verbose'] Under the hood MILC uses ConfigParser to read and write configuration files. If you are not familiar with ConfigParser this is a sample config file: [general] verbose=true MILC maps all of the arguments for the root entrypoint into the general section. Subcommand arguments are mapped into their own section. We'll talk about this more when we introduce subcommands, for now you just need to understand that arguments are added to the general section. Building on our program from earlier we can make our program more flexible about who it is greeting by adding a new flag, --name , or -n for short: #!/usr/bin/env python3 \"\"\"Hello World implementation using MILC. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'Hello, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli () One important thing to note is that decorators are processed from the bottom to the top. You must place @cli.entrypoint directly above the function definition, and then place any cli.argument() decorators above that to avoid a stack trace. More information: Argument Parsing Configuration","title":"Configuration and Argument Parsing"},{"location":"tutorial/#subcommands","text":"A lot of programs use a mode of operation where the first argument that doesn't begin with - or -- is a subcommand. Popular version control programs such as git and svn are the most well known example of this pattern. MILC uses argparser's native subcommand support to implement this for you. To use it you designate functions as subcommand entrypoints using cli.subcommand . Let's extend our program from earlier to use subcommands: #!/usr/bin/env python3 \"\"\"Example MILC program that shows off many features. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'No subcommand specified!' ) cli . print_usage () @cli . subcommand ( 'Say hello.' ) def hello ( cli ): cli . echo ( ' {fg_green} Hello, %s !' , cli . config . general . name ) @cli . subcommand ( 'Say goodbye.' ) def goodbye ( cli ): cli . echo ( ' {fg_blue} Goodbye, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli ()","title":"Subcommands"},{"location":"tutorial/#configuration-and-subcommands","text":"Each subcommand gets its own section in the configuration. You can access a subcommand's config with cli.config. . Options for the root entrypoint can be found in the cli.config.general section of the config. We add flags to our subcommands by decorating them with @cli.argument : @cli . argument ( '--comma' , help = 'comma in output' , action = 'store_boolean' , default = True )","title":"Configuration and Subcommands"},{"location":"tutorial/#user-controlled-configuration","text":"Using the built-in config subcommand our user can permanently set certain options so they don't have to type them in each time. We do this by adding a single line to our program, import milc.subcommand.config . Let's take a look at our final program: #!/usr/bin/env python3 \"\"\"Example MILC program that shows off many features. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli import milc.subcommand.config @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'No subcommand specified!' ) cli . print_usage () @cli . argument ( '--comma' , help = 'comma in output' , action = 'store_boolean' , default = True ) @cli . subcommand ( 'Say hello.' ) def hello ( cli ): comma = ',' if cli . config . hello . comma else '' cli . echo ( ' {fg_green} Hello %s %s !' , comma , cli . config . general . name ) @cli . argument ( '-f' , '--flag' , help = 'Write it in a flag' , action = 'store_true' ) @cli . subcommand ( 'Say goodbye.' ) def goodbye ( cli ): if cli . config . goodbye . flag : cli . log . debug ( 'Drawing a flag.' ) colors = ( ' {bg_red} ' , ' {bg_lightred_ex} ' , ' {bg_lightyellow_ex} ' , ' {bg_green} ' , ' {bg_blue} ' , ' {bg_magenta} ' ) string = 'Goodbye, %s !' % cli . config . general . name for i , letter in enumerate ( string ): color = colors [ i % len ( colors )] cli . echo ( color + letter + ' ' * 39 ) else : cli . log . warning ( 'Parting is such sweet sorrow.' ) cli . echo ( ' {fg_blue} Goodbye, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli ()","title":"User Controlled Configuration"},{"location":"tutorial/#example-output","text":"Now that we've written our program and we have a better idea what is going on, let's explore how it works. We'll start by demonstrating it with no arguments passed. We'll demonstrate entering a subcommand here: So far so good. Now let's take a look at the help output: Finally, let's combine it all together to demonstrate the use of both general and subcommand flags:","title":"Example Output"},{"location":"tutorial/#doing-more","text":"Our program does a lot in only a few lines, but there's a lot more you can do. Explore the rest of the documentation to see everything MILC can do.","title":"Doing More"}],"index":{"fieldVectors":[["title/",[0,5.744]],["text/",[1,0.727,2,1.228,3,1.096,4,0.961,5,1.352,6,0.925,7,1.769,8,1.798,9,0.854,10,1.479,11,1.228,12,1.317,13,1.045,14,2.266,15,0.936,16,1.438,17,1.438,18,1.592,19,0.81,20,1,21,0.744,22,0.893,23,1.045,24,0.533,25,0.893,26,1.045,27,0.786,28,1.071,29,1.045,30,0.835,31,0.344,32,2.628,33,1.438,34,1.123,35,1.41,36,1.991,37,1.989,38,1.045,39,1.438,40,2.637,41,0.893,42,2.266,43,1.156,44,1.156,45,1.123,46,1.278,47,1.438,48,1.835,49,1.156,50,1,51,1.438,52,2.021,53,0.863,54,1,55,1.096,56,1.151,57,1.438,58,1.045,59,0.686,60,1.438,61,0.704,62,1,63,0.893,64,1.097,65,1.156,66,1.438,67,0.486,68,1.228,69,1.989,70,2.267,71,1.317,72,1.096,73,1.438,74,1.228,75,0.48,76,0.581,77,2.618,78,4.597,79,0.893,80,0.786,81,0.835,82,1.536,83,1.097,84,0.917,85,1.998,86,2.266,87,2.437,88,2.691,89,2.266,90,0.893,91,0.723,92,1.536,93,1.592,94,3.917,95,1.592,96,1.51,97,3.645,98,0.653,99,3.033,100,3.256,101,0.961,102,2.949,103,3.722,104,5.288,105,1.156,106,0.893,107,2.474,108,1.554,109,0.704,110,1.798,111,0.81,112,1.515,113,1.443,114,2.483,115,2.483,116,2.112,117,1.722,118,1.156,119,0.925,120,1.228,121,1.798,122,1.352,123,0.835,124,1.438,125,0.743,126,0.723,127,1.228,128,1.228,129,1.228,130,0.961,131,0.925]],["title/#milc-an-opinionated-batteries-included-python-3-cli-framework",[1,0.308,2,1.576,3,1.407,4,1.233,5,1.009,6,1.187,7,0.495,8,1.342]],["text/#milc-an-opinionated-batteries-included-python-3-cli-framework",[1,0.703,5,2.301,7,1.864,8,3.06,10,1.911,11,3.594,12,3.857,13,3.06,14,2.929,15,1.593,16,4.209,17,4.209,18,2.708,19,2.371,20,2.929,21,0.81,22,2.613,23,3.06,24,1.56,25,2.613,26,3.06,27,2.301,28,2.471,29,3.06,30,2.446,31,1.006,32,2.207,33,4.209,34,1.911,35,2.803,36,2.366,37,3.384,38,3.06,39,4.209,40,2.16,41,2.613,42,2.929,43,3.384,44,3.384,45,1.911,46,2.174,47,4.209,48,1.435,49,3.384,50,2.929,51,4.209,52,2.613,53,2.526,54,2.929,55,3.21,56,1.959,57,4.209,58,3.06,59,2.009,60,4.209,61,2.061]],["title/#getting-started",[62,2.834,63,2.528]],["text/#getting-started",[1,1.087,64,2.887,65,5.236,66,6.512,67,1.279]],["title/#reporting-bugs-and-requesting-features",[14,2.021,68,2.48,69,2.335,70,2.661]],["text/#reporting-bugs-and-requesting-features",[14,4.453,42,4.453,69,5.145,70,5.864,71,5.864,72,4.88,73,6.399]],["title/#short-example",[74,3.477,75,1.36]],["text/#short-example",[1,0.583,7,2.061,9,0.885,18,2.247,21,0.964,40,1.322,48,1.19,67,0.686,76,1.412,77,2.808,78,5.166,79,2.168,80,1.909,81,2.029,82,3.11,83,2.221,84,1.856,85,2.587,86,2.43,87,2.771,88,2.43,89,2.43,90,2.168,91,1.756,92,3.11,93,2.247,94,2.43,95,3.223,96,1.034,97,1.967,98,1.586]],["title/#output",[48,1.737]],["text/#output",[9,0.81,10,1.784,15,0.956,21,0.486,32,2.935,34,1.146,36,2.129,37,2.03,40,2.898,42,1.757,45,1.146,46,1.304,48,2.01,52,2.439,56,1.175,64,1.119,77,3.159,78,4.763,85,2.03,86,2.734,87,2.554,88,3.357,89,2.734,93,1.624,94,4.692,96,1.85,97,4.182,99,4.104,100,4.823,101,1.687,102,4.151,103,5.036,104,6.255,105,2.03,106,1.567,107,3.929,108,1.875,109,1.236,110,2.856,111,1.422,112,2.245,113,2.138,114,3.678,115,3.678,116,3.355,117,2.734,118,2.03,119,1.624,120,2.156]],["title/#breaking-changes",[121,2.961,122,2.226]],["text/#breaking-changes",[1,1.007,9,0.621,108,2.879,121,4.386,122,3.298,123,3.505,124,6.032,125,3.116,126,3.033,127,5.152,128,5.152,129,5.152,130,4.032,131,3.882]],["title/ANSI/",[35,2.207]],["text/ANSI/",[1,0.557,4,1.373,7,0.895,9,0.809,25,1.275,28,0.889,32,0.794,35,2.098,36,2.549,40,2.16,45,1.911,46,1.061,48,2.049,58,1.493,61,1.633,67,0.827,75,1.113,87,0.889,95,1.321,106,1.275,113,1.866,122,1.123,132,1.091,133,1.429,134,2.049,135,1.651,136,2.543,137,2.054,138,1.157,139,2.054,140,2.054,141,1.566,142,2.054,143,2.054,144,2.054,145,1.754,146,1.651,147,4.922,148,2.681,149,3.971,150,1.754,151,2.054,152,1.321,153,1.091,154,1.566,155,1.493,156,1.651,157,2.054,158,3.307,159,2.907,160,2.054,161,2.054,162,1.566,163,1.275,164,3.334,165,4.346,166,3.334,167,4.209,168,4.209,169,0.91,170,1.275,171,1.566,172,2.543,173,4.209,174,3.334,175,6.266,176,2.813,177,3.334,178,3.21,179,3.334,180,2.813,181,3.334,182,3.21,183,3.334,184,2.613,185,2.847,186,3.334,187,3.21,188,2.847,189,2.228,190,1.878,191,1.651,192,2.054,193,2.054,194,1.754]],["title/ANSI/#working-with-ansi-in-your-script",[35,1.468,132,1.801,133,2.359]],["text/ANSI/#working-with-ansi-in-your-script",[1,1.007,28,2.612,35,2.612,36,2.611,40,2.284,48,2.446,134,2.552,135,4.851,136,4.601,137,6.032,138,3.398]],["title/ANSI/#colorizing-log-output",[36,1.156,40,1.283,48,1.156]],["text/ANSI/#colorizing-log-output",[25,3.627,36,2.4,40,2.665,48,1.991,58,4.247,61,2.861,67,1.147,87,2.529,113,2.59,139,5.841,140,5.841,141,4.455,142,5.841,143,5.841,144,5.841,145,4.988]],["title/ANSI/#colored-log-example",[36,1.156,40,1.283,75,1.132]],["text/ANSI/#colored-log-example",[7,1.581,9,0.851,32,2.278,40,2.229,95,3.789,146,4.735,147,3.789,148,4.735,149,4.098,150,5.028,151,5.888]],["title/ANSI/#colorizing-printed-output",[36,1.156,45,1.54,48,1.156]],["text/ANSI/#colorizing-printed-output",[9,0.611,35,2.57,36,2.023,45,2.696,46,3.066,48,2.023,61,2.907,67,1.166,113,3.151,136,4.527,152,3.819,153,3.153,154,4.527,155,4.316,156,4.773]],["title/ANSI/#colored-print-example",[36,1.156,45,1.54,75,1.132]],["text/ANSI/#colored-print-example",[7,1.475,9,0.868,134,2.869,147,4.363,148,4.418,149,4.719,157,5.494,158,3.411,159,3.297,160,5.494,161,5.494,162,4.19]],["title/ANSI/#available-colors",[36,1.388,163,2.528]],["text/ANSI/#available-colors",[1,0.502,4,2.01,35,1.302,36,2.362,48,1.025,67,0.591,106,1.868,122,1.645,134,1.273,147,5.143,149,3.74,158,3.7,159,3.225,164,4.491,165,4.644,166,4.491,167,5.373,168,5.373,169,1.334,170,1.868,171,2.294,172,3.425,173,5.373,174,4.491,175,6.743,176,3.591,177,4.491,178,4.098,179,4.491,180,3.591,181,4.491,182,4.098,183,4.491,184,3.336,185,3.835,186,4.491,187,4.098,188,3.835,189,3.001,190,2.53,191,2.419,192,3.008,193,3.008,194,2.569]],["title/api__in_argv/",[195,3.274,196,3.732]],["text/api__in_argv/",[9,0.689,196,6.13]],["title/api__in_argv/#_in_argv",[196,4.671]],["text/api__in_argv/#_in_argv",[]],["title/api__sparkline/",[1,0.68,197,2.163]],["text/api__sparkline/",[1,0.94,9,0.835,21,0.305,23,1.153,25,1.67,35,2.438,36,2.65,56,0.738,61,0.777,67,0.81,83,0.703,84,0.997,91,1.352,97,0.893,109,1.715,122,0.867,125,0.819,126,1.352,147,2.655,156,1.275,158,2.562,159,4.61,165,3.409,184,1.67,190,1.515,191,1.275,197,2.991,198,3.521,199,0.738,200,1.453,201,1.275,202,2.991,203,2.638,204,1.284,205,2.991,206,5.938,207,5.338,208,3.031,209,5.338,210,4.527,211,4.293,212,2.465,213,3.031,214,1.787,215,1.39,216,1.586,217,1.058,218,1.787,219,1.275,220,1.104,221,2.051,222,3.031,223,1.453,224,1.453,225,1.787,226,1.956,227,1.787,228,1.787,229,0.703,230,1.153,231,0.797,232,1.354,233,1.787,234,1.787,235,1.275,236,1.787,237,1.586,238,1.614,239,2.051,240,1.586,241,2.69,242,4.126,243,5.153,244,4.808,245,3,246,2.297,247,3.524]],["title/api__sparkline/#_sparkline",[197,2.708]],["text/api__sparkline/#_sparkline",[109,3.217,190,3.701,197,3.49,198,3.701]],["title/api__sparkline/#arguments",[21,0.981]],["text/api__sparkline/#arguments",[1,1.16,25,2.621,35,3.009,36,2.745,147,3.679,158,3.55,159,4.789,165,3.322,197,2.242,198,2.378,202,2.366,203,2.564,205,2.366,206,6.156,207,5.536,209,5.536,210,4.111,211,3.899,237,2.771,238,2.533,239,3.219,240,2.771,241,4.221,242,5.717,243,6.02,244,5.934,245,4.157,246,3.605,247,4.882]],["title/api_ansi/",[248,5.744]],["text/api_ansi/",[1,1.073,9,0.833,28,2.184,31,1.205,35,3.331,36,1.719,40,2.433,91,2.536,112,3.292,113,2.236,134,2.719,199,2.347,249,5.683,250,4.055,251,4.621,252,5.168,253,2.085,254,3.131,255,5.043,256,5.043,257,4.307]],["title/api_ansi/#ansi",[35,2.207]],["text/api_ansi/#ansi",[1,1.097,28,2.845,35,2.845,36,2.239]],["title/api_ansi/#milcformatter-objects",[252,3.274,253,1.684]],["text/api_ansi/#milcformatter-objects",[1,1.015,9,0.791,31,1.453,40,2.73,112,2.831,252,4.891,254,3.776,255,6.082,256,6.082,257,5.194]],["title/api_attrdict/",[258,5.744]],["text/api_attrdict/",[9,0.849,91,3.008,199,3.123,204,2.156,253,2.774,254,4.165,259,5.193,260,3.371,261,3.85,262,3.371,263,7.142,264,3.564,265,4.811,266,5.483,267,3.858,268,3.633,269,3.858,270,2.4,271,4.164,272,3.02,273,3.145,274,4.14]],["title/api_attrdict/#attrdict",[259,3.706]],["text/api_attrdict/#attrdict",[]],["title/api_attrdict/#attrdict-objects",[253,1.684,259,2.961]],["text/api_attrdict/#attrdict-objects",[9,0.761,253,2.623,254,3.939,259,4.612,260,3.573,261,4.082,262,3.573]],["title/api_attrdict/#sparseattrdict-objects",[253,1.684,266,3.732]],["text/api_attrdict/#sparseattrdict-objects",[9,0.728,199,2.741,204,2.81,254,4.392,259,4.281,260,3.317,261,3.789,262,3.317,264,3.128,266,5.396,267,5.028,268,4.735,269,5.028,270,3.128,271,4.098]],["title/api_configuration/",[275,5.744]],["text/api_configuration/",[9,0.867,15,1.71,21,1.396,24,1.345,27,2.815,29,1.659,31,1.343,34,1.648,44,1.835,61,2.752,80,2.47,81,2.625,82,3.715,84,0.846,87,2.229,91,3.373,96,1.338,98,1.037,113,2.003,126,1.147,199,2.785,203,2.036,204,1.089,211,1.741,217,1.096,253,2.129,254,3.197,259,1.659,260,1.286,261,2.335,262,2.545,263,5.149,264,2.735,267,1.949,268,1.835,269,1.949,270,1.212,271,3.144,272,1.525,273,1.588,276,2.282,277,3.09,278,3.326,279,2.091,280,2.572,281,2.335,282,4.09,283,2.282,284,4.09,285,1.741,286,1.741,287,4.09,288,3.326,289,2.282,290,2.282,291,1.659,292,0.762,293,2.572,294,3.926,295,2.572,296,4.09,297,2.526,298,3.099,299,2.572,300,3.326,301,2.282,302,2.091]],["title/api_configuration/#configuration",[31,1.218]],["text/api_configuration/#configuration",[]],["title/api_configuration/#configuration-objects",[31,0.973,253,1.684]],["text/api_configuration/#configuration-objects",[9,0.725,31,1.682,34,2.653,98,2.653,199,2.719,204,2.788,254,4.371,259,4.247,267,4.988,268,4.697,269,4.988,270,3.103,271,4.066,276,5.841,277,3.506]],["title/api_configuration/#configurationsection-objects",[253,1.684,278,3.732]],["text/api_configuration/#configurationsection-objects",[9,0.773,31,1.556,254,4.043,278,5.967]],["title/api_configuration/#subparserwrapper-objects",[253,1.684,288,3.732]],["text/api_configuration/#subparserwrapper-objects",[9,0.75,15,2.341,34,2.809,253,2.557,254,3.84,288,5.667,289,6.184,290,6.184,291,4.496,292,2.065]],["title/api_emoji/",[303,4.671]],["text/api_emoji/",[1,0.75,9,0.831,40,2.256,48,1.531,49,5.962,67,1.17,76,1.816,93,3.835,116,5.089,146,3.611,147,2.89,148,3.611,149,3.125,158,2.788,159,2.695,165,4.308,176,3.001,178,3.425,180,3.001,184,2.788,187,3.425,270,2.385,303,4.115,304,4.333,305,4.491,306,3.125,307,3.425,308,4.491,309,5.959,310,3.125,311,3.835,312,3.835,313,4.491]],["title/api_emoji/#emoji",[49,4.099]],["text/api_emoji/#emoji",[1,0.759,9,0.825,40,2.274,48,1.55,49,5.757,67,1.18,76,1.838,93,3.866,116,5.131,146,3.656,147,2.925,148,3.656,149,3.164,158,2.823,159,2.728,165,4.326,176,3.038,178,3.467,180,3.038,184,2.823,187,3.467,270,2.415,303,4.166,304,4.368,305,4.546,306,3.164,307,3.467,308,4.546,309,6.008,310,3.164,311,3.882,312,3.882,313,4.546]],["title/api_milc/",[314,5.744]],["text/api_milc/",[1,0.593,2,0.66,3,0.59,4,0.517,6,0.498,7,0.769,8,0.562,9,0.863,10,0.897,15,0.293,21,1.1,22,1.226,24,1.754,31,0.772,32,1.585,34,1.113,35,1.398,36,1.101,40,1.551,41,0.883,45,1.613,46,1.266,48,1.309,52,2.005,53,0.464,59,3.186,61,2.006,63,0.883,64,1.087,67,0.93,80,0.423,82,3.048,83,1.816,84,1.062,85,2.237,87,1.538,90,1.522,91,3.242,92,0.883,96,1.624,98,1.301,101,0.951,105,1.971,106,0.48,108,0.369,109,2.006,112,0.662,113,1.432,114,1.506,115,1.085,126,0.715,130,1.32,134,2.077,138,0.436,149,0.538,153,0.411,159,0.854,162,1.085,163,0.883,165,0.826,169,1.702,171,1.085,176,1.638,178,0.59,180,0.517,182,0.59,184,0.48,187,0.59,190,1.819,199,0.919,204,1.17,217,0.866,220,0.99,231,1.441,235,0.622,244,0.66,245,0.562,253,1.469,254,0.48,260,0.436,261,0.498,264,0.411,265,1.588,270,0.411,272,0.951,273,0.538,277,0.464,281,1.577,285,1.506,291,0.562,292,0.957,294,3.609,298,1.215,301,0.773,306,1.374,315,1.603,316,0.59,317,2.856,318,0.854,319,1.215,320,1.422,321,0.756,322,1.144,323,0.854,324,1.844,325,1.374,326,0.517,327,0.871,328,1.085,329,0.871,330,0.562,331,0.517,332,0.871,333,0.99,334,0.709,335,0.709,336,0.709,337,0.709,338,0.59,339,0.709,340,0.709,341,0.709,342,0.709,343,1.603,344,0.538,345,0.871,346,0.562,347,1.303,348,2.093,349,0.871,350,3.698,351,0.709,352,3.035,353,0.871,354,0.562,355,0.871,356,0.66,357,1.471,358,0.871,359,1.506,360,2.597,361,0.709,362,0.871,363,0.871,364,0.854,365,0.871,366,0.871,367,0.871,368,0.517,369,1.614,370,0.871,371,0.709,372,1.603,373,2.225,374,0.871,375,0.48,376,0.66,377,0.436,378,1.588,379,1.766,380,1.603,381,2.762,382,1.144,383,0.871,384,1.303,385,1.81,386,0.66,387,0.66,388,0.449,389,0.464,390,1.869,391,1.686,392,1.085,393,1.422,394,1.869,395,1.686,396,1.422,397,1.422,398,1.422,399,0.622,400,1.686,401,0.871,402,0.709,403,1.603,404,0.871,405,0.871,406,0.871,407,0.622,408,0.871,409,0.48,410,1.215,411,1.085,412,1.085,413,1.215,414,1.436,415,1.506,416,1.424,417,0.66,418,0.66,419,0.773,420,0.773,421,0.773,422,0.773,423,0.773,424,0.773,425,0.66,426,0.773,427,0.773]],["title/api_milc/#milc",[1,0.851]],["text/api_milc/#milc",[]],["title/api_milc/#milc-objects",[1,0.68,253,1.684]],["text/api_milc/#milc-objects",[1,1.222,2,5.326,3,4.756,4,4.168,8,4.534,9,0.754,253,2.579,254,3.872]],["title/api_milc/#arguments",[21,0.981]],["text/api_milc/#arguments",[9,0.383,10,1.69,35,2.626,36,2.068,48,1.268,59,3.531,67,1.029,82,2.31,83,1.65,84,2.248,87,2.269,109,2.566,112,1.732,113,2.323,114,3.996,115,2.838,134,2.936,149,2.59,159,2.233,163,2.31,165,2.162,171,2.838,176,3.502,178,2.838,180,2.487,182,2.838,184,2.31,187,2.838,190,2.952,220,2.59,235,2.992,244,3.177,273,2.59,292,1.243,294,2.838,318,2.233,319,3.177,320,3.721,321,1.976,379,3.316,390,3.996,391,3.177,392,2.838,393,3.721,394,2.838,395,4.475,396,3.721,397,3.721,398,3.721,400,4.475,416,2.162,417,3.177,418,3.177,419,3.721,420,3.721,421,3.721,422,3.721,423,3.721,424,3.721,425,3.177,426,3.721,427,3.721]],["title/api_questions/",[428,4.099]],["text/api_questions/",[1,0.221,4,3.038,6,1.482,7,0.619,9,0.855,13,0.963,15,2.664,21,0.941,34,2.065,35,1.583,36,0.451,53,2.486,61,0.648,62,0.921,67,0.718,71,1.213,79,1.43,80,1.259,82,3.033,83,2.406,84,2.092,85,1.19,86,1.603,91,2.286,109,0.648,111,0.746,112,1.928,113,2.015,118,1.065,123,1.339,126,1.158,134,1.294,136,3.159,146,1.065,169,0.587,190,0.746,198,1.722,199,2.409,203,1.932,204,2.59,216,2.304,229,0.587,231,2.456,238,0.795,265,2.94,268,1.065,273,1.603,283,3.058,292,0.442,294,3.159,306,0.921,324,3.144,346,0.524,350,3.122,356,1.131,357,0.795,364,0.795,379,0.724,386,4.82,387,4.172,409,0.822,416,0.769,428,1.065,429,4.477,430,0.921,431,1.324,432,1.324,433,1.131,434,1.01,435,2.596,436,7.77,437,3.929,438,1.492,439,5.176,440,3.012,441,1.492,442,2.111,443,5.173,444,0.684,445,5.832,446,7.096,447,1.492,448,1.492,449,1.492,450,1.492,451,1.492,452,1.065,453,2.223,454,1.213,455,1.131,456,1.213,457,1.492,458,2.596,459,2.596,460,1.492,461,1.065,462,1.492,463,1.065,464,2.111,465,2.596,466,1.757,467,0.769,468,1.492,469,1.492,470,5.123,471,1.065,472,1.213,473,1.065,474,2.596,475,1.492,476,3.446,477,2.111,478,0.963,479,1.065]],["title/api_questions/#questions",[429,4.671]],["text/api_questions/#questions",[1,0.991,15,2.691,229,2.631,231,2.984,238,3.562,364,3.562,387,5.069,409,3.685,428,4.773,429,5.439,430,4.131,431,5.935,432,5.935,433,5.069,434,4.527]],["title/api_subcommand_config/",[480,4.099]],["text/api_subcommand_config/",[1,0.873,7,1.53,9,0.869,10,2.376,15,0.889,21,1.007,22,2.304,24,1.375,31,1.448,34,2.09,45,2.376,46,1.917,64,2.685,67,0.461,79,2.304,80,2.029,82,2.304,83,2.319,85,2.378,91,2.864,96,2.273,98,1.066,106,2.858,109,1.817,119,1.511,123,1.364,133,1.634,155,4.404,203,1.82,217,1.987,221,1.79,264,3.218,277,3.139,328,4.838,375,2.858,376,2.005,387,2.005,455,2.005,463,1.888,481,2.348,482,2.151,483,2.646,484,2.646,485,1.458,486,2.646,487,2.151,488,2.151,489,1.364,490,2.646,491,2.646,492,4.182,493,2.646,494,2.646,495,1.79,496,2.646,497,2.646]],["title/api_subcommand_config/#subcommandconfig",[481,5.097]],["text/api_subcommand_config/#subcommandconfig",[10,2.984,31,1.57,64,2.913,217,1.984]],["title/argcomplete/",[21,0.653,26,2.465,27,1.853]],["text/argcomplete/",[1,0.513,5,2.493,9,0.718,13,2.232,19,2.569,20,2.137,21,1.298,26,3.955,27,4.134,28,1.974,30,3.498,31,0.734,32,1.188,50,2.137,53,2.737,62,2.137,67,1.182,75,1.523,85,1.586,87,1.974,91,2.293,98,1.394,126,1.544,131,1.976,132,2.422,153,1.631,158,1.906,169,1.361,199,1.429,215,1.586,217,0.928,221,2.342,229,2.022,270,1.631,292,1.025,321,1.631,338,3.478,346,2.543,354,3.315,369,1.73,382,3.667,388,1.784,402,2.814,444,1.586,452,2.469,453,2.232,455,2.622,467,2.65,479,2.469,498,3.07,499,3.07,500,3.07,501,3.07,502,3.07,503,3.07,504,3.07,505,3.07,506,2.232,507,3.07,508,3.07,509,3.07,510,2.622,511,3.07,512,2.342,513,3.07,514,2.622,515,3.07,516,2.622,517,2.052,518,2.052,519,2.622,520,3.07,521,2.622,522,3.07,523,3.07,524,3.07,525,3.07,526,2.469,527,3.07,528,3.07,529,3.07,530,3.07,531,2.342,532,3.07,533,3.07,534,3.07]],["title/argcomplete/#argument-tab-completion-support",[21,0.559,26,2.111,27,1.588,28,1.257]],["text/argcomplete/#argument-tab-completion-support",[1,0.967,9,0.597,19,3.265,20,4.034,21,1.349,27,3.83,28,2.509,30,3.368,62,4.034,67,1.138,85,2.994,131,3.729,132,3.079,221,4.42,452,4.66,498,5.796,499,5.796]],["title/argcomplete/#prerequisites",[500,5.097]],["text/argcomplete/#prerequisites",[5,3.56,9,0.53,21,0.991,27,2.815,30,3.784,50,3.583,132,2.735,153,2.735,270,2.735,338,4.966,346,2.575,382,5.236,388,2.992,402,4.718,453,3.743,455,4.397,501,5.149,502,5.149,503,5.149,504,5.149,505,5.149,506,3.743,507,5.149,508,5.149,509,5.149,510,4.397,511,5.149,512,3.926,513,5.149,514,4.397]],["title/argcomplete/#using-tab-completion",[26,2.465,27,1.853,67,0.666]],["text/argcomplete/#using-tab-completion",[26,4.281,27,3.219,53,4.245,87,3.063,98,2.674,169,2.61,229,2.61,346,2.797,444,3.042,479,4.735,515,5.888,516,5.028,517,3.935,518,3.935]],["title/argcomplete/#adding-custom-completions",[27,1.853,321,1.801,354,2.465]],["text/argcomplete/#adding-custom-completions",[9,0.492,13,3.477,19,2.693,21,1.196,27,3.992,30,2.778,31,1.143,32,1.85,67,1.22,75,2.074,91,3.122,126,2.404,158,2.969,199,2.226,215,2.47,217,1.444,229,2.12,292,1.597,346,1.891,354,3.477,369,2.693,467,3.608,519,4.083,520,4.782,521,4.083,522,4.782,523,4.782,524,4.782,525,4.782,526,3.845,527,4.782,528,4.782,529,4.782,530,4.782,531,3.647,532,4.782,533,4.782,534,4.782]],["title/argument_parsing/",[21,0.784,22,2.528]],["text/argument_parsing/",[1,0.417,7,0.671,9,0.787,15,1.476,21,1.513,22,1.551,27,2.62,30,2.265,31,0.597,34,1.135,44,2.009,48,0.852,56,1.163,61,1.224,64,1.728,67,1.387,75,1.302,79,3.861,80,2.62,81,2.265,82,2.975,83,1.728,85,2.013,109,1.224,111,1.408,113,1.108,123,1.452,125,1.291,131,1.608,138,2.196,141,1.906,169,2.124,170,1.551,172,1.906,194,2.134,203,0.988,215,2.013,217,1.177,229,1.108,230,1.817,250,2.009,260,2.196,261,2.508,262,2.196,270,2.07,281,1.608,286,1.906,292,2.169,298,3.328,302,2.29,318,2.339,352,3.618,357,1.5,364,1.5,369,3.306,378,2.009,388,2.784,430,1.739,440,1.817,444,3.032,467,1.452,519,3.328,535,1.906,536,1.906,537,2.499,538,2.499,539,2.134,540,2.42,541,1.739,542,3.572,543,2.499,544,2.499,545,3.134,546,2.134,547,2.499,548,2.29,549,3.572,550,2.499,551,1.739,552,2.134,553,4.622,554,2.499,555,2.499,556,2.134,557,2.499,558,2.499,559,2.499,560,1.906]],["title/argument_parsing/#argument-parsing",[21,0.784,22,2.528]],["text/argument_parsing/#argument-parsing",[1,1.007,67,1.409,111,3.398,141,4.601,172,4.601,250,4.851,298,6.129,535,4.601,536,4.601,537,6.032,538,6.032,539,5.152]],["title/argument_parsing/#reading-arguments",[21,0.784,64,1.805]],["text/argument_parsing/#reading-arguments",[9,0.692,21,1.294,64,2.4,67,1.435,75,1.808,82,3.361,138,3.049,215,2.796,229,2.4,260,3.785,261,4.324,262,3.785,286,4.128,318,3.249,519,5.738,540,3.361,541,3.767,542,4.96,543,5.413,544,5.413]],["title/argument_parsing/#defining-arguments",[21,0.784,545,3.274]],["text/argument_parsing/#defining-arguments",[]],["title/argument_parsing/#argument-decorators",[21,0.784,369,2.294]],["text/argument_parsing/#argument-decorators",[9,0.692,15,2.049,21,1.542,44,4.353,67,1.32,138,3.049,169,2.4,292,2.44,318,3.249,357,3.249,369,4.116,440,3.936,444,2.796,545,4.353,546,4.623,547,5.413,548,4.96]],["title/argument_parsing/#arg_only",[82,3.165]],["text/argument_parsing/#arg_only",[7,1.532,9,0.587,21,1.336,31,1.364,34,2.591,82,3.543,170,3.543,203,2.256,215,2.948,364,3.425,369,3.214,430,3.971,444,3.585,540,3.543,542,5.229,549,5.229,550,5.706,551,3.971,552,4.873]],["title/argument_parsing/#completers",[27,2.787]],["text/argument_parsing/#completers",[9,0.631,21,1.181,27,3.962,30,4.211,56,2.854,125,3.168,131,3.946,230,4.459,292,2.048,467,3.563]],["title/argument_parsing/#deprecated",[352,3.407]],["text/argument_parsing/#deprecated",[21,1.254,48,1.755,67,1.403,75,1.719,79,4.043,83,2.283,85,3.364,109,2.521,113,2.283,123,2.992,169,2.887,217,1.555,270,3.459,302,4.718,352,4.773,378,4.14,388,3.784,444,2.66,553,6.409,554,5.149,555,5.149,556,4.397]],["title/argument_parsing/#action-store_boolean",[79,2.105,80,1.853,81,1.97]],["text/argument_parsing/#action-store_boolean",[9,0.695,15,2.064,21,1.411,61,2.67,79,4.552,80,3.69,81,3.168,83,2.418,194,4.657,217,1.647,281,3.509,292,2.448,388,3.168,444,2.817,549,4.997,557,5.453,558,5.453,559,5.453,560,4.159]],["title/breaking_changes/",[121,2.961,122,2.226]],["text/breaking_changes/",[1,0.785,9,0.747,19,1.366,21,0.733,24,1.411,28,1.05,29,1.763,31,1.123,32,1.473,34,1.101,35,1.05,36,0.827,37,1.95,46,1.253,56,1.129,67,0.476,81,1.409,84,1.411,96,1.392,98,1.729,99,2.65,108,3.406,112,1.129,117,3.706,118,1.95,119,1.56,120,2.071,121,2.768,122,2.081,125,1.967,126,1.219,127,2.071,128,2.071,129,2.071,130,1.621,132,1.288,133,3.271,169,1.075,197,1.288,198,1.366,199,1.129,200,2.222,201,1.95,203,0.959,217,1.609,221,1.849,230,1.763,231,1.219,245,1.763,246,2.071,252,1.95,291,1.763,292,1.271,317,1.95,321,2.022,334,3.489,346,1.505,352,2.544,356,2.071,364,1.455,368,1.621,378,1.95,388,3.094,399,1.95,411,1.849,416,2.731,428,1.95,437,1.95,443,2.222,444,1.253,461,1.95,478,2.768,510,2.071,531,1.849,540,1.506,551,1.688,561,2.425,562,4.207,563,1.849,564,2.425,565,2.425,566,2.425,567,2.425,568,2.425,569,3.807,570,3.141,571,4.014,572,2.425,573,2.425,574,2.425,575,2.425,576,2.425,577,3.489,578,2.425,579,2.425,580,2.425,581,3.813,582,2.425,583,2.425,584,3.271,585,1.763,586,2.425,587,2.425,588,2.425,589,2.425,590,2.071,591,2.425,592,2.425,593,2.425,594,2.425,595,2.425,596,1.849,597,2.425,598,2.071,599,2.425,600,2.425,601,1.688,602,2.425,603,2.425,604,2.425,605,2.425,606,2.425,607,2.071,608,1.849]],["title/breaking_changes/#breaking-changes",[121,2.961,122,2.226]],["text/breaking_changes/#breaking-changes",[1,0.999,108,2.856,121,4.351,122,3.271,126,3.008,127,5.11,128,5.11,129,5.11,132,3.178,133,4.164,411,4.563,561,5.984,562,4.351,563,4.563,564,5.984]],["title/breaking_changes/#version-160",[108,1.943,565,4.072]],["text/breaking_changes/#version-160",[1,0.897,28,2.327,130,3.591,197,2.854,321,2.854,416,4.232,562,5.541,566,5.374,567,5.374,568,5.374,569,6.689,570,4.47,571,6.219,572,5.374,573,5.374,574,5.374,575,5.374,576,5.374,577,4.924,578,5.374]],["title/breaking_changes/#version-150",[108,1.943,577,3.732]],["text/breaking_changes/#version-150",[9,0.735,21,1.152,24,2.217,96,1.772,169,2.653,321,3.178,352,3.999,364,3.591,368,3.999,378,4.812,540,3.715,579,5.984,580,5.984,581,3.715]],["title/breaking_changes/#version-140",[108,1.943,582,4.072]],["text/breaking_changes/#version-140",[1,0.723,9,0.446,19,2.44,24,1.605,29,3.15,31,1.39,34,1.968,37,3.484,46,2.238,56,2.017,84,2.156,96,1.283,98,2.642,117,4.888,118,3.484,119,2.788,120,3.7,125,3.006,133,4.049,199,2.017,200,3.97,201,3.484,203,1.713,217,1.984,230,3.15,231,2.178,291,3.15,292,1.943,346,1.713,352,2.896,356,3.7,388,3.381,428,3.484,437,3.484,443,3.97,444,2.238,461,3.484,478,3.15,531,3.304,551,3.015,570,2.896,581,3.613,583,4.332,584,4.572,585,3.15,586,4.332,587,4.332]],["title/breaking_changes/#version-130",[108,1.943,588,4.072]],["text/breaking_changes/#version-130",[9,0.545,21,1.02,35,2.293,36,1.805,67,1.04,99,4.613,108,3.164,112,2.465,198,2.983,217,1.6,252,4.259,334,6.074,346,2.094,388,3.852,478,3.851,510,4.523,581,3.288,589,5.296,590,4.523,591,5.296,592,5.296,593,5.296,594,5.296,595,5.296,596,4.039,597,5.296,598,4.523]],["title/breaking_changes/#version-120",[108,1.943,599,4.072]],["text/breaking_changes/#version-120",[32,2.817,96,1.831,221,4.716,581,3.84,600,6.184,601,4.304,602,6.184,603,6.184,604,6.184,605,6.184]],["title/breaking_changes/#version-110",[108,1.943,606,4.072]],["text/breaking_changes/#version-110",[31,1.529,81,3.718,245,4.652,246,5.464,399,5.145,581,3.973,607,5.464]],["title/breaking_changes/#version-100",[108,1.943,608,3.105]],["text/breaking_changes/#version-100",[108,3.192,317,5.379]],["title/configuration/",[31,1.218]],["text/configuration/",[1,0.892,7,0.555,9,0.788,10,0.938,19,2.38,20,1.437,21,1.101,23,1.501,24,1.801,25,2.079,28,0.894,29,1.501,31,1.593,32,2.638,34,1.919,38,1.501,53,2.01,61,1.011,64,1.873,67,1.183,72,1.575,76,1.354,80,1.831,81,1.2,83,1.873,84,1.241,87,1.829,92,1.282,96,2.059,105,1.661,112,0.961,123,1.2,134,0.874,145,1.764,169,0.916,198,2.38,199,0.961,203,2.872,204,2.016,217,1.82,226,1.501,229,0.916,239,1.575,245,1.501,247,1.764,260,2.38,262,1.887,264,1.779,271,1.437,272,1.38,277,1.239,286,2.554,292,1.119,312,1.764,316,1.575,319,3.608,324,2.155,333,1.437,346,0.817,357,1.239,364,2.01,368,3.248,371,1.892,375,1.282,388,1.2,407,1.661,416,1.2,430,1.437,437,1.661,467,1.2,471,1.661,473,1.661,495,1.575,535,1.575,540,3.018,541,1.437,551,1.437,552,1.764,556,1.764,584,2.94,596,1.575,607,1.764,608,1.575,609,2.693,610,2.065,611,1.764,612,1.661,613,1.661,614,1.764,615,2.693,616,2.065,617,2.065,618,1.764,619,2.065,620,2.065,621,2.065,622,1.764,623,2.86,624,1.764,625,2.065,626,2.065,627,2.065,628,2.065,629,2.065,630,2.065,631,2.065,632,2.065,633,2.065,634,2.065,635,1.892,636,2.065,637,2.065,638,1.575,639,1.575,640,2.065,641,2.065,642,3.349,643,4.225]],["title/configuration/#configuration",[31,1.218]],["text/configuration/#configuration",[1,0.931,19,3.141,20,3.881,21,1.074,24,2.536,28,2.415,29,4.055,32,2.648,61,2.731,67,1.095,76,2.255,96,2.027,112,2.596,169,2.472,346,2.205,357,3.347,375,3.462,535,4.253,540,3.462,609,4.484,610,5.577]],["title/configuration/#structure",[609,4.099]],["text/configuration/#structure",[1,0.878,7,1.412,9,0.541,21,1.27,24,2.445,25,3.265,31,1.577,34,2.997,67,1.033,80,2.875,87,2.857,92,3.265,96,1.557,203,2.609,217,1.588,264,2.793,277,3.156,292,1.756,364,3.156,407,4.229,416,3.056,552,4.491,611,4.491,612,4.229,613,4.229,614,4.491]],["title/configuration/#reading-config-values",[64,1.503,96,1.004,203,1.341]],["text/configuration/#reading-config-values",[31,1.418,64,2.631,67,1.166,96,1.758,203,2.81,204,2.833,260,4.004,262,4.004,264,3.153,271,4.131,286,4.527,541,4.131,615,4.773]],["title/configuration/#setting-config-values",[96,1.004,203,1.341,217,1.024]],["text/configuration/#setting-config-values",[9,0.642,83,2.765,203,2.466,260,3.513,272,4.168,286,4.756,312,5.326,388,3.624,615,5.015,616,6.236]],["title/configuration/#writing-configuration-files",[10,1.54,31,0.81,32,1.312]],["text/configuration/#writing-configuration-files",[9,0.626,31,1.453,32,2.79,67,1.195,96,1.801,105,4.891,333,4.233,368,4.065,467,3.534,540,3.776,617,6.082,618,5.194]],["title/configuration/#configuration-file-location",[31,0.81,32,1.312,368,2.266]],["text/configuration/#configuration-file-location",[1,1.032,9,0.777,31,1.135,32,2.392,38,3.454,67,1.215,76,1.921,87,2.057,96,1.407,123,2.76,217,2.077,239,3.623,247,4.057,316,3.623,368,4.133,556,4.057,584,4.785,608,3.623,619,4.751,620,4.751,621,4.751,622,4.057,623,5.281,624,4.057,625,4.751,626,4.751,627,4.751,628,4.751,629,4.751,630,4.751,631,4.751,632,4.751,633,4.751,634,4.751]],["title/configuration/#where-did-a-value-come-from",[203,1.61,635,3.732]],["text/configuration/#where-did-a-value-come-from",[9,0.545,19,2.983,21,1.393,31,1.266,32,2.564,64,2.348,67,1.04,72,4.039,84,2.456,96,1.963,199,2.465,203,3.087,217,1.6,229,2.348,292,1.769,364,3.179,371,4.854,430,3.686,540,4.116,551,3.686,636,5.296]],["title/configuration/#automatic-type-inference",[25,2.105,53,2.035,637,3.39]],["text/configuration/#automatic-type-inference",[1,0.783,9,0.746,19,2.642,23,3.41,31,1.121,32,1.815,34,2.13,53,2.815,80,2.564,81,2.725,83,2.719,96,1.816,134,1.984,145,4.006,198,3.849,203,2.425,204,2.927,217,1.417,226,3.41,245,3.41,319,5.835,324,3.946,437,3.772,471,3.772,473,3.772,495,3.577,596,3.577,607,4.006,638,3.577,639,3.577,640,4.69,641,4.69,642,6.133,643,6.833]],["title/installation/",[644,5.097]],["text/installation/",[1,1.27,5,3.886,12,5.439,18,3.819,28,2.57,67,1.166,506,4.316,644,7.107,645,5.439,646,4.527,647,5.439,648,6.689]],["title/logging/",[40,1.93]],["text/logging/",[1,0.829,5,2.225,7,0.709,9,0.738,10,2.254,15,1.541,21,0.509,25,1.64,31,0.631,32,2.157,35,2.149,36,2.053,40,2.87,45,1.848,48,1.692,52,3.739,56,1.23,67,0.975,75,0.882,83,1.171,84,2.357,95,1.7,99,3.455,102,3.104,103,2.256,104,4.239,110,3.609,111,1.488,112,2.596,113,2.201,114,3.104,115,3.104,119,1.7,125,1.365,131,1.7,153,1.403,154,2.015,158,1.64,163,3.082,189,2.72,190,1.488,204,1.261,215,1.365,232,2.256,253,1.092,292,1.658,304,2.959,307,2.015,311,2.256,321,1.403,324,1.7,346,1.963,434,3.104,439,2.642,442,2.421,444,2.564,456,2.421,485,1.64,541,1.839,548,2.421,635,2.421,645,2.421,647,2.421,649,2.977,650,2.124,651,2.421,652,4.586,653,2.642,654,2.642,655,2.642,656,2.642,657,2.642,658,2.642,659,2.642,660,2.642,661,2.642,662,2.642,663,2.642,664,2.642,665,1.7,666,2.256,667,2.256,668,2.642,669,2.642,670,2.642,671,2.256,672,2.642,673,4.07,674,4.07,675,2.642,676,2.642,677,2.642]],["title/logging/#writing-log-entries",[10,1.54,40,1.283,653,3.39]],["text/logging/#writing-log-entries",[5,3.453,9,0.505,10,2.229,35,2.735,36,2.153,40,2.391,52,3.048,56,2.285,67,1.241,75,1.639,95,3.159,112,2.285,113,2.176,125,2.536,131,3.159,154,3.744,158,3.048,163,3.922,190,2.765,253,2.03,304,3.569,434,3.744,485,3.048,645,4.499,654,4.909,655,4.909,656,4.909,657,4.909,658,4.909,659,4.909,660,4.909,661,4.909,662,4.909,663,4.909,664,4.909,665,3.159]],["title/logging/#verbose-mode",[110,2.961,119,2.62]],["text/logging/#verbose-mode",[1,0.91,9,0.695,45,2.476,52,3.386,67,1.071,83,2.418,84,2.021,102,5.148,110,4.908,215,2.817,292,2.254,304,3.965,307,4.159,324,3.509,346,2.669,444,3.787,456,4.997,541,3.795,666,4.657,667,4.657]],["title/logging/#controlling-log-output",[40,1.283,48,1.156,189,2.266]],["text/logging/#controlling-log-output",[7,1.105,9,0.708,10,1.869,15,1.558,21,0.792,25,2.555,32,2.66,35,1.782,36,2.181,40,2.879,45,1.869,48,1.915,52,2.555,84,2.667,99,4.453,103,3.514,104,5.464,111,2.318,112,2.978,113,2.491,114,4.285,115,4.285,163,2.555,189,2.75,204,1.964,292,1.374,311,3.514,321,2.186,346,1.627,442,3.771,647,3.771,668,4.115,669,4.115,670,4.115,671,3.514,672,4.115,673,5.619,674,5.619,675,4.115,676,4.115,677,4.115]],["title/metadata/",[584,3.547]],["text/metadata/",[1,1.274,7,1.758,9,0.81,28,1.387,31,0.766,32,1.239,42,2.23,67,0.629,68,2.736,72,2.443,76,2.647,87,2.834,98,1.455,108,3.376,152,2.062,198,2.651,217,2.137,229,2.086,251,2.936,253,1.946,271,2.23,306,2.23,316,4.253,317,2.576,318,1.923,352,2.141,368,2.141,377,1.805,385,2.936,409,1.989,453,2.329,506,2.329,531,3.588,551,2.23,553,2.736,584,4.556,585,4.055,590,4.018,596,2.443,608,2.443,622,2.736,623,2.736,624,2.736,650,2.576,665,3.028,678,2.736,679,2.736,680,4.705,681,3.204,682,3.204,683,3.204,684,2.141,685,3.204,686,2.443,687,2.576,688,3.204,689,3.204,690,3.204,691,3.204,692,2.736]],["title/metadata/#milc-metadata",[1,0.68,584,2.834]],["text/metadata/#milc-metadata",[1,1.047,7,1.907,9,0.802,31,0.946,32,1.532,42,2.756,68,3.382,72,3.02,76,2.871,87,2.716,98,1.799,108,3.229,152,2.548,198,3.083,217,2.145,229,2.427,251,3.629,253,2.263,271,2.756,316,4.174,317,3.185,318,2.377,368,2.647,377,2.231,409,2.459,453,2.88,551,2.756,553,3.382,584,4.708,608,3.02,622,3.382,623,3.382,624,3.382,665,2.548,678,3.382,679,3.382,680,5.473,681,3.96,682,3.96,683,3.96,684,2.647,685,3.96,686,3.02]],["title/metadata/#environment-based-setup",[385,3.107,585,2.465,650,2.726]],["text/metadata/#environment-based-setup",[1,1.336,9,0.731,28,2.199,67,0.997,87,2.795,108,3.387,217,1.95,306,3.534,316,3.872,352,3.394,506,3.692,531,4.922,585,4.693,590,5.512,596,3.872,665,3.267,687,4.083,688,5.078,689,5.078,690,5.078,691,5.078,692,4.336]],["title/sparklines/",[197,2.708]],["text/sparklines/",[1,0.916,6,3.281,9,0.854,18,1.217,21,0.364,28,0.819,36,2.39,45,1.805,48,1.062,56,0.88,64,1.381,67,0.371,76,1.607,84,1.473,97,1.065,99,1.316,101,2.082,109,0.926,112,0.88,122,1.034,123,1.81,126,1.567,131,1.217,134,0.8,152,1.217,153,1.004,156,1.52,159,3.482,165,1.098,184,1.174,190,1.065,197,3.824,198,2.597,202,3.394,203,1.572,204,1.487,205,3.394,206,5.334,207,3.937,209,3.937,210,3.707,211,3.516,215,1.61,217,1.54,219,1.52,223,1.732,224,1.732,226,1.375,229,1.762,235,1.52,243,4.1,253,0.782,257,1.614,262,1.065,265,1.52,272,1.264,292,1.54,323,1.135,326,1.264,328,1.442,364,1.135,379,1.034,389,1.87,399,1.52,409,1.174,433,1.614,466,2.376,471,1.52,472,1.732,473,1.52,477,1.732,487,1.732,488,1.732,489,1.098,518,1.264,560,1.442,601,1.316,665,1.217,692,1.614,693,1.891,694,1.891,695,1.891,696,1.891,697,1.891,698,1.891,699,1.891,700,1.891,701,4.224,702,4.673,703,3.937,704,4.224,705,1.891,706,1.891,707,1.891,708,1.614,709,1.614,710,1.891,711,1.891,712,1.891,713,1.891,714,1.891,715,1.891,716,1.891,717,1.891,718,1.891,719,1.891,720,1.891,721,2.661,722,2.855,723,1.891,724,1.891,725,1.891]],["title/sparklines/#sparklines",[197,2.708]],["text/sparklines/#sparklines",[9,0.583,18,3.644,56,2.635,64,3.063,97,3.19,99,3.941,109,2.773,112,2.635,131,3.644,197,3.669,477,5.189,665,3.644,693,5.662,694,5.662,695,5.662,696,5.662,697,5.662,698,5.662,699,5.662,700,5.662]],["title/sparklines/#usage",[101,3.407]],["text/sparklines/#usage",[1,0.872,6,4.227,9,0.862,45,2.371,48,1.78,76,2.111,101,3.49,123,3.034,134,2.209,197,3.818,409,3.242,518,3.49,701,6.02,702,6.02,703,4.459,704,6.02]],["title/sparklines/#whitespace",[705,5.097]],["text/sparklines/#whitespace",[1,0.809,6,3.117,9,0.861,45,2.2,48,1.651,67,0.951,76,1.959,152,3.117,190,2.729,197,3.687,198,2.729,204,2.989,235,3.895,253,2.003,265,3.895,399,3.895,433,4.137,471,3.895,472,4.439,473,3.895,703,4.137,706,4.844,707,4.844,708,4.137,709,4.137,710,4.844,711,4.844,712,4.844]],["title/sparklines/#color",[36,1.737]],["text/sparklines/#color",[1,1.015,28,2.634,36,2.458,153,3.231,197,3.831,257,5.194,323,3.65,326,4.065,389,3.65,713,6.082,714,6.082]],["title/sparklines/#negative-and-positive-numbers",[198,1.91,210,2.726,211,2.585]],["text/sparklines/#negative-and-positive-numbers",[1,0.91,9,0.561,36,2.684,84,2.021,122,2.981,123,3.168,159,4.051,184,3.386,197,2.897,198,3.802,210,5.895,211,5.591,243,4.385,292,1.821,466,4.159,715,5.453,716,5.453]],["title/sparklines/#highlight-color",[36,1.388,206,3.274]],["text/sparklines/#highlight-color",[1,0.699,9,0.769,21,0.806,36,2.468,84,2.106,126,2.104,156,3.365,159,4.345,165,2.432,206,6.406,207,5.913,209,5.913,215,2.162,217,2.092,219,3.365,223,3.835,229,2.52,243,5.568,262,2.357,292,2.156,379,2.288,466,3.192,489,2.432,560,3.192,717,4.185,718,4.185,719,4.185,720,4.185,721,4.854]],["title/sparklines/#optimization",[722,4.671]],["text/sparklines/#optimization",[1,0.741,6,3.804,9,0.847,45,2.015,76,1.794,126,2.231,197,3.766,202,5.678,203,2.629,205,5.678,215,2.292,217,1.34,224,4.066,226,3.226,229,1.967,272,2.965,328,3.383,364,2.663,389,2.663,487,4.066,488,4.066,601,3.088,692,3.789,701,5.417,702,6.093,703,5.048,704,5.417,722,4.066,723,4.437,724,4.437,725,4.437]],["title/spinners/",[59,2.433]],["text/spinners/",[6,1.22,7,1.475,9,0.885,15,0.718,59,3.766,61,0.928,63,1.939,67,1.141,75,1.705,91,0.953,98,0.861,109,1.95,125,0.979,126,0.953,134,2.16,138,1.759,153,1.659,163,1.177,195,1.524,230,1.378,231,2.002,253,0.784,260,1.068,264,1.007,272,1.267,285,3.037,292,0.633,310,1.319,321,2.115,331,1.267,344,1.319,348,2.667,354,2.27,369,1.759,379,1.036,389,1.874,390,3.521,391,1.619,392,3.037,394,4.43,395,1.619,409,1.177,410,2.667,411,2.381,412,2.381,413,3.943,414,3.712,415,3.521,416,2.314,489,2.314,517,2.661,536,1.445,545,1.524,563,1.445,684,2.087,686,1.445,726,1.445,727,1.895,728,3.4,729,1.895,730,2.861,731,2.861,732,3.122]],["title/spinners/#spinners",[59,2.433]],["text/spinners/#spinners",[6,3.29,9,0.795,15,1.936,59,3.398,63,3.175,67,1.398,125,2.641,153,2.716,195,4.111,230,3.717,231,2.571,253,2.114,344,3.558,348,4.366,369,2.88,409,3.175,410,4.366,411,3.899,412,3.899,413,6.079,415,3.899,536,3.899,563,3.899,686,3.899,726,3.899,727,5.113]],["title/spinners/#adding-a-spinner",[59,1.943,321,2.163]],["text/spinners/#adding-a-spinner",[9,0.872,59,3.409,67,1.175,109,2.213,126,2.272,138,2.545,153,2.4,163,2.805,260,2.545,264,2.4,272,3.02,292,1.509,310,3.145,321,2.4,331,3.02,379,2.47,389,3.591,390,4.563,392,3.446,394,5.116,395,3.858,413,3.858,489,2.625,517,3.02,545,3.633,728,3.858,729,4.518]],["title/spinners/#example-using-a-custom-spinner-directly",[59,1.212,67,0.499,75,0.848,138,1.431,354,1.846]],["text/spinners/#example-using-a-custom-spinner-directly",[7,1.284,9,0.885,59,3.484,109,2.342,134,2.023,390,3.647,392,3.647,394,4.736,414,3.477,489,2.778,517,3.196,684,3.196,728,4.083,730,4.382,731,4.382]],["title/spinners/#example-adding-a-custom-spinner",[59,1.386,75,0.97,321,1.543,354,2.111]],["text/spinners/#example-adding-a-custom-spinner",[7,1.607,9,0.885,59,3.546,61,2.213,109,2.213,134,1.911,390,3.446,392,3.446,394,4.563,414,3.285,489,2.625,517,3.02,684,3.02,728,3.858,730,4.14,731,4.14,732,5.984]],["title/spinners/#example-instantiating-a-spinner",[59,1.618,75,1.132,410,2.895]],["text/spinners/#example-instantiating-a-spinner",[7,1.486,9,0.868,59,3.774,63,3.436,134,2.342,285,4.221,411,4.221,414,4.024,415,4.221,416,3.216]],["title/spinners/#example-using-a-context-manager",[67,0.57,75,0.97,348,2.48,412,2.215]],["text/spinners/#example-using-a-context-manager",[7,1.607,9,0.853,59,3.409,134,2.531,285,4.563,414,4.351,415,4.563,416,3.477]],["title/spinners/#example-decorating-a-function",[75,1.132,231,1.704,369,1.91]],["text/spinners/#example-decorating-a-function",[7,1.544,9,0.854,59,3.328,91,2.891,98,2.612,134,2.433,231,2.891,285,4.385,391,4.911,414,4.181,415,4.385,416,3.341]],["title/subcommand_config/",[24,1.509,96,1.206]],["text/subcommand_config/",[1,0.469,7,1.75,9,0.814,10,0.758,11,1.425,15,1.801,21,1.055,23,1.213,24,2.219,31,1.725,34,1.275,56,0.776,64,2.109,67,0.551,75,2.125,76,1.135,84,1.347,87,0.722,96,2.092,97,0.94,98,1.275,106,1.036,109,1.375,112,1.692,113,1.245,117,1.161,123,0.969,125,0.862,132,0.886,155,1.213,163,1.036,169,2.285,170,1.036,203,2.368,204,2.858,215,0.862,217,1.922,220,1.954,232,1.425,238,1.001,264,3.058,270,0.886,277,1.685,297,1.954,323,1.001,328,1.272,357,1.001,375,2.257,376,1.425,377,0.94,379,0.912,389,1.001,412,1.272,430,1.161,461,1.341,463,2.258,467,1.631,480,1.341,485,1.743,489,1.631,495,2.141,518,1.115,536,1.272,562,1.213,570,1.115,581,1.743,671,1.425,678,1.425,684,1.115,686,1.272,708,1.425,709,1.425,733,1.668,734,1.668,735,1.668,736,1.668,737,1.668,738,1.668,739,1.668,740,1.668,741,1.425,742,2.041,743,3.331,744,3.331,745,3.331,746,2.808,747,2.808,748,2.808,749,3.331,750,1.668,751,1.668,752,3.628,753,3.628,754,3.628,755,3.628,756,3.628,757,1.668,758,3.931,759,1.668,760,3.104,761,1.668,762,1.668,763,1.668,764,1.425,765,1.668,766,1.668,767,1.668,768,1.668,769,1.668,770,2.573,771,3.331,772,1.668,773,2.573,774,3.331,775,1.668,776,1.668,777,1.668]],["title/subcommand_config/#milc-config-subcommand",[1,0.566,24,1.256,96,1.004]],["text/subcommand_config/#milc-config-subcommand",[24,2.392,96,1.912,132,3.429,163,4.008,562,4.693,733,6.455]],["title/subcommand_config/#introduction",[734,5.097]],["text/subcommand_config/#introduction",[1,0.848,11,4.336,15,2.444,21,1.243,24,2.767,31,1.542,64,2.251,76,2.61,87,2.199,96,1.912,125,2.623,217,1.534,220,3.534,232,4.336,238,3.048,264,3.429,412,3.872,461,4.083,480,4.083,489,2.95,709,4.336,735,5.078,736,5.078,737,5.078,738,5.078,739,5.078,740,5.078,741,4.336]],["title/subcommand_config/#simple-example",[75,1.36,518,2.721]],["text/subcommand_config/#simple-example",[7,1.818,9,0.741,21,0.886,23,3.346,31,1.448,64,2.041,75,1.537,96,1.363,98,2.09,169,2.685,170,2.858,204,2.891,217,1.39,270,2.445,357,2.762,389,2.762,467,2.674,489,2.674,581,3.761,684,3.076,742,4.404,743,5.551,744,5.551,745,5.551,746,6.057,747,6.057,748,6.057,749,5.551,750,4.603,751,4.603,752,3.51,753,3.51,754,3.51,755,3.51,756,3.51]],["title/subcommand_config/#setting-user-defaults",[15,1.283,84,1.256,217,1.024]],["text/subcommand_config/#setting-user-defaults",[7,1.336,9,0.763,15,1.883,21,1.227,24,1.844,31,1.189,67,0.977,75,2.128,96,1.473,169,3.116,203,2.519,204,2.374,215,2.57,217,2.123,220,3.463,297,4.434,430,3.463,744,4.559,752,3.794,753,3.794,754,3.794,755,3.794,756,3.794,757,4.975,758,4.859,759,4.975,760,4.249,761,4.975]],["title/subcommand_config/#subcommand-reference-config",[24,1.256,96,1.004,686,2.585]],["text/subcommand_config/#subcommand-reference-config",[21,1.33,24,2.098,31,1.781,67,1.112,96,1.677,98,2.571,106,3.516,113,2.51,117,3.941,123,3.29,155,4.117,328,4.318,376,4.835,463,4.553,708,4.835,762,5.662,763,5.662,764,4.835,765,5.662]],["title/subcommand_config/#setting-configuration-values",[31,0.81,203,1.341,217,1.024]],["text/subcommand_config/#setting-configuration-values",[7,1.433,9,0.783,31,1.591,75,1.782,84,1.977,96,1.972,203,2.109,204,2.546,217,1.611,264,3.537,463,4.29,536,4.068,570,3.565,752,4.068,753,4.068,754,4.068,755,4.068,756,4.068,760,4.556,766,5.335,767,5.335,768,5.335,769,5.335,770,4.889]],["title/subcommand_config/#reading-configuration-values",[31,0.81,64,1.503,203,1.341]],["text/subcommand_config/#reading-configuration-values",[31,1.682,34,2.653,56,2.719,64,2.59,109,2.861,203,2.784,217,1.765,264,3.739,277,3.506,375,3.627,379,3.194,467,3.394,758,4.455,771,6.451]],["title/subcommand_config/#all-set-options-example",[34,1.54,75,1.132,217,1.024]],["text/subcommand_config/#all-set-options-example",[7,1.796,96,1.981]],["title/subcommand_config/#entire-configuration-example",[31,0.81,75,1.132,771,3.107]],["text/subcommand_config/#entire-configuration-example",[7,1.796,96,1.981]],["title/subcommand_config/#whole-section-example",[75,1.132,277,2.035,772,3.39]],["text/subcommand_config/#whole-section-example",[7,1.78,96,1.963,97,3.734]],["title/subcommand_config/#single-key-example",[75,1.132,264,1.801,375,2.105]],["text/subcommand_config/#single-key-example",[7,1.78,96,1.963,773,6.074]],["title/subcommand_config/#multiple-keys-example",[75,1.132,264,1.801,758,2.585]],["text/subcommand_config/#multiple-keys-example",[7,1.733,15,2.444,96,1.912,112,3.004,773,5.915,774,5.915]],["title/subcommand_config/#deleting-configuration-values",[31,0.81,203,1.341,495,2.585]],["text/subcommand_config/#deleting-configuration-values",[7,1.464,9,0.789,31,1.613,75,1.821,96,1.615,112,3.142,113,2.418,203,2.156,204,3.499,217,1.647,495,4.159,671,4.657,752,4.159,753,4.159,754,4.159,755,4.159,756,4.159,774,6.186,775,5.453]],["title/subcommand_config/#multiple-operations",[485,2.528,758,3.105]],["text/subcommand_config/#multiple-operations",[7,1.412,9,0.779,10,2.388,31,1.257,64,2.331,84,1.949,96,1.557,109,2.575,169,2.331,204,3.149,323,3.156,375,3.265,377,2.962,485,3.265,678,4.491,743,4.819,745,4.819,749,4.819,752,4.01,753,4.01,754,4.01,755,4.01,756,4.01,758,4.01,760,4.491,770,4.819,776,5.259,777,5.259]],["title/subprocesses/",[778,3.706]],["text/subprocesses/",[1,0.776,7,0.514,9,0.81,18,1.232,21,1.309,24,0.71,28,1.364,32,0.741,38,2.916,41,3.623,46,3.014,48,1.75,50,1.333,56,0.891,61,0.938,67,0.619,69,1.54,75,0.64,76,1.273,77,1.54,83,1.778,84,1.486,98,2.768,111,1.079,113,0.849,125,0.989,126,2.336,132,2.13,134,1.966,138,1.774,141,1.46,150,1.635,153,2.13,169,2.953,171,1.46,190,2.259,191,1.54,199,1.466,201,1.54,215,1.627,226,1.392,229,1.778,238,1.149,262,1.079,270,1.673,274,1.755,279,1.755,281,1.232,292,1.949,294,1.46,300,1.755,310,2.791,318,1.149,322,3.736,323,3.081,324,2.581,325,3.842,326,2.68,330,2.916,331,2.105,333,2.192,335,1.755,336,1.755,338,2.402,339,1.755,340,1.755,341,1.755,342,1.755,344,2.192,350,1.635,377,3.11,379,1.047,400,1.635,409,1.189,440,1.392,452,1.54,466,1.46,482,2.886,506,1.392,514,1.635,570,1.28,598,1.635,601,1.333,764,1.635,778,3.733,779,1.915,780,3.968,781,1.915,782,1.915,783,3.736,784,3.149,785,1.915,786,1.915,787,1.915,788,1.915,789,1.915,790,1.915,791,1.915,792,1.915,793,1.915,794,1.915,795,1.635,796,1.635,797,1.915,798,1.635,799,1.915,800,1.915,801,1.915,802,1.915,803,1.915,804,1.915,805,1.915,806,1.915,807,3.149,808,1.635,809,1.915,810,1.915,811,1.392,812,1.915,813,1.915,814,1.915,815,1.915,816,1.915,817,1.915,818,1.915,819,1.915,820,1.915]],["title/subprocesses/#executing-commands-in-a-subprocess",[169,1.503,377,1.91,778,2.465]],["text/subprocesses/#executing-commands-in-a-subprocess",[1,1.041,18,4.013,24,2.311,56,2.903,98,2.832,111,3.513,132,3.313,141,4.756,238,3.743,779,6.236]],["title/subprocesses/#basic-subprocess-execution",[377,1.91,409,2.105,778,2.465]],["text/subprocesses/#basic-subprocess-execution",[7,1.137,9,0.841,21,1.339,50,2.946,67,0.831,75,1.414,77,3.404,98,3.159,125,2.187,126,3.264,169,3.084,199,1.97,215,2.959,229,1.877,262,2.384,279,3.879,292,1.414,318,2.541,330,3.078,331,2.829,335,3.879,336,3.879,338,3.228,344,2.946,764,3.615,780,4.892,781,4.233,782,4.233,783,5.594,784,5.728,785,4.233,786,4.233,787,4.233,788,4.233,789,4.233,790,4.233,791,4.233]],["title/subprocesses/#supported-arguments",[21,0.784,28,1.763]],["text/subprocesses/#supported-arguments",[21,1.345,41,4.336,46,3.608,48,2.381,83,3.096,84,1.819,98,2.229,134,2.077,138,2.765,169,3.096,190,2.765,199,2.285,226,3.569,292,1.639,294,3.744,322,3.947,323,3.791,324,4.494,325,3.416,331,3.281,333,3.416,350,4.192,377,2.765,778,3.569,792,4.909,793,4.909,794,4.909]],["title/subprocesses/#differences-from-subprocessrun",[325,2.834,326,2.721]],["text/subprocesses/#differences-from-subprocessrun",[76,2.61,153,3.429,325,4.492,326,4.314,440,4.693,780,5.512]],["title/subprocesses/#windows-support",[28,1.763,38,2.961]],["text/subprocesses/#windows-support",[1,1.037,9,0.492,32,1.85,38,4.515,61,2.342,98,2.82,132,3.299,169,2.12,201,3.845,229,2.753,281,3.077,292,1.597,300,4.382,325,3.328,344,3.328,377,3.885,452,3.845,514,4.083,570,3.196,598,4.083,601,3.328,778,3.477,795,4.083,796,4.083,797,4.782,798,4.083,799,4.782,800,4.782,801,4.782,802,4.782,803,4.782,804,4.782,805,4.782,806,4.782,807,6.21,808,4.083,809,4.782,810,4.782]],["title/subprocesses/#building-argument-lists",[21,0.653,126,1.704,330,2.465]],["text/subprocesses/#building-argument-lists",[1,0.938,21,1.082,69,4.518,76,2.272,113,2.491,153,3.652,169,3.048,190,3.873,274,5.149,325,3.911,326,3.756,330,4.085,466,4.285,482,6.301,506,4.085,811,4.085,812,5.619,813,5.619,814,5.619]],["title/subprocesses/#capture-output",[48,1.388,322,3.274]],["text/subprocesses/#capture-output",[9,0.621,41,3.745,46,3.116,48,2.056,84,2.235,171,4.601,270,3.204,292,2.015,310,4.199,322,5.771,333,4.199,780,5.152,815,6.032]],["title/subprocesses/#combining-stderr-with-stdout",[41,2.105,46,1.751,323,2.035]],["text/subprocesses/#combining-stderr-with-stdout",[9,0.735,41,3.715,46,3.091,292,1.998,310,4.164,323,4.286,338,4.563,339,5.483,340,5.483,379,3.271,400,5.11,816,5.984,817,5.984]],["title/subprocesses/#text-encoding",[134,1.723,341,3.732]],["text/subprocesses/#text-encoding",[9,0.631,41,3.808,46,3.168,84,2.273,134,3.066,150,5.237,270,3.258,292,2.048,310,4.268,342,5.62,818,6.133]],["title/subprocesses/#other-arguments",[21,0.981]],["text/subprocesses/#other-arguments",[9,0.642,21,1.201,67,1.225,138,3.513,191,5.015,292,2.083,325,4.34,778,4.534,819,6.236,820,6.236]],["title/threading/",[54,2.834,55,3.105]],["text/threading/",[1,0.668,9,0.649,10,1.818,21,0.771,54,4.73,55,4.205,67,1.083,76,1.619,83,1.775,111,2.255,117,2.786,122,3.015,130,4.216,152,2.576,199,2.566,215,2.068,217,1.209,229,1.775,231,2.013,238,2.403,253,2.28,281,2.576,324,3.548,346,1.583,351,3.669,359,5.436,360,6.184,361,5.053,425,3.419,464,3.669,485,2.486,512,4.205,570,2.676,638,3.053,639,3.053,667,3.419,726,3.053,741,3.419,821,4.003,822,4.003,823,4.003,824,4.003,825,4.003,826,3.419,827,4.003,828,4.003,829,4.003,830,4.003,831,4.003,832,4.003]],["title/threading/#thread-safety",[54,2.834,55,3.105]],["text/threading/#thread-safety",[1,0.931,54,3.881,55,4.253,67,1.095,117,3.881,122,3.049,130,3.727,152,3.588,229,2.472,238,3.347,253,2.83,346,2.205,359,4.253,360,5.954,512,5.219,638,4.253,639,4.253,741,4.762,821,5.577,822,5.577]],["title/threading/#acquire",[359,3.887]],["text/threading/#acquire",[10,2.306,21,0.978,54,3.534,67,0.997,76,2.053,83,2.251,111,2.86,122,2.776,199,3.004,215,2.623,217,1.534,281,3.267,324,4.153,351,4.653,359,4.922,360,5.706,361,5.915,425,4.336,464,4.653,485,3.153,570,3.394,667,4.336,726,3.872,823,5.078,824,5.078,825,5.078,826,4.336,827,5.078,828,5.078,829,5.078,830,5.078]],["title/threading/#release",[130,3.407]],["text/threading/#release",[54,4.415,130,4.24,231,3.189,359,4.838,360,5.944,831,6.344,832,6.344]],["title/tutorial/",[65,4.099]],["text/tutorial/",[1,0.947,3,0.467,4,0.409,5,1.492,7,1.924,8,0.445,9,0.869,10,1.089,13,0.445,14,1.123,15,1.507,18,0.394,19,0.645,20,0.426,21,0.975,22,1.002,24,2.036,28,1.038,30,1.178,31,0.848,32,1.172,34,0.52,35,1.038,36,1.209,40,1.767,41,0.38,42,0.426,43,1.297,45,1.376,46,0.316,48,1.125,50,0.426,52,1.002,53,0.687,56,1.271,58,0.833,59,0.292,61,0.3,62,0.797,63,1.259,64,0.271,65,0.492,67,0.971,74,0.523,75,0.801,76,1.526,78,2.31,79,1.002,80,0.882,81,0.665,83,0.899,84,1.012,85,1.705,86,1.412,87,2.194,88,1.9,89,2.297,90,2.986,91,1.659,92,2.591,93,1.305,94,2.771,95,1.949,96,1.288,97,2.243,101,0.765,102,0.467,106,0.711,108,0.292,110,0.445,111,0.645,112,0.533,113,0.899,119,0.737,125,0.316,132,0.857,133,0.426,134,0.683,135,0.921,136,0.467,138,0.345,147,1.757,152,0.737,153,0.608,154,0.467,155,0.833,162,1.829,165,1.178,170,1.259,172,0.467,175,0.978,176,1.078,180,1.078,182,0.467,184,0.38,185,0.523,188,0.523,189,1.078,195,0.492,199,0.285,212,0.561,217,0.487,219,0.492,220,0.426,229,0.508,231,1.659,238,0.367,239,0.467,250,0.492,253,0.253,260,0.345,261,1.038,262,0.345,273,0.797,277,1.439,281,0.737,291,0.445,292,0.539,297,1.412,304,0.445,306,0.426,307,0.467,318,0.687,321,0.857,323,0.687,326,0.765,330,0.445,331,0.765,333,0.426,337,0.561,344,0.426,346,2.172,347,0.561,357,0.968,369,1.142,375,0.711,377,1.142,379,0.882,382,0.492,384,0.561,386,0.523,388,0.356,389,1.217,407,0.921,416,0.356,417,0.523,418,0.523,434,0.467,440,0.445,444,1.565,453,0.445,454,0.561,467,0.665,478,1.173,479,0.921,480,0.921,485,0.711,489,0.665,512,0.467,516,0.523,517,0.765,518,0.765,521,0.523,526,0.921,535,0.467,539,0.523,540,0.38,541,0.426,546,0.523,560,0.467,562,0.445,563,0.467,571,0.523,581,1.002,585,0.445,601,0.426,609,0.492,611,0.978,612,0.921,613,0.921,614,0.523,615,0.492,618,0.523,638,0.873,639,0.467,646,1.547,650,0.492,651,0.561,665,0.737,666,0.523,679,0.523,684,0.409,687,0.921,721,0.523,726,0.467,742,1.985,783,0.921,795,0.978,796,0.523,798,0.523,808,0.523,811,1.743,826,0.523,833,0.612,834,1.145,835,0.612,836,1.05,837,0.612,838,1.05,839,0.612,840,1.05,841,1.631,842,1.378,843,1.631,844,0.612,845,0.612,846,0.612,847,1.378,848,1.05,849,0.612,850,0.612,851,0.612,852,0.612,853,0.612,854,0.612,855,0.612,856,1.378,857,1.145,858,0.612,859,0.612,860,1.145,861,0.612,862,0.612,863,1.479,864,0.612,865,0.612,866,0.612,867,0.612,868,0.612,869,0.612,870,0.612,871,0.612,872,0.612,873,0.612,874,0.612,875,0.612,876,0.612,877,0.612,878,0.612,879,0.612,880,3.025,881,0.612,882,0.612,883,0.612,884,0.612,885,0.612,886,1.145,887,0.612,888,0.612,889,0.612,890,0.612,891,0.612,892,0.612,893,0.612,894,0.612,895,1.05,896,1.614,897,0.612,898,0.612,899,0.612,900,0.612,901,0.612,902,0.612]],["title/tutorial/#milc-tutorial",[1,0.68,65,3.274]],["text/tutorial/#milc-tutorial",[1,1.063,3,3.794,4,3.325,7,1.336,8,3.617,10,2.259,13,3.617,15,1.883,18,3.201,19,2.802,20,3.463,21,0.958,22,3.089,31,1.523,32,1.925,35,2.154,36,1.696,40,1.883,43,5.123,48,1.696,59,2.374,62,3.463,63,3.089,67,0.977,111,2.802,231,2.501,323,2.986,346,1.967,379,2.72,434,3.794,826,4.249,833,4.975,834,6.371,835,4.975,836,4.559,837,4.975]],["title/tutorial/#minimal-example",[75,1.36,838,3.732]],["text/tutorial/#minimal-example",[1,1.175,5,2.383,7,1.971,9,0.857,15,1.65,24,1.615,30,2.532,40,1.65,67,0.856,76,1.762,87,1.887,88,4.066,89,3.033,90,4.091,91,2.191,92,4.091,93,2.804,94,4.066,132,2.315,170,2.706,231,2.191,346,2.31,377,2.455,382,3.504,478,3.169,646,3.324,838,3.994,839,4.358,840,3.994,841,3.504,842,3.722,843,3.504]],["title/tutorial/#quick-program-overview",[346,1.341,844,3.39,845,3.39]],["text/tutorial/#quick-program-overview",[1,0.967,7,1.556,9,0.721,14,2.998,32,1.666,40,1.631,45,2.632,52,2.674,63,2.674,67,0.846,76,2.343,84,1.596,85,2.225,87,1.865,92,4.067,97,2.426,134,1.822,170,2.674,217,1.301,231,3.523,253,1.781,291,3.132,297,2.998,346,2.77,369,2.426,377,3.265,417,3.678,440,3.132,453,3.132,518,2.879,535,3.285,563,3.285,609,3.463,612,3.463,613,3.463,618,3.678,666,3.678,726,3.285,742,3.132,795,4.949,808,3.678,811,3.132,846,4.307,847,3.678,848,3.947,849,4.307]],["title/tutorial/#logging-and-printing",[40,1.542,45,1.849]],["text/tutorial/#logging-and-printing",[1,0.621,5,2.034,7,0.999,9,0.624,10,2.38,15,1.984,19,2.096,28,2.851,32,2.027,35,2.851,36,2.068,40,2.726,41,2.31,42,2.59,43,2.992,45,2.38,46,1.922,48,2.068,50,2.59,52,3.253,56,1.732,58,2.705,67,1.363,76,1.504,112,2.439,113,2.323,134,2.217,135,2.992,136,2.838,152,3.372,153,2.783,154,2.838,155,3.81,195,2.992,212,3.41,219,2.992,220,2.59,229,1.65,238,2.233,304,2.705,326,3.502,346,1.471,347,3.41,379,2.034,389,3.145,512,2.838,518,2.487,651,3.41,665,2.394,796,3.177,811,2.705,850,3.721,851,3.721,852,3.721,853,3.721,854,3.721]],["title/tutorial/#entrypoints",[90,3.165]],["text/tutorial/#entrypoints",[1,1.13,5,2.516,7,1.627,9,0.474,15,1.742,21,1.303,24,2.245,53,2.762,63,2.858,90,4.765,119,2.962,132,2.445,133,3.203,189,3.076,217,1.39,239,3.51,273,3.203,281,3.898,292,1.537,297,3.203,331,3.076,346,2.395,375,2.858,377,2.593,389,2.762,418,3.931,454,4.218,485,2.858,521,3.931,585,3.346,650,3.701,721,3.931,783,3.701,855,4.603,856,3.931,857,6.057,858,4.603,859,4.603]],["title/tutorial/#configuration-and-argument-parsing",[21,0.653,22,2.105,31,0.81]],["text/tutorial/#configuration-and-argument-parsing",[1,0.996,5,1.414,7,1.766,9,0.849,10,1.175,15,1.516,21,1.214,22,1.606,24,1.483,30,1.503,31,1.17,32,1.895,40,0.979,56,2.28,64,1.147,67,0.786,74,2.209,76,1.619,83,1.147,84,0.958,85,1.336,86,2.786,87,2.582,88,2.786,89,3.409,90,2.486,91,1.3,92,2.486,93,1.664,94,2.786,95,1.664,96,1.451,97,3.106,102,1.972,110,1.88,111,1.457,138,1.457,199,1.204,229,1.147,231,1.3,260,1.457,261,2.576,262,1.457,277,2.94,292,0.864,321,2.127,330,1.88,337,2.37,344,1.8,346,1.583,357,1.552,369,2.255,379,1.414,388,1.503,389,1.552,407,3.219,444,1.336,478,2.911,479,3.219,526,2.08,540,1.606,541,1.8,581,1.606,601,1.8,611,3.419,613,2.08,615,2.08,638,3.053,639,1.972,646,1.972,665,1.664,679,2.209,687,2.08,836,2.37,841,2.08,842,2.209,843,2.08,848,2.37,856,2.209,860,4.003,861,2.586,862,2.586,863,2.37,864,2.586,865,2.586,866,2.586,867,2.586,868,2.586,869,2.586,870,2.586,871,2.586,872,2.586]],["title/tutorial/#subcommands",[24,1.889]],["text/tutorial/#subcommands",[1,0.83,5,1.45,7,2.057,9,0.875,14,1.845,15,1.004,21,0.786,24,2.459,28,1.148,30,1.541,40,1.004,45,1.204,67,1.185,75,1.363,76,1.072,84,0.982,85,1.37,86,1.845,87,2.612,88,1.845,89,2.84,90,2.534,91,2.501,92,2.534,93,1.706,94,3.462,95,2.626,96,1.209,97,2.299,101,1.772,106,1.646,108,1.265,119,1.706,162,3.112,165,2.371,172,2.022,176,1.772,180,1.772,189,1.772,231,1.333,273,1.845,318,1.591,331,1.772,346,2.209,467,1.541,485,1.646,517,1.772,539,2.264,560,2.022,646,2.022,687,2.132,742,1.928,783,2.132,811,1.928,840,2.43,841,2.132,842,2.264,843,2.132,873,2.651,874,2.651,875,2.651,876,2.651,877,2.651,878,2.651,879,2.651,880,4.559]],["title/tutorial/#configuration-and-subcommands",[24,1.509,31,0.973]],["text/tutorial/#configuration-and-subcommands",[7,1.301,9,0.853,21,0.933,24,2.321,31,1.158,34,2.2,48,1.651,61,2.372,62,3.372,78,4.776,79,3.008,80,2.649,81,2.815,83,2.148,84,1.795,85,2.503,90,3.008,96,1.855,261,3.117,277,3.759,369,2.729,444,2.503,489,2.815,526,3.895,571,4.137,614,4.137,856,4.137,881,4.844,882,4.844]],["title/tutorial/#user-controlled-configuration",[15,1.283,31,0.81,189,2.266]],["text/tutorial/#user-controlled-configuration",[1,0.486,5,0.953,7,2.02,9,0.886,10,0.792,14,1.213,15,1.103,21,0.722,24,1.625,30,1.013,34,0.792,36,1.662,40,1.421,45,0.792,48,0.594,53,1.046,58,1.267,67,0.342,75,0.582,76,1.517,78,3.719,79,1.809,80,1.593,81,1.013,83,1.291,84,1.079,85,1.938,86,1.213,87,2.282,88,1.213,89,2.027,90,1.082,91,1.887,92,1.809,93,1.122,94,3.051,95,2.821,96,1.561,97,2.114,101,1.165,106,1.082,113,1.291,147,3.392,162,2.862,165,1.693,170,1.082,175,2.488,176,1.947,180,1.947,182,1.329,184,1.082,185,1.489,188,1.489,217,0.527,250,1.402,297,1.213,306,1.213,307,1.329,318,1.046,321,0.926,346,1.484,357,1.046,375,1.082,384,1.597,444,2.265,467,1.013,480,2.342,489,1.013,517,1.165,546,1.489,646,1.329,684,1.165,742,1.267,841,1.402,843,1.402,847,1.489,880,4.469,883,1.743,884,1.743,885,1.743,886,2.913,887,1.743,888,1.743,889,1.743,890,1.743,891,1.743]],["title/tutorial/#example-output",[48,1.388,75,1.36]],["text/tutorial/#example-output",[21,0.971,24,2.381,48,1.719,63,3.131,67,0.99,85,2.605,97,2.841,132,2.679,135,4.055,170,3.131,292,1.684,297,3.51,323,3.027,333,3.51,346,1.994,386,4.307,416,2.93,444,2.605,581,3.99,612,4.055,742,5.143,847,4.307,863,5.889,892,5.043,893,5.043,894,5.043,895,4.621,896,7.073,897,5.043,898,5.043,899,5.043]],["title/tutorial/#doing-more",[56,1.895,798,3.477]],["text/tutorial/#doing-more",[1,1.015,56,2.831,125,3.142,346,2.405,357,3.65,516,5.194,562,4.422,811,5.243,895,5.574,900,6.082,901,6.082,902,6.082]]],"fields":["title","text"],"invertedIndex":[["",{"_index":9,"text":{"":{},"#breaking-changes":{},"#output":{},"#short-example":{},"ANSI/":{},"ANSI/#colored-log-example":{},"ANSI/#colored-print-example":{},"ANSI/#colorizing-printed-output":{},"api__in_argv/":{},"api__sparkline/":{},"api_ansi/":{},"api_ansi/#milcformatter-objects":{},"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"api_configuration/#configuration-objects":{},"api_configuration/#configurationsection-objects":{},"api_configuration/#subparserwrapper-objects":{},"api_emoji/":{},"api_emoji/#emoji":{},"api_milc/":{},"api_milc/#arguments":{},"api_milc/#milc-objects":{},"api_questions/":{},"api_subcommand_config/":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argcomplete/#argument-tab-completion-support":{},"argcomplete/#prerequisites":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"argument_parsing/#arg_only":{},"argument_parsing/#argument-decorators":{},"argument_parsing/#completers":{},"argument_parsing/#reading-arguments":{},"breaking_changes/":{},"breaking_changes/#version-130":{},"breaking_changes/#version-140":{},"breaking_changes/#version-150":{},"configuration/":{},"configuration/#automatic-type-inference":{},"configuration/#configuration-file-location":{},"configuration/#setting-config-values":{},"configuration/#structure":{},"configuration/#where-did-a-value-come-from":{},"configuration/#writing-configuration-files":{},"logging/":{},"logging/#controlling-log-output":{},"logging/#verbose-mode":{},"logging/#writing-log-entries":{},"metadata/":{},"metadata/#environment-based-setup":{},"metadata/#milc-metadata":{},"sparklines/":{},"sparklines/#highlight-color":{},"sparklines/#negative-and-positive-numbers":{},"sparklines/#optimization":{},"sparklines/#sparklines":{},"sparklines/#usage":{},"sparklines/#whitespace":{},"spinners/":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-decorating-a-function":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-context-manager":{},"spinners/#example-using-a-custom-spinner-directly":{},"spinners/#spinners":{},"subcommand_config/":{},"subcommand_config/#deleting-configuration-values":{},"subcommand_config/#multiple-operations":{},"subcommand_config/#setting-configuration-values":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#simple-example":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"subprocesses/#capture-output":{},"subprocesses/#combining-stderr-with-stdout":{},"subprocesses/#other-arguments":{},"subprocesses/#text-encoding":{},"subprocesses/#windows-support":{},"threading/":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#entrypoints":{},"tutorial/#logging-and-printing":{},"tutorial/#minimal-example":{},"tutorial/#quick-program-overview":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["0",{"_index":246,"text":{"api__sparkline/":{},"api__sparkline/#arguments":{},"breaking_changes/":{},"breaking_changes/#version-110":{}},"title":{}}],["1",{"_index":399,"text":{"api_milc/":{},"breaking_changes/":{},"breaking_changes/#version-110":{},"sparklines/":{},"sparklines/#whitespace":{}},"title":{}}],["1.0.0",{"_index":608,"text":{"breaking_changes/":{},"configuration/":{},"configuration/#configuration-file-location":{},"metadata/":{},"metadata/#milc-metadata":{}},"title":{"breaking_changes/#version-100":{}}}],["1.1.0",{"_index":606,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-110":{}}}],["1.2.0",{"_index":599,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-120":{}}}],["1.2.3",{"_index":591,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["1.3.0",{"_index":588,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-130":{}}}],["1.4.0",{"_index":582,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-140":{}}}],["1.4.x",{"_index":688,"text":{"metadata/":{},"metadata/#environment-based-setup":{}},"title":{}}],["1.5.0",{"_index":577,"text":{"breaking_changes/":{},"breaking_changes/#version-160":{}},"title":{"breaking_changes/#version-150":{}}}],["1.6.0",{"_index":565,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-160":{}}}],["10",{"_index":731,"text":{"spinners/":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-using-a-custom-spinner-directly":{}},"title":{}}],["100",{"_index":728,"text":{"spinners/":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-using-a-custom-spinner-directly":{}},"title":{}}],["1:1",{"_index":408,"text":{"api_milc/":{}},"title":{}}],["2",{"_index":703,"text":{"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{},"sparklines/#whitespace":{}},"title":{}}],["2>&1",{"_index":340,"text":{"api_milc/":{},"subprocesses/":{},"subprocesses/#combining-stderr-with-stdout":{}},"title":{}}],["3",{"_index":6,"text":{"":{},"api_milc/":{},"api_questions/":{},"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{},"sparklines/#whitespace":{},"spinners/":{},"spinners/#spinners":{}},"title":{"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}}}],["3.6",{"_index":12,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"installation/":{}},"title":{}}],["39",{"_index":889,"text":{"tutorial/":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["4",{"_index":714,"text":{"sparklines/":{},"sparklines/#color":{}},"title":{}}],["4.2",{"_index":505,"text":{"argcomplete/":{},"argcomplete/#prerequisites":{}},"title":{}}],["5",{"_index":701,"text":{"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{}},"title":{}}],["6",{"_index":704,"text":{"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{}},"title":{}}],["60",{"_index":57,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}},"title":{}}],["7",{"_index":712,"text":{"sparklines/":{},"sparklines/#whitespace":{}},"title":{}}],["9",{"_index":702,"text":{"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{}},"title":{}}],["abil",{"_index":60,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}},"title":{}}],["abov",{"_index":479,"text":{"api_questions/":{},"argcomplete/":{},"argcomplete/#using-tab-completion":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["accept",{"_index":466,"text":{"api_questions/":{},"sparklines/":{},"sparklines/#highlight-color":{},"sparklines/#negative-and-positive-numbers":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{}}],["access",{"_index":261,"text":{"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"api_milc/":{},"argument_parsing/":{},"argument_parsing/#reading-arguments":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{}},"title":{}}],["accord",{"_index":233,"text":{"api__sparkline/":{}},"title":{}}],["acquir",{"_index":359,"text":{"api_milc/":{},"threading/":{},"threading/#acquire":{},"threading/#release":{},"threading/#thread-safety":{}},"title":{"threading/#acquire":{}}}],["action",{"_index":79,"text":{"":{},"#short-example":{},"api_questions/":{},"api_subcommand_config/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"argument_parsing/#deprecated":{},"tutorial/":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"argument_parsing/#action-store_boolean":{}}}],["action='stor",{"_index":302,"text":{"api_configuration/":{},"argument_parsing/":{},"argument_parsing/#deprecated":{}},"title":{}}],["activ",{"_index":402,"text":{"api_milc/":{},"argcomplete/":{},"argcomplete/#prerequisites":{}},"title":{}}],["actual",{"_index":221,"text":{"api__sparkline/":{},"api_subcommand_config/":{},"argcomplete/":{},"argcomplete/#argument-tab-completion-support":{},"breaking_changes/":{},"breaking_changes/#version-120":{}},"title":{}}],["ad",{"_index":321,"text":{"api_milc/":{},"api_milc/#arguments":{},"argcomplete/":{},"breaking_changes/":{},"breaking_changes/#version-150":{},"breaking_changes/#version-160":{},"logging/":{},"logging/#controlling-log-output":{},"spinners/":{},"spinners/#adding-a-spinner":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#user-controlled-configuration":{}},"title":{"argcomplete/#adding-custom-completions":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{}}}],["add",{"_index":61,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"ANSI/":{},"ANSI/#colorizing-log-output":{},"ANSI/#colorizing-printed-output":{},"api__sparkline/":{},"api_configuration/":{},"api_milc/":{},"api_questions/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"configuration/":{},"configuration/#configuration":{},"spinners/":{},"spinners/#example-adding-a-custom-spinner":{},"subprocesses/":{},"subprocesses/#windows-support":{},"tutorial/":{},"tutorial/#configuration-and-subcommands":{}},"title":{}}],["addit",{"_index":557,"text":{"argument_parsing/":{},"argument_parsing/#action-store_boolean":{}},"title":{}}],["adjust",{"_index":219,"text":{"api__sparkline/":{},"sparklines/":{},"sparklines/#highlight-color":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["affect",{"_index":166,"text":{"ANSI/":{},"ANSI/#available-colors":{}},"title":{}}],["again",{"_index":449,"text":{"api_questions/":{}},"title":{}}],["allow",{"_index":461,"text":{"api_questions/":{},"breaking_changes/":{},"breaking_changes/#version-140":{},"subcommand_config/":{},"subcommand_config/#introduction":{}},"title":{}}],["alreadi",{"_index":274,"text":{"api_attrdict/":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{}}],["alway",{"_index":570,"text":{"breaking_changes/":{},"breaking_changes/#version-140":{},"breaking_changes/#version-160":{},"subcommand_config/":{},"subcommand_config/#setting-configuration-values":{},"subprocesses/":{},"subprocesses/#windows-support":{},"threading/":{},"threading/#acquire":{}},"title":{}}],["and/or",{"_index":42,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"#output":{},"#reporting-bugs-and-requesting-features":{},"metadata/":{},"metadata/#milc-metadata":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["anim",{"_index":395,"text":{"api_milc/":{},"api_milc/#arguments":{},"spinners/":{},"spinners/#adding-a-spinner":{}},"title":{}}],["anoth",{"_index":832,"text":{"threading/":{},"threading/#release":{}},"title":{}}],["ansi",{"_index":35,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"ANSI/":{},"ANSI/#available-colors":{},"ANSI/#colorizing-printed-output":{},"ANSI/#working-with-ansi-in-your-script":{},"api__sparkline/":{},"api__sparkline/#arguments":{},"api_ansi/":{},"api_ansi/#ansi":{},"api_milc/":{},"api_milc/#arguments":{},"api_questions/":{},"breaking_changes/":{},"breaking_changes/#version-130":{},"logging/":{},"logging/#controlling-log-output":{},"logging/#writing-log-entries":{},"tutorial/":{},"tutorial/#logging-and-printing":{},"tutorial/#milc-tutorial":{}},"title":{"ANSI/":{},"ANSI/#working-with-ansi-in-your-script":{},"api_ansi/#ansi":{}}}],["ansiemojiloglevelformatt",{"_index":594,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["ansiformatt",{"_index":592,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["ansistrippingemojiloglevelformatt",{"_index":595,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["ansistrippingformatt",{"_index":593,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["answer",{"_index":443,"text":{"api_questions/":{},"breaking_changes/":{},"breaking_changes/#version-140":{}},"title":{}}],["anyth",{"_index":669,"text":{"logging/":{},"logging/#controlling-log-output":{}},"title":{}}],["api",{"_index":195,"text":{"spinners/":{},"spinners/#spinners":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{"api__in_argv/":{}}}],["app",{"_index":590,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{},"metadata/":{},"metadata/#environment-based-setup":{}},"title":{}}],["appdir",{"_index":619,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["appli",{"_index":244,"text":{"api__sparkline/":{},"api__sparkline/#arguments":{},"api_milc/":{},"api_milc/#arguments":{}},"title":{}}],["applic",{"_index":11,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"subcommand_config/":{},"subcommand_config/#introduction":{}},"title":{}}],["application'",{"_index":620,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["appropri",{"_index":145,"text":{"ANSI/":{},"ANSI/#colorizing-log-output":{},"configuration/":{},"configuration/#automatic-type-inference":{}},"title":{}}],["arg",{"_index":82,"text":{"":{},"#short-example":{},"api_configuration/":{},"api_milc/":{},"api_milc/#arguments":{},"api_questions/":{},"api_subcommand_config/":{},"argument_parsing/":{},"argument_parsing/#arg_only":{},"argument_parsing/#reading-arguments":{}},"title":{"argument_parsing/#arg_only":{}}}],["arg1",{"_index":744,"text":{"subcommand_config/":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#simple-example":{}},"title":{}}],["arg2",{"_index":746,"text":{"subcommand_config/":{},"subcommand_config/#simple-example":{}},"title":{}}],["argcomplet",{"_index":30,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argcomplete/#argument-tab-completion-support":{},"argcomplete/#prerequisites":{},"argument_parsing/":{},"argument_parsing/#completers":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#minimal-example":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["argpars",{"_index":298,"text":{"api_configuration/":{},"api_milc/":{},"argument_parsing/":{},"argument_parsing/#argument-parsing":{}},"title":{}}],["argparser'",{"_index":876,"text":{"tutorial/":{},"tutorial/#subcommands":{}},"title":{}}],["argument",{"_index":21,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"#output":{},"#short-example":{},"api__sparkline/":{},"api_configuration/":{},"api_milc/":{},"api_questions/":{},"api_subcommand_config/":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argcomplete/#argument-tab-completion-support":{},"argcomplete/#prerequisites":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"argument_parsing/#arg_only":{},"argument_parsing/#argument-decorators":{},"argument_parsing/#completers":{},"argument_parsing/#deprecated":{},"argument_parsing/#reading-arguments":{},"breaking_changes/":{},"breaking_changes/#version-130":{},"breaking_changes/#version-150":{},"configuration/":{},"configuration/#configuration":{},"configuration/#structure":{},"configuration/#where-did-a-value-come-from":{},"logging/":{},"logging/#controlling-log-output":{},"sparklines/":{},"sparklines/#highlight-color":{},"subcommand_config/":{},"subcommand_config/#introduction":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#simple-example":{},"subcommand_config/#subcommand-reference-config":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"subprocesses/#building-argument-lists":{},"subprocesses/#other-arguments":{},"subprocesses/#supported-arguments":{},"threading/":{},"threading/#acquire":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#entrypoints":{},"tutorial/#example-output":{},"tutorial/#milc-tutorial":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"api__sparkline/#arguments":{},"api_milc/#arguments":{},"argcomplete/":{},"argcomplete/#argument-tab-completion-support":{},"argument_parsing/":{},"argument_parsing/#argument-decorators":{},"argument_parsing/#argument-parsing":{},"argument_parsing/#defining-arguments":{},"argument_parsing/#reading-arguments":{},"subprocesses/#building-argument-lists":{},"subprocesses/#other-arguments":{},"subprocesses/#supported-arguments":{},"tutorial/#configuration-and-argument-parsing":{}}}],["argumentparser.add",{"_index":547,"text":{"argument_parsing/":{},"argument_parsing/#argument-decorators":{}},"title":{}}],["argv",{"_index":196,"text":{"api__in_argv/":{}},"title":{"api__in_argv/":{},"api__in_argv/#_in_argv":{}}}],["arpcomplet",{"_index":293,"text":{"api_configuration/":{}},"title":{}}],["articl",{"_index":698,"text":{"sparklines/":{},"sparklines/#sparklines":{}},"title":{}}],["asctime)",{"_index":675,"text":{"logging/":{},"logging/#controlling-log-output":{}},"title":{}}],["ask",{"_index":431,"text":{"api_questions/":{},"api_questions/#questions":{}},"title":{}}],["assign",{"_index":616,"text":{"configuration/":{},"configuration/#setting-config-values":{}},"title":{}}],["associ",{"_index":720,"text":{"sparklines/":{},"sparklines/#highlight-color":{}},"title":{}}],["assum",{"_index":763,"text":{"subcommand_config/":{},"subcommand_config/#subcommand-reference-config":{}},"title":{}}],["attack",{"_index":161,"text":{"ANSI/":{},"ANSI/#colored-print-example":{}},"title":{}}],["attempt",{"_index":452,"text":{"api_questions/":{},"argcomplete/":{},"argcomplete/#argument-tab-completion-support":{},"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["attrdict",{"_index":259,"text":{"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"api_configuration/#configuration-objects":{}},"title":{"api_attrdict/#attrdict":{},"api_attrdict/#attrdict-objects":{}}}],["attribut",{"_index":262,"text":{"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"argument_parsing/":{},"argument_parsing/#reading-arguments":{},"configuration/":{},"configuration/#reading-config-values":{},"sparklines/":{},"sparklines/#highlight-color":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["author",{"_index":316,"text":{"api_milc/":{},"configuration/":{},"configuration/#configuration-file-location":{},"metadata/":{},"metadata/#environment-based-setup":{},"metadata/#milc-metadata":{}},"title":{}}],["automat",{"_index":25,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"ANSI/":{},"ANSI/#colorizing-log-output":{},"api__sparkline/":{},"api__sparkline/#arguments":{},"configuration/":{},"configuration/#structure":{},"logging/":{},"logging/#controlling-log-output":{}},"title":{"configuration/#automatic-type-inference":{}}}],["avail",{"_index":163,"text":{"ANSI/":{},"api_milc/":{},"api_milc/#arguments":{},"logging/":{},"logging/#controlling-log-output":{},"logging/#writing-log-entries":{},"spinners/":{},"spinners/#adding-a-spinner":{},"subcommand_config/":{},"subcommand_config/#milc-config-subcommand":{}},"title":{"ANSI/#available-colors":{}}}],["avoid",{"_index":601,"text":{"breaking_changes/":{},"breaking_changes/#version-120":{},"sparklines/":{},"sparklines/#optimization":{},"subprocesses/":{},"subprocesses/#windows-support":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["awar",{"_index":598,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{},"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["away",{"_index":830,"text":{"threading/":{},"threading/#acquire":{}},"title":{}}],["background",{"_index":168,"text":{"ANSI/":{},"ANSI/#available-colors":{}},"title":{}}],["bar",{"_index":745,"text":{"subcommand_config/":{},"subcommand_config/#multiple-operations":{},"subcommand_config/#simple-example":{}},"title":{}}],["base",{"_index":650,"text":{"logging/":{},"metadata/":{},"tutorial/":{},"tutorial/#entrypoints":{}},"title":{"metadata/#environment-based-setup":{}}}],["bash",{"_index":504,"text":{"argcomplete/":{},"argcomplete/#prerequisites":{}},"title":{}}],["basic",{"_index":409,"text":{"api_milc/":{},"api_questions/":{},"api_questions/#questions":{},"metadata/":{},"metadata/#milc-metadata":{},"sparklines/":{},"sparklines/#usage":{},"spinners/":{},"spinners/#spinners":{},"subprocesses/":{}},"title":{"subprocesses/#basic-subprocess-execution":{}}}],["bat",{"_index":747,"text":{"subcommand_config/":{},"subcommand_config/#simple-example":{}},"title":{}}],["batteri",{"_index":3,"text":{"":{},"api_milc/":{},"api_milc/#milc-objects":{},"tutorial/":{},"tutorial/#milc-tutorial":{}},"title":{"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}}}],["baz",{"_index":761,"text":{"subcommand_config/":{},"subcommand_config/#setting-user-defaults":{}},"title":{}}],["be",{"_index":334,"text":{"api_milc/":{},"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["befor",{"_index":453,"text":{"api_questions/":{},"argcomplete/":{},"argcomplete/#prerequisites":{},"metadata/":{},"metadata/#milc-metadata":{},"tutorial/":{},"tutorial/#quick-program-overview":{}},"title":{}}],["begin",{"_index":840,"text":{"tutorial/":{},"tutorial/#minimal-example":{},"tutorial/#subcommands":{}},"title":{}}],["behav",{"_index":558,"text":{"argument_parsing/":{},"argument_parsing/#action-store_boolean":{}},"title":{}}],["behavior",{"_index":191,"text":{"ANSI/":{},"ANSI/#available-colors":{},"api__sparkline/":{},"subprocesses/":{},"subprocesses/#other-arguments":{}},"title":{}}],["behind",{"_index":405,"text":{"api_milc/":{}},"title":{}}],["below",{"_index":156,"text":{"ANSI/":{},"ANSI/#colorizing-printed-output":{},"api__sparkline/":{},"sparklines/":{},"sparklines/#highlight-color":{}},"title":{}}],["better",{"_index":892,"text":{"tutorial/":{},"tutorial/#example-output":{}},"title":{}}],["between",{"_index":220,"text":{"api__sparkline/":{},"api_milc/":{},"api_milc/#arguments":{},"subcommand_config/":{},"subcommand_config/#introduction":{},"subcommand_config/#setting-user-defaults":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["bg",{"_index":147,"text":{"ANSI/":{},"ANSI/#available-colors":{},"ANSI/#colored-log-example":{},"ANSI/#colored-print-example":{},"api__sparkline/":{},"api__sparkline/#arguments":{},"api_emoji/":{},"api_emoji/#emoji":{},"tutorial/":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["binari",{"_index":793,"text":{"subprocesses/":{},"subprocesses/#supported-arguments":{}},"title":{}}],["black",{"_index":173,"text":{"ANSI/":{},"ANSI/#available-colors":{}},"title":{}}],["blank",{"_index":707,"text":{"sparklines/":{},"sparklines/#whitespace":{}},"title":{}}],["block",{"_index":361,"text":{"api_milc/":{},"threading/":{},"threading/#acquire":{}},"title":{}}],["blue",{"_index":176,"text":{"ANSI/":{},"ANSI/#available-colors":{},"api_emoji/":{},"api_emoji/#emoji":{},"api_milc/":{},"api_milc/#arguments":{},"tutorial/":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["blue}{fg",{"_index":157,"text":{"ANSI/":{},"ANSI/#colored-print-example":{}},"title":{}}],["boolean",{"_index":81,"text":{"":{},"#short-example":{},"api_configuration/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"breaking_changes/":{},"breaking_changes/#version-110":{},"configuration/":{},"configuration/#automatic-type-inference":{},"tutorial/":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"argument_parsing/#action-store_boolean":{}}}],["both",{"_index":135,"text":{"ANSI/":{},"ANSI/#working-with-ansi-in-your-script":{},"tutorial/":{},"tutorial/#example-output":{},"tutorial/#logging-and-printing":{}},"title":{}}],["bottom",{"_index":868,"text":{"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["bounc",{"_index":422,"text":{"api_milc/":{},"api_milc/#arguments":{}},"title":{}}],["boundari",{"_index":724,"text":{"sparklines/":{},"sparklines/#optimization":{}},"title":{}}],["box",{"_index":20,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"argcomplete/":{},"argcomplete/#argument-tab-completion-support":{},"configuration/":{},"configuration/#configuration":{},"tutorial/":{},"tutorial/#milc-tutorial":{}},"title":{}}],["brace",{"_index":143,"text":{"ANSI/":{},"ANSI/#colorizing-log-output":{}},"title":{}}],["break",{"_index":121,"text":{"":{},"#breaking-changes":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{}},"title":{"#breaking-changes":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{}}}],["brief",{"_index":349,"text":{"api_milc/":{}},"title":{}}],["bright",{"_index":192,"text":{"ANSI/":{},"ANSI/#available-colors":{}},"title":{}}],["broken",{"_index":514,"text":{"argcomplete/":{},"argcomplete/#prerequisites":{},"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["bug",{"_index":69,"text":{"":{},"#reporting-bugs-and-requesting-features":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{"#reporting-bugs-and-requesting-features":{}}}],["build",{"_index":330,"text":{"api_milc/":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"subprocesses/#building-argument-lists":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{"subprocesses/#building-argument-lists":{}}}],["built",{"_index":58,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"ANSI/":{},"ANSI/#colorizing-log-output":{},"tutorial/":{},"tutorial/#logging-and-printing":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["byte",{"_index":342,"text":{"api_milc/":{},"subprocesses/":{},"subprocesses/#text-encoding":{}},"title":{}}],["c",{"_index":77,"text":{"":{},"#output":{},"#short-example":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{}},"title":{}}],["c:\\document",{"_index":630,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["cach",{"_index":366,"text":{"api_milc/":{}},"title":{}}],["call",{"_index":281,"text":{"api_configuration/":{},"api_milc/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"subprocesses/":{},"subprocesses/#windows-support":{},"threading/":{},"threading/#acquire":{},"tutorial/":{},"tutorial/#entrypoints":{}},"title":{}}],["callabl",{"_index":521,"text":{"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"tutorial/":{},"tutorial/#entrypoints":{}},"title":{}}],["captur",{"_index":322,"text":{"api_milc/":{},"subprocesses/":{},"subprocesses/#capture-output":{},"subprocesses/#supported-arguments":{}},"title":{"subprocesses/#capture-output":{}}}],["case",{"_index":519,"text":{"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argument_parsing/":{},"argument_parsing/#reading-arguments":{}},"title":{}}],["caus",{"_index":812,"text":{"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{}}],["certain",{"_index":250,"text":{"api_ansi/":{},"argument_parsing/":{},"argument_parsing/#argument-parsing":{},"tutorial/":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["chang",{"_index":122,"text":{"":{},"#breaking-changes":{},"ANSI/":{},"ANSI/#available-colors":{},"api__sparkline/":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{},"sparklines/":{},"sparklines/#negative-and-positive-numbers":{},"threading/":{},"threading/#acquire":{},"threading/#thread-safety":{}},"title":{"#breaking-changes":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{}}}],["charact",{"_index":218,"text":{"api__sparkline/":{}},"title":{}}],["check",{"_index":456,"text":{"api_questions/":{},"logging/":{},"logging/#verbose-mode":{}},"title":{}}],["choic",{"_index":470,"text":{"api_questions/":{}},"title":{}}],["choos",{"_index":476,"text":{"api_questions/":{}},"title":{}}],["class",{"_index":254,"text":{"api_ansi/":{},"api_ansi/#milcformatter-objects":{},"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"api_configuration/#configuration-objects":{},"api_configuration/#configurationsection-objects":{},"api_configuration/#subparserwrapper-objects":{},"api_milc/":{},"api_milc/#milc-objects":{}},"title":{}}],["cli",{"_index":7,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"#short-example":{},"ANSI/":{},"ANSI/#colored-log-example":{},"ANSI/#colored-print-example":{},"api_milc/":{},"api_questions/":{},"api_subcommand_config/":{},"argument_parsing/":{},"argument_parsing/#arg_only":{},"configuration/":{},"configuration/#structure":{},"logging/":{},"logging/#controlling-log-output":{},"metadata/":{},"metadata/#milc-metadata":{},"spinners/":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-decorating-a-function":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-context-manager":{},"spinners/#example-using-a-custom-spinner-directly":{},"subcommand_config/":{},"subcommand_config/#all-set-options-example":{},"subcommand_config/#deleting-configuration-values":{},"subcommand_config/#entire-configuration-example":{},"subcommand_config/#multiple-keys-example":{},"subcommand_config/#multiple-operations":{},"subcommand_config/#setting-configuration-values":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#simple-example":{},"subcommand_config/#single-key-example":{},"subcommand_config/#whole-section-example":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#entrypoints":{},"tutorial/#logging-and-printing":{},"tutorial/#milc-tutorial":{},"tutorial/#minimal-example":{},"tutorial/#quick-program-overview":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}}}],["cli.acquir",{"_index":823,"text":{"threading/":{},"threading/#acquire":{}},"title":{}}],["cli.add",{"_index":729,"text":{"spinners/":{},"spinners/#adding-a-spinner":{}},"title":{}}],["cli.arg",{"_index":542,"text":{"argument_parsing/":{},"argument_parsing/#arg_only":{},"argument_parsing/#reading-arguments":{}},"title":{}}],["cli.args.verbos",{"_index":543,"text":{"argument_parsing/":{},"argument_parsing/#reading-arguments":{}},"title":{}}],["cli.args['verbos",{"_index":544,"text":{"argument_parsing/":{},"argument_parsing/#reading-arguments":{}},"title":{}}],["cli.argu",{"_index":526,"text":{"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{}},"title":{}}],["cli.config",{"_index":540,"text":{"argument_parsing/":{},"argument_parsing/#arg_only":{},"argument_parsing/#reading-arguments":{},"breaking_changes/":{},"breaking_changes/#version-150":{},"configuration/":{},"configuration/#configuration":{},"configuration/#where-did-a-value-come-from":{},"configuration/#writing-configuration-files":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["cli.config..\\appl",{"_index":631,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["settings\\florzelbop",{"_index":633,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["setup",{"_index":385,"text":{"api_milc/":{},"metadata/":{}},"title":{"metadata/#environment-based-setup":{}}}],["sever",{"_index":668,"text":{"logging/":{},"logging/#controlling-log-output":{}},"title":{}}],["share",{"_index":757,"text":{"subcommand_config/":{},"subcommand_config/#setting-user-defaults":{}},"title":{}}],["shark",{"_index":160,"text":{"ANSI/":{},"ANSI/#colored-print-example":{}},"title":{}}],["shell",{"_index":338,"text":{"api_milc/":{},"argcomplete/":{},"argcomplete/#prerequisites":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"subprocesses/#combining-stderr-with-stdout":{}},"title":{}}],["shlex.split",{"_index":329,"text":{"api_milc/":{}},"title":{}}],["short",{"_index":74,"text":{"":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{"#short-example":{}}}],["show",{"_index":106,"text":{"":{},"#output":{},"ANSI/":{},"ANSI/#available-colors":{},"api_milc/":{},"api_subcommand_config/":{},"subcommand_config/":{},"subcommand_config/#subcommand-reference-config":{},"tutorial/":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["side",{"_index":424,"text":{"api_milc/":{},"api_milc/#arguments":{}},"title":{}}],["sign",{"_index":768,"text":{"subcommand_config/":{},"subcommand_config/#setting-configuration-values":{}},"title":{}}],["signatur",{"_index":458,"text":{"api_questions/":{}},"title":{}}],["similar",{"_index":816,"text":{"subprocesses/":{},"subprocesses/#combining-stderr-with-stdout":{}},"title":{}}],["simpl",{"_index":518,"text":{"argcomplete/":{},"argcomplete/#using-tab-completion":{},"sparklines/":{},"sparklines/#usage":{},"subcommand_config/":{},"tutorial/":{},"tutorial/#logging-and-printing":{},"tutorial/#quick-program-overview":{}},"title":{"subcommand_config/#simple-example":{}}}],["simpli",{"_index":312,"text":{"api_emoji/":{},"api_emoji/#emoji":{},"configuration/":{},"configuration/#setting-config-values":{}},"title":{}}],["singl",{"_index":375,"text":{"api_milc/":{},"api_subcommand_config/":{},"configuration/":{},"configuration/#configuration":{},"subcommand_config/":{},"subcommand_config/#multiple-operations":{},"subcommand_config/#reading-configuration-values":{},"tutorial/":{},"tutorial/#entrypoints":{},"tutorial/#user-controlled-configuration":{}},"title":{"subcommand_config/#single-key-example":{}}}],["sleep",{"_index":730,"text":{"spinners/":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-using-a-custom-spinner-directly":{}},"title":{}}],["someth",{"_index":415,"text":{"api_milc/":{},"spinners/":{},"spinners/#example-decorating-a-function":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-context-manager":{},"spinners/#spinners":{}},"title":{}}],["sometim",{"_index":430,"text":{"api_questions/":{},"api_questions/#questions":{},"argument_parsing/":{},"argument_parsing/#arg_only":{},"configuration/":{},"configuration/#where-did-a-value-come-from":{},"subcommand_config/":{},"subcommand_config/#setting-user-defaults":{}},"title":{}}],["sorrow",{"_index":891,"text":{"tutorial/":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["sourc",{"_index":371,"text":{"api_milc/":{},"configuration/":{},"configuration/#where-did-a-value-come-from":{}},"title":{}}],["source.general.verbos",{"_index":636,"text":{"configuration/":{},"configuration/#where-did-a-value-come-from":{}},"title":{}}],["space",{"_index":708,"text":{"sparklines/":{},"sparklines/#whitespace":{},"subcommand_config/":{},"subcommand_config/#subcommand-reference-config":{}},"title":{}}],["spark",{"_index":228,"text":{"api__sparkline/":{}},"title":{}}],["sparklin",{"_index":197,"text":{"api__sparkline/":{},"api__sparkline/#_sparkline":{},"api__sparkline/#arguments":{},"breaking_changes/":{},"breaking_changes/#version-160":{},"sparklines/":{},"sparklines/#color":{},"sparklines/#negative-and-positive-numbers":{},"sparklines/#optimization":{},"sparklines/#sparklines":{},"sparklines/#usage":{},"sparklines/#whitespace":{}},"title":{"api__sparkline/":{},"api__sparkline/#_sparkline":{},"sparklines/":{},"sparklines/#sparklines":{}}}],["sparseattrdict",{"_index":266,"text":{"api_attrdict/":{},"api_attrdict/#sparseattrdict-objects":{}},"title":{"api_attrdict/#sparseattrdict-objects":{}}}],["special",{"_index":775,"text":{"subcommand_config/":{},"subcommand_config/#deleting-configuration-values":{}},"title":{}}],["specif",{"_index":697,"text":{"sparklines/":{},"sparklines/#sparklines":{}},"title":{}}],["specifi",{"_index":467,"text":{"api_questions/":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argument_parsing/":{},"argument_parsing/#completers":{},"configuration/":{},"configuration/#writing-configuration-files":{},"subcommand_config/":{},"subcommand_config/#reading-configuration-values":{},"subcommand_config/#simple-example":{},"tutorial/":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["spinner",{"_index":59,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"api_milc/":{},"api_milc/#arguments":{},"spinners/":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-decorating-a-function":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-context-manager":{},"spinners/#example-using-a-custom-spinner-directly":{},"spinners/#spinners":{},"tutorial/":{},"tutorial/#milc-tutorial":{}},"title":{"spinners/":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-custom-spinner-directly":{},"spinners/#spinners":{}}}],["spinners/dac4fc6571059bb9e9bc204711e9dfe8f72e5c6f/spinners.json",{"_index":420,"text":{"api_milc/":{},"api_milc/#arguments":{}},"title":{}}],["split",{"_index":482,"text":{"api_subcommand_config/":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{}}],["srv/web/htdoc",{"_index":785,"text":{"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{}},"title":{}}],["stack",{"_index":871,"text":{"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["standard",{"_index":645,"text":{"installation/":{},"logging/":{},"logging/#writing-log-entries":{}},"title":{}}],["start",{"_index":63,"text":{"":{},"api_milc/":{},"spinners/":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#spinners":{},"tutorial/":{},"tutorial/#entrypoints":{},"tutorial/#example-output":{},"tutorial/#milc-tutorial":{},"tutorial/#quick-program-overview":{}},"title":{"#getting-started":{}}}],["state",{"_index":808,"text":{"subprocesses/":{},"subprocesses/#windows-support":{},"tutorial/":{},"tutorial/#quick-program-overview":{}},"title":{}}],["stderr",{"_index":41,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"api_milc/":{},"subprocesses/":{},"subprocesses/#capture-output":{},"subprocesses/#combining-stderr-with-stdout":{},"subprocesses/#supported-arguments":{},"subprocesses/#text-encoding":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{"subprocesses/#combining-stderr-with-stdout":{}}}],["stdin",{"_index":807,"text":{"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["stdin=devnul",{"_index":809,"text":{"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["stdin=non",{"_index":810,"text":{"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["stdout",{"_index":46,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"#output":{},"ANSI/":{},"ANSI/#colorizing-printed-output":{},"api_milc/":{},"api_subcommand_config/":{},"breaking_changes/":{},"breaking_changes/#version-140":{},"subprocesses/":{},"subprocesses/#capture-output":{},"subprocesses/#combining-stderr-with-stdout":{},"subprocesses/#supported-arguments":{},"subprocesses/#text-encoding":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{"subprocesses/#combining-stderr-with-stdout":{}}}],["still",{"_index":854,"text":{"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["stop",{"_index":411,"text":{"api_milc/":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{},"spinners/":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#spinners":{}},"title":{}}],["store",{"_index":80,"text":{"":{},"#short-example":{},"api_configuration/":{},"api_milc/":{},"api_questions/":{},"api_subcommand_config/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"configuration/":{},"configuration/#automatic-type-inference":{},"configuration/#structure":{},"tutorial/":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"argument_parsing/#action-store_boolean":{}}}],["str",{"_index":460,"text":{"api_questions/":{}},"title":{}}],["straightforward",{"_index":738,"text":{"subcommand_config/":{},"subcommand_config/#introduction":{}},"title":{}}],["stream",{"_index":400,"text":{"api_milc/":{},"api_milc/#arguments":{},"subprocesses/":{},"subprocesses/#combining-stderr-with-stdout":{}},"title":{}}],["string",{"_index":113,"text":{"":{},"#output":{},"ANSI/":{},"ANSI/#colorizing-log-output":{},"ANSI/#colorizing-printed-output":{},"api_ansi/":{},"api_configuration/":{},"api_milc/":{},"api_milc/#arguments":{},"api_questions/":{},"argument_parsing/":{},"argument_parsing/#deprecated":{},"logging/":{},"logging/#controlling-log-output":{},"logging/#writing-log-entries":{},"subcommand_config/":{},"subcommand_config/#deleting-configuration-values":{},"subcommand_config/#subcommand-reference-config":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{},"tutorial/":{},"tutorial/#logging-and-printing":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["strip",{"_index":852,"text":{"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["structur",{"_index":609,"text":{"configuration/":{},"configuration/#configuration":{},"tutorial/":{},"tutorial/#quick-program-overview":{}},"title":{"configuration/#structure":{}}}],["style",{"_index":158,"text":{"ANSI/":{},"ANSI/#available-colors":{},"ANSI/#colored-print-example":{},"api__sparkline/":{},"api__sparkline/#arguments":{},"api_emoji/":{},"api_emoji/#emoji":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"logging/":{},"logging/#writing-log-entries":{}},"title":{}}],["subcommand",{"_index":24,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"api_configuration/":{},"api_milc/":{},"api_subcommand_config/":{},"breaking_changes/":{},"breaking_changes/#version-140":{},"breaking_changes/#version-150":{},"configuration/":{},"configuration/#configuration":{},"configuration/#structure":{},"subcommand_config/":{},"subcommand_config/#introduction":{},"subcommand_config/#milc-config-subcommand":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#subcommand-reference-config":{},"subprocesses/":{},"subprocesses/#executing-commands-in-a-subprocess":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#entrypoints":{},"tutorial/#example-output":{},"tutorial/#minimal-example":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"subcommand_config/":{},"subcommand_config/#milc-config-subcommand":{},"subcommand_config/#subcommand-reference-config":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#subcommands":{}}}],["subcommand'",{"_index":881,"text":{"tutorial/":{},"tutorial/#configuration-and-subcommands":{}},"title":{}}],["subcommand.config",{"_index":481,"text":{"api_subcommand_config/":{}},"title":{"api_subcommand_config/#subcommandconfig":{}}}],["subcommand|general|user>[.][=&1 . text Set to False to disable encoding and get bytes() from .stdout and .stderr . initialize_argparse \u00b6 def initialize_argparse () Prepare to process arguments from sys.argv. print_help \u00b6 def print_help ( * args , ** kwargs ) Print a help message for the main program or subcommand, depending on context. print_usage \u00b6 def print_usage ( * args , ** kwargs ) Print brief description of how the main program or subcommand is invoked, depending on context. log_deprecated_warning \u00b6 def log_deprecated_warning ( item_type , name , reason ) Logs a warning with a custom message if a argument or command is deprecated. add_argument \u00b6 def add_argument ( * args , ** kwargs ) Wrapper to add arguments and track whether they were passed on the command line. initialize_logging \u00b6 def initialize_logging ( logger ) Prepare the defaults for the logging infrastructure. acquire_lock \u00b6 def acquire_lock ( blocking = True ) Acquire the MILC lock for exclusive access to properties. release_lock \u00b6 def release_lock () Release the MILC lock. find_config_file \u00b6 @lru_cache ( maxsize = None ) def find_config_file () Locate the config file. argument \u00b6 def argument ( * args , ** kwargs ) Decorator to call self.add_argument or self. .add_argument. parse_args \u00b6 def parse_args () Parse the CLI args. read_config_file \u00b6 def read_config_file () Read in the configuration file and return Configuration objects for it and the config_source. initialize_config \u00b6 def initialize_config () Read in the configuration file and store it in self.config. merge_args_into_config \u00b6 def merge_args_into_config () Merge CLI arguments into self.config to create the runtime configuration. write_config_option \u00b6 def write_config_option ( section , option ) Save a single config option to the config file. save_config \u00b6 def save_config () Save the current configuration to the config file. __call__ \u00b6 def __call__ () Execute the entrypoint function. entrypoint \u00b6 def entrypoint ( description , deprecated = None ) Decorator that marks the entrypoint used when a subcommand is not supplied. Arguments : description A one-line description to display in --help deprecated Deprecation message. When set the subcommand will marked as deprecated and this message will be displayed in the help output. add_subcommand \u00b6 def add_subcommand ( handler , description , hidden = False , deprecated = None , ** kwargs ) Register a subcommand. Arguments : handler The function to exececute for this subcommand. description A one-line description to display in --help hidden When True don't display this command in --help deprecated Deprecation message. When set the subcommand will be marked as deprecated and this message will be displayed in help output. subcommand \u00b6 def subcommand ( description , hidden = False , ** kwargs ) Decorator to register a subcommand. Arguments : description A one-line description to display in --help hidden When True don't display this command in --help setup_logging \u00b6 def setup_logging () Called by enter () to setup the logging configuration. is_spinner \u00b6 def is_spinner ( name ) Returns true if name is a valid spinner. add_spinner \u00b6 def add_spinner ( name , spinner ) Adds a new spinner to the list of spinners. A spinner is a dictionary with two keys: interval An integer that sets how long (in ms) to wait between frames. frames A list of frames for this spinner spinner \u00b6 def spinner ( text , * args , spinner = None , animation = 'ellipsed' , placement = 'left' , color = 'blue' , interval =- 1 , stream = sys . stdout , enabled = True , ** kwargs ) Create a spinner object for showing activity to the user. This uses halo https://github.com/ManrajGrover/halo behind the scenes, most of the arguments map to Halo objects 1:1. There are 3 basic ways to use this: Instantiating a spinner and then using .start() and .stop() on your object. Using a context manager ( with cli.spinner(...): ) Decorate a function ( @cli.spinner(...) ) Instantiating a spinner \u00b6 spinner = cli . spinner ( text = 'Loading' , spinner = 'dots' ) spinner . start () # Do something here spinner . stop () Using a context manager \u00b6 with cli . spinner ( text = 'Loading' , spinner = 'dots' ): # Do something here Decorate a function \u00b6 @cli . spinner ( text = 'Loading' , spinner = 'dots' ) def long_running_function (): # Do something here Arguments \u00b6 text The text to display next to the spinner. ANSI color strings (such as {fg_blue}) will be converted into ANSI escape sequences, and the ANSI reset sequence will be added to the end of the string. If *args or **kwargs are passed they will be used to %-format the text. spinner The name of the spinner to use. Available names are here: animation The animation to apply to the text if it doesn't fit the terminal. One of `ellipsed`, `bounce`, `marquee`. placement Which side of the text to display the spinner on. One of `left`, `right`. color Color of the spinner. One of `blue`, `grey`, `red`, `green`, `yellow`, `magenta`, `cyan`, `white` interval How long in ms to wait between frames. Defaults to the spinner interval (recommended.) stream Stream to write the output. Defaults to sys.stdout. enabled Enable or disable the spinner. Defaults to `True`.","title":"milc.milc"},{"location":"api_milc/#milc","text":"","title":"milc"},{"location":"api_milc/#milc-objects","text":"class MILC ( object ) MILC - An Opinionated Batteries Included Framework","title":"MILC Objects"},{"location":"api_milc/#arguments","text":"text The text to display next to the spinner. ANSI color strings (such as {fg_blue}) will be converted into ANSI escape sequences, and the ANSI reset sequence will be added to the end of the string. If *args or **kwargs are passed they will be used to %-format the text. spinner The name of the spinner to use. Available names are here: animation The animation to apply to the text if it doesn't fit the terminal. One of `ellipsed`, `bounce`, `marquee`. placement Which side of the text to display the spinner on. One of `left`, `right`. color Color of the spinner. One of `blue`, `grey`, `red`, `green`, `yellow`, `magenta`, `cyan`, `white` interval How long in ms to wait between frames. Defaults to the spinner interval (recommended.) stream Stream to write the output. Defaults to sys.stdout. enabled Enable or disable the spinner. Defaults to `True`.","title":"Arguments"},{"location":"api_questions/","text":"questions \u00b6 Sometimes you need to ask the user a question. MILC provides basic functions for collecting and validating user input. You can find these in the milc.questions module. yesno \u00b6 def yesno ( prompt , * args , default = None , ** kwargs ) Displays prompt to the user and gets a yes or no response. Returns True for a yes and False for a no. Argument Description prompt The prompt to present to the user. Can include ANSI and format strings like milc's cli.echo() . default Whether to default to a Yes or No when the user presses enter. None- force the user to enter Y or N True- Default to yes False- Default to no If you add --yes and --no arguments to your program the user can answer questions by passing command line flags. @cli . argument ( '-y' , '--yes' , action = 'store_true' , arg_only = True , help = 'Answer yes to all questions.' ) @cli . argument ( '-n' , '--no' , action = 'store_true' , arg_only = True , help = 'Answer no to all questions.' ) password \u00b6 def password ( prompt = 'Enter password:' , * args , confirm = False , confirm_prompt = 'Confirm password:' , confirm_limit = 3 , validate = None , ** kwargs ) Securely receive a password from the user. Returns the password or None. Argument Description prompt The prompt to present to the user. Can include ANSI and format strings like milc's cli.echo() . confirm Prompt the user to type the password again and make sure they match. confirm_prompt The prompt to present to the user. Can include ANSI and format strings like milc's cli.echo() . confirm_limit Number of attempts to confirm before giving up. Default: 3 validate This is an optional function that can be used to validate the password, EG to check complexity. It should return True or False and have the following signature: def function_name(answer): question \u00b6 def question ( prompt , * args , default = None , confirm = False , answer_type = str , validate = None , ** kwargs ) Allow the user to type in a free-form string to answer. Argument Description prompt The prompt to present to the user. Can include ANSI and format strings like milc's cli.echo() . default The value to return when the user doesn't enter any value. Use None to prompt until they enter a value. confirm Present the user with a confirmation dialog before accepting their answer. answer_type Specify a type function for the answer. Will re-prompt the user if the function raises any errors. Common choices here include int, float, and decimal.Decimal. validate This is an optional function that can be used to validate the answer. It should return True or False and have the following signature: def function_name(answer, *args, **kwargs): choice \u00b6 def choice ( heading , options , * args , default = None , confirm = False , prompt = 'Please enter your choice: ' , ** kwargs ) Present the user with a list of options and let them select one. Users can enter either the number or the text of their choice. This will return the value of the item they choose, not the numerical index. Argument Description heading The text to place above the list of options. options A sequence of items to choose from. default The index of the item to return when the user doesn't enter any value. Use None to prompt until they enter a value. confirm When True present the user with a confirmation dialog before accepting their answer. prompt The prompt to present to the user. Can include color and format strings like milc's cli.echo() . Users can enter either the number or the text of their choice. Warning This will return the value of the item they choose, not the numerical index.","title":"milc.questions"},{"location":"api_questions/#questions","text":"Sometimes you need to ask the user a question. MILC provides basic functions for collecting and validating user input. You can find these in the milc.questions module.","title":"questions"},{"location":"api_subcommand_config/","text":"subcommand.config \u00b6 Read and write configuration settings print_config \u00b6 def print_config ( section , key ) Print a single config setting to stdout. show_config \u00b6 def show_config () Print the current configuration to stdout. parse_config_token \u00b6 def parse_config_token ( config_token ) Split a user-supplied configuration-token into its components. set_config \u00b6 def set_config ( section , option , value ) Set a config key in the running config. config \u00b6 @milc . cli . argument ( '-a' , '--all' , action = 'store_true' , help = 'Show all configuration options.' ) @milc . cli . argument ( '-ro' , '--read-only' , arg_only = True , action = 'store_true' , help = 'Operate in read-only mode.' ) @milc . cli . argument ( 'configs' , nargs = '*' , arg_only = True , help = 'Configuration options to read or write.' ) @milc . cli . subcommand ( \"Read and write configuration settings.\" ) def config ( cli ) Read and write config settings. This script iterates over the config_tokens supplied as argument. Each config_token has the following form: section[.key][=value] If only a section (EG 'compile') is supplied all keys for that section will be displayed. If section.key is supplied the value for that single key will be displayed. If section.key=value is supplied the value for that single key will be set. If section.key=None is supplied the key will be deleted. No validation is done to ensure that the supplied section.key is actually used by a subcommand.","title":"milc.subcommand.config"},{"location":"api_subcommand_config/#subcommandconfig","text":"Read and write configuration settings","title":"subcommand.config"},{"location":"argcomplete/","text":"Argument (Tab) Completion Support \u00b6 MILC supports argument completion out of the box using argcomplete . Getting argument completion to actually work can be a little fiddly, this page attempts to help you with that. Prerequisites \u00b6 Before argument completion will work your program must be registered with your shell. The most compatible way to do so is this: eval \"$(register-python-argcomplete my-program)\" If you have a new enough shell (EG bash 4.2 or later, zsh, fish) you can instead rely on activate-global-python-argcomplete , but in my experience that mechanism is fragile and easily broken. Using Tab Completion \u00b6 After running the command above you should be able to type the name of your program, type a partial flag name, and tab complete the rest. For many simple programs this is all you need. Adding Custom Completions \u00b6 In some cases you need to give argcomplete a custom list of completions. For example, if you want to complete hostnames out of a configuration file. You can specify this by setting completer in your argument decorator. You can use either callable or readline-style completers when you specify that. For example, to use an EnvironCompleter for an argument: def EnvironCompleter(**kwargs): return os.environ @cli.argument('-e', '--env', completer=EnvironCompleter, help='Environment Variable') @cli.entrypoint('My cool program') def my_program(cli): pass","title":"Argument (Tab) Completion"},{"location":"argcomplete/#argument-tab-completion-support","text":"MILC supports argument completion out of the box using argcomplete . Getting argument completion to actually work can be a little fiddly, this page attempts to help you with that.","title":"Argument (Tab) Completion Support"},{"location":"argcomplete/#prerequisites","text":"Before argument completion will work your program must be registered with your shell. The most compatible way to do so is this: eval \"$(register-python-argcomplete my-program)\" If you have a new enough shell (EG bash 4.2 or later, zsh, fish) you can instead rely on activate-global-python-argcomplete , but in my experience that mechanism is fragile and easily broken.","title":"Prerequisites"},{"location":"argcomplete/#using-tab-completion","text":"After running the command above you should be able to type the name of your program, type a partial flag name, and tab complete the rest. For many simple programs this is all you need.","title":"Using Tab Completion"},{"location":"argcomplete/#adding-custom-completions","text":"In some cases you need to give argcomplete a custom list of completions. For example, if you want to complete hostnames out of a configuration file. You can specify this by setting completer in your argument decorator. You can use either callable or readline-style completers when you specify that. For example, to use an EnvironCompleter for an argument: def EnvironCompleter(**kwargs): return os.environ @cli.argument('-e', '--env', completer=EnvironCompleter, help='Environment Variable') @cli.entrypoint('My cool program') def my_program(cli): pass","title":"Adding Custom Completions"},{"location":"argument_parsing/","text":"Argument Parsing \u00b6 MILC exposes the full power of argparse to you. It also extends argparse to make certain commonly used patterns easier to use. Reading Arguments \u00b6 In most cases you will want to use cli.config to read your argument. For example: cli.config.general.verbose In some cases (such as arg_only ) you will need to access the arguments directly using cli.args . You can access these using either attribute or dictionary notation: Attribute: cli.args.verbose Dictionary: cli.args['verbose'] Defining arguments \u00b6 Argument Decorators \u00b6 Argument decorators ( @argument() ) are used to define command line flags that the user has passed. For the most part the arguments passed to this decorator are passed to ArgumentParser.add_argument() directly. As such you can use all of those method arguments with MILC's @argument() decorator. arg_only \u00b6 Sometimes you want an argument to be a CLI flag only, and to not have a corresponding configuration option. With arg_only=True in your @argument() decorator this is possible. You will have to look in cli.args to find the value of that flag, it will not be populated to cli.config . completers \u00b6 You can specify argcomplete completers for your arguments by passing completers . For more detail see the argcomplete page. deprecated \u00b6 You can use the deprecated argument to mark a flag as deprecated. To use this you should set it to a string that will be displayed in --help. For example: @argument('--old', action='store_true', deprecated='Use --new instead', help='The old action for my command.') This will result in the following help output: --old The old action for my command. [Deprecated]: Use --new instead action: store_boolean \u00b6 In addition to the normal set of action= arguments that you can pass to @argument() , you can also pass a new action called store_boolean . This action behaves like store_true except that it adds a corresponding --no- flag that the user can pass as well.","title":"Argument Parsing"},{"location":"argument_parsing/#argument-parsing","text":"MILC exposes the full power of argparse to you. It also extends argparse to make certain commonly used patterns easier to use.","title":"Argument Parsing"},{"location":"argument_parsing/#reading-arguments","text":"In most cases you will want to use cli.config to read your argument. For example: cli.config.general.verbose In some cases (such as arg_only ) you will need to access the arguments directly using cli.args . You can access these using either attribute or dictionary notation: Attribute: cli.args.verbose Dictionary: cli.args['verbose']","title":"Reading Arguments"},{"location":"argument_parsing/#defining-arguments","text":"","title":"Defining arguments"},{"location":"argument_parsing/#argument-decorators","text":"Argument decorators ( @argument() ) are used to define command line flags that the user has passed. For the most part the arguments passed to this decorator are passed to ArgumentParser.add_argument() directly. As such you can use all of those method arguments with MILC's @argument() decorator.","title":"Argument Decorators"},{"location":"argument_parsing/#arg_only","text":"Sometimes you want an argument to be a CLI flag only, and to not have a corresponding configuration option. With arg_only=True in your @argument() decorator this is possible. You will have to look in cli.args to find the value of that flag, it will not be populated to cli.config .","title":"arg_only"},{"location":"argument_parsing/#completers","text":"You can specify argcomplete completers for your arguments by passing completers . For more detail see the argcomplete page.","title":"completers"},{"location":"argument_parsing/#deprecated","text":"You can use the deprecated argument to mark a flag as deprecated. To use this you should set it to a string that will be displayed in --help. For example: @argument('--old', action='store_true', deprecated='Use --new instead', help='The old action for my command.') This will result in the following help output: --old The old action for my command. [Deprecated]: Use --new instead","title":"deprecated"},{"location":"argument_parsing/#action-store_boolean","text":"In addition to the normal set of action= arguments that you can pass to @argument() , you can also pass a new action called store_boolean . This action behaves like store_true except that it adds a corresponding --no- flag that the user can pass as well.","title":"action: store_boolean"},{"location":"breaking_changes/","text":"Breaking Changes \u00b6 This is a list of breaking changes that have been made to MILC. If your script stops working after a minor or major version upgrade this document will tell you how to fix it. Version 1.6.0 \u00b6 Added support for Sparklines Moved documentation to Material for MkDocs Latest release documentation can always be found here: https://milc.clueboard.co/latest Latest in development documentation can always be found here: https://milc.clueboard.co/devel Legacy docsify documentation for MILC 1.5.0 can be found here: https://milc.clueboard.co/1.5.0 Version 1.5.0 \u00b6 Added cli.config_dir to find the location of the config directory. Arguments , commands , and subcommands can now be marked as deprecated. Version 1.4.0 \u00b6 The config subcommand now filters out configuration that has not been explicitly set. The new --all flag will allow you to see all possible configuration options and their default values. Setting program metadata through environment variables has been deprecated. In its place is the new set_metadata() function. See Metadata for more detail. MILC now tracks whether a script is running interactively or not with cli.interactive . You can pass --interactive to force a script into interactive mode even when stdout is not a TTY. milc.questions will always return the default answer when running non-interactively, unless --yes or --no are passed. Version 1.3.0 \u00b6 You can now set the program version number with os.environ['MILC_APP_VERSION'] = '1.2.3' New global arguments: --unicode and --no-unicode ANSIFormatter, ANSIStrippingFormatter, ANSIEmojiLoglevelFormatter, and ANSIStrippingEmojiLoglevelFormatter have been removed in favor of format_ansi() being color aware. The new MILCFormatter is being used in its place. Version 1.2.0 \u00b6 The config file is now resolved to the actual file which should avoid overwriting symlinks. https://github.com/qmk/qmk_cli/issues/43 Version 1.1.0 \u00b6 Configuration: 0 and 1 are now considered integers, not boolean Version 1.0.0 \u00b6 Initial Version","title":"Breaking Changes"},{"location":"breaking_changes/#breaking-changes","text":"This is a list of breaking changes that have been made to MILC. If your script stops working after a minor or major version upgrade this document will tell you how to fix it.","title":"Breaking Changes"},{"location":"breaking_changes/#version-160","text":"Added support for Sparklines Moved documentation to Material for MkDocs Latest release documentation can always be found here: https://milc.clueboard.co/latest Latest in development documentation can always be found here: https://milc.clueboard.co/devel Legacy docsify documentation for MILC 1.5.0 can be found here: https://milc.clueboard.co/1.5.0","title":"Version 1.6.0"},{"location":"breaking_changes/#version-150","text":"Added cli.config_dir to find the location of the config directory. Arguments , commands , and subcommands can now be marked as deprecated.","title":"Version 1.5.0"},{"location":"breaking_changes/#version-140","text":"The config subcommand now filters out configuration that has not been explicitly set. The new --all flag will allow you to see all possible configuration options and their default values. Setting program metadata through environment variables has been deprecated. In its place is the new set_metadata() function. See Metadata for more detail. MILC now tracks whether a script is running interactively or not with cli.interactive . You can pass --interactive to force a script into interactive mode even when stdout is not a TTY. milc.questions will always return the default answer when running non-interactively, unless --yes or --no are passed.","title":"Version 1.4.0"},{"location":"breaking_changes/#version-130","text":"You can now set the program version number with os.environ['MILC_APP_VERSION'] = '1.2.3' New global arguments: --unicode and --no-unicode ANSIFormatter, ANSIStrippingFormatter, ANSIEmojiLoglevelFormatter, and ANSIStrippingEmojiLoglevelFormatter have been removed in favor of format_ansi() being color aware. The new MILCFormatter is being used in its place.","title":"Version 1.3.0"},{"location":"breaking_changes/#version-120","text":"The config file is now resolved to the actual file which should avoid overwriting symlinks. https://github.com/qmk/qmk_cli/issues/43","title":"Version 1.2.0"},{"location":"breaking_changes/#version-110","text":"Configuration: 0 and 1 are now considered integers, not boolean","title":"Version 1.1.0"},{"location":"breaking_changes/#version-100","text":"Initial Version","title":"Version 1.0.0"},{"location":"configuration/","text":"Configuration \u00b6 MILC supports a config file out of the box. The format and structure of this file is exposed through cli.config and tied to command line arguments. If your program uses subcommands you can add a config subcommand with a single import. Structure \u00b6 MILC uses ConfigParser to store configuration values. We've mapped the section names to subcommands, and values passed as CLI arguments will be automatically populated to keys named after the argument. Configuration options for the main cli.entrypoint() are set in cli.config.general . If you do not have any subcommands you will find all of your config options here. Reading Config Values \u00b6 You can read config values using either attribute or dictionary notation. If a key does not exist in the configuration you will get None as the value. Attribute: cli.config.general.verbose Dictionary: cli.config['general']['verbose'] Setting Config Values \u00b6 You can create new values by simply assigning to them. This only with dictionary notation. cli.config['general']['verbose'] = True Writing Configuration Files \u00b6 Use cli.save_config() to save the user's configuration file. It will be written to the location specified by cli.config_file . Configuration File Location \u00b6 MILC uses appdirs to determine the configuration file location. You can set your application's name and author by using milc.set_metadata : from milc import set_metadata set_metadata ( 'Florzelbop' , '1.0.0' , 'Jane Doe' ) This will (usually) result in the following config file locations: Linux: ~/.local/share/Florzelbop macOS: ~/Library/Application Support/Florzelbop Windows: C:\\Documents and Settings\\\\Application Data\\Local Settings\\Florzelbop Jane Doe\\hello Where Did A Value Come From? \u00b6 Sometimes you need to know how a configuration value was set. You can use cli.config_source to find out. >>> cli.config_source.general.verbose 'argument' The possible values returned are: 'argument' The value was passed as an argument 'config_file' The value was read from the config file 'default' This is the default value Automatic Type Inference \u00b6 Under the hood all configuration options are stored as plain text. MILC converts your config values into appropriate data types when it can figure out how. Booleans yes , true , and on evaluate to True. no , false , and off evaluate to False. None Values set to None are considered deleted, and will be removed from the config file Integers Numbers without a decimal are converted to int() Decimal Numbers Numbers with a decimal are converted to decimal.Decimal()","title":"Configuration"},{"location":"configuration/#configuration","text":"MILC supports a config file out of the box. The format and structure of this file is exposed through cli.config and tied to command line arguments. If your program uses subcommands you can add a config subcommand with a single import.","title":"Configuration"},{"location":"configuration/#structure","text":"MILC uses ConfigParser to store configuration values. We've mapped the section names to subcommands, and values passed as CLI arguments will be automatically populated to keys named after the argument. Configuration options for the main cli.entrypoint() are set in cli.config.general . If you do not have any subcommands you will find all of your config options here.","title":"Structure"},{"location":"configuration/#reading-config-values","text":"You can read config values using either attribute or dictionary notation. If a key does not exist in the configuration you will get None as the value. Attribute: cli.config.general.verbose Dictionary: cli.config['general']['verbose']","title":"Reading Config Values"},{"location":"configuration/#setting-config-values","text":"You can create new values by simply assigning to them. This only with dictionary notation. cli.config['general']['verbose'] = True","title":"Setting Config Values"},{"location":"configuration/#writing-configuration-files","text":"Use cli.save_config() to save the user's configuration file. It will be written to the location specified by cli.config_file .","title":"Writing Configuration Files"},{"location":"configuration/#configuration-file-location","text":"MILC uses appdirs to determine the configuration file location. You can set your application's name and author by using milc.set_metadata : from milc import set_metadata set_metadata ( 'Florzelbop' , '1.0.0' , 'Jane Doe' ) This will (usually) result in the following config file locations: Linux: ~/.local/share/Florzelbop macOS: ~/Library/Application Support/Florzelbop Windows: C:\\Documents and Settings\\\\Application Data\\Local Settings\\Florzelbop Jane Doe\\hello","title":"Configuration File Location"},{"location":"configuration/#where-did-a-value-come-from","text":"Sometimes you need to know how a configuration value was set. You can use cli.config_source to find out. >>> cli.config_source.general.verbose 'argument' The possible values returned are: 'argument' The value was passed as an argument 'config_file' The value was read from the config file 'default' This is the default value","title":"Where Did A Value Come From?"},{"location":"configuration/#automatic-type-inference","text":"Under the hood all configuration options are stored as plain text. MILC converts your config values into appropriate data types when it can figure out how. Booleans yes , true , and on evaluate to True. no , false , and off evaluate to False. None Values set to None are considered deleted, and will be removed from the config file Integers Numbers without a decimal are converted to int() Decimal Numbers Numbers with a decimal are converted to decimal.Decimal()","title":"Automatic Type Inference"},{"location":"installation/","text":"MILC supports Python 3.6 or later. You can install MILC using standard python tooling: python3 -m pip install milc","title":"Installation"},{"location":"logging/","text":"MILC comes with a robust logging system based on python's logging module. All you have to worry about are log messages, let MILC worry about presenting those messages to the user in configurable ways. Writing Log Entries \u00b6 A python Logger Object is available as cli.log . You can use this to write messages at various log levels: cli.log.debug() cli.log.info() cli.log.warning() cli.log.error() cli.log.critical() cli.log.exception() As is standard for the python logging module you can use printf -style format string operations with these. Example: log.info('Hello, %s!', cli.config.general.name) ANSI color sequences are also available. For more information see the ANSI Color page. Verbose Mode \u00b6 All MILC programs have -v and --verbose flags by default. When this flag is passed DEBUG level messages will be printed to the screen. If you want to use this flag in your program you can check cli.config.general.verbose . It is True when -v / --verbose is passed and False otherwise. Controlling Log Output \u00b6 Users have several CLI arguments they can pass to control the output of logs. These are automatically added to your program, you do not have to do anything to make them available: --datetime-fmt , default: %Y-%m-%d %H:%M:%S Default date/time format. --log-fmt , default: %(levelname)s %(message)s Format string for printed log output --log-file-fmt , default: [%(levelname)s] [%(asctime)s] [file:%(pathname)s] [line:%(lineno)d] %(message)s Format string for log file. --log-file , default: None File to write log messages to --color and --no-color Enable or disable ANSI color --unicode and --no-unicode Enable or disable unicode icons","title":"Logging"},{"location":"logging/#writing-log-entries","text":"A python Logger Object is available as cli.log . You can use this to write messages at various log levels: cli.log.debug() cli.log.info() cli.log.warning() cli.log.error() cli.log.critical() cli.log.exception() As is standard for the python logging module you can use printf -style format string operations with these. Example: log.info('Hello, %s!', cli.config.general.name) ANSI color sequences are also available. For more information see the ANSI Color page.","title":"Writing Log Entries"},{"location":"logging/#verbose-mode","text":"All MILC programs have -v and --verbose flags by default. When this flag is passed DEBUG level messages will be printed to the screen. If you want to use this flag in your program you can check cli.config.general.verbose . It is True when -v / --verbose is passed and False otherwise.","title":"Verbose Mode"},{"location":"logging/#controlling-log-output","text":"Users have several CLI arguments they can pass to control the output of logs. These are automatically added to your program, you do not have to do anything to make them available: --datetime-fmt , default: %Y-%m-%d %H:%M:%S Default date/time format. --log-fmt , default: %(levelname)s %(message)s Format string for printed log output --log-file-fmt , default: [%(levelname)s] [%(asctime)s] [file:%(pathname)s] [line:%(lineno)d] %(message)s Format string for log file. --log-file , default: None File to write log messages to --color and --no-color Enable or disable ANSI color --unicode and --no-unicode Enable or disable unicode icons","title":"Controlling Log Output"},{"location":"metadata/","text":"MILC Metadata \u00b6 In order to initialize some things, such as the configuration file location and the version number reported by --version , MILC needs to know some basic information before you import cli . If you need to set the program's name, author name, and/or version number do it like this: from milc import set_metadata set_metadata ( name = 'Florzelbop' , version = '1.0.0' , author = 'Jane Doe' ) from milc import cli You should only do this once, and you should do it as early in your program's execution as possible. Danger Do not import set_metadata and cli at the same time! When you run set_metadata the cli object will be replaced, but your existing import will continue to reference the old cli object. Custom Loggers \u00b6 You can also use this to pass in custom loggers. from milc import set_metadata from my_program import custom_logger set_metadata ( logger = custom_logger ) from milc import cli","title":"Metadata"},{"location":"metadata/#milc-metadata","text":"In order to initialize some things, such as the configuration file location and the version number reported by --version , MILC needs to know some basic information before you import cli . If you need to set the program's name, author name, and/or version number do it like this: from milc import set_metadata set_metadata ( name = 'Florzelbop' , version = '1.0.0' , author = 'Jane Doe' ) from milc import cli You should only do this once, and you should do it as early in your program's execution as possible. Danger Do not import set_metadata and cli at the same time! When you run set_metadata the cli object will be replaced, but your existing import will continue to reference the old cli object.","title":"MILC Metadata"},{"location":"metadata/#custom-loggers","text":"You can also use this to pass in custom loggers. from milc import set_metadata from my_program import custom_logger set_metadata ( logger = custom_logger ) from milc import cli","title":"Custom Loggers"},{"location":"sparklines/","text":"Sparklines \u00b6 A sparkline is a tool for displaying numerical information in a very compact format. You can read more about the general concept on the Wikipedia page and read about Unicode sparklines specifically in an article by Jon Udell . Usage \u00b6 Basic usage of a sparkline is simple: from milc import sparkline print ( sparkline ([ 5 , 9 , 2 , 3 , 6 , 9 , 3 , 5 , 6 ]) This will output the following text: \u2586\u2583\u2584\u2587\u2584\u2586\u2587 Whitespace \u00b6 Any item in your sparkline sequence that is not a number ( int , float , or decimal.Decimal ) will be rendered as a blank space. It is recommended that you consistently use the same object for this purpose, I prefer None . Input: from milc import sparkline print ( sparkline ([ 3 , 7 , None , 2 , 1 ]) Output: \u2583\u2588 \u2582\u2581 Color \u00b6 MILC supports coloring your sparkline in two different ways. You can combine these for a total of 4 colors per sparkline. Negative and Positive Numbers \u00b6 By default your sparkline will be un-colored for positive numbers and red for negative numbers. You can change the colors for these by passing the following parameters: negative_color negative_reset positive_color positive_reset These accept MILC color codes . Highlight Color \u00b6 If you want to highlight datapoints that higher or lower than a threshold you can do so by passing in highlight_low , highlight_high , and the associated color codes. These accept MILC color codes . You will need to set a color for your highlight, one is not set by default. The correct arguments to pass for each are listed below. By default the reset codes are set to {fg_reset} . If you are setting other attributes too you will need to adjust this by passing the correct reset code as well. highlight_low : highlight_low_color and highlight_low_reset highlight_high : highlight_high_color and highlight_high_reset Optimization \u00b6 If you need to optimize the performance of a sparkline, or you want to set the boundaries for your data, you can supply min and max values when creating your sparkline. This will avoid two iterations over the list to find min and max values. from milc import sparkline print ( sparkline ([ 5 , 9 , 2 , 3 , 6 , 9 , 3 , 5 , 6 ], 2 , 9 ) Any values that fall outside your min and max will be ignored.","title":"Sparklines"},{"location":"sparklines/#sparklines","text":"A sparkline is a tool for displaying numerical information in a very compact format. You can read more about the general concept on the Wikipedia page and read about Unicode sparklines specifically in an article by Jon Udell .","title":"Sparklines"},{"location":"sparklines/#usage","text":"Basic usage of a sparkline is simple: from milc import sparkline print ( sparkline ([ 5 , 9 , 2 , 3 , 6 , 9 , 3 , 5 , 6 ]) This will output the following text: \u2586\u2583\u2584\u2587\u2584\u2586\u2587","title":"Usage"},{"location":"sparklines/#whitespace","text":"Any item in your sparkline sequence that is not a number ( int , float , or decimal.Decimal ) will be rendered as a blank space. It is recommended that you consistently use the same object for this purpose, I prefer None . Input: from milc import sparkline print ( sparkline ([ 3 , 7 , None , 2 , 1 ]) Output: \u2583\u2588 \u2582\u2581","title":"Whitespace"},{"location":"sparklines/#color","text":"MILC supports coloring your sparkline in two different ways. You can combine these for a total of 4 colors per sparkline.","title":"Color"},{"location":"sparklines/#negative-and-positive-numbers","text":"By default your sparkline will be un-colored for positive numbers and red for negative numbers. You can change the colors for these by passing the following parameters: negative_color negative_reset positive_color positive_reset These accept MILC color codes .","title":"Negative and Positive Numbers"},{"location":"sparklines/#highlight-color","text":"If you want to highlight datapoints that higher or lower than a threshold you can do so by passing in highlight_low , highlight_high , and the associated color codes. These accept MILC color codes . You will need to set a color for your highlight, one is not set by default. The correct arguments to pass for each are listed below. By default the reset codes are set to {fg_reset} . If you are setting other attributes too you will need to adjust this by passing the correct reset code as well. highlight_low : highlight_low_color and highlight_low_reset highlight_high : highlight_high_color and highlight_high_reset","title":"Highlight Color"},{"location":"sparklines/#optimization","text":"If you need to optimize the performance of a sparkline, or you want to set the boundaries for your data, you can supply min and max values when creating your sparkline. This will avoid two iterations over the list to find min and max values. from milc import sparkline print ( sparkline ([ 5 , 9 , 2 , 3 , 6 , 9 , 3 , 5 , 6 ], 2 , 9 ) Any values that fall outside your min and max will be ignored.","title":"Optimization"},{"location":"spinners/","text":"Spinners \u00b6 Spinners let you tell the user that something is happening while you're processing. There are 3 basic ways to use a spinner: Instantiating a spinner and then using .start() and .stop() on your object. Using a context manager ( with cli.spinner(...): ) Decorate a function ( @cli.spinner(...) ) For full details see the cli.spinner api reference . Adding a Spinner \u00b6 If you'd like to create your own spinner animation you can do that. First you should define a dictionary with two keys, interval and frames : my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } You can use this in one of two ways- by passing it directly to cli.spinner() or by adding it to the list of available spinners using cli.add_spinner() . Example: Using a custom spinner directly \u00b6 my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } with cli . spinner ( text = 'Loading' , spinner = my_spinner ): time . sleep ( 10 ) Example: Adding a custom spinner \u00b6 my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } cli . add_spinner ( 'my_twirl' , my_spinner ) with cli . spinner ( text = 'Loading' , spinner = 'my_twirl' ): time . sleep ( 10 ) Example: Instantiating a Spinner \u00b6 spinner = cli . spinner ( text = 'Loading' , spinner = 'dots' ) spinner . start () # Do something here spinner . stop () Example: Using a Context Manager \u00b6 with cli . spinner ( text = 'Loading' , spinner = 'dots' ): # Do something here Example: Decorating a Function \u00b6 @cli . spinner ( text = 'Loading' , spinner = 'dots' ) def long_running_function (): # Do something here","title":"Spinners"},{"location":"spinners/#spinners","text":"Spinners let you tell the user that something is happening while you're processing. There are 3 basic ways to use a spinner: Instantiating a spinner and then using .start() and .stop() on your object. Using a context manager ( with cli.spinner(...): ) Decorate a function ( @cli.spinner(...) ) For full details see the cli.spinner api reference .","title":"Spinners"},{"location":"spinners/#adding-a-spinner","text":"If you'd like to create your own spinner animation you can do that. First you should define a dictionary with two keys, interval and frames : my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } You can use this in one of two ways- by passing it directly to cli.spinner() or by adding it to the list of available spinners using cli.add_spinner() .","title":"Adding a Spinner"},{"location":"spinners/#example-using-a-custom-spinner-directly","text":"my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } with cli . spinner ( text = 'Loading' , spinner = my_spinner ): time . sleep ( 10 )","title":"Example: Using a custom spinner directly"},{"location":"spinners/#example-adding-a-custom-spinner","text":"my_spinner = { 'interval' : 100 , # How many ms to display each frame 'frames' : [ '-' , ' \\\\ ' , '|' , '/' ] } cli . add_spinner ( 'my_twirl' , my_spinner ) with cli . spinner ( text = 'Loading' , spinner = 'my_twirl' ): time . sleep ( 10 )","title":"Example: Adding a custom spinner"},{"location":"spinners/#example-instantiating-a-spinner","text":"spinner = cli . spinner ( text = 'Loading' , spinner = 'dots' ) spinner . start () # Do something here spinner . stop ()","title":"Example: Instantiating a Spinner"},{"location":"spinners/#example-using-a-context-manager","text":"with cli . spinner ( text = 'Loading' , spinner = 'dots' ): # Do something here","title":"Example: Using a Context Manager"},{"location":"spinners/#example-decorating-a-function","text":"@cli . spinner ( text = 'Loading' , spinner = 'dots' ) def long_running_function (): # Do something here","title":"Example: Decorating a Function"},{"location":"subcommand_config/","text":"MILC config subcommand \u00b6 This document explains how the available config subcommand works. Introduction \u00b6 Configuration for MILC applications is a key/value system. Each key consists of a subcommand and an argument name separated by a period. This allows for a straightforward and direct translation between config keys and the arguments they set. You can provide your users with a subcommand for managing this configuration by importing the config subcommand: import milc.subcommand.config Read on to see how users can utilize this subcommand. Simple Example \u00b6 As an example let's look at the command my_cli foo --arg1 bar --arg2 bat . There are two command line arguments that could be read from configuration instead: foo.arg1 foo.arg2 Let's set these now: $ my_cli config foo.arg1=bar foo.arg2=bat foo.arg1 None -> bar foo.arg2 None -> bat i Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Now I can run my_cli foo without specifying --arg1 and --arg2 each time. Setting User Defaults \u00b6 Sometimes you want to share a setting between multiple subcommands. For example, multiple commands take the argument --arg1 . Rather than setting this value for every command you can set a user value which will be used by any command that takes that argument. Example: $ my_cli config user.arg1=baz user.arg1: None -> baz \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Subcommand reference ( config ) \u00b6 The config subcommand is used to interact with the underlying configuration. When run with no argument it shows the current configuration. When arguments are supplied they are assumed to be configuration tokens, which are strings containing no spaces with the following form: [.][=] Setting Configuration Values \u00b6 You can set configuration values by putting an equal sign (=) into your config key. The key must always be the full . form. Example: $ my_cli config user.arg1=default user.arg1: None -> default \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Reading Configuration Values \u00b6 You can read configuration values for all set options, the entire configuration, a single key, or for an entire section. You can also specify multiple keys to display more than one value. All Set Options Example \u00b6 my_cli config Entire Configuration Example \u00b6 my_cli config -a Whole Section Example \u00b6 my_cli config general Single Key Example \u00b6 my_cli config general.verbose Multiple Keys Example \u00b6 my_cli config user general.verbose general.log_format Deleting Configuration Values \u00b6 You can delete a configuration value by setting it to the special string None . Example: $ my_cli config general.log_format None general.log_format: %H:%M:%S -> None \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Multiple Operations \u00b6 You can combine multiple read and write operations into a single command. They will be executed and displayed in order: $ my_cli config foo user.arg1=default foo.arg2=None foo.arg3=peep user.arg1: None -> default foo.arg2: bar -> None \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Config Subcommand"},{"location":"subcommand_config/#milc-config-subcommand","text":"This document explains how the available config subcommand works.","title":"MILC config subcommand"},{"location":"subcommand_config/#introduction","text":"Configuration for MILC applications is a key/value system. Each key consists of a subcommand and an argument name separated by a period. This allows for a straightforward and direct translation between config keys and the arguments they set. You can provide your users with a subcommand for managing this configuration by importing the config subcommand: import milc.subcommand.config Read on to see how users can utilize this subcommand.","title":"Introduction"},{"location":"subcommand_config/#simple-example","text":"As an example let's look at the command my_cli foo --arg1 bar --arg2 bat . There are two command line arguments that could be read from configuration instead: foo.arg1 foo.arg2 Let's set these now: $ my_cli config foo.arg1=bar foo.arg2=bat foo.arg1 None -> bar foo.arg2 None -> bat i Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini' Now I can run my_cli foo without specifying --arg1 and --arg2 each time.","title":"Simple Example"},{"location":"subcommand_config/#setting-user-defaults","text":"Sometimes you want to share a setting between multiple subcommands. For example, multiple commands take the argument --arg1 . Rather than setting this value for every command you can set a user value which will be used by any command that takes that argument. Example: $ my_cli config user.arg1=baz user.arg1: None -> baz \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Setting User Defaults"},{"location":"subcommand_config/#subcommand-reference-config","text":"The config subcommand is used to interact with the underlying configuration. When run with no argument it shows the current configuration. When arguments are supplied they are assumed to be configuration tokens, which are strings containing no spaces with the following form: [.][=]","title":"Subcommand reference (config)"},{"location":"subcommand_config/#setting-configuration-values","text":"You can set configuration values by putting an equal sign (=) into your config key. The key must always be the full . form. Example: $ my_cli config user.arg1=default user.arg1: None -> default \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Setting Configuration Values"},{"location":"subcommand_config/#reading-configuration-values","text":"You can read configuration values for all set options, the entire configuration, a single key, or for an entire section. You can also specify multiple keys to display more than one value.","title":"Reading Configuration Values"},{"location":"subcommand_config/#all-set-options-example","text":"my_cli config","title":"All Set Options Example"},{"location":"subcommand_config/#entire-configuration-example","text":"my_cli config -a","title":"Entire Configuration Example"},{"location":"subcommand_config/#whole-section-example","text":"my_cli config general","title":"Whole Section Example"},{"location":"subcommand_config/#single-key-example","text":"my_cli config general.verbose","title":"Single Key Example"},{"location":"subcommand_config/#multiple-keys-example","text":"my_cli config user general.verbose general.log_format","title":"Multiple Keys Example"},{"location":"subcommand_config/#deleting-configuration-values","text":"You can delete a configuration value by setting it to the special string None . Example: $ my_cli config general.log_format None general.log_format: %H:%M:%S -> None \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Deleting Configuration Values"},{"location":"subcommand_config/#multiple-operations","text":"You can combine multiple read and write operations into a single command. They will be executed and displayed in order: $ my_cli config foo user.arg1=default foo.arg2=None foo.arg3=peep user.arg1: None -> default foo.arg2: bar -> None \u2139 Wrote configuration to '/Users/example/Library/Application Support/my_cli/my_cli.ini'","title":"Multiple Operations"},{"location":"subprocesses/","text":"Executing commands in a subprocess \u00b6 MILC provides some tools to make running subcommands easier and more convienent to work with. Basic Subprocess Execution \u00b6 You can use cli.run() to easily and safely run shell commands. The first argument to cli.run() should be an argument list, which is a list or tuple containing the command and any arguments you want to pass in. For example, if you wanted to run a git command you might build this argument list: git_cmd = [ 'git' , '-C' , '/srv/web/htdocs' , 'pull' ] This is all you need to do to run that command: p = cli . run ( git_cmd ) This will return a subprocess.CompletedProcess instance. You can examine attributes such as p.returncode , p.stderr , and p.stdout to see the fate of the process. Supported Arguments \u00b6 Argument Default Description command A sequence of arguments for the command to be run. The first element is the command to be executed. capture_output True When False output from the subprocess is written directly to STDOUT and STDERR. combined_output False When True STDERR will be combined with STDOUT. text True When False STDOUT and STDERR will return binary data. **kwargs Any unrecognized argument will be passed to subprocess.run() Differences from subprocess.run \u00b6 MILC's cli.run() differs from subprocess.run() in some important ways. Windows Support \u00b6 When running inside a windows console (Powershell, DOS, Cygwin, Msys2) there are some quirks that MILC attempts to handle but which you need to be aware of: Commands are always run in a subshell, so that non-executable files and POSIX paths work seemlessly. Windows leaves stdin in a broken state after executing a subprocess. To avoid this MILC adds stdin=DEVNULL to the subprocess.run() call. If you need stdin to work in your executed process you can pass stdin=None . Building argument lists \u00b6 The most important way MILC differs from subprocess.run() is that it only accepts commands that have already been split into sequences. A lot of bugs are caused by mistakes in building command strings that are later split into a sequence of arguments in unexpected ways. Capture Output \u00b6 By default cli.run() captures STDOUT and STDERR. If you'd like that output to be written to the terminal instead you can pass capture_output=False . Combining STDERR with STDOUT \u00b6 If you'd like to combine STDOUT and STDERR into one stream (similar to the shell construct 2>&1 ) you can pass combined_output=True . Text Encoding \u00b6 By default STDOUT and STDERR will be opened as text. If you'd like these to be bytes instead of text you can pass text=False . Other Arguments \u00b6 All other arguments are passed directly to subprocess.run() . You can use these to further tweak the behavior of your subprocesses.","title":"Subprocesses"},{"location":"subprocesses/#executing-commands-in-a-subprocess","text":"MILC provides some tools to make running subcommands easier and more convienent to work with.","title":"Executing commands in a subprocess"},{"location":"subprocesses/#basic-subprocess-execution","text":"You can use cli.run() to easily and safely run shell commands. The first argument to cli.run() should be an argument list, which is a list or tuple containing the command and any arguments you want to pass in. For example, if you wanted to run a git command you might build this argument list: git_cmd = [ 'git' , '-C' , '/srv/web/htdocs' , 'pull' ] This is all you need to do to run that command: p = cli . run ( git_cmd ) This will return a subprocess.CompletedProcess instance. You can examine attributes such as p.returncode , p.stderr , and p.stdout to see the fate of the process.","title":"Basic Subprocess Execution"},{"location":"subprocesses/#supported-arguments","text":"Argument Default Description command A sequence of arguments for the command to be run. The first element is the command to be executed. capture_output True When False output from the subprocess is written directly to STDOUT and STDERR. combined_output False When True STDERR will be combined with STDOUT. text True When False STDOUT and STDERR will return binary data. **kwargs Any unrecognized argument will be passed to subprocess.run()","title":"Supported Arguments"},{"location":"subprocesses/#differences-from-subprocessrun","text":"MILC's cli.run() differs from subprocess.run() in some important ways.","title":"Differences from subprocess.run"},{"location":"subprocesses/#windows-support","text":"When running inside a windows console (Powershell, DOS, Cygwin, Msys2) there are some quirks that MILC attempts to handle but which you need to be aware of: Commands are always run in a subshell, so that non-executable files and POSIX paths work seemlessly. Windows leaves stdin in a broken state after executing a subprocess. To avoid this MILC adds stdin=DEVNULL to the subprocess.run() call. If you need stdin to work in your executed process you can pass stdin=None .","title":"Windows Support"},{"location":"subprocesses/#building-argument-lists","text":"The most important way MILC differs from subprocess.run() is that it only accepts commands that have already been split into sequences. A lot of bugs are caused by mistakes in building command strings that are later split into a sequence of arguments in unexpected ways.","title":"Building argument lists"},{"location":"subprocesses/#capture-output","text":"By default cli.run() captures STDOUT and STDERR. If you'd like that output to be written to the terminal instead you can pass capture_output=False .","title":"Capture Output"},{"location":"subprocesses/#combining-stderr-with-stdout","text":"If you'd like to combine STDOUT and STDERR into one stream (similar to the shell construct 2>&1 ) you can pass combined_output=True .","title":"Combining STDERR with STDOUT"},{"location":"subprocesses/#text-encoding","text":"By default STDOUT and STDERR will be opened as text. If you'd like these to be bytes instead of text you can pass text=False .","title":"Text Encoding"},{"location":"subprocesses/#other-arguments","text":"All other arguments are passed directly to subprocess.run() . You can use these to further tweak the behavior of your subprocesses.","title":"Other Arguments"},{"location":"threading/","text":"Thread Safety \u00b6 MILC provides a locking mechanism you can interact with for thread safety. It will acquire and release that lock when changing any objects in memory. You can utilize this same mechanism in your own programs as needed. Under the hood it uses an RLock object to do the locking. Acquire \u00b6 You can use cli.acquire_lock(blocking=True) to prevent all write operations from happening. Other threads that want to make any changes will block until they can acquire the lock, so it's important not to hold the lock longer than necessary. When invoked with the blocking argument set to False the call will always return right away. It will return True when the lock has been acquired and False otherwise. Release \u00b6 The cli.release_lock() function will release the lock so another thread can acquire it.","title":"Thread Safety"},{"location":"threading/#thread-safety","text":"MILC provides a locking mechanism you can interact with for thread safety. It will acquire and release that lock when changing any objects in memory. You can utilize this same mechanism in your own programs as needed. Under the hood it uses an RLock object to do the locking.","title":"Thread Safety"},{"location":"threading/#acquire","text":"You can use cli.acquire_lock(blocking=True) to prevent all write operations from happening. Other threads that want to make any changes will block until they can acquire the lock, so it's important not to hold the lock longer than necessary. When invoked with the blocking argument set to False the call will always return right away. It will return True when the lock has been acquired and False otherwise.","title":"Acquire"},{"location":"threading/#release","text":"The cli.release_lock() function will release the lock so another thread can acquire it.","title":"Release"},{"location":"tutorial/","text":"MILC Tutorial \u00b6 MILC is a framework for writing CLI tools. It's goal is to make getting started easy and to grow with your program as it grows. MILC is Batteries Included- it gives you all the functionality that your users demand out of the box. Argument parsing, configuration files, flexible and configurable log output, ANSI colors, spinners, and other nicities are combined into one easy to use module. Minimal Example \u00b6 MILC works by registering functions as either the entrypoint or a subcommand. The entrypoint can be thought of as your main() , or the place where program execution begins. A minimal MILC program looks like this: #!/usr/bin/env python3 \"\"\"Hello World implementation using MILC. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'Hello, World!' ) if __name__ == '__main__' : cli () Quick Program Overview \u00b6 Before we dive into the features our program is using let's take a look at the general structure of a MILC program. We start by importing the cli object- this is where most of MILC's functionality is exposed and where a lot of important state tracking happens. Next, we've decorated our main function with cli.entrypoint() . This is how we tell MILC what function to execute and set the help text for our program. Inside our main() function we print a simple message to the log file, which by default is also printed to the user's screen. Finally, we execute our cli() program inside the familiar if __name__ == '__main__': guard. Logging and Printing \u00b6 MILC provides two mechanisms for outputting text to the user, and which one you use depends a lot on the needs of your program. Both use the same API so switching between them should be simple. For writing to stdout you have cli.echo() . This differs from python print() in two important ways- It supports tokens for colorizing your text using ANSI and it supports format strings in the same way as logging . For writing to stderr and/or log files you have cli.log . You can use these to output log messages at different levels so the CLI user can easily adjust how much output they get. ANSI color tokens are also supported in log messages on the console, and will be stripped out of log files for easy viewing. You can still use python's built-in print() if you wish, but you will not get ANSI or string formatting support. More information: ANSI Color Logging Entrypoints \u00b6 MILC does the work of setting up your execution environment then it hands off control to your entrypoint. There are two types of entrypoints in MILC- the root entrypoint and subcommand entrypoints. When you think of subcommands think of programs like git, where the first argument that doesn't start with a dash indicates what mode the program is operating in. MILC entrypoints are python callables that take a single argument- cli . When you call cli() at the end of your script it will determine the correct entrypoint to call based on the arguments the user passed. Configuration and Argument Parsing \u00b6 MILC unifies arguments and configuration files. This unified config can be accessed under cli.config . You can access this as attributes or dictionaries. These two lines are equivalent, and will return True when the user passes -v or --verbose : cli.config.general.verbose cli.config['general']['verbose'] Under the hood MILC uses ConfigParser to read and write configuration files. If you are not familiar with ConfigParser this is a sample config file: [general] verbose=true MILC maps all of the arguments for the root entrypoint into the general section. Subcommand arguments are mapped into their own section. We'll talk about this more when we introduce subcommands, for now you just need to understand that arguments are added to the general section. Building on our program from earlier we can make our program more flexible about who it is greeting by adding a new flag, --name , or -n for short: #!/usr/bin/env python3 \"\"\"Hello World implementation using MILC. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'Hello, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli () One important thing to note is that decorators are processed from the bottom to the top. You must place @cli.entrypoint directly above the function definition, and then place any cli.argument() decorators above that to avoid a stack trace. More information: Argument Parsing Configuration Subcommands \u00b6 A lot of programs use a mode of operation where the first argument that doesn't begin with - or -- is a subcommand. Popular version control programs such as git and svn are the most well known example of this pattern. MILC uses argparser's native subcommand support to implement this for you. To use it you designate functions as subcommand entrypoints using cli.subcommand . Let's extend our program from earlier to use subcommands: #!/usr/bin/env python3 \"\"\"Example MILC program that shows off many features. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'No subcommand specified!' ) cli . print_usage () @cli . subcommand ( 'Say hello.' ) def hello ( cli ): cli . echo ( ' {fg_green} Hello, %s !' , cli . config . general . name ) @cli . subcommand ( 'Say goodbye.' ) def goodbye ( cli ): cli . echo ( ' {fg_blue} Goodbye, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli () Configuration and Subcommands \u00b6 Each subcommand gets its own section in the configuration. You can access a subcommand's config with cli.config. . Options for the root entrypoint can be found in the cli.config.general section of the config. We add flags to our subcommands by decorating them with @cli.argument : @cli . argument ( '--comma' , help = 'comma in output' , action = 'store_boolean' , default = True ) User Controlled Configuration \u00b6 Using the built-in config subcommand our user can permanently set certain options so they don't have to type them in each time. We do this by adding a single line to our program, import milc.subcommand.config . Let's take a look at our final program: #!/usr/bin/env python3 \"\"\"Example MILC program that shows off many features. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli import milc.subcommand.config @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'No subcommand specified!' ) cli . print_usage () @cli . argument ( '--comma' , help = 'comma in output' , action = 'store_boolean' , default = True ) @cli . subcommand ( 'Say hello.' ) def hello ( cli ): comma = ',' if cli . config . hello . comma else '' cli . echo ( ' {fg_green} Hello %s %s !' , comma , cli . config . general . name ) @cli . argument ( '-f' , '--flag' , help = 'Write it in a flag' , action = 'store_true' ) @cli . subcommand ( 'Say goodbye.' ) def goodbye ( cli ): if cli . config . goodbye . flag : cli . log . debug ( 'Drawing a flag.' ) colors = ( ' {bg_red} ' , ' {bg_lightred_ex} ' , ' {bg_lightyellow_ex} ' , ' {bg_green} ' , ' {bg_blue} ' , ' {bg_magenta} ' ) string = 'Goodbye, %s !' % cli . config . general . name for i , letter in enumerate ( string ): color = colors [ i % len ( colors )] cli . echo ( color + letter + ' ' * 39 ) else : cli . log . warning ( 'Parting is such sweet sorrow.' ) cli . echo ( ' {fg_blue} Goodbye, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli () Example Output \u00b6 Now that we've written our program and we have a better idea what is going on, let's explore how it works. We'll start by demonstrating it with no arguments passed. We'll demonstrate entering a subcommand here: So far so good. Now let's take a look at the help output: Finally, let's combine it all together to demonstrate the use of both general and subcommand flags: Doing More \u00b6 Our program does a lot in only a few lines, but there's a lot more you can do. Explore the rest of the documentation to see everything MILC can do.","title":"Tutorial"},{"location":"tutorial/#milc-tutorial","text":"MILC is a framework for writing CLI tools. It's goal is to make getting started easy and to grow with your program as it grows. MILC is Batteries Included- it gives you all the functionality that your users demand out of the box. Argument parsing, configuration files, flexible and configurable log output, ANSI colors, spinners, and other nicities are combined into one easy to use module.","title":"MILC Tutorial"},{"location":"tutorial/#minimal-example","text":"MILC works by registering functions as either the entrypoint or a subcommand. The entrypoint can be thought of as your main() , or the place where program execution begins. A minimal MILC program looks like this: #!/usr/bin/env python3 \"\"\"Hello World implementation using MILC. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'Hello, World!' ) if __name__ == '__main__' : cli ()","title":"Minimal Example"},{"location":"tutorial/#quick-program-overview","text":"Before we dive into the features our program is using let's take a look at the general structure of a MILC program. We start by importing the cli object- this is where most of MILC's functionality is exposed and where a lot of important state tracking happens. Next, we've decorated our main function with cli.entrypoint() . This is how we tell MILC what function to execute and set the help text for our program. Inside our main() function we print a simple message to the log file, which by default is also printed to the user's screen. Finally, we execute our cli() program inside the familiar if __name__ == '__main__': guard.","title":"Quick Program Overview"},{"location":"tutorial/#logging-and-printing","text":"MILC provides two mechanisms for outputting text to the user, and which one you use depends a lot on the needs of your program. Both use the same API so switching between them should be simple. For writing to stdout you have cli.echo() . This differs from python print() in two important ways- It supports tokens for colorizing your text using ANSI and it supports format strings in the same way as logging . For writing to stderr and/or log files you have cli.log . You can use these to output log messages at different levels so the CLI user can easily adjust how much output they get. ANSI color tokens are also supported in log messages on the console, and will be stripped out of log files for easy viewing. You can still use python's built-in print() if you wish, but you will not get ANSI or string formatting support. More information: ANSI Color Logging","title":"Logging and Printing"},{"location":"tutorial/#entrypoints","text":"MILC does the work of setting up your execution environment then it hands off control to your entrypoint. There are two types of entrypoints in MILC- the root entrypoint and subcommand entrypoints. When you think of subcommands think of programs like git, where the first argument that doesn't start with a dash indicates what mode the program is operating in. MILC entrypoints are python callables that take a single argument- cli . When you call cli() at the end of your script it will determine the correct entrypoint to call based on the arguments the user passed.","title":"Entrypoints"},{"location":"tutorial/#configuration-and-argument-parsing","text":"MILC unifies arguments and configuration files. This unified config can be accessed under cli.config . You can access this as attributes or dictionaries. These two lines are equivalent, and will return True when the user passes -v or --verbose : cli.config.general.verbose cli.config['general']['verbose'] Under the hood MILC uses ConfigParser to read and write configuration files. If you are not familiar with ConfigParser this is a sample config file: [general] verbose=true MILC maps all of the arguments for the root entrypoint into the general section. Subcommand arguments are mapped into their own section. We'll talk about this more when we introduce subcommands, for now you just need to understand that arguments are added to the general section. Building on our program from earlier we can make our program more flexible about who it is greeting by adding a new flag, --name , or -n for short: #!/usr/bin/env python3 \"\"\"Hello World implementation using MILC. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'Hello, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli () One important thing to note is that decorators are processed from the bottom to the top. You must place @cli.entrypoint directly above the function definition, and then place any cli.argument() decorators above that to avoid a stack trace. More information: Argument Parsing Configuration","title":"Configuration and Argument Parsing"},{"location":"tutorial/#subcommands","text":"A lot of programs use a mode of operation where the first argument that doesn't begin with - or -- is a subcommand. Popular version control programs such as git and svn are the most well known example of this pattern. MILC uses argparser's native subcommand support to implement this for you. To use it you designate functions as subcommand entrypoints using cli.subcommand . Let's extend our program from earlier to use subcommands: #!/usr/bin/env python3 \"\"\"Example MILC program that shows off many features. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'No subcommand specified!' ) cli . print_usage () @cli . subcommand ( 'Say hello.' ) def hello ( cli ): cli . echo ( ' {fg_green} Hello, %s !' , cli . config . general . name ) @cli . subcommand ( 'Say goodbye.' ) def goodbye ( cli ): cli . echo ( ' {fg_blue} Goodbye, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli ()","title":"Subcommands"},{"location":"tutorial/#configuration-and-subcommands","text":"Each subcommand gets its own section in the configuration. You can access a subcommand's config with cli.config. . Options for the root entrypoint can be found in the cli.config.general section of the config. We add flags to our subcommands by decorating them with @cli.argument : @cli . argument ( '--comma' , help = 'comma in output' , action = 'store_boolean' , default = True )","title":"Configuration and Subcommands"},{"location":"tutorial/#user-controlled-configuration","text":"Using the built-in config subcommand our user can permanently set certain options so they don't have to type them in each time. We do this by adding a single line to our program, import milc.subcommand.config . Let's take a look at our final program: #!/usr/bin/env python3 \"\"\"Example MILC program that shows off many features. PYTHON_ARGCOMPLETE_OK \"\"\" from milc import cli import milc.subcommand.config @cli . argument ( '-n' , '--name' , help = 'Name to greet' , default = 'World' ) @cli . entrypoint ( 'Greet a user.' ) def main ( cli ): cli . log . info ( 'No subcommand specified!' ) cli . print_usage () @cli . argument ( '--comma' , help = 'comma in output' , action = 'store_boolean' , default = True ) @cli . subcommand ( 'Say hello.' ) def hello ( cli ): comma = ',' if cli . config . hello . comma else '' cli . echo ( ' {fg_green} Hello %s %s !' , comma , cli . config . general . name ) @cli . argument ( '-f' , '--flag' , help = 'Write it in a flag' , action = 'store_true' ) @cli . subcommand ( 'Say goodbye.' ) def goodbye ( cli ): if cli . config . goodbye . flag : cli . log . debug ( 'Drawing a flag.' ) colors = ( ' {bg_red} ' , ' {bg_lightred_ex} ' , ' {bg_lightyellow_ex} ' , ' {bg_green} ' , ' {bg_blue} ' , ' {bg_magenta} ' ) string = 'Goodbye, %s !' % cli . config . general . name for i , letter in enumerate ( string ): color = colors [ i % len ( colors )] cli . echo ( color + letter + ' ' * 39 ) else : cli . log . warning ( 'Parting is such sweet sorrow.' ) cli . echo ( ' {fg_blue} Goodbye, %s !' , cli . config . general . name ) if __name__ == '__main__' : cli ()","title":"User Controlled Configuration"},{"location":"tutorial/#example-output","text":"Now that we've written our program and we have a better idea what is going on, let's explore how it works. We'll start by demonstrating it with no arguments passed. We'll demonstrate entering a subcommand here: So far so good. Now let's take a look at the help output: Finally, let's combine it all together to demonstrate the use of both general and subcommand flags:","title":"Example Output"},{"location":"tutorial/#doing-more","text":"Our program does a lot in only a few lines, but there's a lot more you can do. Explore the rest of the documentation to see everything MILC can do.","title":"Doing More"}],"index":{"fieldVectors":[["title/",[0,5.739]],["text/",[1,0.727,2,1.225,3,1.094,4,0.959,5,1.35,6,0.923,7,1.734,8,1.796,9,0.854,10,1.477,11,1.225,12,1.315,13,1.043,14,2.263,15,0.935,16,1.435,17,1.435,18,1.589,19,0.808,20,0.999,21,0.744,22,0.891,23,1.043,24,0.532,25,0.891,26,1.043,27,0.785,28,1.122,29,1.043,30,0.834,31,0.343,32,2.627,33,1.435,34,1.122,35,1.408,36,1.99,37,1.986,38,1.043,39,1.435,40,2.635,41,0.891,42,2.263,43,1.154,44,1.154,45,1.122,46,1.276,47,1.435,48,1.833,49,1.154,50,0.999,51,1.435,52,2.019,53,0.861,54,0.999,55,1.094,56,1.15,57,1.435,58,1.043,59,0.685,60,1.435,61,0.703,62,0.999,63,0.891,64,1.095,65,1.154,66,1.435,67,0.485,68,1.225,69,1.986,70,2.263,71,1.315,72,1.094,73,1.435,74,1.225,75,0.479,76,0.567,77,2.614,78,4.594,79,0.891,80,0.785,81,0.834,82,1.533,83,1.095,84,0.915,85,1.995,86,2.263,87,2.493,88,2.688,89,2.263,90,0.891,91,0.721,92,1.533,93,1.589,94,3.914,95,1.589,96,1.508,97,3.643,98,0.652,99,3.03,100,3.251,101,0.959,102,2.946,103,3.718,104,5.285,105,1.154,106,0.891,107,2.47,108,1.592,109,0.703,110,1.796,111,0.808,112,1.513,113,1.441,114,2.48,115,2.48,116,2.109,117,1.719,118,1.154,119,0.923,120,1.225,121,1.796,122,1.35,123,0.834,124,1.435,125,0.741,126,0.721,127,1.225,128,1.225,129,1.225,130,0.959,131,0.923]],["title/#milc-an-opinionated-batteries-included-python-3-cli-framework",[1,0.307,2,1.572,3,1.404,4,1.23,5,1.006,6,1.184,7,0.485,8,1.338]],["text/#milc-an-opinionated-batteries-included-python-3-cli-framework",[1,0.702,5,2.299,7,1.827,8,3.058,10,1.91,11,3.591,12,3.854,13,3.058,14,2.927,15,1.592,16,4.205,17,4.205,18,2.706,19,2.369,20,2.927,21,0.81,22,2.611,23,3.058,24,1.558,25,2.611,26,3.058,27,2.299,28,2.59,29,3.058,30,2.444,31,1.005,32,2.206,33,4.205,34,1.91,35,2.802,36,2.365,37,3.382,38,3.058,39,4.205,40,2.159,41,2.611,42,2.927,43,3.382,44,3.382,45,1.91,46,2.172,47,4.205,48,1.433,49,3.382,50,2.927,51,4.205,52,2.611,53,2.524,54,2.927,55,3.207,56,1.957,57,4.205,58,3.058,59,2.007,60,4.205,61,2.059]],["title/#getting-started",[62,2.83,63,2.525]],["text/#getting-started",[1,1.087,64,2.887,65,5.236,66,6.511,67,1.279]],["title/#reporting-bugs-and-requesting-features",[14,2.017,68,2.475,69,2.33,70,2.656]],["text/#reporting-bugs-and-requesting-features",[14,4.453,42,4.453,69,5.145,70,5.863,71,5.863,72,4.879,73,6.398]],["title/#short-example",[74,3.472,75,1.358]],["text/#short-example",[1,0.582,7,2.021,9,0.885,18,2.245,21,0.964,40,1.321,48,1.189,67,0.685,76,1.379,77,2.805,78,5.164,79,2.166,80,1.907,81,2.027,82,3.107,83,2.219,84,1.855,85,2.585,86,2.428,87,2.835,88,2.428,89,2.428,90,2.166,91,1.754,92,3.107,93,2.245,94,2.428,95,3.221,96,1.033,97,1.965,98,1.584]],["title/#output",[48,1.736]],["text/#output",[9,0.81,10,1.782,15,0.954,21,0.485,32,2.934,34,1.145,36,2.128,37,2.027,40,2.898,42,1.754,45,1.145,46,1.302,48,2.009,52,2.437,56,1.173,64,1.118,77,3.156,78,4.76,85,2.027,86,2.731,87,2.613,88,3.354,89,2.731,93,1.622,94,4.69,96,1.848,97,4.18,99,4.102,100,4.819,101,1.685,102,4.148,103,5.033,104,6.253,105,2.027,106,1.565,107,3.924,108,1.922,109,1.234,110,2.853,111,1.42,112,2.243,113,2.136,114,3.675,115,3.675,116,3.351,117,2.731,118,2.027,119,1.622,120,2.153]],["title/#breaking-changes",[121,2.956,122,2.223]],["text/#breaking-changes",[1,1.007,9,0.621,108,2.953,121,4.385,122,3.297,123,3.504,124,6.031,125,3.116,126,3.032,127,5.15,128,5.15,129,5.15,130,4.031,131,3.881]],["title/ANSI/",[35,2.205]],["text/ANSI/",[1,0.556,4,1.37,7,0.877,9,0.809,25,1.273,28,0.931,32,0.793,35,2.096,36,2.549,40,2.159,45,1.909,46,1.059,48,2.048,58,1.491,61,1.631,67,0.826,75,1.112,87,0.909,95,1.319,106,1.273,113,1.864,122,1.121,132,1.089,133,1.427,134,2.048,135,1.649,136,2.539,137,2.05,138,1.155,139,2.05,140,2.05,141,1.564,142,2.05,143,2.05,144,2.05,145,1.751,146,1.649,147,4.921,148,2.678,149,3.968,150,1.751,151,2.05,152,1.319,153,1.089,154,1.564,155,1.491,156,1.649,157,2.05,158,3.305,159,2.905,160,2.05,161,2.05,162,1.564,163,1.273,164,3.33,165,4.345,166,3.33,167,4.204,168,4.204,169,0.909,170,1.273,171,1.564,172,2.539,173,4.204,174,3.33,175,6.263,176,2.81,177,3.33,178,3.206,179,3.33,180,2.81,181,3.33,182,3.206,183,3.33,184,2.61,185,2.844,186,3.33,187,3.206,188,2.844,189,2.226,190,1.876,191,1.649,192,2.05,193,2.05,194,1.751]],["title/ANSI/#working-with-ansi-in-your-script",[35,1.465,132,1.798,133,2.355]],["text/ANSI/#working-with-ansi-in-your-script",[1,1.007,28,2.739,35,2.611,36,2.611,40,2.283,48,2.446,134,2.551,135,4.85,136,4.599,137,6.031,138,3.397]],["title/ANSI/#colorizing-log-output",[36,1.154,40,1.281,48,1.154]],["text/ANSI/#colorizing-log-output",[25,3.626,36,2.399,40,2.665,48,1.991,58,4.246,61,2.86,67,1.147,87,2.589,113,2.589,139,5.84,140,5.84,141,4.453,142,5.84,143,5.84,144,5.84,145,4.987]],["title/ANSI/#colored-log-example",[36,1.154,40,1.281,75,1.13]],["text/ANSI/#colored-log-example",[7,1.55,9,0.85,32,2.277,40,2.228,95,3.788,146,4.733,147,3.788,148,4.733,149,4.097,150,5.027,151,5.886]],["title/ANSI/#colorizing-printed-output",[36,1.154,45,1.537,48,1.154]],["text/ANSI/#colorizing-printed-output",[9,0.611,35,2.569,36,2.023,45,2.695,46,3.065,48,2.023,61,2.906,67,1.165,113,3.15,136,4.525,152,3.818,153,3.152,154,4.525,155,4.314,156,4.771]],["title/ANSI/#colored-print-example",[36,1.154,45,1.537,75,1.13]],["text/ANSI/#colored-print-example",[7,1.446,9,0.867,134,2.868,147,4.362,148,4.416,149,4.718,157,5.491,158,3.409,159,3.296,160,5.491,161,5.491,162,4.188]],["title/ANSI/#available-colors",[36,1.386,163,2.525]],["text/ANSI/#available-colors",[1,0.501,4,2.008,35,1.301,36,2.362,48,1.024,67,0.59,106,1.865,122,1.643,134,1.271,147,5.142,149,3.737,158,3.698,159,3.223,164,4.486,165,4.643,166,4.486,167,5.37,168,5.37,169,1.332,170,1.865,171,2.291,172,3.421,173,5.37,174,4.486,175,6.742,176,3.589,177,4.486,178,4.095,179,4.486,180,3.589,181,4.486,182,4.095,183,4.486,184,3.334,185,3.831,186,4.486,187,4.095,188,3.831,189,2.999,190,2.527,191,2.416,192,3.004,193,3.004,194,2.566]],["title/api__in_argv/",[195,3.27,196,3.726]],["text/api__in_argv/",[9,0.689,196,6.129]],["title/api__in_argv/#_in_argv",[196,4.667]],["text/api__in_argv/#_in_argv",[]],["title/api__sparkline/",[1,0.679,197,2.16]],["text/api__sparkline/",[1,0.939,9,0.835,21,0.305,23,1.151,25,1.668,35,2.436,36,2.65,56,0.737,61,0.775,67,0.81,83,0.702,84,0.995,91,1.35,97,0.892,109,1.713,122,0.866,125,0.818,126,1.35,147,2.652,156,1.273,158,2.559,159,4.609,165,3.407,184,1.668,190,1.513,191,1.273,197,2.988,198,3.519,199,0.737,200,1.451,201,1.273,202,2.988,203,2.637,204,1.282,205,2.988,206,5.936,207,5.335,208,3.027,209,5.335,210,4.524,211,4.29,212,2.462,213,3.027,214,1.784,215,1.388,216,1.583,217,1.057,218,1.784,219,1.273,220,1.102,221,2.048,222,3.027,223,1.451,224,1.451,225,1.784,226,1.953,227,1.784,228,1.784,229,0.702,230,1.151,231,0.796,232,1.352,233,1.784,234,1.784,235,1.273,236,1.784,237,1.583,238,1.612,239,2.048,240,1.583,241,2.686,242,4.122,243,5.15,244,4.804,245,2.997,246,2.294,247,3.52]],["title/api__sparkline/#_sparkline",[197,2.705]],["text/api__sparkline/#_sparkline",[109,3.217,190,3.7,197,3.489,198,3.7]],["title/api__sparkline/#arguments",[21,0.98]],["text/api__sparkline/#arguments",[1,1.159,25,2.618,35,3.007,36,2.744,147,3.676,158,3.547,159,4.788,165,3.32,197,2.24,198,2.375,202,2.363,203,2.562,205,2.363,206,6.154,207,5.533,209,5.533,210,4.108,211,3.896,237,2.767,238,2.531,239,3.216,240,2.767,241,4.217,242,5.713,243,6.018,244,5.931,245,4.154,246,3.601,247,4.879]],["title/api_ansi/",[248,5.739]],["text/api_ansi/",[1,1.072,9,0.833,28,2.289,31,1.204,35,3.33,36,1.718,40,2.432,91,2.534,112,3.291,113,2.235,134,2.718,199,2.346,249,5.68,250,4.053,251,4.619,252,5.166,253,2.084,254,3.129,255,5.04,256,5.04,257,4.304]],["title/api_ansi/#ansi",[35,2.205]],["text/api_ansi/#ansi",[1,1.097,28,2.983,35,2.844,36,2.239]],["title/api_ansi/#milcformatter-objects",[252,3.27,253,1.681]],["text/api_ansi/#milcformatter-objects",[1,1.015,9,0.791,31,1.453,40,2.73,112,2.83,252,4.89,254,3.775,255,6.081,256,6.081,257,5.193]],["title/api_attrdict/",[258,5.739]],["text/api_attrdict/",[9,0.849,91,3.007,199,3.121,204,2.155,253,2.773,254,4.164,259,5.191,260,3.369,261,3.848,262,3.369,263,7.14,264,3.562,265,4.809,266,5.481,267,3.855,268,3.63,269,3.855,270,2.398,271,4.162,272,3.017,273,3.142,274,4.137]],["title/api_attrdict/#attrdict",[259,3.703]],["text/api_attrdict/#attrdict",[]],["title/api_attrdict/#attrdict-objects",[253,1.681,259,2.956]],["text/api_attrdict/#attrdict-objects",[9,0.761,253,2.623,254,3.938,259,4.612,260,3.573,261,4.081,262,3.573]],["title/api_attrdict/#sparseattrdict-objects",[253,1.681,266,3.726]],["text/api_attrdict/#sparseattrdict-objects",[9,0.728,199,2.74,204,2.809,254,4.391,259,4.28,260,3.316,261,3.788,262,3.316,264,3.127,266,5.394,267,5.027,268,4.733,269,5.027,270,3.127,271,4.097]],["title/api_configuration/",[275,5.739]],["text/api_configuration/",[9,0.867,15,1.709,21,1.395,24,1.343,27,2.813,29,1.657,31,1.342,34,1.646,44,1.833,61,2.75,80,2.468,81,2.623,82,3.713,84,0.844,87,2.281,91,3.371,96,1.337,98,1.035,113,2.001,126,1.146,199,2.783,203,2.034,204,1.088,211,1.738,217,1.095,253,2.127,254,3.194,259,1.657,260,1.284,261,2.333,262,2.543,263,5.144,264,2.733,267,1.946,268,1.833,269,1.946,270,1.211,271,3.141,272,1.523,273,1.586,276,2.279,277,3.087,278,3.322,279,2.088,280,2.568,281,2.333,282,4.085,283,2.279,284,4.085,285,1.738,286,1.738,287,4.085,288,3.322,289,2.279,290,2.279,291,1.657,292,0.731,293,2.568,294,3.923,295,2.568,296,4.085,297,2.523,298,3.096,299,2.568,300,3.322,301,2.279,302,2.088]],["title/api_configuration/#configuration",[31,1.217]],["text/api_configuration/#configuration",[]],["title/api_configuration/#configuration-objects",[31,0.972,253,1.681]],["text/api_configuration/#configuration-objects",[9,0.725,31,1.682,34,2.652,98,2.652,199,2.718,204,2.787,254,4.37,259,4.246,267,4.987,268,4.696,269,4.987,270,3.102,271,4.064,276,5.84,277,3.505]],["title/api_configuration/#configurationsection-objects",[253,1.681,278,3.726]],["text/api_configuration/#configurationsection-objects",[9,0.773,31,1.556,254,4.043,278,5.967]],["title/api_configuration/#subparserwrapper-objects",[253,1.681,288,3.726]],["text/api_configuration/#subparserwrapper-objects",[9,0.75,15,2.341,34,2.808,253,2.557,254,3.839,288,5.666,289,6.183,290,6.183,291,4.495,292,1.983]],["title/api_emoji/",[303,4.667]],["text/api_emoji/",[1,0.749,9,0.831,40,2.255,48,1.53,49,5.961,67,1.17,76,1.774,93,3.833,116,5.087,146,3.608,147,2.887,148,3.608,149,3.123,158,2.786,159,2.693,165,4.307,176,2.999,178,3.422,180,2.999,184,2.786,187,3.422,270,2.384,303,4.112,304,4.331,305,4.487,306,3.422,307,3.422,308,4.487,309,5.956,310,3.123,311,3.832,312,3.832,313,4.487]],["title/api_emoji/#emoji",[49,4.095]],["text/api_emoji/#emoji",[1,0.758,9,0.825,40,2.273,48,1.548,49,5.755,67,1.179,76,1.796,93,3.864,116,5.128,146,3.653,147,2.923,148,3.653,149,3.162,158,2.82,159,2.726,165,4.324,176,3.036,178,3.464,180,3.036,184,2.82,187,3.464,270,2.413,303,4.163,304,4.366,305,4.543,306,3.464,307,3.464,308,4.543,309,6.005,310,3.162,311,3.879,312,3.879,313,4.543]],["title/api_milc/",[314,5.739]],["text/api_milc/",[1,0.59,2,0.655,3,0.585,4,0.513,6,0.493,7,0.75,8,0.558,9,0.864,10,0.891,15,0.29,21,1.096,22,1.218,24,1.747,31,0.767,32,1.577,34,1.106,35,1.39,36,1.095,40,1.544,41,0.876,45,1.604,46,1.258,48,1.302,52,1.994,53,0.46,59,3.179,61,1.997,63,0.876,64,1.08,67,0.926,80,0.419,82,3.036,83,1.808,84,1.055,85,2.226,87,1.566,90,1.512,91,3.234,92,0.876,96,1.619,98,1.293,101,0.943,105,1.958,106,0.476,108,0.376,109,1.997,112,0.657,113,1.424,114,1.496,115,1.076,126,0.71,130,1.311,134,2.068,138,0.432,149,0.534,153,0.407,159,0.847,162,1.076,163,0.876,165,0.82,169,1.693,171,1.076,176,1.627,178,0.585,180,0.513,182,0.585,184,0.476,187,0.585,190,1.809,199,0.913,204,1.359,217,0.86,220,0.982,231,1.432,235,0.617,244,0.655,245,0.558,253,1.461,254,0.476,260,0.432,261,0.493,264,0.407,265,1.577,270,0.407,272,0.943,273,0.534,277,0.46,281,1.567,285,1.496,291,0.558,292,0.913,294,3.594,298,1.205,301,0.767,306,1.496,315,1.591,316,0.617,317,1.076,318,2.841,319,0.847,320,1.205,321,1.412,322,0.75,323,1.135,324,0.847,325,1.833,326,1.365,327,0.513,328,0.864,329,1.076,330,0.864,331,0.558,332,0.513,333,0.864,334,0.982,335,0.703,336,0.703,337,0.703,338,0.703,339,0.585,340,0.703,341,0.703,342,0.703,343,0.703,344,1.591,345,0.534,346,0.864,347,0.534,348,1.294,349,2.079,350,0.864,351,3.681,352,0.703,353,3.287,354,0.864,355,0.493,356,0.864,357,0.655,358,1.461,359,0.864,360,1.496,361,2.582,362,0.703,363,0.864,364,0.864,365,0.847,366,0.864,367,0.864,368,0.864,369,0.513,370,1.604,371,0.864,372,0.703,373,1.591,374,2.21,375,0.864,376,0.476,377,0.655,378,0.432,379,1.577,380,1.756,381,1.591,382,2.744,383,1.135,384,0.864,385,1.294,386,2.21,387,0.655,388,0.655,389,0.446,390,0.46,391,1.857,392,1.675,393,1.076,394,1.412,395,1.857,396,1.675,397,1.412,398,1.412,399,1.412,400,0.617,401,1.675,402,0.864,403,0.703,404,1.591,405,0.864,406,0.864,407,0.864,408,0.617,409,0.864,410,0.476,411,1.205,412,1.076,413,1.076,414,1.205,415,1.426,416,1.496,417,1.415,418,0.655,419,0.655,420,0.767,421,0.767,422,0.767,423,0.767,424,0.767,425,0.767,426,0.655,427,0.767,428,0.767]],["title/api_milc/#milc",[1,0.85]],["text/api_milc/#milc",[]],["title/api_milc/#milc-objects",[1,0.679,253,1.681]],["text/api_milc/#milc-objects",[1,1.222,2,5.325,3,4.755,4,4.167,8,4.534,9,0.753,253,2.578,254,3.871]],["title/api_milc/#arguments",[21,0.98]],["text/api_milc/#arguments",[9,0.383,10,1.688,35,2.625,36,2.066,48,1.267,59,3.53,67,1.028,82,2.308,83,1.648,84,2.246,87,2.321,109,2.564,112,1.73,113,2.321,114,3.993,115,2.835,134,2.935,149,2.587,159,2.231,163,2.308,165,2.16,171,2.835,176,3.5,178,2.835,180,2.484,182,2.835,184,2.308,187,2.835,190,2.95,220,2.587,235,2.989,244,3.174,273,2.587,292,1.192,294,2.835,319,2.231,320,3.174,321,3.717,322,1.974,380,3.314,391,3.993,392,3.174,393,2.835,394,3.717,395,2.835,396,4.472,397,3.717,398,3.717,399,3.717,401,4.472,417,2.16,418,3.174,419,3.174,420,3.717,421,3.717,422,3.717,423,3.717,424,3.717,425,3.717,426,3.174,427,3.717,428,3.717]],["title/api_questions/",[429,4.095]],["text/api_questions/",[1,0.221,4,3.035,6,1.48,7,0.606,9,0.854,13,0.961,15,2.663,21,0.94,34,2.062,35,1.581,36,0.451,53,2.484,61,0.647,62,0.92,67,0.717,71,1.211,79,1.428,80,1.258,82,3.031,83,2.404,84,2.09,85,1.188,86,1.601,91,2.283,109,0.647,111,0.745,112,1.926,113,2.013,118,1.063,123,1.336,126,1.156,134,1.292,136,3.156,146,1.063,169,0.586,190,0.745,198,1.72,199,2.407,203,1.93,204,2.588,216,2.3,229,0.586,231,2.454,238,0.793,265,2.936,268,1.063,273,1.601,283,3.054,292,0.424,294,3.156,306,1.008,325,3.141,347,0.5,351,3.118,357,1.129,358,0.793,365,0.793,380,0.723,387,4.817,388,4.168,410,0.821,417,0.768,429,1.063,430,4.473,431,0.92,432,1.322,433,1.322,434,1.129,435,1.008,436,2.592,437,7.766,438,3.925,439,1.489,440,5.171,441,3.009,442,1.489,443,2.108,444,5.169,445,0.683,446,5.827,447,7.092,448,1.489,449,1.489,450,1.489,451,1.489,452,1.489,453,1.063,454,2.22,455,1.211,456,1.129,457,1.211,458,1.489,459,2.592,460,2.592,461,1.489,462,1.063,463,1.489,464,1.063,465,2.108,466,2.592,467,1.754,468,0.768,469,1.489,470,1.489,471,5.118,472,1.063,473,1.211,474,1.063,475,2.592,476,1.489,477,3.441,478,2.108,479,0.961,480,1.063]],["title/api_questions/#questions",[430,4.667]],["text/api_questions/#questions",[1,0.991,15,2.69,229,2.631,231,2.983,238,3.561,365,3.561,388,5.067,410,3.684,429,4.771,430,5.438,431,4.13,432,5.934,433,5.934,434,5.067,435,4.525]],["title/api_subcommand_config/",[481,4.095]],["text/api_subcommand_config/",[1,0.872,7,1.499,9,0.869,10,2.374,15,0.887,21,1.006,22,2.302,24,1.374,31,1.447,34,2.088,45,2.374,46,1.915,64,2.684,67,0.46,79,2.302,80,2.027,82,2.302,83,2.317,85,2.375,91,2.862,96,2.272,98,1.065,106,2.855,109,1.815,119,1.508,123,1.362,133,1.632,155,4.401,203,1.818,217,1.986,221,1.788,264,3.216,277,3.137,329,4.835,376,2.855,377,2.002,388,2.002,456,2.002,464,1.885,482,2.344,483,2.148,484,2.642,485,2.642,486,1.456,487,2.642,488,2.148,489,2.148,490,1.362,491,2.642,492,2.642,493,4.178,494,2.642,495,2.642,496,1.788,497,2.642,498,2.642]],["title/api_subcommand_config/#subcommandconfig",[482,5.093]],["text/api_subcommand_config/#subcommandconfig",[10,2.983,31,1.57,64,2.912,217,1.984]],["title/argcomplete/",[21,0.652,26,2.461,27,1.85]],["text/argcomplete/",[1,0.512,5,2.491,9,0.718,13,2.23,19,2.566,20,2.134,21,1.297,26,3.952,27,4.133,28,2.069,30,3.496,31,0.733,32,1.186,50,2.134,53,2.734,62,2.134,67,1.182,75,1.521,85,1.584,87,2.02,91,2.291,98,1.393,126,1.542,131,1.973,132,2.42,153,1.629,158,1.904,169,1.36,199,1.427,215,1.584,217,0.926,221,2.339,229,2.02,270,1.629,292,0.984,322,1.629,339,3.474,347,2.434,355,2.932,370,1.728,383,3.663,389,1.782,403,2.81,445,1.584,453,2.466,454,2.23,456,2.619,468,2.647,480,2.466,499,3.067,500,3.067,501,3.067,502,3.067,503,3.067,504,3.067,505,3.067,506,3.067,507,2.466,508,3.067,509,3.067,510,3.067,511,2.619,512,3.067,513,2.339,514,3.067,515,2.619,516,3.067,517,2.619,518,2.05,519,2.05,520,2.619,521,3.067,522,2.619,523,3.067,524,3.067,525,3.067,526,3.067,527,2.466,528,3.067,529,3.067,530,3.067,531,3.067,532,2.619,533,3.067,534,3.067,535,3.067]],["title/argcomplete/#argument-tab-completion-support",[21,0.558,26,2.107,27,1.584,28,1.316]],["text/argcomplete/#argument-tab-completion-support",[1,0.967,9,0.596,19,3.264,20,4.032,21,1.349,27,3.83,28,2.631,30,3.366,62,4.032,67,1.138,85,2.993,131,3.728,132,3.078,221,4.418,453,4.659,499,5.794,500,5.794]],["title/argcomplete/#prerequisites",[501,5.093]],["text/argcomplete/#prerequisites",[5,3.559,9,0.53,21,0.991,27,2.813,30,3.782,50,3.581,132,2.733,153,2.733,270,2.733,339,4.964,347,2.464,383,5.234,389,2.99,403,4.716,454,3.741,456,4.394,502,5.146,503,5.146,504,5.146,505,5.146,506,5.146,507,4.138,508,5.146,509,5.146,510,5.146,511,4.394,512,5.146,513,3.924,514,5.146,515,4.394]],["title/argcomplete/#using-tab-completion",[26,2.461,27,1.85,67,0.665]],["text/argcomplete/#using-tab-completion",[26,4.28,27,3.218,53,4.244,87,3.135,98,2.673,169,2.61,229,2.61,347,2.677,445,3.041,480,4.733,516,5.886,517,5.027,518,3.934,519,3.934]],["title/argcomplete/#adding-custom-completions",[27,1.85,322,1.798,355,2.178]],["text/argcomplete/#adding-custom-completions",[9,0.492,13,3.474,19,2.692,21,1.195,27,3.991,30,2.777,31,1.142,32,1.849,67,1.219,75,2.073,91,3.121,126,2.403,158,2.967,199,2.224,215,2.468,217,1.443,229,2.119,292,1.533,347,1.809,355,3.075,370,2.692,468,3.607,520,4.081,521,4.778,522,4.081,523,4.778,524,4.778,525,4.778,526,4.778,527,3.842,528,4.778,529,4.778,530,4.778,531,4.778,532,4.081,533,4.778,534,4.778,535,4.778]],["title/argument_parsing/",[21,0.783,22,2.525]],["text/argument_parsing/",[1,0.417,7,0.657,9,0.786,15,1.474,21,1.512,22,1.549,27,2.618,30,2.262,31,0.596,34,1.133,44,2.006,48,0.851,56,1.161,61,1.222,64,1.726,67,1.386,75,1.3,79,3.859,80,2.618,81,2.262,82,2.973,83,1.726,85,2.011,109,1.222,111,1.406,113,1.106,123,1.45,125,1.289,131,1.606,138,2.193,141,1.903,169,2.123,170,1.549,172,1.903,194,2.131,203,0.987,215,2.011,217,1.176,229,1.106,230,1.814,250,2.006,260,2.193,261,2.505,262,2.193,270,2.068,281,1.606,286,1.903,292,2.082,298,3.325,302,2.287,319,2.337,353,3.933,358,1.498,365,1.498,370,3.304,379,2.006,389,2.782,431,1.737,441,1.814,445,3.03,468,1.45,520,3.325,536,1.903,537,1.903,538,2.495,539,2.495,540,2.131,541,2.417,542,1.737,543,3.568,544,2.495,545,2.495,546,3.131,547,2.131,548,2.495,549,2.287,550,3.568,551,2.495,552,1.737,553,2.131,554,4.619,555,2.495,556,2.495,557,2.131,558,2.495,559,2.495,560,2.495,561,1.903]],["title/argument_parsing/#argument-parsing",[21,0.783,22,2.525]],["text/argument_parsing/#argument-parsing",[1,1.007,67,1.409,111,3.397,141,4.599,172,4.599,250,4.85,298,6.128,536,4.599,537,4.599,538,6.031,539,6.031,540,5.15]],["title/argument_parsing/#reading-arguments",[21,0.783,64,1.803]],["text/argument_parsing/#reading-arguments",[9,0.692,21,1.293,64,2.399,67,1.435,75,1.807,82,3.359,138,3.048,215,2.795,229,2.399,260,3.784,261,4.322,262,3.784,286,4.126,319,3.247,520,5.736,541,3.359,542,3.766,543,4.958,544,5.411,545,5.411]],["title/argument_parsing/#defining-arguments",[21,0.783,546,3.27]],["text/argument_parsing/#defining-arguments",[]],["title/argument_parsing/#argument-decorators",[21,0.783,370,2.291]],["text/argument_parsing/#argument-decorators",[9,0.692,15,2.048,21,1.541,44,4.351,67,1.319,138,3.048,169,2.399,292,2.343,319,3.247,358,3.247,370,4.115,441,3.934,445,2.795,546,4.351,547,4.62,548,5.411,549,4.958]],["title/argument_parsing/#arg_only",[82,3.162]],["text/argument_parsing/#arg_only",[7,1.502,9,0.587,21,1.336,31,1.363,34,2.59,82,3.541,170,3.541,203,2.255,215,2.947,365,3.423,370,3.213,431,3.97,445,3.584,541,3.541,543,5.227,550,5.227,551,5.704,552,3.97,553,4.871]],["title/argument_parsing/#completers",[27,2.784]],["text/argument_parsing/#completers",[9,0.631,21,1.18,27,3.962,30,4.21,56,2.854,125,3.167,131,3.945,230,4.458,292,1.966,468,3.563]],["title/argument_parsing/#deprecated",[353,3.703]],["text/argument_parsing/#deprecated",[21,1.253,48,1.754,67,1.402,75,1.719,79,4.042,83,2.281,85,3.363,109,2.52,113,2.281,123,2.99,169,2.886,217,1.554,270,3.458,302,4.716,353,5.191,379,4.138,389,3.782,445,2.658,554,6.408,555,5.146,556,5.146,557,4.394]],["title/argument_parsing/#action-store_boolean",[79,2.101,80,1.85,81,1.966]],["text/argument_parsing/#action-store_boolean",[9,0.695,15,2.063,21,1.411,61,2.669,79,4.551,80,3.689,81,3.167,83,2.417,194,4.655,217,1.646,281,3.507,292,2.351,389,3.167,445,2.816,550,4.995,558,5.451,559,5.451,560,5.451,561,4.157]],["title/breaking_changes/",[121,2.956,122,2.223]],["text/breaking_changes/",[1,0.784,9,0.746,19,1.364,21,0.732,24,1.409,28,1.1,29,1.76,31,1.122,32,1.471,34,1.1,35,1.048,36,0.825,37,1.947,46,1.251,56,1.127,67,0.476,81,1.407,84,1.409,96,1.391,98,1.727,99,2.647,108,3.493,112,1.127,117,3.703,118,1.947,119,1.558,120,2.068,121,2.765,122,2.079,125,1.965,126,1.217,127,2.068,128,2.068,129,2.068,130,1.618,132,1.286,133,3.268,169,1.073,197,1.286,198,1.364,199,1.127,200,2.219,201,1.947,203,0.957,217,1.607,221,1.847,230,1.76,231,1.217,245,1.76,246,2.068,252,1.947,291,1.76,292,1.22,318,1.947,322,2.02,335,3.485,347,1.44,353,2.765,357,2.068,365,1.453,369,1.618,379,1.947,389,3.092,400,1.947,412,1.847,417,2.729,429,1.947,438,1.947,444,2.219,445,1.251,462,1.947,479,2.765,511,2.068,532,2.068,541,1.503,552,1.685,562,2.421,563,4.204,564,1.847,565,2.421,566,2.421,567,2.421,568,2.421,569,2.421,570,3.803,571,3.139,572,4.01,573,2.421,574,2.421,575,2.421,576,2.421,577,2.421,578,3.485,579,2.421,580,2.421,581,2.421,582,3.811,583,2.421,584,2.421,585,3.139,586,2.068,587,2.421,588,2.421,589,2.421,590,2.421,591,2.421,592,2.421,593,2.421,594,2.421,595,2.421,596,2.421,597,2.068,598,2.421,599,2.068,600,2.421,601,2.421,602,1.685,603,2.421,604,2.421,605,2.421,606,2.421,607,2.421,608,2.068,609,1.847]],["title/breaking_changes/#breaking-changes",[121,2.956,122,2.223]],["text/breaking_changes/#breaking-changes",[1,0.999,108,2.929,121,4.349,122,3.271,126,3.008,127,5.108,128,5.108,129,5.108,132,3.178,133,4.163,412,4.562,562,5.982,563,4.349,564,4.562,565,5.982]],["title/breaking_changes/#version-160",[108,1.991,566,4.066]],["text/breaking_changes/#version-160",[1,0.897,28,2.439,130,3.59,197,2.853,322,2.853,417,4.231,563,5.54,567,5.371,568,5.371,569,5.371,570,6.687,571,4.469,572,6.218,573,5.371,574,5.371,575,5.371,576,5.371,577,5.371,578,4.922,579,5.371]],["title/breaking_changes/#version-150",[108,1.991,578,3.726]],["text/breaking_changes/#version-150",[9,0.735,21,1.152,24,2.217,96,1.772,169,2.652,322,3.178,353,4.349,365,3.59,369,3.998,379,4.81,541,3.714,580,5.982,581,5.982,582,3.714]],["title/breaking_changes/#version-140",[108,1.991,583,4.066]],["text/breaking_changes/#version-140",[1,0.723,9,0.446,19,2.439,24,1.604,29,3.147,31,1.39,34,1.966,37,3.481,46,2.236,56,2.015,84,2.155,96,1.282,98,2.641,117,4.886,118,3.481,119,2.786,120,3.697,125,3.004,133,4.047,199,2.015,200,3.967,201,3.481,203,1.712,217,1.984,230,3.147,231,2.177,291,3.147,292,1.865,347,1.639,353,3.147,357,3.697,389,3.379,429,3.481,438,3.481,444,3.967,445,2.236,462,3.481,479,3.147,532,3.697,552,3.013,571,2.893,582,3.611,584,4.329,585,4.389,586,3.697,587,4.329,588,4.329]],["title/breaking_changes/#version-130",[108,1.991,589,4.066]],["text/breaking_changes/#version-130",[9,0.545,21,1.019,35,2.292,36,1.804,67,1.04,99,4.612,108,3.245,112,2.464,198,2.982,217,1.599,252,4.257,335,6.073,347,2.004,389,3.85,479,3.849,511,4.521,582,3.287,590,5.294,591,5.294,592,5.294,593,5.294,594,5.294,595,5.294,596,5.294,597,4.521,598,5.294,599,4.521]],["title/breaking_changes/#version-120",[108,1.991,600,4.066]],["text/breaking_changes/#version-120",[32,2.817,96,1.831,221,4.715,582,3.839,601,6.183,602,4.303,603,6.183,604,6.183,605,6.183,606,6.183]],["title/breaking_changes/#version-110",[108,1.991,607,4.066]],["text/breaking_changes/#version-110",[31,1.529,81,3.717,245,4.652,246,5.464,400,5.145,582,3.972,608,5.464]],["title/breaking_changes/#version-100",[108,1.991,609,3.101]],["text/breaking_changes/#version-100",[108,3.275,318,5.378]],["title/configuration/",[31,1.217]],["text/configuration/",[1,0.891,7,0.543,9,0.788,10,0.936,19,2.377,20,1.435,21,1.101,23,1.499,24,1.799,25,2.077,28,0.936,29,1.499,31,1.592,32,2.636,34,1.917,38,1.499,53,2.008,61,1.01,64,1.871,67,1.183,72,1.572,76,1.323,80,1.829,81,1.198,83,1.871,84,1.24,87,1.871,92,1.28,96,2.058,105,1.658,112,0.96,123,1.198,134,0.872,145,1.761,169,0.914,198,2.377,199,0.96,203,2.871,204,2.014,217,1.819,226,1.499,229,0.914,239,1.572,245,1.499,247,1.761,260,2.377,262,1.884,264,1.777,271,1.435,272,1.378,277,1.238,286,2.551,292,1.073,312,1.761,316,1.658,320,3.604,325,2.152,334,1.435,347,0.781,358,1.238,365,2.008,369,3.245,372,1.89,376,1.28,389,1.198,408,1.658,417,1.198,431,1.435,438,1.658,468,1.198,472,1.658,474,1.658,496,1.572,536,1.572,541,3.015,542,1.435,552,1.435,553,1.761,557,1.761,585,2.821,597,1.761,608,1.761,609,1.572,610,2.69,611,2.062,612,1.761,613,1.658,614,1.658,615,1.761,616,2.69,617,2.062,618,2.062,619,1.761,620,2.062,621,2.062,622,2.062,623,1.761,624,2.857,625,1.761,626,2.062,627,2.062,628,2.062,629,2.062,630,2.062,631,2.062,632,2.062,633,2.062,634,2.062,635,2.062,636,1.89,637,2.062,638,2.062,639,1.572,640,1.572,641,2.062,642,2.062,643,3.345,644,4.22]],["title/configuration/#configuration",[31,1.217]],["text/configuration/#configuration",[1,0.931,19,3.14,20,3.88,21,1.073,24,2.535,28,2.532,29,4.053,32,2.647,61,2.73,67,1.095,76,2.204,96,2.026,112,2.595,169,2.471,347,2.11,358,3.346,376,3.461,536,4.251,541,3.461,610,4.482,611,5.574]],["title/configuration/#structure",[610,4.095]],["text/configuration/#structure",[1,0.877,7,1.384,9,0.541,21,1.27,24,2.445,25,3.263,31,1.576,34,2.996,67,1.032,80,2.874,87,2.925,92,3.263,96,1.557,203,2.609,217,1.588,264,2.792,277,3.155,292,1.686,365,3.155,408,4.226,417,3.054,553,4.489,612,4.489,613,4.226,614,4.226,615,4.489]],["title/configuration/#reading-config-values",[64,1.5,96,1.002,203,1.338]],["text/configuration/#reading-config-values",[31,1.418,64,2.631,67,1.165,96,1.757,203,2.81,204,2.832,260,4.003,262,4.003,264,3.152,271,4.13,286,4.525,542,4.13,616,4.771]],["title/configuration/#setting-config-values",[96,1.002,203,1.338,217,1.022]],["text/configuration/#setting-config-values",[9,0.642,83,2.764,203,2.466,260,3.512,272,4.167,286,4.755,312,5.325,389,3.623,616,5.014,617,6.235]],["title/configuration/#writing-configuration-files",[10,1.537,31,0.809,32,1.309]],["text/configuration/#writing-configuration-files",[9,0.626,31,1.453,32,2.789,67,1.194,96,1.801,105,4.89,334,4.232,369,4.064,468,3.533,541,3.775,618,6.081,619,5.193]],["title/configuration/#configuration-file-location",[31,0.809,32,1.309,369,2.262]],["text/configuration/#configuration-file-location",[1,1.032,9,0.777,31,1.135,32,2.391,38,3.452,67,1.214,76,1.877,87,2.105,96,1.406,123,2.759,217,2.076,239,3.621,247,4.054,316,3.818,369,4.131,557,4.054,585,4.594,609,3.621,620,4.748,621,4.748,622,4.748,623,4.054,624,5.279,625,4.054,626,4.748,627,4.748,628,4.748,629,4.748,630,4.748,631,4.748,632,4.748,633,4.748,634,4.748,635,4.748]],["title/configuration/#where-did-a-value-come-from",[203,1.608,636,3.726]],["text/configuration/#where-did-a-value-come-from",[9,0.545,19,2.982,21,1.393,31,1.265,32,2.564,64,2.347,67,1.04,72,4.037,84,2.456,96,1.962,199,2.464,203,3.086,217,1.599,229,2.347,292,1.698,365,3.177,372,4.851,431,3.684,541,4.114,552,3.684,637,5.294]],["title/configuration/#automatic-type-inference",[25,2.101,53,2.031,638,3.384]],["text/configuration/#automatic-type-inference",[1,0.782,9,0.746,19,2.64,23,3.408,31,1.12,32,1.813,34,2.129,53,2.813,80,2.563,81,2.724,83,2.718,96,1.815,134,1.983,145,4.003,198,3.848,203,2.424,204,2.926,217,1.416,226,3.408,245,3.408,320,5.833,325,3.945,438,3.769,472,3.769,474,3.769,496,3.575,597,4.003,608,4.003,639,3.575,640,3.575,641,4.687,642,4.687,643,6.13,644,6.831]],["title/installation/",[645,5.093]],["text/installation/",[1,1.27,5,3.885,12,5.438,18,3.818,28,2.695,67,1.165,507,4.771,645,7.106,646,5.438,647,4.525,648,5.438,649,6.687]],["title/logging/",[40,1.928]],["text/logging/",[1,0.828,5,2.223,7,0.695,9,0.738,10,2.252,15,1.539,21,0.508,25,1.638,31,0.63,32,2.156,35,2.148,36,2.052,40,2.87,45,1.846,48,1.691,52,3.737,56,1.228,67,0.974,75,0.881,83,1.17,84,2.356,95,1.698,99,3.452,102,3.1,103,2.253,104,4.235,110,3.606,111,1.486,112,2.594,113,2.199,114,3.1,115,3.1,119,1.698,125,1.363,131,1.698,153,1.401,154,2.012,158,1.638,163,3.079,189,2.717,190,1.486,204,1.259,215,1.363,232,2.253,253,1.091,292,1.591,304,2.956,307,2.012,311,2.253,317,2.012,322,1.401,325,1.698,347,1.878,435,3.1,440,2.638,443,2.418,445,2.562,457,2.418,486,1.638,542,1.836,549,2.418,636,2.418,646,2.418,648,2.418,650,2.973,651,2.418,652,2.418,653,4.581,654,2.638,655,2.638,656,2.638,657,2.638,658,2.638,659,2.638,660,2.638,661,2.638,662,2.638,663,2.638,664,2.638,665,1.763,666,2.253,667,2.253,668,2.638,669,2.638,670,2.638,671,2.253,672,2.638,673,4.065,674,4.065,675,2.638,676,2.638,677,2.638]],["title/logging/#writing-log-entries",[10,1.537,40,1.281,654,3.384]],["text/logging/#writing-log-entries",[5,3.452,9,0.505,10,2.228,35,2.734,36,2.152,40,2.39,52,3.046,56,2.283,67,1.24,75,1.638,95,3.157,112,2.283,113,2.175,125,2.534,131,3.157,154,3.741,158,3.046,163,3.92,190,2.763,253,2.029,304,3.567,317,3.741,435,3.741,486,3.046,646,4.496,655,4.906,656,4.906,657,4.906,658,4.906,659,4.906,660,4.906,661,4.906,662,4.906,663,4.906,664,4.906,665,3.279]],["title/logging/#verbose-mode",[110,2.956,119,2.617]],["text/logging/#verbose-mode",[1,0.91,9,0.695,45,2.475,52,3.384,67,1.071,83,2.417,84,2.02,102,5.146,110,4.906,215,2.816,292,2.164,304,3.963,307,4.157,325,3.507,347,2.555,445,3.786,457,4.995,542,3.793,666,4.655,667,4.655]],["title/logging/#controlling-log-output",[40,1.281,48,1.154,189,2.262]],["text/logging/#controlling-log-output",[7,1.083,9,0.708,10,1.867,15,1.556,21,0.792,25,2.553,32,2.659,35,1.78,36,2.18,40,2.878,45,1.867,48,1.914,52,2.553,84,2.666,99,4.451,103,3.511,104,5.462,111,2.316,112,2.977,113,2.49,114,4.283,115,4.283,163,2.553,189,2.748,204,1.962,292,1.319,311,3.511,322,2.184,347,1.556,443,3.768,648,3.768,668,4.111,669,4.111,670,4.111,671,3.511,672,4.111,673,5.616,674,5.616,675,4.111,676,4.111,677,4.111]],["title/metadata/",[585,3.404]],["text/metadata/",[1,1.169,7,1.844,9,0.819,31,0.818,32,1.324,42,2.383,67,0.672,68,2.923,72,2.611,76,2.922,87,2.568,98,1.555,108,3.105,152,2.203,198,2.781,217,2.181,229,2.189,251,3.137,253,2.042,271,2.383,292,1.098,316,3.971,317,5.127,318,2.753,319,2.055,347,1.296,355,4.08,369,2.288,378,1.928,410,2.125,454,2.489,552,2.383,554,2.923,585,4.825,609,2.611,623,2.923,624,2.923,625,2.923,665,2.288,678,2.923,679,2.923,680,4.938,681,3.423,682,3.423,683,3.423,684,2.288,685,3.423,686,2.611]],["title/metadata/#milc-metadata",[1,0.679,585,2.718]],["text/metadata/#milc-metadata",[1,1.046,7,1.869,9,0.801,31,0.946,32,1.531,42,2.754,68,3.379,72,3.018,76,2.807,87,2.779,98,1.797,108,3.312,152,2.546,198,3.081,217,2.144,229,2.425,251,3.626,253,2.262,271,2.754,316,4.398,318,3.182,319,2.375,369,2.644,378,2.229,410,2.457,454,2.877,552,2.754,554,3.379,585,4.52,609,3.018,623,3.379,624,3.379,625,3.379,665,2.644,678,3.379,679,3.379,680,5.47,681,3.957,682,3.957,683,3.957,684,2.644,685,3.957,686,3.018]],["title/metadata/#custom-loggers",[317,3.101,355,2.617]],["text/metadata/#custom-loggers",[1,1.147,7,1.479,9,0.765,67,1.103,76,2.937,217,2.076,292,1.801,317,5.903,347,2.126,355,4.78,585,4.594]],["title/sparklines/",[197,2.705]],["text/sparklines/",[1,0.915,6,3.278,9,0.853,18,1.215,21,0.363,28,0.857,36,2.389,45,1.803,48,1.061,56,0.879,64,1.38,67,0.371,76,1.57,84,1.471,97,1.063,99,1.314,101,2.08,109,0.924,112,0.879,122,1.032,123,1.808,126,1.565,131,1.215,134,0.799,152,1.215,153,1.003,156,1.518,159,3.48,165,1.097,184,1.172,190,1.063,197,3.822,198,2.594,202,3.39,203,1.57,204,1.485,205,3.39,206,5.332,207,3.933,209,3.933,210,3.703,211,3.512,215,1.607,217,1.539,219,1.518,223,1.73,224,1.73,226,1.372,229,1.76,235,1.518,243,4.096,253,0.78,257,1.612,262,1.063,265,1.518,272,1.262,292,1.477,324,1.133,327,1.262,329,1.439,365,1.133,380,1.032,390,1.868,400,1.518,410,1.172,434,1.612,467,2.373,472,1.518,473,1.73,474,1.518,478,1.73,488,1.73,489,1.73,490,1.097,519,1.262,561,1.439,602,1.314,665,1.262,687,1.887,688,1.887,689,1.887,690,1.887,691,1.887,692,1.887,693,1.887,694,1.887,695,4.22,696,4.668,697,3.933,698,4.22,699,1.887,700,1.887,701,1.887,702,1.612,703,1.612,704,1.887,705,1.887,706,1.887,707,1.887,708,1.887,709,1.887,710,1.887,711,1.887,712,1.887,713,1.887,714,1.887,715,2.657,716,2.852,717,1.887,718,1.887,719,1.887,720,1.887]],["title/sparklines/#sparklines",[197,2.705]],["text/sparklines/#sparklines",[9,0.583,18,3.642,56,2.634,64,3.062,97,3.188,99,3.939,109,2.772,112,2.634,131,3.642,197,3.669,478,5.187,665,3.783,687,5.66,688,5.66,689,5.66,690,5.66,691,5.66,692,5.66,693,5.66,694,5.66]],["title/sparklines/#usage",[101,3.404]],["text/sparklines/#usage",[1,0.871,6,4.226,9,0.862,45,2.37,48,1.779,76,2.064,101,3.488,123,3.032,134,2.208,197,3.817,410,3.24,519,3.488,695,6.018,696,6.018,697,4.457,698,6.018]],["title/sparklines/#whitespace",[699,5.093]],["text/sparklines/#whitespace",[1,0.808,6,3.115,9,0.861,45,2.199,48,1.65,67,0.951,76,1.914,152,3.115,190,2.727,197,3.686,198,2.727,204,2.988,235,3.893,253,2.002,265,3.893,400,3.893,434,4.134,472,3.893,473,4.437,474,3.893,697,4.134,700,4.841,701,4.841,702,4.134,703,4.134,704,4.841,705,4.841,706,4.841]],["title/sparklines/#color",[36,1.736]],["text/sparklines/#color",[1,1.015,28,2.762,36,2.458,153,3.23,197,3.83,257,5.193,324,3.65,327,4.064,390,3.65,707,6.081,708,6.081]],["title/sparklines/#negative-and-positive-numbers",[198,1.906,210,2.721,211,2.581]],["text/sparklines/#negative-and-positive-numbers",[1,0.91,9,0.561,36,2.683,84,2.02,122,2.98,123,3.167,159,4.05,184,3.384,197,2.895,198,3.801,210,5.894,211,5.59,243,4.383,292,1.748,467,4.157,709,5.451,710,5.451]],["title/sparklines/#highlight-color",[36,1.386,206,3.27]],["text/sparklines/#highlight-color",[1,0.698,9,0.769,21,0.805,36,2.467,84,2.105,126,2.102,156,3.362,159,4.344,165,2.43,206,6.405,207,5.911,209,5.911,215,2.16,217,2.091,219,3.362,223,3.832,229,2.519,243,5.566,262,2.355,292,2.069,380,2.286,467,3.189,490,2.43,561,3.189,711,4.181,712,4.181,713,4.181,714,4.181,715,4.851]],["title/sparklines/#optimization",[716,4.667]],["text/sparklines/#optimization",[1,0.74,6,3.802,9,0.847,45,2.013,76,1.753,126,2.229,197,3.765,202,5.675,203,2.628,205,5.675,215,2.29,217,1.339,224,4.063,226,3.223,229,1.965,272,2.963,329,3.381,365,2.661,390,2.661,488,4.063,489,4.063,602,3.085,695,5.415,696,6.09,697,5.046,698,5.415,716,4.063,717,4.433,718,4.433,719,4.433,720,4.433]],["title/spinners/",[59,2.431]],["text/spinners/",[6,1.218,7,1.446,9,0.885,15,0.716,59,3.765,61,0.927,63,1.936,67,1.14,75,1.704,91,0.951,98,0.859,109,1.948,125,0.978,126,0.951,134,2.158,138,1.757,153,1.656,163,1.175,195,1.522,230,1.376,231,2,253,0.782,260,1.066,264,1.005,272,1.265,285,3.033,292,0.607,310,1.317,322,2.113,332,1.265,345,1.317,349,2.663,355,2.007,370,1.757,380,1.035,390,1.872,391,3.518,392,1.616,393,3.033,395,4.427,396,1.616,410,1.175,411,2.663,412,2.378,413,2.378,414,3.939,415,3.709,416,3.518,417,2.311,490,2.311,518,2.658,537,1.443,546,1.522,564,1.443,684,2.084,686,1.443,721,1.443,722,1.892,723,3.397,724,1.892,725,2.858,726,2.858,727,3.118]],["title/spinners/#spinners",[59,2.431]],["text/spinners/#spinners",[6,3.288,9,0.795,15,1.935,59,3.397,63,3.173,67,1.398,125,2.64,153,2.715,195,4.109,230,3.715,231,2.569,253,2.113,345,3.557,349,4.364,370,2.879,410,3.173,411,4.364,412,3.897,413,3.897,414,6.078,416,3.897,537,3.897,564,3.897,686,3.897,721,3.897,722,5.11]],["title/spinners/#adding-a-spinner",[59,1.941,322,2.16]],["text/spinners/#adding-a-spinner",[9,0.872,59,3.408,67,1.175,109,2.211,126,2.27,138,2.543,153,2.398,163,2.803,260,2.543,264,2.398,272,3.017,292,1.448,310,3.142,322,2.398,332,3.017,380,2.468,390,3.589,391,4.561,393,3.443,395,5.114,396,3.855,414,3.855,490,2.623,518,3.017,546,3.63,723,3.855,724,4.515]],["title/spinners/#example-using-a-custom-spinner-directly",[59,1.209,67,0.498,75,0.846,138,1.427,355,1.631]],["text/spinners/#example-using-a-custom-spinner-directly",[7,1.258,9,0.885,59,3.484,109,2.34,134,2.022,391,3.644,393,3.644,395,4.734,415,3.474,490,2.777,518,3.194,684,3.194,723,4.081,725,4.379,726,4.379]],["title/spinners/#example-adding-a-custom-spinner",[59,1.383,75,0.968,322,1.539,355,1.865]],["text/spinners/#example-adding-a-custom-spinner",[7,1.575,9,0.885,59,3.545,61,2.211,109,2.211,134,1.91,391,3.443,393,3.443,395,4.561,415,3.283,490,2.623,518,3.017,684,3.017,723,3.855,725,4.137,726,4.137,727,5.981]],["title/spinners/#example-instantiating-a-spinner",[59,1.615,75,1.13,411,2.89]],["text/spinners/#example-instantiating-a-spinner",[7,1.457,9,0.868,59,3.773,63,3.435,134,2.341,285,4.219,412,4.219,415,4.023,416,4.219,417,3.215]],["title/spinners/#example-using-a-context-manager",[67,0.569,75,0.968,349,2.475,413,2.21]],["text/spinners/#example-using-a-context-manager",[7,1.575,9,0.853,59,3.408,134,2.531,285,4.562,415,4.349,416,4.562,417,3.476]],["title/spinners/#example-decorating-a-function",[75,1.13,231,1.701,370,1.906]],["text/spinners/#example-decorating-a-function",[7,1.514,9,0.854,59,3.327,91,2.89,98,2.611,134,2.432,231,2.89,285,4.384,392,4.909,415,4.18,416,4.384,417,3.34]],["title/subcommand_config/",[24,1.507,96,1.204]],["text/subcommand_config/",[1,0.468,7,1.715,9,0.814,10,0.756,11,1.422,15,1.799,21,1.055,23,1.211,24,2.218,31,1.724,34,1.273,56,0.775,64,2.107,67,0.551,75,2.124,76,1.109,84,1.345,87,0.738,96,2.092,97,0.938,98,1.273,106,1.034,109,1.373,112,1.69,113,1.243,117,1.159,123,0.968,125,0.86,132,0.885,155,1.211,163,1.034,169,2.283,170,1.034,203,2.367,204,2.856,215,0.86,217,1.921,220,1.951,232,1.422,238,1,264,3.055,270,0.885,277,1.683,297,1.951,324,1,329,1.27,358,1,376,2.254,377,1.422,378,0.938,380,0.911,390,1,413,1.27,431,1.159,462,1.339,464,2.255,468,1.629,481,1.339,486,1.741,490,1.629,496,2.138,519,1.113,537,1.27,563,1.211,571,1.113,582,1.741,671,1.422,678,1.422,684,1.113,686,1.27,702,1.422,703,1.422,728,1.665,729,1.665,730,1.665,731,1.665,732,1.665,733,1.665,734,1.665,735,1.665,736,1.422,737,2.038,738,3.327,739,3.327,740,3.327,741,2.804,742,2.804,743,2.804,744,3.327,745,1.665,746,1.665,747,3.624,748,3.624,749,3.624,750,3.624,751,3.624,752,1.665,753,3.928,754,1.665,755,3.101,756,1.665,757,1.665,758,1.665,759,1.422,760,1.665,761,1.665,762,1.665,763,1.665,764,1.665,765,2.569,766,3.327,767,1.665,768,2.569,769,3.327,770,1.665,771,1.665,772,1.665]],["title/subcommand_config/#milc-config-subcommand",[1,0.565,24,1.254,96,1.002]],["text/subcommand_config/#milc-config-subcommand",[24,2.392,96,1.911,132,3.428,163,4.007,563,4.692,728,6.454]],["title/subcommand_config/#introduction",[729,5.093]],["text/subcommand_config/#introduction",[1,0.847,11,4.334,15,2.443,21,1.242,24,2.766,31,1.542,64,2.25,76,2.551,87,2.25,96,1.911,125,2.622,217,1.533,220,3.532,232,4.334,238,3.046,264,3.427,413,3.87,462,4.081,481,4.081,490,2.949,703,4.334,730,5.075,731,5.075,732,5.075,733,5.075,734,5.075,735,5.075,736,4.334]],["title/subcommand_config/#simple-example",[75,1.358,519,2.718]],["text/subcommand_config/#simple-example",[7,1.782,9,0.74,21,0.885,23,3.344,31,1.447,64,2.039,75,1.536,96,1.362,98,2.089,169,2.684,170,2.856,204,2.89,217,1.389,270,2.443,358,2.76,390,2.76,468,2.672,490,2.672,582,3.759,684,3.074,737,4.402,738,5.548,739,5.548,740,5.548,741,6.054,742,6.054,743,6.054,744,5.548,745,4.599,746,4.599,747,3.508,748,3.508,749,3.508,750,3.508,751,3.508]],["title/subcommand_config/#setting-user-defaults",[15,1.281,84,1.254,217,1.022]],["text/subcommand_config/#setting-user-defaults",[7,1.309,9,0.763,15,1.882,21,1.226,24,1.842,31,1.188,67,0.977,75,2.127,96,1.473,169,3.115,203,2.518,204,2.373,215,2.568,217,2.122,220,3.46,297,4.432,431,3.46,739,4.556,747,3.792,748,3.792,749,3.792,750,3.792,751,3.792,752,4.972,753,4.857,754,4.972,755,4.246,756,4.972]],["title/subcommand_config/#subcommand-reference-config",[24,1.254,96,1.002,686,2.581]],["text/subcommand_config/#subcommand-reference-config",[21,1.33,24,2.097,31,1.781,67,1.112,96,1.676,98,2.571,106,3.514,113,2.509,117,3.939,123,3.289,155,4.115,329,4.317,377,4.834,464,4.551,702,4.834,757,5.66,758,5.66,759,4.834,760,5.66]],["title/subcommand_config/#setting-configuration-values",[31,0.809,203,1.338,217,1.022]],["text/subcommand_config/#setting-configuration-values",[7,1.404,9,0.782,31,1.591,75,1.781,84,1.976,96,1.971,203,2.108,204,2.545,217,1.611,264,3.536,464,4.288,537,4.066,571,3.564,747,4.066,748,4.066,749,4.066,750,4.066,751,4.066,755,4.554,761,5.332,762,5.332,763,5.332,764,5.332,765,4.886]],["title/subcommand_config/#reading-configuration-values",[31,0.809,64,1.5,203,1.338]],["text/subcommand_config/#reading-configuration-values",[31,1.682,34,2.652,56,2.718,64,2.589,109,2.86,203,2.783,217,1.764,264,3.739,277,3.505,376,3.626,380,3.193,468,3.393,753,4.453,766,6.45]],["title/subcommand_config/#all-set-options-example",[34,1.537,75,1.13,217,1.022]],["text/subcommand_config/#all-set-options-example",[7,1.761,96,1.981]],["title/subcommand_config/#entire-configuration-example",[31,0.809,75,1.13,766,3.101]],["text/subcommand_config/#entire-configuration-example",[7,1.761,96,1.981]],["title/subcommand_config/#whole-section-example",[75,1.13,277,2.031,767,3.384]],["text/subcommand_config/#whole-section-example",[7,1.746,96,1.963,97,3.734]],["title/subcommand_config/#single-key-example",[75,1.13,264,1.798,376,2.101]],["text/subcommand_config/#single-key-example",[7,1.746,96,1.963,768,6.074]],["title/subcommand_config/#multiple-keys-example",[75,1.13,264,1.798,753,2.581]],["text/subcommand_config/#multiple-keys-example",[7,1.7,15,2.443,96,1.911,112,3.004,768,5.914,769,5.914]],["title/subcommand_config/#deleting-configuration-values",[31,0.809,203,1.338,496,2.581]],["text/subcommand_config/#deleting-configuration-values",[7,1.435,9,0.789,31,1.613,75,1.82,96,1.614,112,3.141,113,2.417,203,2.155,204,3.498,217,1.646,496,4.157,671,4.655,747,4.157,748,4.157,749,4.157,750,4.157,751,4.157,769,6.184,770,5.451]],["title/subcommand_config/#multiple-operations",[486,2.525,753,3.101]],["text/subcommand_config/#multiple-operations",[7,1.384,9,0.778,10,2.387,31,1.256,64,2.33,84,1.948,96,1.557,109,2.574,169,2.33,204,3.148,324,3.155,376,3.263,378,2.961,486,3.263,678,4.489,738,4.817,740,4.817,744,4.817,747,4.008,748,4.008,749,4.008,750,4.008,751,4.008,753,4.008,755,4.489,765,4.817,771,5.256,772,5.256]],["title/subprocesses/",[773,3.703]],["text/subprocesses/",[1,0.775,7,0.504,9,0.81,18,1.23,21,1.309,24,0.709,28,1.428,32,0.74,38,2.913,41,3.62,46,3.012,48,1.749,50,1.331,56,0.89,61,0.936,67,0.618,69,1.537,75,0.639,76,1.244,77,1.537,83,1.776,84,1.485,98,2.766,111,1.077,113,0.848,125,0.988,126,2.334,132,2.128,134,1.964,138,1.772,141,1.458,150,1.633,153,2.128,169,2.952,171,1.458,190,2.257,191,1.537,199,1.464,201,1.537,215,1.625,226,1.39,229,1.776,238,1.148,262,1.077,270,1.671,274,1.752,279,1.752,281,1.23,292,1.87,294,1.458,300,1.752,310,2.788,319,1.148,323,3.732,324,3.079,325,2.578,326,3.84,327,2.678,331,2.913,332,2.102,334,2.189,336,1.752,337,1.752,339,2.398,340,1.752,341,1.752,342,1.752,343,1.752,345,2.189,351,1.633,378,3.108,380,1.045,401,1.633,410,1.187,441,1.39,453,1.537,467,1.458,483,2.882,507,1.537,515,1.633,571,1.278,599,1.633,602,1.331,759,1.633,773,3.73,774,1.912,775,3.964,776,1.912,777,1.912,778,3.732,779,3.145,780,1.912,781,1.912,782,1.912,783,1.912,784,1.912,785,1.912,786,1.912,787,1.912,788,1.912,789,1.912,790,1.633,791,1.633,792,1.912,793,1.633,794,1.912,795,1.912,796,1.912,797,1.912,798,1.912,799,1.912,800,1.912,801,1.912,802,3.145,803,1.633,804,1.912,805,1.912,806,1.39,807,1.912,808,1.912,809,1.912,810,1.912,811,1.912,812,1.912,813,1.912,814,1.912,815,1.912]],["title/subprocesses/#executing-commands-in-a-subprocess",[169,1.5,378,1.906,773,2.461]],["text/subprocesses/#executing-commands-in-a-subprocess",[1,1.041,18,4.012,24,2.311,56,2.902,98,2.832,111,3.512,132,3.312,141,4.755,238,3.742,774,6.235]],["title/subprocesses/#basic-subprocess-execution",[378,1.906,410,2.101,773,2.461]],["text/subprocesses/#basic-subprocess-execution",[7,1.114,9,0.841,21,1.339,50,2.944,67,0.831,75,1.412,77,3.401,98,3.158,125,2.185,126,3.263,169,3.083,199,1.969,215,2.957,229,1.875,262,2.382,279,3.876,292,1.356,319,2.538,331,3.075,332,2.827,336,3.876,337,3.876,339,3.226,345,2.944,759,3.612,775,4.889,776,4.229,777,4.229,778,5.592,779,5.725,780,4.229,781,4.229,782,4.229,783,4.229,784,4.229,785,4.229,786,4.229]],["title/subprocesses/#supported-arguments",[21,0.783,28,1.847]],["text/subprocesses/#supported-arguments",[21,1.344,41,4.335,46,3.607,48,2.38,83,3.095,84,1.818,98,2.228,134,2.075,138,2.763,169,3.095,190,2.763,199,2.283,226,3.567,292,1.573,294,3.741,323,3.945,324,3.789,325,4.493,326,3.414,332,3.279,334,3.414,351,4.189,378,2.763,773,3.567,787,4.906,788,4.906,789,4.906]],["title/subprocesses/#differences-from-subprocessrun",[326,2.83,327,2.718]],["text/subprocesses/#differences-from-subprocessrun",[76,2.552,153,3.428,326,4.492,327,4.313,441,4.692,775,5.511]],["title/subprocesses/#windows-support",[28,1.847,38,2.956]],["text/subprocesses/#windows-support",[1,1.036,9,0.492,32,1.849,38,4.513,61,2.34,98,2.819,132,3.297,169,2.119,201,3.842,229,2.752,281,3.075,292,1.533,300,4.379,326,3.326,345,3.326,378,3.884,453,3.842,515,4.081,571,3.194,599,4.081,602,3.326,773,3.474,790,4.081,791,4.081,792,4.778,793,4.081,794,4.778,795,4.778,796,4.778,797,4.778,798,4.778,799,4.778,800,4.778,801,4.778,802,6.207,803,4.081,804,4.778,805,4.778]],["title/subprocesses/#building-argument-lists",[21,0.652,126,1.701,331,2.461]],["text/subprocesses/#building-argument-lists",[1,0.938,21,1.081,69,4.517,76,2.221,113,2.49,153,3.651,169,3.048,190,3.872,274,5.147,326,3.909,327,3.754,331,4.084,467,4.284,483,6.299,507,4.517,806,4.084,807,5.617,808,5.617,809,5.617]],["title/subprocesses/#capture-output",[48,1.386,323,3.27]],["text/subprocesses/#capture-output",[9,0.621,41,3.745,46,3.116,48,2.056,84,2.235,171,4.599,270,3.204,292,1.934,310,4.197,323,5.77,334,4.197,775,5.15,810,6.031]],["title/subprocesses/#combining-stderr-with-stdout",[41,2.101,46,1.748,324,2.031]],["text/subprocesses/#combining-stderr-with-stdout",[9,0.735,41,3.714,46,3.09,292,1.918,310,4.163,324,4.286,339,4.562,340,5.482,341,5.482,380,3.271,401,5.108,811,5.982,812,5.982]],["title/subprocesses/#text-encoding",[134,1.72,342,3.726]],["text/subprocesses/#text-encoding",[9,0.631,41,3.807,46,3.167,84,2.272,134,3.065,150,5.236,270,3.257,292,1.966,310,4.267,343,5.619,813,6.131]],["title/subprocesses/#other-arguments",[21,0.98]],["text/subprocesses/#other-arguments",[9,0.642,21,1.2,67,1.225,138,3.512,191,5.014,292,2,326,4.34,773,4.534,814,6.235,815,6.235]],["title/threading/",[54,2.83,55,3.101]],["text/threading/",[1,0.668,9,0.649,10,1.816,21,0.77,54,4.728,55,4.203,67,1.082,76,1.582,83,1.773,111,2.253,117,2.784,122,3.013,130,4.214,152,2.574,199,2.565,215,2.066,217,1.208,229,1.773,231,2.011,238,2.401,253,2.279,281,2.574,325,3.546,347,1.514,352,3.665,360,5.434,361,6.183,362,5.05,426,3.416,465,3.665,486,2.483,513,4.203,571,2.673,639,3.05,640,3.05,667,3.416,721,3.05,736,3.416,816,4,817,4,818,4,819,4,820,4,821,3.416,822,4,823,4,824,4,825,4,826,4,827,4]],["title/threading/#thread-safety",[54,2.83,55,3.101]],["text/threading/#thread-safety",[1,0.931,54,3.88,55,4.251,67,1.095,117,3.88,122,3.048,130,3.726,152,3.587,229,2.471,238,3.346,253,2.829,347,2.11,360,4.251,361,5.953,513,5.218,639,4.251,640,4.251,736,4.76,816,5.574,817,5.574]],["title/threading/#acquire",[360,3.884]],["text/threading/#acquire",[10,2.305,21,0.977,54,3.532,67,0.997,76,2.007,83,2.25,111,2.859,122,2.775,199,3.003,215,2.622,217,1.533,281,3.266,325,4.152,352,4.651,360,4.921,361,5.705,362,5.913,426,4.334,465,4.651,486,3.151,571,3.392,667,4.334,721,3.87,818,5.075,819,5.075,820,5.075,821,4.334,822,5.075,823,5.075,824,5.075,825,5.075]],["title/threading/#release",[130,3.404]],["text/threading/#release",[54,4.414,130,4.239,231,3.189,360,4.837,361,5.944,826,6.343,827,6.343]],["title/tutorial/",[65,4.095]],["text/tutorial/",[1,0.946,3,0.466,4,0.408,5,1.49,7,1.886,8,0.444,9,0.869,10,1.087,13,0.444,14,1.121,15,1.506,18,0.393,19,0.644,20,0.425,21,0.974,22,1,24,2.034,28,1.087,30,1.177,31,0.847,32,1.17,34,0.519,35,1.037,36,1.208,40,1.765,41,0.379,42,0.425,43,1.295,45,1.374,46,0.316,48,1.124,50,0.425,52,1,53,0.686,56,1.269,58,0.831,59,0.292,61,0.299,62,0.796,63,1.257,64,0.271,65,0.491,67,0.97,74,0.522,75,0.8,76,1.49,78,2.307,79,1,80,0.881,81,0.664,83,0.898,84,1.01,85,1.703,86,1.409,87,2.244,88,1.897,89,2.294,90,2.983,91,1.657,92,2.588,93,1.303,94,2.768,95,1.946,96,1.287,97,2.24,101,0.764,102,0.466,106,0.71,108,0.299,110,0.444,111,0.644,112,0.532,113,0.898,119,0.736,125,0.316,132,0.856,133,0.425,134,0.681,135,0.919,136,0.466,138,0.344,147,1.754,152,0.736,153,0.607,154,0.466,155,0.831,162,1.826,165,1.177,170,1.257,172,0.466,175,0.976,176,1.077,180,1.077,182,0.466,184,0.379,185,0.522,188,0.522,189,1.077,195,0.491,199,0.284,212,0.56,217,0.487,219,0.491,220,0.425,229,0.507,231,1.657,238,0.367,239,0.466,250,0.491,253,0.253,260,0.344,261,1.036,262,0.344,273,0.796,277,1.437,281,0.736,291,0.444,292,0.517,297,1.409,304,0.444,306,0.466,307,0.466,319,0.686,322,0.856,324,0.686,327,0.764,331,0.444,332,0.764,334,0.425,338,0.56,345,0.425,347,2.078,348,0.56,358,0.967,370,1.141,376,0.71,378,1.141,380,0.881,383,0.491,385,0.56,387,0.522,389,0.355,390,1.215,408,0.919,417,0.355,418,0.522,419,0.522,435,0.466,441,0.444,445,1.563,454,0.444,455,0.56,468,0.664,479,1.171,480,0.919,481,0.919,486,0.71,490,0.664,513,0.466,517,0.522,518,0.764,519,0.764,522,0.522,527,0.919,536,0.466,540,0.522,541,0.379,542,0.425,547,0.522,561,0.466,563,0.444,564,0.466,572,0.522,582,1,586,0.522,602,0.425,610,0.491,612,0.976,613,0.919,614,0.919,615,0.522,616,0.491,619,0.522,639,0.872,640,0.466,647,1.544,651,0.56,652,0.56,665,0.764,666,0.522,679,0.522,684,0.408,715,0.522,721,0.466,737,1.982,778,0.919,790,0.976,791,0.522,793,0.522,803,0.522,806,1.741,821,0.522,828,0.611,829,1.143,830,0.611,831,1.048,832,0.611,833,1.048,834,0.611,835,1.048,836,1.628,837,1.375,838,1.628,839,0.611,840,0.611,841,0.611,842,1.375,843,1.048,844,0.611,845,0.611,846,0.611,847,0.611,848,0.611,849,0.611,850,0.611,851,1.375,852,1.143,853,0.611,854,0.611,855,1.143,856,0.611,857,0.611,858,1.476,859,0.611,860,0.611,861,0.611,862,1.048,863,0.611,864,0.611,865,0.611,866,0.611,867,0.611,868,0.611,869,0.611,870,0.611,871,0.611,872,0.611,873,0.611,874,0.611,875,0.611,876,3.021,877,0.611,878,0.611,879,0.611,880,0.611,881,0.611,882,1.143,883,0.611,884,0.611,885,0.611,886,0.611,887,0.611,888,0.611,889,0.611,890,0.611,891,1.048,892,1.611,893,0.611,894,0.611,895,0.611,896,0.611,897,0.611,898,0.611]],["title/tutorial/#milc-tutorial",[1,0.679,65,3.27]],["text/tutorial/#milc-tutorial",[1,1.063,3,3.792,4,3.323,7,1.309,8,3.615,10,2.258,13,3.615,15,1.882,18,3.199,19,2.801,20,3.46,21,0.957,22,3.087,31,1.522,32,1.923,35,2.153,36,1.695,40,1.882,43,5.121,48,1.695,59,2.373,62,3.46,63,3.087,67,0.977,111,2.801,231,2.5,324,2.984,347,1.882,380,2.718,435,3.792,821,4.246,828,4.972,829,6.369,830,4.972,831,4.556,832,4.972]],["title/tutorial/#minimal-example",[75,1.358,833,3.726]],["text/tutorial/#minimal-example",[1,1.175,5,2.381,7,1.933,9,0.856,15,1.649,24,1.614,30,2.53,40,1.649,67,0.855,76,1.722,87,1.931,88,4.063,89,3.031,90,4.089,91,2.189,92,4.089,93,2.802,94,4.063,132,2.313,170,2.704,231,2.189,347,2.21,378,2.453,383,3.502,479,3.166,647,3.321,833,3.991,834,4.355,835,3.991,836,3.502,837,3.719,838,3.502]],["title/tutorial/#quick-program-overview",[347,1.281,839,3.384,840,3.384]],["text/tutorial/#quick-program-overview",[1,0.967,7,1.525,9,0.721,14,2.995,32,1.665,40,1.629,45,2.631,52,2.672,63,2.672,67,0.845,76,2.29,84,1.595,85,2.223,87,1.908,92,4.065,97,2.424,134,1.821,170,2.672,217,1.3,231,3.521,253,1.78,291,3.129,297,2.995,347,2.651,370,2.424,378,3.263,418,3.675,441,3.129,454,3.129,519,2.876,536,3.282,564,3.282,610,3.461,613,3.461,614,3.461,619,3.675,666,3.675,721,3.282,737,3.129,790,4.947,803,3.675,806,3.129,841,4.304,842,3.675,843,3.944,844,4.304]],["title/tutorial/#logging-and-printing",[40,1.539,45,1.847]],["text/tutorial/#logging-and-printing",[1,0.62,5,2.032,7,0.979,9,0.624,10,2.378,15,1.982,19,2.094,28,2.989,32,2.026,35,2.85,36,2.066,40,2.725,41,2.308,42,2.587,43,2.989,45,2.378,46,1.92,48,2.066,50,2.587,52,3.251,56,1.73,58,2.703,67,1.363,76,1.47,112,2.437,113,2.321,134,2.215,135,2.989,136,2.835,152,3.369,153,2.782,154,2.835,155,3.807,195,2.989,212,3.406,219,2.989,220,2.587,229,1.648,238,2.231,304,2.703,327,3.5,347,1.407,348,3.406,380,2.032,390,3.143,513,2.835,519,2.484,652,3.406,665,2.484,791,3.174,806,2.703,845,3.717,846,3.717,847,3.717,848,3.717,849,3.717]],["title/tutorial/#entrypoints",[90,3.162]],["text/tutorial/#entrypoints",[1,1.13,5,2.515,7,1.594,9,0.474,15,1.741,21,1.303,24,2.244,53,2.76,63,2.856,90,4.764,119,2.96,132,2.443,133,3.201,189,3.074,217,1.389,239,3.508,273,3.201,281,3.896,292,1.475,297,3.201,332,3.074,347,2.292,376,2.856,378,2.591,390,2.76,419,3.928,455,4.215,486,2.856,522,3.928,586,3.928,651,4.215,715,3.928,778,3.698,850,4.599,851,3.928,852,6.054,853,4.599,854,4.599]],["title/tutorial/#configuration-and-argument-parsing",[21,0.652,22,2.101,31,0.809]],["text/tutorial/#configuration-and-argument-parsing",[1,0.995,5,1.412,7,1.731,9,0.849,10,1.173,15,1.514,21,1.214,22,1.604,24,1.482,30,1.501,31,1.169,32,1.893,40,0.978,56,2.278,64,1.145,67,0.785,74,2.206,76,1.581,83,1.145,84,0.957,85,1.334,86,2.783,87,2.643,88,2.783,89,3.406,90,2.483,91,1.299,92,2.483,93,1.662,94,2.783,95,1.662,96,1.449,97,3.104,102,1.97,110,1.878,111,1.455,138,1.455,199,1.202,229,1.145,231,1.299,260,1.455,261,2.573,262,1.455,277,2.937,292,0.828,322,2.124,331,1.878,338,2.367,345,1.798,347,1.514,358,1.55,370,2.253,380,1.412,389,1.501,390,1.55,408,3.216,445,1.334,479,2.908,480,3.216,527,2.077,541,1.604,542,1.798,582,1.604,602,1.798,612,3.415,614,2.077,616,2.077,639,3.05,640,1.97,647,1.97,665,1.726,679,2.206,831,2.367,836,2.077,837,2.206,838,2.077,843,2.367,851,2.206,855,3.999,856,2.583,857,2.583,858,2.367,859,2.583,860,2.583,861,2.583,862,2.367,863,2.583,864,2.583,865,2.583,866,2.583,867,2.583,868,2.583]],["title/tutorial/#subcommands",[24,1.887]],["text/tutorial/#subcommands",[1,0.83,5,1.448,7,2.017,9,0.875,14,1.843,15,1.002,21,0.785,24,2.458,28,1.202,30,1.538,40,1.002,45,1.202,67,1.184,75,1.361,76,1.047,84,0.981,85,1.368,86,1.843,87,2.673,88,1.843,89,2.837,90,2.531,91,2.499,92,2.531,93,1.704,94,3.46,95,2.623,96,1.207,97,2.296,101,1.77,106,1.644,108,1.297,119,1.704,162,3.109,165,2.369,172,2.019,176,1.77,180,1.77,189,1.77,231,1.331,273,1.843,319,1.589,332,1.77,347,2.114,468,1.538,486,1.644,518,1.77,540,2.261,561,2.019,647,2.019,737,1.925,778,2.129,806,1.925,835,2.426,836,2.129,837,2.261,838,2.129,862,2.426,869,2.648,870,2.648,871,2.648,872,2.648,873,2.648,874,2.648,875,2.648,876,4.555]],["title/tutorial/#configuration-and-subcommands",[24,1.507,31,0.972]],["text/tutorial/#configuration-and-subcommands",[7,1.275,9,0.853,21,0.932,24,2.32,31,1.157,34,2.199,48,1.65,61,2.371,62,3.369,78,4.774,79,3.006,80,2.647,81,2.813,83,2.146,84,1.794,85,2.501,90,3.006,96,1.854,261,3.115,277,3.757,370,2.727,445,2.501,490,2.813,527,3.893,572,4.134,615,4.134,851,4.134,877,4.841,878,4.841]],["title/tutorial/#user-controlled-configuration",[15,1.281,31,0.809,189,2.262]],["text/tutorial/#user-controlled-configuration",[1,0.486,5,0.951,7,1.98,9,0.886,10,0.79,14,1.211,15,1.101,21,0.722,24,1.623,30,1.011,34,0.79,36,1.661,40,1.419,45,0.79,48,0.593,53,1.044,58,1.265,67,0.342,75,0.581,76,1.482,78,3.715,79,1.806,80,1.59,81,1.011,83,1.29,84,1.078,85,1.936,86,1.211,87,2.335,88,1.211,89,2.025,90,1.081,91,1.884,92,1.806,93,1.12,94,3.048,95,2.818,96,1.56,97,2.111,101,1.163,106,1.081,113,1.29,147,3.389,162,2.858,165,1.69,170,1.081,175,2.484,176,1.944,180,1.944,182,1.327,184,1.081,185,1.486,188,1.486,217,0.526,250,1.399,297,1.211,306,1.327,307,1.327,319,1.044,322,0.924,347,1.419,358,1.044,376,1.081,385,1.595,445,2.262,468,1.011,481,2.339,490,1.011,518,1.163,547,1.486,647,1.327,684,1.163,737,1.265,836,1.399,838,1.399,842,1.486,876,4.465,879,1.74,880,1.74,881,1.74,882,2.909,883,1.74,884,1.74,885,1.74,886,1.74,887,1.74]],["title/tutorial/#example-output",[48,1.386,75,1.358]],["text/tutorial/#example-output",[21,0.97,24,2.381,48,1.718,63,3.129,67,0.99,85,2.604,97,2.839,132,2.677,135,4.053,170,3.129,292,1.616,297,3.508,324,3.025,334,3.508,347,1.908,387,4.304,417,2.929,445,2.604,582,3.989,613,4.053,737,5.141,842,4.304,858,5.887,888,5.04,889,5.04,890,5.04,891,4.619,892,7.071,893,5.04,894,5.04,895,5.04]],["title/tutorial/#doing-more",[56,1.893,793,3.472]],["text/tutorial/#doing-more",[1,1.015,56,2.83,125,3.141,347,2.302,358,3.65,517,5.193,563,4.421,806,5.243,891,5.572,896,6.081,897,6.081,898,6.081]]],"fields":["title","text"],"invertedIndex":[["",{"_index":9,"text":{"":{},"#breaking-changes":{},"#output":{},"#short-example":{},"ANSI/":{},"ANSI/#colored-log-example":{},"ANSI/#colored-print-example":{},"ANSI/#colorizing-printed-output":{},"api__in_argv/":{},"api__sparkline/":{},"api_ansi/":{},"api_ansi/#milcformatter-objects":{},"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"api_configuration/#configuration-objects":{},"api_configuration/#configurationsection-objects":{},"api_configuration/#subparserwrapper-objects":{},"api_emoji/":{},"api_emoji/#emoji":{},"api_milc/":{},"api_milc/#arguments":{},"api_milc/#milc-objects":{},"api_questions/":{},"api_subcommand_config/":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argcomplete/#argument-tab-completion-support":{},"argcomplete/#prerequisites":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"argument_parsing/#arg_only":{},"argument_parsing/#argument-decorators":{},"argument_parsing/#completers":{},"argument_parsing/#reading-arguments":{},"breaking_changes/":{},"breaking_changes/#version-130":{},"breaking_changes/#version-140":{},"breaking_changes/#version-150":{},"configuration/":{},"configuration/#automatic-type-inference":{},"configuration/#configuration-file-location":{},"configuration/#setting-config-values":{},"configuration/#structure":{},"configuration/#where-did-a-value-come-from":{},"configuration/#writing-configuration-files":{},"logging/":{},"logging/#controlling-log-output":{},"logging/#verbose-mode":{},"logging/#writing-log-entries":{},"metadata/":{},"metadata/#custom-loggers":{},"metadata/#milc-metadata":{},"sparklines/":{},"sparklines/#highlight-color":{},"sparklines/#negative-and-positive-numbers":{},"sparklines/#optimization":{},"sparklines/#sparklines":{},"sparklines/#usage":{},"sparklines/#whitespace":{},"spinners/":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-decorating-a-function":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-context-manager":{},"spinners/#example-using-a-custom-spinner-directly":{},"spinners/#spinners":{},"subcommand_config/":{},"subcommand_config/#deleting-configuration-values":{},"subcommand_config/#multiple-operations":{},"subcommand_config/#setting-configuration-values":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#simple-example":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"subprocesses/#capture-output":{},"subprocesses/#combining-stderr-with-stdout":{},"subprocesses/#other-arguments":{},"subprocesses/#text-encoding":{},"subprocesses/#windows-support":{},"threading/":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#entrypoints":{},"tutorial/#logging-and-printing":{},"tutorial/#minimal-example":{},"tutorial/#quick-program-overview":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["0",{"_index":246,"text":{"api__sparkline/":{},"api__sparkline/#arguments":{},"breaking_changes/":{},"breaking_changes/#version-110":{}},"title":{}}],["1",{"_index":400,"text":{"api_milc/":{},"breaking_changes/":{},"breaking_changes/#version-110":{},"sparklines/":{},"sparklines/#whitespace":{}},"title":{}}],["1.0.0",{"_index":609,"text":{"breaking_changes/":{},"configuration/":{},"configuration/#configuration-file-location":{},"metadata/":{},"metadata/#milc-metadata":{}},"title":{"breaking_changes/#version-100":{}}}],["1.1.0",{"_index":607,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-110":{}}}],["1.2.0",{"_index":600,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-120":{}}}],["1.2.3",{"_index":592,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["1.3.0",{"_index":589,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-130":{}}}],["1.4.0",{"_index":583,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-140":{}}}],["1.5.0",{"_index":578,"text":{"breaking_changes/":{},"breaking_changes/#version-160":{}},"title":{"breaking_changes/#version-150":{}}}],["1.6.0",{"_index":566,"text":{"breaking_changes/":{}},"title":{"breaking_changes/#version-160":{}}}],["10",{"_index":726,"text":{"spinners/":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-using-a-custom-spinner-directly":{}},"title":{}}],["100",{"_index":723,"text":{"spinners/":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-using-a-custom-spinner-directly":{}},"title":{}}],["1:1",{"_index":409,"text":{"api_milc/":{}},"title":{}}],["2",{"_index":697,"text":{"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{},"sparklines/#whitespace":{}},"title":{}}],["2>&1",{"_index":341,"text":{"api_milc/":{},"subprocesses/":{},"subprocesses/#combining-stderr-with-stdout":{}},"title":{}}],["3",{"_index":6,"text":{"":{},"api_milc/":{},"api_questions/":{},"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{},"sparklines/#whitespace":{},"spinners/":{},"spinners/#spinners":{}},"title":{"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}}}],["3.6",{"_index":12,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"installation/":{}},"title":{}}],["39",{"_index":885,"text":{"tutorial/":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["4",{"_index":708,"text":{"sparklines/":{},"sparklines/#color":{}},"title":{}}],["4.2",{"_index":506,"text":{"argcomplete/":{},"argcomplete/#prerequisites":{}},"title":{}}],["5",{"_index":695,"text":{"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{}},"title":{}}],["6",{"_index":698,"text":{"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{}},"title":{}}],["60",{"_index":57,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}},"title":{}}],["7",{"_index":706,"text":{"sparklines/":{},"sparklines/#whitespace":{}},"title":{}}],["9",{"_index":696,"text":{"sparklines/":{},"sparklines/#optimization":{},"sparklines/#usage":{}},"title":{}}],["abil",{"_index":60,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}},"title":{}}],["abov",{"_index":480,"text":{"api_questions/":{},"argcomplete/":{},"argcomplete/#using-tab-completion":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["accept",{"_index":467,"text":{"api_questions/":{},"sparklines/":{},"sparklines/#highlight-color":{},"sparklines/#negative-and-positive-numbers":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{}}],["access",{"_index":261,"text":{"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"api_milc/":{},"argument_parsing/":{},"argument_parsing/#reading-arguments":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{}},"title":{}}],["accord",{"_index":233,"text":{"api__sparkline/":{}},"title":{}}],["acquir",{"_index":360,"text":{"api_milc/":{},"threading/":{},"threading/#acquire":{},"threading/#release":{},"threading/#thread-safety":{}},"title":{"threading/#acquire":{}}}],["action",{"_index":79,"text":{"":{},"#short-example":{},"api_questions/":{},"api_subcommand_config/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"argument_parsing/#deprecated":{},"tutorial/":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"argument_parsing/#action-store_boolean":{}}}],["action='stor",{"_index":302,"text":{"api_configuration/":{},"argument_parsing/":{},"argument_parsing/#deprecated":{}},"title":{}}],["activ",{"_index":403,"text":{"api_milc/":{},"argcomplete/":{},"argcomplete/#prerequisites":{}},"title":{}}],["actual",{"_index":221,"text":{"api__sparkline/":{},"api_subcommand_config/":{},"argcomplete/":{},"argcomplete/#argument-tab-completion-support":{},"breaking_changes/":{},"breaking_changes/#version-120":{}},"title":{}}],["ad",{"_index":322,"text":{"api_milc/":{},"api_milc/#arguments":{},"argcomplete/":{},"breaking_changes/":{},"breaking_changes/#version-150":{},"breaking_changes/#version-160":{},"logging/":{},"logging/#controlling-log-output":{},"spinners/":{},"spinners/#adding-a-spinner":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#user-controlled-configuration":{}},"title":{"argcomplete/#adding-custom-completions":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{}}}],["add",{"_index":61,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"ANSI/":{},"ANSI/#colorizing-log-output":{},"ANSI/#colorizing-printed-output":{},"api__sparkline/":{},"api_configuration/":{},"api_milc/":{},"api_questions/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"configuration/":{},"configuration/#configuration":{},"spinners/":{},"spinners/#example-adding-a-custom-spinner":{},"subprocesses/":{},"subprocesses/#windows-support":{},"tutorial/":{},"tutorial/#configuration-and-subcommands":{}},"title":{}}],["addit",{"_index":558,"text":{"argument_parsing/":{},"argument_parsing/#action-store_boolean":{}},"title":{}}],["adjust",{"_index":219,"text":{"api__sparkline/":{},"sparklines/":{},"sparklines/#highlight-color":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["affect",{"_index":166,"text":{"ANSI/":{},"ANSI/#available-colors":{}},"title":{}}],["again",{"_index":450,"text":{"api_questions/":{}},"title":{}}],["allow",{"_index":462,"text":{"api_questions/":{},"breaking_changes/":{},"breaking_changes/#version-140":{},"subcommand_config/":{},"subcommand_config/#introduction":{}},"title":{}}],["alreadi",{"_index":274,"text":{"api_attrdict/":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{}}],["alway",{"_index":571,"text":{"breaking_changes/":{},"breaking_changes/#version-140":{},"breaking_changes/#version-160":{},"subcommand_config/":{},"subcommand_config/#setting-configuration-values":{},"subprocesses/":{},"subprocesses/#windows-support":{},"threading/":{},"threading/#acquire":{}},"title":{}}],["and/or",{"_index":42,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"#output":{},"#reporting-bugs-and-requesting-features":{},"metadata/":{},"metadata/#milc-metadata":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["anim",{"_index":396,"text":{"api_milc/":{},"api_milc/#arguments":{},"spinners/":{},"spinners/#adding-a-spinner":{}},"title":{}}],["anoth",{"_index":827,"text":{"threading/":{},"threading/#release":{}},"title":{}}],["ansi",{"_index":35,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"ANSI/":{},"ANSI/#available-colors":{},"ANSI/#colorizing-printed-output":{},"ANSI/#working-with-ansi-in-your-script":{},"api__sparkline/":{},"api__sparkline/#arguments":{},"api_ansi/":{},"api_ansi/#ansi":{},"api_milc/":{},"api_milc/#arguments":{},"api_questions/":{},"breaking_changes/":{},"breaking_changes/#version-130":{},"logging/":{},"logging/#controlling-log-output":{},"logging/#writing-log-entries":{},"tutorial/":{},"tutorial/#logging-and-printing":{},"tutorial/#milc-tutorial":{}},"title":{"ANSI/":{},"ANSI/#working-with-ansi-in-your-script":{},"api_ansi/#ansi":{}}}],["ansiemojiloglevelformatt",{"_index":595,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["ansiformatt",{"_index":593,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["ansistrippingemojiloglevelformatt",{"_index":596,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["ansistrippingformatt",{"_index":594,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["answer",{"_index":444,"text":{"api_questions/":{},"breaking_changes/":{},"breaking_changes/#version-140":{}},"title":{}}],["anyth",{"_index":669,"text":{"logging/":{},"logging/#controlling-log-output":{}},"title":{}}],["api",{"_index":195,"text":{"spinners/":{},"spinners/#spinners":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{"api__in_argv/":{}}}],["app",{"_index":591,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["appdir",{"_index":620,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["appli",{"_index":244,"text":{"api__sparkline/":{},"api__sparkline/#arguments":{},"api_milc/":{},"api_milc/#arguments":{}},"title":{}}],["applic",{"_index":11,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"subcommand_config/":{},"subcommand_config/#introduction":{}},"title":{}}],["application'",{"_index":621,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["appropri",{"_index":145,"text":{"ANSI/":{},"ANSI/#colorizing-log-output":{},"configuration/":{},"configuration/#automatic-type-inference":{}},"title":{}}],["arg",{"_index":82,"text":{"":{},"#short-example":{},"api_configuration/":{},"api_milc/":{},"api_milc/#arguments":{},"api_questions/":{},"api_subcommand_config/":{},"argument_parsing/":{},"argument_parsing/#arg_only":{},"argument_parsing/#reading-arguments":{}},"title":{"argument_parsing/#arg_only":{}}}],["arg1",{"_index":739,"text":{"subcommand_config/":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#simple-example":{}},"title":{}}],["arg2",{"_index":741,"text":{"subcommand_config/":{},"subcommand_config/#simple-example":{}},"title":{}}],["argcomplet",{"_index":30,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argcomplete/#argument-tab-completion-support":{},"argcomplete/#prerequisites":{},"argument_parsing/":{},"argument_parsing/#completers":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#minimal-example":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["argpars",{"_index":298,"text":{"api_configuration/":{},"api_milc/":{},"argument_parsing/":{},"argument_parsing/#argument-parsing":{}},"title":{}}],["argparser'",{"_index":872,"text":{"tutorial/":{},"tutorial/#subcommands":{}},"title":{}}],["argument",{"_index":21,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"#output":{},"#short-example":{},"api__sparkline/":{},"api_configuration/":{},"api_milc/":{},"api_questions/":{},"api_subcommand_config/":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argcomplete/#argument-tab-completion-support":{},"argcomplete/#prerequisites":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"argument_parsing/#arg_only":{},"argument_parsing/#argument-decorators":{},"argument_parsing/#completers":{},"argument_parsing/#deprecated":{},"argument_parsing/#reading-arguments":{},"breaking_changes/":{},"breaking_changes/#version-130":{},"breaking_changes/#version-150":{},"configuration/":{},"configuration/#configuration":{},"configuration/#structure":{},"configuration/#where-did-a-value-come-from":{},"logging/":{},"logging/#controlling-log-output":{},"sparklines/":{},"sparklines/#highlight-color":{},"subcommand_config/":{},"subcommand_config/#introduction":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#simple-example":{},"subcommand_config/#subcommand-reference-config":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"subprocesses/#building-argument-lists":{},"subprocesses/#other-arguments":{},"subprocesses/#supported-arguments":{},"threading/":{},"threading/#acquire":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#entrypoints":{},"tutorial/#example-output":{},"tutorial/#milc-tutorial":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"api__sparkline/#arguments":{},"api_milc/#arguments":{},"argcomplete/":{},"argcomplete/#argument-tab-completion-support":{},"argument_parsing/":{},"argument_parsing/#argument-decorators":{},"argument_parsing/#argument-parsing":{},"argument_parsing/#defining-arguments":{},"argument_parsing/#reading-arguments":{},"subprocesses/#building-argument-lists":{},"subprocesses/#other-arguments":{},"subprocesses/#supported-arguments":{},"tutorial/#configuration-and-argument-parsing":{}}}],["argumentparser.add",{"_index":548,"text":{"argument_parsing/":{},"argument_parsing/#argument-decorators":{}},"title":{}}],["argv",{"_index":196,"text":{"api__in_argv/":{}},"title":{"api__in_argv/":{},"api__in_argv/#_in_argv":{}}}],["arpcomplet",{"_index":293,"text":{"api_configuration/":{}},"title":{}}],["articl",{"_index":692,"text":{"sparklines/":{},"sparklines/#sparklines":{}},"title":{}}],["asctime)",{"_index":675,"text":{"logging/":{},"logging/#controlling-log-output":{}},"title":{}}],["ask",{"_index":432,"text":{"api_questions/":{},"api_questions/#questions":{}},"title":{}}],["assign",{"_index":617,"text":{"configuration/":{},"configuration/#setting-config-values":{}},"title":{}}],["associ",{"_index":714,"text":{"sparklines/":{},"sparklines/#highlight-color":{}},"title":{}}],["assum",{"_index":758,"text":{"subcommand_config/":{},"subcommand_config/#subcommand-reference-config":{}},"title":{}}],["attack",{"_index":161,"text":{"ANSI/":{},"ANSI/#colored-print-example":{}},"title":{}}],["attempt",{"_index":453,"text":{"api_questions/":{},"argcomplete/":{},"argcomplete/#argument-tab-completion-support":{},"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["attrdict",{"_index":259,"text":{"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"api_configuration/#configuration-objects":{}},"title":{"api_attrdict/#attrdict":{},"api_attrdict/#attrdict-objects":{}}}],["attribut",{"_index":262,"text":{"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"argument_parsing/":{},"argument_parsing/#reading-arguments":{},"configuration/":{},"configuration/#reading-config-values":{},"sparklines/":{},"sparklines/#highlight-color":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["author",{"_index":316,"text":{"api_milc/":{},"configuration/":{},"configuration/#configuration-file-location":{},"metadata/":{},"metadata/#milc-metadata":{}},"title":{}}],["automat",{"_index":25,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"ANSI/":{},"ANSI/#colorizing-log-output":{},"api__sparkline/":{},"api__sparkline/#arguments":{},"configuration/":{},"configuration/#structure":{},"logging/":{},"logging/#controlling-log-output":{}},"title":{"configuration/#automatic-type-inference":{}}}],["avail",{"_index":163,"text":{"ANSI/":{},"api_milc/":{},"api_milc/#arguments":{},"logging/":{},"logging/#controlling-log-output":{},"logging/#writing-log-entries":{},"spinners/":{},"spinners/#adding-a-spinner":{},"subcommand_config/":{},"subcommand_config/#milc-config-subcommand":{}},"title":{"ANSI/#available-colors":{}}}],["avoid",{"_index":602,"text":{"breaking_changes/":{},"breaking_changes/#version-120":{},"sparklines/":{},"sparklines/#optimization":{},"subprocesses/":{},"subprocesses/#windows-support":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["awar",{"_index":599,"text":{"breaking_changes/":{},"breaking_changes/#version-130":{},"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["away",{"_index":825,"text":{"threading/":{},"threading/#acquire":{}},"title":{}}],["background",{"_index":168,"text":{"ANSI/":{},"ANSI/#available-colors":{}},"title":{}}],["bar",{"_index":740,"text":{"subcommand_config/":{},"subcommand_config/#multiple-operations":{},"subcommand_config/#simple-example":{}},"title":{}}],["base",{"_index":651,"text":{"logging/":{},"tutorial/":{},"tutorial/#entrypoints":{}},"title":{}}],["bash",{"_index":505,"text":{"argcomplete/":{},"argcomplete/#prerequisites":{}},"title":{}}],["basic",{"_index":410,"text":{"api_milc/":{},"api_questions/":{},"api_questions/#questions":{},"metadata/":{},"metadata/#milc-metadata":{},"sparklines/":{},"sparklines/#usage":{},"spinners/":{},"spinners/#spinners":{},"subprocesses/":{}},"title":{"subprocesses/#basic-subprocess-execution":{}}}],["bat",{"_index":742,"text":{"subcommand_config/":{},"subcommand_config/#simple-example":{}},"title":{}}],["batteri",{"_index":3,"text":{"":{},"api_milc/":{},"api_milc/#milc-objects":{},"tutorial/":{},"tutorial/#milc-tutorial":{}},"title":{"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}}}],["baz",{"_index":756,"text":{"subcommand_config/":{},"subcommand_config/#setting-user-defaults":{}},"title":{}}],["be",{"_index":335,"text":{"api_milc/":{},"breaking_changes/":{},"breaking_changes/#version-130":{}},"title":{}}],["befor",{"_index":454,"text":{"api_questions/":{},"argcomplete/":{},"argcomplete/#prerequisites":{},"metadata/":{},"metadata/#milc-metadata":{},"tutorial/":{},"tutorial/#quick-program-overview":{}},"title":{}}],["begin",{"_index":835,"text":{"tutorial/":{},"tutorial/#minimal-example":{},"tutorial/#subcommands":{}},"title":{}}],["behav",{"_index":559,"text":{"argument_parsing/":{},"argument_parsing/#action-store_boolean":{}},"title":{}}],["behavior",{"_index":191,"text":{"ANSI/":{},"ANSI/#available-colors":{},"api__sparkline/":{},"subprocesses/":{},"subprocesses/#other-arguments":{}},"title":{}}],["behind",{"_index":406,"text":{"api_milc/":{}},"title":{}}],["below",{"_index":156,"text":{"ANSI/":{},"ANSI/#colorizing-printed-output":{},"api__sparkline/":{},"sparklines/":{},"sparklines/#highlight-color":{}},"title":{}}],["better",{"_index":888,"text":{"tutorial/":{},"tutorial/#example-output":{}},"title":{}}],["between",{"_index":220,"text":{"api__sparkline/":{},"api_milc/":{},"api_milc/#arguments":{},"subcommand_config/":{},"subcommand_config/#introduction":{},"subcommand_config/#setting-user-defaults":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["bg",{"_index":147,"text":{"ANSI/":{},"ANSI/#available-colors":{},"ANSI/#colored-log-example":{},"ANSI/#colored-print-example":{},"api__sparkline/":{},"api__sparkline/#arguments":{},"api_emoji/":{},"api_emoji/#emoji":{},"tutorial/":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["binari",{"_index":788,"text":{"subprocesses/":{},"subprocesses/#supported-arguments":{}},"title":{}}],["black",{"_index":173,"text":{"ANSI/":{},"ANSI/#available-colors":{}},"title":{}}],["blank",{"_index":701,"text":{"sparklines/":{},"sparklines/#whitespace":{}},"title":{}}],["block",{"_index":362,"text":{"api_milc/":{},"threading/":{},"threading/#acquire":{}},"title":{}}],["blue",{"_index":176,"text":{"ANSI/":{},"ANSI/#available-colors":{},"api_emoji/":{},"api_emoji/#emoji":{},"api_milc/":{},"api_milc/#arguments":{},"tutorial/":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["blue}{fg",{"_index":157,"text":{"ANSI/":{},"ANSI/#colored-print-example":{}},"title":{}}],["boolean",{"_index":81,"text":{"":{},"#short-example":{},"api_configuration/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"breaking_changes/":{},"breaking_changes/#version-110":{},"configuration/":{},"configuration/#automatic-type-inference":{},"tutorial/":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"argument_parsing/#action-store_boolean":{}}}],["both",{"_index":135,"text":{"ANSI/":{},"ANSI/#working-with-ansi-in-your-script":{},"tutorial/":{},"tutorial/#example-output":{},"tutorial/#logging-and-printing":{}},"title":{}}],["bottom",{"_index":864,"text":{"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["bounc",{"_index":423,"text":{"api_milc/":{},"api_milc/#arguments":{}},"title":{}}],["boundari",{"_index":718,"text":{"sparklines/":{},"sparklines/#optimization":{}},"title":{}}],["box",{"_index":20,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"argcomplete/":{},"argcomplete/#argument-tab-completion-support":{},"configuration/":{},"configuration/#configuration":{},"tutorial/":{},"tutorial/#milc-tutorial":{}},"title":{}}],["brace",{"_index":143,"text":{"ANSI/":{},"ANSI/#colorizing-log-output":{}},"title":{}}],["break",{"_index":121,"text":{"":{},"#breaking-changes":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{}},"title":{"#breaking-changes":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{}}}],["brief",{"_index":350,"text":{"api_milc/":{}},"title":{}}],["bright",{"_index":192,"text":{"ANSI/":{},"ANSI/#available-colors":{}},"title":{}}],["broken",{"_index":515,"text":{"argcomplete/":{},"argcomplete/#prerequisites":{},"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["bug",{"_index":69,"text":{"":{},"#reporting-bugs-and-requesting-features":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{"#reporting-bugs-and-requesting-features":{}}}],["build",{"_index":331,"text":{"api_milc/":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"subprocesses/#building-argument-lists":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{"subprocesses/#building-argument-lists":{}}}],["built",{"_index":58,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"ANSI/":{},"ANSI/#colorizing-log-output":{},"tutorial/":{},"tutorial/#logging-and-printing":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["byte",{"_index":343,"text":{"api_milc/":{},"subprocesses/":{},"subprocesses/#text-encoding":{}},"title":{}}],["c",{"_index":77,"text":{"":{},"#output":{},"#short-example":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{}},"title":{}}],["c:\\document",{"_index":631,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["cach",{"_index":367,"text":{"api_milc/":{}},"title":{}}],["call",{"_index":281,"text":{"api_configuration/":{},"api_milc/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"subprocesses/":{},"subprocesses/#windows-support":{},"threading/":{},"threading/#acquire":{},"tutorial/":{},"tutorial/#entrypoints":{}},"title":{}}],["callabl",{"_index":522,"text":{"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"tutorial/":{},"tutorial/#entrypoints":{}},"title":{}}],["captur",{"_index":323,"text":{"api_milc/":{},"subprocesses/":{},"subprocesses/#capture-output":{},"subprocesses/#supported-arguments":{}},"title":{"subprocesses/#capture-output":{}}}],["case",{"_index":520,"text":{"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argument_parsing/":{},"argument_parsing/#reading-arguments":{}},"title":{}}],["caus",{"_index":807,"text":{"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{}}],["certain",{"_index":250,"text":{"api_ansi/":{},"argument_parsing/":{},"argument_parsing/#argument-parsing":{},"tutorial/":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["chang",{"_index":122,"text":{"":{},"#breaking-changes":{},"ANSI/":{},"ANSI/#available-colors":{},"api__sparkline/":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{},"sparklines/":{},"sparklines/#negative-and-positive-numbers":{},"threading/":{},"threading/#acquire":{},"threading/#thread-safety":{}},"title":{"#breaking-changes":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{}}}],["charact",{"_index":218,"text":{"api__sparkline/":{}},"title":{}}],["check",{"_index":457,"text":{"api_questions/":{},"logging/":{},"logging/#verbose-mode":{}},"title":{}}],["choic",{"_index":471,"text":{"api_questions/":{}},"title":{}}],["choos",{"_index":477,"text":{"api_questions/":{}},"title":{}}],["class",{"_index":254,"text":{"api_ansi/":{},"api_ansi/#milcformatter-objects":{},"api_attrdict/":{},"api_attrdict/#attrdict-objects":{},"api_attrdict/#sparseattrdict-objects":{},"api_configuration/":{},"api_configuration/#configuration-objects":{},"api_configuration/#configurationsection-objects":{},"api_configuration/#subparserwrapper-objects":{},"api_milc/":{},"api_milc/#milc-objects":{}},"title":{}}],["cli",{"_index":7,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"#short-example":{},"ANSI/":{},"ANSI/#colored-log-example":{},"ANSI/#colored-print-example":{},"api_milc/":{},"api_questions/":{},"api_subcommand_config/":{},"argument_parsing/":{},"argument_parsing/#arg_only":{},"configuration/":{},"configuration/#structure":{},"logging/":{},"logging/#controlling-log-output":{},"metadata/":{},"metadata/#custom-loggers":{},"metadata/#milc-metadata":{},"spinners/":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-decorating-a-function":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-context-manager":{},"spinners/#example-using-a-custom-spinner-directly":{},"subcommand_config/":{},"subcommand_config/#all-set-options-example":{},"subcommand_config/#deleting-configuration-values":{},"subcommand_config/#entire-configuration-example":{},"subcommand_config/#multiple-keys-example":{},"subcommand_config/#multiple-operations":{},"subcommand_config/#setting-configuration-values":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#simple-example":{},"subcommand_config/#single-key-example":{},"subcommand_config/#whole-section-example":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#entrypoints":{},"tutorial/#logging-and-printing":{},"tutorial/#milc-tutorial":{},"tutorial/#minimal-example":{},"tutorial/#quick-program-overview":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"#milc-an-opinionated-batteries-included-python-3-cli-framework":{}}}],["cli.acquir",{"_index":818,"text":{"threading/":{},"threading/#acquire":{}},"title":{}}],["cli.add",{"_index":724,"text":{"spinners/":{},"spinners/#adding-a-spinner":{}},"title":{}}],["cli.arg",{"_index":543,"text":{"argument_parsing/":{},"argument_parsing/#arg_only":{},"argument_parsing/#reading-arguments":{}},"title":{}}],["cli.args.verbos",{"_index":544,"text":{"argument_parsing/":{},"argument_parsing/#reading-arguments":{}},"title":{}}],["cli.args['verbos",{"_index":545,"text":{"argument_parsing/":{},"argument_parsing/#reading-arguments":{}},"title":{}}],["cli.argu",{"_index":527,"text":{"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{}},"title":{}}],["cli.config",{"_index":541,"text":{"argument_parsing/":{},"argument_parsing/#arg_only":{},"argument_parsing/#reading-arguments":{},"breaking_changes/":{},"breaking_changes/#version-150":{},"configuration/":{},"configuration/#configuration":{},"configuration/#where-did-a-value-come-from":{},"configuration/#writing-configuration-files":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["cli.config..\\appl",{"_index":632,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["settings\\florzelbop",{"_index":634,"text":{"configuration/":{},"configuration/#configuration-file-location":{}},"title":{}}],["setup",{"_index":386,"text":{"api_milc/":{}},"title":{}}],["sever",{"_index":668,"text":{"logging/":{},"logging/#controlling-log-output":{}},"title":{}}],["share",{"_index":752,"text":{"subcommand_config/":{},"subcommand_config/#setting-user-defaults":{}},"title":{}}],["shark",{"_index":160,"text":{"ANSI/":{},"ANSI/#colored-print-example":{}},"title":{}}],["shell",{"_index":339,"text":{"api_milc/":{},"argcomplete/":{},"argcomplete/#prerequisites":{},"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{},"subprocesses/#combining-stderr-with-stdout":{}},"title":{}}],["shlex.split",{"_index":330,"text":{"api_milc/":{}},"title":{}}],["short",{"_index":74,"text":{"":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{"#short-example":{}}}],["show",{"_index":106,"text":{"":{},"#output":{},"ANSI/":{},"ANSI/#available-colors":{},"api_milc/":{},"api_subcommand_config/":{},"subcommand_config/":{},"subcommand_config/#subcommand-reference-config":{},"tutorial/":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["side",{"_index":425,"text":{"api_milc/":{},"api_milc/#arguments":{}},"title":{}}],["sign",{"_index":763,"text":{"subcommand_config/":{},"subcommand_config/#setting-configuration-values":{}},"title":{}}],["signatur",{"_index":459,"text":{"api_questions/":{}},"title":{}}],["similar",{"_index":811,"text":{"subprocesses/":{},"subprocesses/#combining-stderr-with-stdout":{}},"title":{}}],["simpl",{"_index":519,"text":{"argcomplete/":{},"argcomplete/#using-tab-completion":{},"sparklines/":{},"sparklines/#usage":{},"subcommand_config/":{},"tutorial/":{},"tutorial/#logging-and-printing":{},"tutorial/#quick-program-overview":{}},"title":{"subcommand_config/#simple-example":{}}}],["simpli",{"_index":312,"text":{"api_emoji/":{},"api_emoji/#emoji":{},"configuration/":{},"configuration/#setting-config-values":{}},"title":{}}],["singl",{"_index":376,"text":{"api_milc/":{},"api_subcommand_config/":{},"configuration/":{},"configuration/#configuration":{},"subcommand_config/":{},"subcommand_config/#multiple-operations":{},"subcommand_config/#reading-configuration-values":{},"tutorial/":{},"tutorial/#entrypoints":{},"tutorial/#user-controlled-configuration":{}},"title":{"subcommand_config/#single-key-example":{}}}],["sleep",{"_index":725,"text":{"spinners/":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-using-a-custom-spinner-directly":{}},"title":{}}],["someth",{"_index":416,"text":{"api_milc/":{},"spinners/":{},"spinners/#example-decorating-a-function":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-context-manager":{},"spinners/#spinners":{}},"title":{}}],["sometim",{"_index":431,"text":{"api_questions/":{},"api_questions/#questions":{},"argument_parsing/":{},"argument_parsing/#arg_only":{},"configuration/":{},"configuration/#where-did-a-value-come-from":{},"subcommand_config/":{},"subcommand_config/#setting-user-defaults":{}},"title":{}}],["sorrow",{"_index":887,"text":{"tutorial/":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["sourc",{"_index":372,"text":{"api_milc/":{},"configuration/":{},"configuration/#where-did-a-value-come-from":{}},"title":{}}],["source.general.verbos",{"_index":637,"text":{"configuration/":{},"configuration/#where-did-a-value-come-from":{}},"title":{}}],["space",{"_index":702,"text":{"sparklines/":{},"sparklines/#whitespace":{},"subcommand_config/":{},"subcommand_config/#subcommand-reference-config":{}},"title":{}}],["spark",{"_index":228,"text":{"api__sparkline/":{}},"title":{}}],["sparklin",{"_index":197,"text":{"api__sparkline/":{},"api__sparkline/#_sparkline":{},"api__sparkline/#arguments":{},"breaking_changes/":{},"breaking_changes/#version-160":{},"sparklines/":{},"sparklines/#color":{},"sparklines/#negative-and-positive-numbers":{},"sparklines/#optimization":{},"sparklines/#sparklines":{},"sparklines/#usage":{},"sparklines/#whitespace":{}},"title":{"api__sparkline/":{},"api__sparkline/#_sparkline":{},"sparklines/":{},"sparklines/#sparklines":{}}}],["sparseattrdict",{"_index":266,"text":{"api_attrdict/":{},"api_attrdict/#sparseattrdict-objects":{}},"title":{"api_attrdict/#sparseattrdict-objects":{}}}],["special",{"_index":770,"text":{"subcommand_config/":{},"subcommand_config/#deleting-configuration-values":{}},"title":{}}],["specif",{"_index":691,"text":{"sparklines/":{},"sparklines/#sparklines":{}},"title":{}}],["specifi",{"_index":468,"text":{"api_questions/":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"argument_parsing/":{},"argument_parsing/#completers":{},"configuration/":{},"configuration/#writing-configuration-files":{},"subcommand_config/":{},"subcommand_config/#reading-configuration-values":{},"subcommand_config/#simple-example":{},"tutorial/":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["spinner",{"_index":59,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"api_milc/":{},"api_milc/#arguments":{},"spinners/":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-decorating-a-function":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-context-manager":{},"spinners/#example-using-a-custom-spinner-directly":{},"spinners/#spinners":{},"tutorial/":{},"tutorial/#milc-tutorial":{}},"title":{"spinners/":{},"spinners/#adding-a-spinner":{},"spinners/#example-adding-a-custom-spinner":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#example-using-a-custom-spinner-directly":{},"spinners/#spinners":{}}}],["spinners/dac4fc6571059bb9e9bc204711e9dfe8f72e5c6f/spinners.json",{"_index":421,"text":{"api_milc/":{},"api_milc/#arguments":{}},"title":{}}],["split",{"_index":483,"text":{"api_subcommand_config/":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{}},"title":{}}],["srv/web/htdoc",{"_index":780,"text":{"subprocesses/":{},"subprocesses/#basic-subprocess-execution":{}},"title":{}}],["stack",{"_index":867,"text":{"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{}},"title":{}}],["standard",{"_index":646,"text":{"installation/":{},"logging/":{},"logging/#writing-log-entries":{}},"title":{}}],["start",{"_index":63,"text":{"":{},"api_milc/":{},"spinners/":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#spinners":{},"tutorial/":{},"tutorial/#entrypoints":{},"tutorial/#example-output":{},"tutorial/#milc-tutorial":{},"tutorial/#quick-program-overview":{}},"title":{"#getting-started":{}}}],["state",{"_index":803,"text":{"subprocesses/":{},"subprocesses/#windows-support":{},"tutorial/":{},"tutorial/#quick-program-overview":{}},"title":{}}],["stderr",{"_index":41,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"api_milc/":{},"subprocesses/":{},"subprocesses/#capture-output":{},"subprocesses/#combining-stderr-with-stdout":{},"subprocesses/#supported-arguments":{},"subprocesses/#text-encoding":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{"subprocesses/#combining-stderr-with-stdout":{}}}],["stdin",{"_index":802,"text":{"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["stdin=devnul",{"_index":804,"text":{"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["stdin=non",{"_index":805,"text":{"subprocesses/":{},"subprocesses/#windows-support":{}},"title":{}}],["stdout",{"_index":46,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"#output":{},"ANSI/":{},"ANSI/#colorizing-printed-output":{},"api_milc/":{},"api_subcommand_config/":{},"breaking_changes/":{},"breaking_changes/#version-140":{},"subprocesses/":{},"subprocesses/#capture-output":{},"subprocesses/#combining-stderr-with-stdout":{},"subprocesses/#supported-arguments":{},"subprocesses/#text-encoding":{},"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{"subprocesses/#combining-stderr-with-stdout":{}}}],["still",{"_index":849,"text":{"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["stop",{"_index":412,"text":{"api_milc/":{},"breaking_changes/":{},"breaking_changes/#breaking-changes":{},"spinners/":{},"spinners/#example-instantiating-a-spinner":{},"spinners/#spinners":{}},"title":{}}],["store",{"_index":80,"text":{"":{},"#short-example":{},"api_configuration/":{},"api_milc/":{},"api_questions/":{},"api_subcommand_config/":{},"argument_parsing/":{},"argument_parsing/#action-store_boolean":{},"configuration/":{},"configuration/#automatic-type-inference":{},"configuration/#structure":{},"tutorial/":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"argument_parsing/#action-store_boolean":{}}}],["str",{"_index":461,"text":{"api_questions/":{}},"title":{}}],["straightforward",{"_index":733,"text":{"subcommand_config/":{},"subcommand_config/#introduction":{}},"title":{}}],["stream",{"_index":401,"text":{"api_milc/":{},"api_milc/#arguments":{},"subprocesses/":{},"subprocesses/#combining-stderr-with-stdout":{}},"title":{}}],["string",{"_index":113,"text":{"":{},"#output":{},"ANSI/":{},"ANSI/#colorizing-log-output":{},"ANSI/#colorizing-printed-output":{},"api_ansi/":{},"api_configuration/":{},"api_milc/":{},"api_milc/#arguments":{},"api_questions/":{},"argument_parsing/":{},"argument_parsing/#deprecated":{},"logging/":{},"logging/#controlling-log-output":{},"logging/#writing-log-entries":{},"subcommand_config/":{},"subcommand_config/#deleting-configuration-values":{},"subcommand_config/#subcommand-reference-config":{},"subprocesses/":{},"subprocesses/#building-argument-lists":{},"tutorial/":{},"tutorial/#logging-and-printing":{},"tutorial/#user-controlled-configuration":{}},"title":{}}],["strip",{"_index":847,"text":{"tutorial/":{},"tutorial/#logging-and-printing":{}},"title":{}}],["structur",{"_index":610,"text":{"configuration/":{},"configuration/#configuration":{},"tutorial/":{},"tutorial/#quick-program-overview":{}},"title":{"configuration/#structure":{}}}],["style",{"_index":158,"text":{"ANSI/":{},"ANSI/#available-colors":{},"ANSI/#colored-print-example":{},"api__sparkline/":{},"api__sparkline/#arguments":{},"api_emoji/":{},"api_emoji/#emoji":{},"argcomplete/":{},"argcomplete/#adding-custom-completions":{},"logging/":{},"logging/#writing-log-entries":{}},"title":{}}],["subcommand",{"_index":24,"text":{"":{},"#milc-an-opinionated-batteries-included-python-3-cli-framework":{},"api_configuration/":{},"api_milc/":{},"api_subcommand_config/":{},"breaking_changes/":{},"breaking_changes/#version-140":{},"breaking_changes/#version-150":{},"configuration/":{},"configuration/#configuration":{},"configuration/#structure":{},"subcommand_config/":{},"subcommand_config/#introduction":{},"subcommand_config/#milc-config-subcommand":{},"subcommand_config/#setting-user-defaults":{},"subcommand_config/#subcommand-reference-config":{},"subprocesses/":{},"subprocesses/#executing-commands-in-a-subprocess":{},"tutorial/":{},"tutorial/#configuration-and-argument-parsing":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#entrypoints":{},"tutorial/#example-output":{},"tutorial/#minimal-example":{},"tutorial/#subcommands":{},"tutorial/#user-controlled-configuration":{}},"title":{"subcommand_config/":{},"subcommand_config/#milc-config-subcommand":{},"subcommand_config/#subcommand-reference-config":{},"tutorial/#configuration-and-subcommands":{},"tutorial/#subcommands":{}}}],["subcommand'",{"_index":877,"text":{"tutorial/":{},"tutorial/#configuration-and-subcommands":{}},"title":{}}],["subcommand.config",{"_index":482,"text":{"api_subcommand_config/":{}},"title":{"api_subcommand_config/#subcommandconfig":{}}}],["subcommand|general|user>[.][=
https://milc.clueboard.co/1.6/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/ANSI/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api__in_argv/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api__sparkline/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api_ansi/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api_attrdict/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api_configuration/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api_emoji/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api_milc/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api_questions/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/api_subcommand_config/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/argcomplete/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/argument_parsing/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/breaking_changes/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/configuration/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/installation/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/logging/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/metadata/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/sparklines/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/spinners/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/subcommand_config/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/subprocesses/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/threading/
- 2023-06-13
+ 2024-01-27
daily
https://milc.clueboard.co/1.6/tutorial/
- 2023-06-13
+ 2024-01-27
daily
\ No newline at end of file
diff --git a/1.6/sitemap.xml.gz b/1.6/sitemap.xml.gz
index 8239e5020389546951f227f17b448aa3626356fe..7fd1394ce4da397163b95f3bb49867b01382c3d2 100644
GIT binary patch
literal 391
zcmV;20eJo&iwFquTD4^Y|8r?{Wo=<_E_iKh0M*w!Z^AGT0N}m9BFat-sOn20s7s|T
zUE0pkVH?NAkKnsN`|s-jLaZGs9bS?+=hG+Ix!Cpc+q+_?6WSOS<*b^Pg$^<*8_c5o
z{CJr>l*{I(9+E>%MGg+QC_AG5Nr?S^U!f)Kp~osFBT#nv0mZ3POsmJTxhZlR6CCdj
zt#(m1V;0P5ymhjYZqTa;NmVk6S#>9BF~(dD0VE$)GoQ|HC)3$vexE~5eHUS}gJASJ
z>20IHx}REH^c*eXjQKn3`R)Ccs||YFwl=ho%#O7Ydq^8+gXXM+fR?q7C@Cw6vr)#d
zwq{5`xx8?OY9GH?&-VC+vu`_S948q$BXL;C=sg5=TA6II$z*8nG-<}f!RtV6uH~3_
z3tXM6q+yeN?J+Cc^?4Pg(gq}Oj7*cLK~S+NwA7-MdS0Fn!BJul~rX}O%v7AfS?cM~Q%@LFx7
z+Se@@`%{UVp0h<LWSDcmL(XjRr#nwpTY?Q%o
zjUFOUDleR&%7ri1vpv4y?As3t$4N%cNE|jYI0wGHtW37ps1vleiWFnw;FPB()pAU`
z1+LCbRIp3F=A4!7`n-!$X*?2G%i3sz){NJqQv@v#aP?jHX2@4)yiX?tA`(^Zm6C0069+!RG(~
diff --git a/latest b/latest
new file mode 120000
index 0000000..dc39e58
--- /dev/null
+++ b/latest
@@ -0,0 +1 @@
+1.6
\ No newline at end of file
diff --git a/latest/404.html b/latest/404.html
deleted file mode 100644
index 3114756..0000000
--- a/latest/404.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../1.6/404.html...
-
-
\ No newline at end of file
diff --git a/latest/ANSI/index.html b/latest/ANSI/index.html
deleted file mode 100644
index d7c9c70..0000000
--- a/latest/ANSI/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/ANSI/...
-
-
\ No newline at end of file
diff --git a/latest/api__in_argv/index.html b/latest/api__in_argv/index.html
deleted file mode 100644
index 602558e..0000000
--- a/latest/api__in_argv/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api__in_argv/...
-
-
\ No newline at end of file
diff --git a/latest/api__sparkline/index.html b/latest/api__sparkline/index.html
deleted file mode 100644
index 803ac4e..0000000
--- a/latest/api__sparkline/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api__sparkline/...
-
-
\ No newline at end of file
diff --git a/latest/api_ansi/index.html b/latest/api_ansi/index.html
deleted file mode 100644
index a3d9809..0000000
--- a/latest/api_ansi/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api_ansi/...
-
-
\ No newline at end of file
diff --git a/latest/api_attrdict/index.html b/latest/api_attrdict/index.html
deleted file mode 100644
index c5aabc2..0000000
--- a/latest/api_attrdict/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api_attrdict/...
-
-
\ No newline at end of file
diff --git a/latest/api_configuration/index.html b/latest/api_configuration/index.html
deleted file mode 100644
index 6b9199a..0000000
--- a/latest/api_configuration/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api_configuration/...
-
-
\ No newline at end of file
diff --git a/latest/api_emoji/index.html b/latest/api_emoji/index.html
deleted file mode 100644
index 635500a..0000000
--- a/latest/api_emoji/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api_emoji/...
-
-
\ No newline at end of file
diff --git a/latest/api_milc/index.html b/latest/api_milc/index.html
deleted file mode 100644
index 2df257f..0000000
--- a/latest/api_milc/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api_milc/...
-
-
\ No newline at end of file
diff --git a/latest/api_questions/index.html b/latest/api_questions/index.html
deleted file mode 100644
index be3ce81..0000000
--- a/latest/api_questions/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api_questions/...
-
-
\ No newline at end of file
diff --git a/latest/api_subcommand_config/index.html b/latest/api_subcommand_config/index.html
deleted file mode 100644
index d372932..0000000
--- a/latest/api_subcommand_config/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/api_subcommand_config/...
-
-
\ No newline at end of file
diff --git a/latest/argcomplete/index.html b/latest/argcomplete/index.html
deleted file mode 100644
index a704667..0000000
--- a/latest/argcomplete/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/argcomplete/...
-
-
\ No newline at end of file
diff --git a/latest/argument_parsing/index.html b/latest/argument_parsing/index.html
deleted file mode 100644
index b213442..0000000
--- a/latest/argument_parsing/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/argument_parsing/...
-
-
\ No newline at end of file
diff --git a/latest/breaking_changes/index.html b/latest/breaking_changes/index.html
deleted file mode 100644
index 877f23d..0000000
--- a/latest/breaking_changes/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/breaking_changes/...
-
-
\ No newline at end of file
diff --git a/latest/configuration/index.html b/latest/configuration/index.html
deleted file mode 100644
index 11b3aaa..0000000
--- a/latest/configuration/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/configuration/...
-
-
\ No newline at end of file
diff --git a/latest/index.html b/latest/index.html
deleted file mode 100644
index 454be31..0000000
--- a/latest/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../1.6/...
-
-
\ No newline at end of file
diff --git a/latest/installation/index.html b/latest/installation/index.html
deleted file mode 100644
index 4f1e617..0000000
--- a/latest/installation/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/installation/...
-
-
\ No newline at end of file
diff --git a/latest/logging/index.html b/latest/logging/index.html
deleted file mode 100644
index b2a0f02..0000000
--- a/latest/logging/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/logging/...
-
-
\ No newline at end of file
diff --git a/latest/metadata/index.html b/latest/metadata/index.html
deleted file mode 100644
index 74302ab..0000000
--- a/latest/metadata/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/metadata/...
-
-
\ No newline at end of file
diff --git a/latest/sparklines/index.html b/latest/sparklines/index.html
deleted file mode 100644
index 8a4a5e4..0000000
--- a/latest/sparklines/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/sparklines/...
-
-
\ No newline at end of file
diff --git a/latest/spinners/index.html b/latest/spinners/index.html
deleted file mode 100644
index 7bf4aee..0000000
--- a/latest/spinners/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/spinners/...
-
-
\ No newline at end of file
diff --git a/latest/subcommand_config/index.html b/latest/subcommand_config/index.html
deleted file mode 100644
index 0b09b51..0000000
--- a/latest/subcommand_config/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/subcommand_config/...
-
-
\ No newline at end of file
diff --git a/latest/subprocesses/index.html b/latest/subprocesses/index.html
deleted file mode 100644
index 9d88771..0000000
--- a/latest/subprocesses/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/subprocesses/...
-
-
\ No newline at end of file
diff --git a/latest/threading/index.html b/latest/threading/index.html
deleted file mode 100644
index aca0937..0000000
--- a/latest/threading/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/threading/...
-
-
\ No newline at end of file
diff --git a/latest/tutorial/index.html b/latest/tutorial/index.html
deleted file mode 100644
index 178e9aa..0000000
--- a/latest/tutorial/index.html
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
- Redirecting
-
-
-
-
- Redirecting to ../../1.6/tutorial/...
-
-
\ No newline at end of file