aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pym/gentoolkit/module_base.py')
-rw-r--r--pym/gentoolkit/module_base.py268
1 files changed, 138 insertions, 130 deletions
diff --git a/pym/gentoolkit/module_base.py b/pym/gentoolkit/module_base.py
index 0632469..e6e668e 100644
--- a/pym/gentoolkit/module_base.py
+++ b/pym/gentoolkit/module_base.py
@@ -7,7 +7,7 @@
"""General Base Module class to hold common module operation functions
"""
-__docformat__ = 'epytext'
+__docformat__ = "epytext"
import sys
@@ -17,135 +17,143 @@ import gentoolkit.pprinter as pp
from gentoolkit.formatters import format_options
from gentoolkit.base import mod_usage
+
class ModuleBase:
- """E-app base module class to parse module options print module help, etc.."""
-
- def __init__(self):
- self.module_name = None
- self.options = {}
- self.formatted_options = None
- self.short_opts = None
- self.long_opts = None
- self.module_opts = {}
- self.warning = None
- self.need_queries = True
- self.saved_verbose = None
-
-
- def print_help(self, with_description=True):
- """Print description, usage and a detailed help message.
-
- @type with_description: bool
- @param with_description: if true, print module's __doc__ string
- """
-
- if with_description:
- print()
- print(__doc__.strip())
- print()
- if self.warning:
- print()
- for line in self.warning:
- sys.stderr.write(pp.warn(line))
- print()
- print(mod_usage(mod_name=self.module_name, arg=self.arg_spec, optional=self.arg_option))
- print()
- print(pp.command("options"))
- print(format_options( self.formatted_options ))
- if self.formatted_args:
- print()
- print(pp.command(self.arg_spec))
- print(format_options(self.formatted_args))
- print()
-
- def parse_module_options(self, module_opts):
- """Parse module options and update self.options"""
- opts = (x[0] for x in module_opts)
- posargs = (x[1] for x in module_opts)
- for opt, posarg in zip(opts, posargs):
- if opt in ('-h', '--help'):
- self.print_help()
- sys.exit(0)
- opt_name, opt_type, opt_setting = self.module_opts[opt]
- if opt_type == 'boolean':
- self.options[opt_name] = opt_setting
- elif opt_type == 'int':
- if posarg.isdigit():
- val = int(posarg)
- else:
- print()
- err = "Module option %s requires integer (got '%s')"
- sys.stdout.write(pp.error(err % (opt,posarg)))
- print()
- self.print_help(with_description=False)
- sys.exit(2)
- self.options[opt_name] = val
- elif opt_type == 'char':
- self.options[opt_name] = posarg
-
- def set_quiet(self, quiet):
- """sets the class option["quiet"] and option["verbose"] accordingly"""
- if quiet == self.options['quiet']:
- return
- if self.saved_verbose:
- # detected a switch
- verbose = self.options['verbose']
- self.options['verbose'] = self.saved_verbose
- self.saved_verbose = verbose
- elif quiet:
- self.saved_verbose = self.options['verbose']
- self.options['verbose'] = False
- self.options['quiet'] = quiet
- return
-
- def validate_query(self, query, depth=0):
- """check that the query meets the modules TargetSpec
- If not it attempts to reduce it to a valid TargetSpec
- or prints the help message and exits
- """
- if depth > 1:
- return []
- if len(query) > 1:
- query = list(set(self.arg_options).intersection(query))
- #print "reduced query =", query
- query = self.validate_query(query, depth+1)
- if isinstance(query, list):
- query = query[0]
- if query not in self.arg_options:
- print()
- print(pp.error(
- "Error starting module. Incorrect or No TargetSpec specified!"
- ))
- print("query = ", query)
- self.print_help()
- sys.exit(2)
- return query
-
-
- def main_setup(self, input_args):
- """Parse input and prepares the program"""
-
- try:
- module_opts, queries = gnu_getopt(input_args, self.short_opts, self.long_opts)
- except GetoptError as err:
- sys.stderr.write(pp.error("Module %s" % err))
- print()
- self.print_help(with_description=False)
- sys.exit(2)
- self.parse_module_options(module_opts)
- if self.need_queries and not queries:
- self.print_help()
- sys.exit(2)
- return queries
-
-
- def not_implemented(self, target):
- """Prints a standard module not implemented message"""
- print()
- print(pp.error(
- "Sorry %s module and/or target is not implenented yet."
- % pp.emph(self.command_name)))
- print("module: %s, target: %s" %(pp.emph(self.module_name), pp.emph(target)))
- print()
+ """E-app base module class to parse module options print module help, etc.."""
+
+ def __init__(self):
+ self.module_name = None
+ self.options = {}
+ self.formatted_options = None
+ self.short_opts = None
+ self.long_opts = None
+ self.module_opts = {}
+ self.warning = None
+ self.need_queries = True
+ self.saved_verbose = None
+
+ def print_help(self, with_description=True):
+ """Print description, usage and a detailed help message.
+
+ @type with_description: bool
+ @param with_description: if true, print module's __doc__ string
+ """
+
+ if with_description:
+ print()
+ print(__doc__.strip())
+ print()
+ if self.warning:
+ print()
+ for line in self.warning:
+ sys.stderr.write(pp.warn(line))
+ print()
+ print(
+ mod_usage(
+ mod_name=self.module_name, arg=self.arg_spec, optional=self.arg_option
+ )
+ )
+ print()
+ print(pp.command("options"))
+ print(format_options(self.formatted_options))
+ if self.formatted_args:
+ print()
+ print(pp.command(self.arg_spec))
+ print(format_options(self.formatted_args))
+ print()
+
+ def parse_module_options(self, module_opts):
+ """Parse module options and update self.options"""
+ opts = (x[0] for x in module_opts)
+ posargs = (x[1] for x in module_opts)
+ for opt, posarg in zip(opts, posargs):
+ if opt in ("-h", "--help"):
+ self.print_help()
+ sys.exit(0)
+ opt_name, opt_type, opt_setting = self.module_opts[opt]
+ if opt_type == "boolean":
+ self.options[opt_name] = opt_setting
+ elif opt_type == "int":
+ if posarg.isdigit():
+ val = int(posarg)
+ else:
+ print()
+ err = "Module option %s requires integer (got '%s')"
+ sys.stdout.write(pp.error(err % (opt, posarg)))
+ print()
+ self.print_help(with_description=False)
+ sys.exit(2)
+ self.options[opt_name] = val
+ elif opt_type == "char":
+ self.options[opt_name] = posarg
+
+ def set_quiet(self, quiet):
+ """sets the class option["quiet"] and option["verbose"] accordingly"""
+ if quiet == self.options["quiet"]:
+ return
+ if self.saved_verbose:
+ # detected a switch
+ verbose = self.options["verbose"]
+ self.options["verbose"] = self.saved_verbose
+ self.saved_verbose = verbose
+ elif quiet:
+ self.saved_verbose = self.options["verbose"]
+ self.options["verbose"] = False
+ self.options["quiet"] = quiet
+ return
+
+ def validate_query(self, query, depth=0):
+ """check that the query meets the modules TargetSpec
+ If not it attempts to reduce it to a valid TargetSpec
+ or prints the help message and exits
+ """
+ if depth > 1:
+ return []
+ if len(query) > 1:
+ query = list(set(self.arg_options).intersection(query))
+ # print "reduced query =", query
+ query = self.validate_query(query, depth + 1)
+ if isinstance(query, list):
+ query = query[0]
+ if query not in self.arg_options:
+ print()
+ print(
+ pp.error("Error starting module. Incorrect or No TargetSpec specified!")
+ )
+ print("query = ", query)
+ self.print_help()
+ sys.exit(2)
+ return query
+
+ def main_setup(self, input_args):
+ """Parse input and prepares the program"""
+
+ try:
+ module_opts, queries = gnu_getopt(
+ input_args, self.short_opts, self.long_opts
+ )
+ except GetoptError as err:
+ sys.stderr.write(pp.error("Module %s" % err))
+ print()
+ self.print_help(with_description=False)
+ sys.exit(2)
+ self.parse_module_options(module_opts)
+ if self.need_queries and not queries:
+ self.print_help()
+ sys.exit(2)
+ return queries
+
+ def not_implemented(self, target):
+ """Prints a standard module not implemented message"""
+ print()
+ print(
+ pp.error(
+ "Sorry %s module and/or target is not implenented yet."
+ % pp.emph(self.command_name)
+ )
+ )
+ print("module: %s, target: %s" % (pp.emph(self.module_name), pp.emph(target)))
+ print()
+
# vim: set ts=4 sw=4 tw=79: