diff options
author | Ed Bartosh <eduard.bartosh@intel.com> | 2013-08-11 18:17:34 +0300 |
---|---|---|
committer | Eduard Bartosh <eduard.bartosh@intel.com> | 2013-08-12 23:56:11 -0700 |
commit | e5ce4ed3104f84fecae02e3867d80a7d79fe6010 (patch) | |
tree | dc37107a64f0cefcf0b33e995d39cf235e703d1f | |
parent | 23e81434023fd632dcd5d5f15d2c8f40da531b6f (diff) | |
download | repa-e5ce4ed3104f84fecae02e3867d80a7d79fe6010.tar.gz repa-e5ce4ed3104f84fecae02e3867d80a7d79fe6010.tar.bz2 repa-e5ce4ed3104f84fecae02e3867d80a7d79fe6010.zip |
Implemented config file processing
Configuration is taken from /etc/repa.conf and ~/.repa.conf, so it's
possible to specify system defaults in /etc/repa.conf and user-related
configuration options in ~/.repa.conf. ~/.repa.conf has higher priority
and any option from /etc/repa.conf can be reset in ~/.repa.conf
Configuration processing is implemented in a way that default values for
command line parameters are taken from configuration file(s).
Configuration section to use can be specified in command line too.
Fixes: #1141
Change-Id: I632f22674c282021983bc6a496ef1fccc0da3137
Signed-off-by: Ed Bartosh <eduard.bartosh@intel.com>
Reviewed-on: https://otctools.jf.intel.com/review/5839
Tested-by: OTC Tools Tester <ed.bartosh@linux.intel.com>
Reviewed-by: Hasan Wan <hasan.wan@intel.com>
-rw-r--r-- | packaging/repa.spec | 1 | ||||
-rw-r--r-- | repa.conf | 9 | ||||
-rwxr-xr-x | repa/group.py | 2 | ||||
-rwxr-xr-x | repa/list.py | 10 | ||||
-rwxr-xr-x | repa/main.py | 76 | ||||
-rw-r--r-- | setup.py | 10 |
6 files changed, 93 insertions, 15 deletions
diff --git a/packaging/repa.spec b/packaging/repa.spec index bea2d0a..176d0b0 100644 --- a/packaging/repa.spec +++ b/packaging/repa.spec @@ -35,6 +35,7 @@ rm -rf %{buildroot} %files %defattr(-,root,root,-) +%config %{_sysconfdir}/%{name}.conf %{_prefix}/share/doc/packages/%{name} %{python_sitelib}/%{name}-%{version}-*.egg-info %{python_sitelib}/%{name}-%{version}-*-nspkg.pth diff --git a/repa.conf b/repa.conf new file mode 100644 index 0000000..6e16037 --- /dev/null +++ b/repa.conf @@ -0,0 +1,9 @@ +[general] +#apiurl = +#apiuser = +#apipasswd = +list_regexp = .* + +[tizen.org] +apiurl = https://api.tizen.org + diff --git a/repa/group.py b/repa/group.py index 4d8140f..0c3089a 100755 --- a/repa/group.py +++ b/repa/group.py @@ -23,7 +23,7 @@ class Group(object): help = description @staticmethod - def add_arguments(parser): + def add_arguments(parser, _config): """Adds arguments to the parser. Called from [sub_]main.""" parser.add_argument('--comment', help='comment') diff --git a/repa/list.py b/repa/list.py index 6359502..e8c493b 100755 --- a/repa/list.py +++ b/repa/list.py @@ -23,9 +23,13 @@ class List(object): help = description @staticmethod - def add_arguments(parser): - """Adds arguments to the parser. Called from [sub_]main.""" - parser.add_argument('-regexp', default='.*', help='search regexp') + def add_arguments(parser, config): + """ + Add arguments to the parser. Called from [sub_]main. + Set defaults for arguments from config. + """ + parser.add_argument('-regexp', help='search regexp', + default=config.get('list_regexp', '.*')) def run(self, argv): """Command line entry point. Called from [sub_]main""" diff --git a/repa/main.py b/repa/main.py index 7dc63b8..1f1c402 100755 --- a/repa/main.py +++ b/repa/main.py @@ -13,13 +13,32 @@ Command line parsing, script entry point. import sys import pkg_resources +import ConfigParser +from os.path import expanduser from argparse import ArgumentParser +class RepaException(Exception): + """Custom repa exception. All repa modules should use it.""" + pass + + def parse_args(argv): - """Command line parsing.""" - parser = ArgumentParser(description='Release Engineering Process Assistant') + """ + Parse command line. Read config. + Set arguments to config values. + """ + # create parser to parse -section + parser = ArgumentParser(add_help=False) + parser.add_argument('-section', default='general', + help='config section to use') + # read config section, specified in command line + parsed, argv = parser.parse_known_args(argv) + config = read_config(section=parsed.section) + + # recreate parser to parse rest of the command line + parser = ArgumentParser(description='Release Engineering Process Assistant') # Define subcommands using setup.py entry points subparsers = parser.add_subparsers(help='sub-command help') for entry in pkg_resources.iter_entry_points(group='repa_commands'): @@ -28,16 +47,56 @@ def parse_args(argv): description=cmd.description, help=cmd.help) if hasattr(cmd, 'add_arguments'): - cmd.add_arguments(parser_cmd) + cmd.add_arguments(parser_cmd, config) parser_cmd.set_defaults(func=cmd.run) - return parser.parse_args(argv) + args = parser.parse_args(argv) + + return update_args(config, args) + + +def read_config(paths=('/etc/repa.conf', expanduser('~/.repa.conf')), + section='general', + mandatory=('apiurl', 'apiuser', 'apipasswd')): + """ + Read repa config. + Configuration is read from the set of files provided. + Optional section name can be specified to read options from + """ + conf = ConfigParser.RawConfigParser() + if not conf.read(paths): + raise RepaException("Configuration file not found") + if not conf.has_section(section): + raise RepaException("Section '%s' doesn't exist in config" % section) + + # read configuration from 'general' and then from specified section + # to have defaults set properly + config = dict(conf.items('general')) + if section != 'general': + config.update(conf.items(section)) + + # Check mandatory config options + missed = set(mandatory).difference(set(config.keys())) + if missed: + raise RepaException("Missing mandatory config options: %s" % \ + ','.join(missed)) + return config + +def update_args(config, args): + """Set configuration options as args attributes.""" + for key, val in config.iteritems(): + if not hasattr(args, key): + setattr(args, key, val) + return args def sub_main(argv, cmd): """Subcommand entry point.""" parser = ArgumentParser(description=cmd.description) - cmd.add_arguments(parser) - return cmd.run(parser.parse_args(argv)) + config = read_config() + cmd.add_arguments(parser, config) + args = parser.parse_args(argv) + return cmd.run(update_args(config, args)) + def main(argv=sys.argv[1:]): """Command line entry point.""" @@ -46,4 +105,7 @@ def main(argv=sys.argv[1:]): if __name__ == '__main__': - sys.exit(main(sys.argv[1:])) + try: + sys.exit(main(sys.argv[1:])) + except RepaException, error: + print >> sys.stderr, error @@ -9,7 +9,7 @@ Author: Ed Bartosh <eduard.bartosh@intel.com> Setup module """ - +import os from setuptools import setup setup(name = "repa", @@ -18,10 +18,12 @@ setup(name = "repa", author_email = 'eduard.bartosh@intel.com', packages = ['repa'], namespace_packages = ['repa'], - data_files = [('share/doc/packages/repa/', ['README']),], + data_files = [ + ('share/doc/packages/repa/', ['README']), + (['/etc', 'etc'][bool(os.getenv('VIRTUAL_ENV'))], ['repa.conf'])], entry_points = { 'console_scripts': ['repa = repa.main:main'], - 'repa_commands': ['list = repa.list:List', - 'group = repa.group:Group'] + 'repa_commands': ['list = repa.list:List', + 'group = repa.group:Group'] } ) |