Package: cincoconfig
Cinco ConfigNext generation universal configuration file parser. The config file structure is defined
programmatically and expressively, no need to create classes and inheritance.Let's get right to it:# app_config.pyimportgetpassfromcincoconfigimport*# first, define the configuration's schema -- the fields available that# customize the application's or library's behaviorschema=Schema()schema.mode=ApplicationModeField(default='production')# nested configurations are built on the fly# http is now a subconfigschema.http.port=PortField(default=8080,required=True)# each field has its own validation rules that are run anytime the config# value is loaded from disk or modified by the user.# here, this field only accepts IPv4 network addresses and the user is# required to define this field in the configuration file.schema.http.address=IPv4AddressField(default='127.0.0.1',required=True)schema.http.ssl.enabled=BoolField(default=False)schema.http.ssl.cafile=FilenameField()schema.http.ssl.keyfile=FilenameField()schema.http.ssl.certfile=FilenameField()schema.db.host=HostnameField(allow_ipv4=True,required=True,default='localhost')schema.db.port=PortField(default=27017,required=True)schema.db.name=StringField(default='my_app',required=True)schema.db.user=StringField(default='admin')# some configuration values are sensitive, such as credentials, so# cincoconfig provides config value encryption when the value is# saved to disk via the SecureFieldschema.db.password=SecureField()# get a field programmaticallyprint(schema['db.host'])# >>> schema.db.host# once a schema is defined, build the actual configuration object# that can load config files from disk and interact with the valuesconfig=schema()# print the http portprint(config.http.port)# >>> 8080# print the http port programmaticallyprint(config['http.port'])# >>> 8080config.db.password=getpass.getpass("Enter Password: ")# < 'password'# set a config value manuallyifconfig.mode=='production':config.db.name=config.db.name+'_production'print(config.dumps(format='json',pretty=True).decode())# {#   "mode": "production",#   "http": {#     "port": 8080,#     "address": "127.0.0.1"#     "ssl": {#       "enabled": false#     }#   },#   "db": {#     "host": "localhost",#     "port": 27017,#     "name": "my_app_production",#     "user": "admin",#     "password": {#       "method": "best",#       "ciphertext": "<ciphertext>"#     }#   }# }Override Configuration with Command Line Arguments (argparse)# config.pyschema=Schema()schema.mode=ApplicationModeField(default='production',modes=['production','debug'])schema.http.port=PortField(default=8080,required=True)schema.http.address=IPv4AddressField(default='127.0.0.1',required=True)config=schema()# __main__.pyimportargparsefrom.configimportconfig,schemaparser=schema.generate_argparse_parser()## The generate_argparse_parser() method auto generates the parser using --long-opts. For this# configuration, the returned parser is equivalent to:## parser = argparse.ArgumentParser()## parser.add_argument('--http-address', action='store', dest='http.address')# parser.add_argument('--http-port', action='store', dest='http.port')# parser.add_argument('--mode', action='store', dest='mode')## new args can be added to the parserparser.add_argument('-c','--config',action='store')args=parser.parse_args()ifargs.config:config.load(args.config,format='json')# update the configuration with arguments specified via the command lineconfig.cmdline_args_override(args,ignore=['config'])