=============================
Setting Configuration Options
=============================

$Id$

(TO DO / exercises: try to formulate a typical buildout.cfg, a configure.zcml,
or a generic setup configuration file using this syntax.)

  >>> from cybertools import util
  >>> from cybertools.util.config import Configurator
  >>> config = Configurator()

  >>> config.load('transport.serverURL = "http://demo.cy55.de"')
  >>> config.transport.serverURL
  'http://demo.cy55.de'

This setting may also contain indexed access; thus we can model
configuration parameters with multiple instances (like crawling
jobs).

  >>> config.load('''
  ... crawl[0].type = "filesystem"
  ... crawl[0].directory = "documents/projects"
  ... ''')
  >>> config.crawl[0].type
  'filesystem'
  >>> config.crawl[0].directory
  'documents/projects'

Subsections are created automatically when they are first accessed.

  >>> config.load('ui.web.port = 8081')
  >>> config.ui.web.port
  8081

The ``setdefault()`` method allows to retrieve a value and set
it with a default if not found, in one statement.

  >>> config.ui.web.setdefault('port', 8080)
  8081
  >>> config.transport.setdefault('userName', 'demo')
  'demo'

  >>> sorted(config.transport.items())
  [('__name__', 'transport'), ('serverURL', 'http://demo.cy55.de'),
   ('userName', 'demo')]

We can output a configuration in a form that is ready for loading
just by converting it to a string representation.

  >>> print(config)
  crawl[0].directory = 'documents/projects'
  crawl[0].type = 'filesystem'
  transport.serverURL = 'http://demo.cy55.de'
  transport.userName = 'demo'
  ui.web.port = 8081

The configuration may also be saved to a file -
for testing purposes let's use the cybertools.util package directory
for storage; normally it would be stored in the users home directory.

  >>> import os
  >>> os.environ['HOME'] = os.path.dirname(util.__file__)

  >>> config.save()

  >>> fn = config.getDefaultConfigFile()
  >>> fn
  '....cybertools.cfg'

  >>> print(open(fn).read())
  crawl[0].directory = 'documents/projects'
  crawl[0].type = 'filesystem'
  transport.serverURL = 'http://demo.cy55.de'
  transport.userName = 'demo'
  ui.web.port = 8081

The simplified syntax
---------------------

  >>> config.load('''
  ... ui(
  ...   web(
  ...     port=11080,
  ... ))
  ... crawl[1](
  ...   type='outlook',
  ...   folder='inbox',
  ... )
  ... ''')
  >>> config.ui.web.port
  11080
  >>> config.crawl[1].type
  'outlook'

  >>> #print config

A better simplified syntax
--------------------------

Open a section with the ``use`` method.

use(ui.web)
port = 11080

use(crawl[1])
type = 'outlook'
folder = 'inbox'

or - even more better...

use(ui.web,
    port=11080,
)

use(crawl[1],
    type='outlook',
    folder='inbox',
)


Cleaning up
-----------

  >>> os.unlink(fn)

