D Configuration Framework (alias Program Options)

Robert Fraser fraserofhenight at gmail.com
Mon Oct 8 17:49:08 PDT 2007


Marcin Kuszczak Wrote:

> Hello all D fans!
> 
> I would like to announce completely rewritten and reworked program options
> library. This is beta release, but should be rather stable for everyday
> use. You can find source code and download package on project page:
> http://www.dsource.org/projects/doost/wiki
> 
> ----
> 
> Program options library is intended to make managing of configuration in D
> programs easy. Instead of reinventing the wheel and implementing same parts
> of program to manage configuration over and over again, it is possible now
> to use library with simple API for common tasks. Common tasks with managing
> program configuration include: reading configuration options from physicall
> media, saving them back, presenting description of available options to
> user, checking for incorrect usage, working with different sources of
> options, checking option values for validity, synchronizing with physicall
> media etc.
> 
> Main goal for this release was to make library usage very easy for common
> use cases. Other goal was to make it easy to implement new physicall
> backends for storing options and also to make source code and usage of
> library more D-like.
> 
> To achieve above goals I changed architecture of previous version, so it is
> currently based on concept of root access class to options (ProgramOptions
> class) and different classes which define specific backends (e.g.
> CommandLineStorage, ConfigFileStorage). Standard way to access options is
> through root class (ProgramOptions), which is searching then for concrete
> options in stacked physicall storages. From library user point of view
> interface to options is similar to interface of associative arrays.
> 
> New library has gain several abilities which were not available in original:
>         * possibility to store options in backends
>         * available storages: CommandLineStorage, ConfigFileStorage, 
>           EnvironmentStorage, DbStorage (using ddbi)
>         * interfacing to whole stack (ProgramOptions) and every concrete storage
>         * easy method to add new backends using [read|save]Physically[One|All] 
>           methods
>         * stacking of options backends
>         * removed possibility to store values into concrete variables (it was 
>           insecure)
>         * notification about option changes (it is possible to register for 
>           specific events)
>         * easy synchronization of options with backends using synchronize() method
>         * different synchronization methods: direct or cached
>         * interface to stack of options similar to associative arrays
>         * possibility to have many stacks of options in program (ProgramOptions is 
>           not singleton)
>         * custom file loaders and savers with simple ones set by default
>         * possibility to compose one option which is defined in different storages 
>           into one value
>         * generalization of short option, which now is just alias for normal option
>         * reading/storing lists in  backends (with user defined separators)
>         * support for escape sequences
>         * easy initialization of options stack, with no temporary variables
>         * checking for options integrity (not possible to define same option twice 
>           in storage, option type must be same in whole stack)
>         * Tango-like structure of directories + naming convention similar to other 
>           D programs
>         * built-in regular expressions for option values
>         * user defined formatters for options
>         * special types of options: SelfName, SelfDir, SelfPath, RegExpOptions and 
>           possibility to create user defined options
>         * reworked positional options in CommandLineStorage (currently it is 
>           special type option)
>         * built-in response files support for CommandLineStorage
>         * functions for checking for obligatory options, conflicting options and 
>           dependant options
>         * comments for DDoc
>         * unit tests
>         * many smaller improvements and bugfixes
> 
> Below you can find simplest usage example for command line:
> 
> ----------8<----------
> 
> import doost.util.config.ProgramOptions;
> import doost.util.config.CommandLineStorage;
> 
> void main(char[][] args) {
>   //Definition of simplest options stack
>   auto po = (new ProgramOptions)
>                 .next(
>             (new CommandLineStorage(args))
>                 .caption("Command line options")
>                 .options()
>                   ("help,h", "produce help message")
>                   ("compression", define!(int), "set compression level")
>                   ("sync", "stores cmdline options in persistent backend")
>                   ()
>             );
> 
>   //Conecting to storages
>   po.connect();
> 
>   //Reading options
>   if ("help" in po) writefln(po);
>   if ("compression" in po)      
>         writefln("Compresson level set to: ", po["compression"].as!(uint));
> 
>   //Disconnecting storages
>   po.disconnect;
> }
>  
> ---------->8----------
>  
> *A lot of different examples for different storages you can find in file:
> examples/util/config/FunctionTest.d.*
> 
> Currently there are following backends defined for program options:
> CommandLineStorage      -       handles command line options
> ConfigFileStorage       -       handles options from ini-like files
> EnvironmentStorage      -       handles options from environment variables
> DbStorage               -       handles options from database through ddbi interface
> 
> -------
> 
> Although it is beta release (so architecture of library is considered to be
> finished) I am open to discuss and eventually change parts of program in
> case there are good arguments supporting changes. 
> 
> I will be happy to get feedback from you. You can find few things to
> consider in file doc/todo.txt. You can also write other physicall backends
> to library. If you want I can host them in doost svn.
> 
> Also as I am not native English-speaker, I would appreciate help with
> improving documentation and corrections for misspelled words. You can send
> patches or just send me an e-mail.
> 
> I hope anyway you will like what you get :-) Have a fun!
> 
> -- 
> Regards
> Marcin Kuszczak (Aarti_pl)
> -------------------------------------
> Ask me why... I believe in Jesus - http://www.zapytajmnie.com (en/pl)
> Doost (port of few Boost libraries) - http://www.dsource.org/projects/doost/
> -------------------------------------
> 

Wow, I was thinking about how useful this would be. Very, very awesome! Any chance of a Tango port?



More information about the Digitalmars-d-announce mailing list