YamlSettings
------------

A Yaml Settings Configuration Module.

A library to help manage project settings, without having to worry about
accidentally checking non-public information, like api keys.  Along with
simple environment variable support.

Example setup
^^^^^^^^^^^^^
Python Code - Base Functions::

 app_settings = load('defaults.yml')
 update_from_env(test_settings)
 update_from_file(app_defaults, 'settings.yml')
 user = app_settings.myproj.databases.primary_sql.user

Python Code - YamlSettings Helper Class::

 project_settings = YamlSettings('defaults.yml',
                                 'settings.yml',
                                 default_section='myproj')
 base_settings = project_settings.get_settings()
 user = base_settings.databases.primary_sql.user

defaults.yml - Default Settings for Project (tracked)::

 ---
 # Program Defaults, do not edit this file!!!
 # All values should be overridden in the following ways:
 # 1. In the 'settings.yaml' file.
 # 2. With environment variables. Example myproj.databases.primary_sql.user can
 #    be overridden with MYPROJ_DATABASES_PRIMARY_SQL_USER.
 myproj:
   databases:
     primary_sql:
       user: my_user
       passwd: password_here
       host: db-bouncer-01.postgres.com:5432
       db: postgres
       compress: true
       engine: postgresql
     splunk:
       user: splunk_user_here
       passwd: password here
       host: splunk.com
       port: 8089
     redis:
       redis_host: 127.0.0.1
       redis_port: 6379
   flask_config:
     DEBUG: False
     SECRET_KEY: hard key to guess and keep values secret
   debug_sql: false
   debug_profiler: false
   cache_routes: true
   logging_config:
     version: 1
     disable_existing_loggers: False
     formatters:
       light:
         format: '%(asctime)s [%(levelname).1s] %(name)s: %(message)s'
         datefmt: '%Y-%m-%d %H:%M:%S'
       verbose:
         format: '%(asctime)s %(levelname) 8s(%(name)s): %(message)s'
         datefmt: ''
     handlers:
       console:
         class: logging.StreamHandler
         level: DEBUG
         formatter: light
         stream: ext://sys.stdout
       slack:
         class: api.slackLogHandler.BufferingSlackWebHookHandler
         level: INFO
         formatter: light
         capacity: 100
         organization: KyleJamesWalker
         token: need_this
         channel: '#services'
         username: my-proj-logger
         icon_emoji: ':happy_panda:'
       noid:
         class: logging.NullHandler
     loggers:
       requests:
         level: NOTSET
         handlers: [noid]
         propagate: no
     root:
       level: NOTSET
       handlers:
         - console

settings.yml - Custom Settings (untracked)::

 ---
 myproj:
   databases:
     primary_sql:
       user: root
       passwd: god
     splunk:
       user: real_user
       passwd: pa$$word
   flask_config:
     SECRET_KEY: sdfasjksdfASFAS23423f@#$%!$#VR@%UQ%
   logging_config:
     handlers:
       slack:
         token: 123243294832104981209
     root:
       handlers:
         - console
         - slack
