## UsageUsing CloeePy is simple. Just import the framework, tell CloeePy where your config fileis located, and use the plugins that are attached to the application object.

With programs consisting of multiple modules, you can access the CloeePy instanceby re-instantiating it via `app = CloeePy()`. The CloeePy instance is a singleton,so it will only ever be instantiated once per process.

The only plugin that comes packaged with CloeePy (at this point) is the logger.

## BackgroundThis package is brought to you by the engineering team at Cloee. We buildArtificial Intelligence for DevOps and Infrastructure as a Service. Many of oursystems run as background jobs, and we weren't quite happy with existing Pythonframeworks - as most are designed for building web systems (Django, Flask, Tornado, etc).

We write a lot of cron jobs and message-driven systems, so we don't need requesthandling functionality, which is the focus of most existing frameworks.

**Singleton application context that can be accessed from anywhere**

We needed an application context containing configuration, database connections, otheruseful stuff, that can be easily accessed from anywhere in our application.Application context for a CloeePy app is a singleton that can be instantiatedanywhere in the application without running the risk of re-reading configurationfiles or overwriting existing database connections.

**YAML driven configuration files**

Most popular python frameworks use python modules as configuration files. Although it'sconvenient to do so in many situations, most of our systems run as containers onKubernetes. YAML has become the de-facto configuration format for many modernapplications, and Kuberenetes supports YAML-based ConfigMaps that can be added toa container at startup time.

**Configuration object, NOT configuration dictionary**

Okay, this is a nit-picky one. But when you have deeply nested configurations,isn't it annoying when all of your configuration data is stored as a Python dictionary?Wouldn't dot accessors to your configuration data be a lot prettier and easy toread/write? We think so. Therefore, any dictionaries in your configuration filesare turned into generic Python objets, so you can use the dot accessors like this:

`config.key1.key2.key3`

instead of this:

`config[key1][key2][key3]`.

Nonetheless, if you REALLY like dictionary access, you still have access toyour configuration as a dictionary.

**Extensible via plugins**

You can extend CloeePy by creating plugins. Plugins allow you to createanything you want and attach it to the application context. This is particularlyuseful for managing database connections or sharing common data/objectsthroughout your application.

## MaintainersScott Crespo (@scottcrespo)

## ContributingIf you would like to contribute, please read the [Contributor's Guide](./CONTRIBUTING.md)