summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEd Bartosh <eduard.bartosh@intel.com>2013-08-11 18:17:34 +0300
committerEduard Bartosh <eduard.bartosh@intel.com>2013-08-12 23:56:11 -0700
commite5ce4ed3104f84fecae02e3867d80a7d79fe6010 (patch)
treedc37107a64f0cefcf0b33e995d39cf235e703d1f
parent23e81434023fd632dcd5d5f15d2c8f40da531b6f (diff)
downloadrepa-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.spec1
-rw-r--r--repa.conf9
-rwxr-xr-xrepa/group.py2
-rwxr-xr-xrepa/list.py10
-rwxr-xr-xrepa/main.py76
-rw-r--r--setup.py10
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
diff --git a/setup.py b/setup.py
index 6c38f90..a1f5e0f 100644
--- a/setup.py
+++ b/setup.py
@@ -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']
}
)