aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'pym/gentoolkit/eclean/output.py')
-rw-r--r--pym/gentoolkit/eclean/output.py354
1 files changed, 184 insertions, 170 deletions
diff --git a/pym/gentoolkit/eclean/output.py b/pym/gentoolkit/eclean/output.py
index e2ed221..62777b7 100644
--- a/pym/gentoolkit/eclean/output.py
+++ b/pym/gentoolkit/eclean/output.py
@@ -10,173 +10,187 @@ from gentoolkit.pprinter import cpv, number
class OutputControl:
- """Outputs data according to predetermined options and handles any user
- interaction.
-
- @param options: dictionary of boolean options as determined in cli.py
- used here: interactive, pretend, quiet, accept_all, nocolor.
- """
-
- def __init__(self, options):
- if not options:
- # set some defaults
- self.options['interactive'] = False
- self.options['pretend'] = True
- self.options['quiet'] = False
- self.options['accept_all'] = False
- self.options['nocolor'] = False
- else:
- self.options = options
- self.set_colors("normal")
-
- def set_colors(self, mode):
- """Sets the colors for the progress_controller
- and prettysize output
-
- @param mode: string, 1 of ["normal", "deprecated"]
- """
- if mode == "normal":
- self.pkg_color = cpv # green
- self.numbers = number # turquoise
- self.brace = blue
- elif mode == "deprecated":
- self.pkg_color = yellow
- self.numbers = teal # darkgreen
- self.brace = blue
-
- def einfo(self, message=""):
- """Display an info message depending on a color mode.
-
- @param message: text string to display
-
- @outputs to stdout.
- """
- if not self.options['nocolor']:
- prefix = " "+green('*')
- else:
- prefix = ">>>"
- print(prefix,message)
-
- def eprompt(self, message):
- """Display a user question depending on a color mode.
-
- @param message: text string to display
-
- @output to stdout
- """
- if not self.options['nocolor']:
- prefix = " "+red('>')+" "
- else:
- prefix = "??? "
- sys.stdout.write(prefix+message)
- sys.stdout.flush()
-
- def prettySize(self, size, justify=False, color=None):
- """int -> byte/kilo/mega/giga converter. Optionally
- justify the result. Output is a string.
-
- @param size: integer
- @param justify: optional boolean, defaults to False
- @param color: optional color, defaults to green
- as defined in portage.output
-
- @returns a formatted and (escape sequenced)
- colorized text string
- """
- if color == None:
- color = self.numbers
- units = [" G"," M"," K"," B"]
- # by using 1000 as the changeover, the integer portion
- # of the number will never be more than 3 digits long
- # but the true base 2 value of 1024 is used for the actual
- # calulation to maintain better accuracy.
- while len(units) and size >= 1000:
- size = size / 1024.0
- units.pop()
- sizestr = "%.1f" %(round(size,1)) + units[-1]
- if justify:
- sizestr = " " + self.brace("[ ") + \
- color(sizestr.rjust(8)) + self.brace(" ]")
- return sizestr
-
- def yesNoAllPrompt(self, message="Do you want to proceed?"):
- """Print a prompt until user answer in yes/no/all. Return a
- boolean for answer, and also may affect the 'accept_all' option.
-
- @param message: optional different input string from the default
- message of: "Do you want to proceed?"
- @outputs to stdout
- @modifies class var options['accept_all']
- @rtype: bool
- """
- user_string="xxx"
- while not user_string.lower() in ["","y","n","a","yes","no","all"]:
- self.eprompt(message+" [Y/n/a]: ")
- user_string = sys.stdin.readline().rstrip('\n')
- user_string = user_string.strip()
- if user_string.lower() in ["a","all"]:
- self.options['accept_all'] = True
- answer = user_string.lower() in ["","y","a","yes","all"]
- return answer
-
- def progress_controller(self, size, key, clean_list, file_type):
- """Callback function for doCleanup. It outputs data according to the
- options configured.
- Alternatively it handles user interaction for decisions that are
- required.
-
- @param size: Integer of the file(s) size
- @param key: the filename/pkgname currently being processed
- @param clean_list: list of files being processed.
- """
- if not self.options['quiet']:
- # pretty print mode
- print(self.prettySize(size,True), self.pkg_color(key))
- elif self.options['pretend'] or self.options['interactive']:
- # file list mode
- for file_ in clean_list:
- print(file_)
- if self.options['pretend']:
- return False
- elif not self.options['interactive'] \
- or self.options['accept_all'] \
- or self.yesNoAllPrompt("Do you want to delete this " + file_type + "?"):
- return True
- return False
-
- def total(self, mode, size, num_files, verb, action):
- """outputs the formatted totals to stdout
-
- @param mode: sets color and message. 1 of ['normal', 'deprecated']
- @param size: total space savings
- @param num_files: total number of files
- @param verb: string eg. 1 of ["would be", "has been"]
- @param action: string eg 1 of ['distfiles', 'packages']
- """
- self.set_colors(mode)
- if mode =="normal":
- message="Total space from "+red(str(num_files))+" files "+\
- verb+" freed in the " + action + " directory"
- print( " ===========")
- print( self.prettySize(size, True, red), message)
- elif mode == "deprecated":
- message = "Total space from "+red(str(num_files))+" package files\n"+\
- " Re-run the last command with the -D " +\
- "option to clean them as well"
- print( " ===========")
- print( self.prettySize(size, True, red), message)
-
- def list_pkgs(self, pkgs):
- """outputs the packages to stdout
-
- @param pkgs: dict. of {cat/pkg-ver: src_uri,}
- """
- indent = ' ' * 12
- keys = sorted(pkgs)
- for key in keys:
- if pkgs[key]:
- saved = ""
- else:
- saved = " ...distfile name(s) not known/saved"
- print( indent,self.pkg_color(key) + saved)
- print()
+ """Outputs data according to predetermined options and handles any user
+ interaction.
+
+ @param options: dictionary of boolean options as determined in cli.py
+ used here: interactive, pretend, quiet, accept_all, nocolor.
+ """
+
+ def __init__(self, options):
+ if not options:
+ # set some defaults
+ self.options["interactive"] = False
+ self.options["pretend"] = True
+ self.options["quiet"] = False
+ self.options["accept_all"] = False
+ self.options["nocolor"] = False
+ else:
+ self.options = options
+ self.set_colors("normal")
+
+ def set_colors(self, mode):
+ """Sets the colors for the progress_controller
+ and prettysize output
+
+ @param mode: string, 1 of ["normal", "deprecated"]
+ """
+ if mode == "normal":
+ self.pkg_color = cpv # green
+ self.numbers = number # turquoise
+ self.brace = blue
+ elif mode == "deprecated":
+ self.pkg_color = yellow
+ self.numbers = teal # darkgreen
+ self.brace = blue
+
+ def einfo(self, message=""):
+ """Display an info message depending on a color mode.
+
+ @param message: text string to display
+
+ @outputs to stdout.
+ """
+ if not self.options["nocolor"]:
+ prefix = " " + green("*")
+ else:
+ prefix = ">>>"
+ print(prefix, message)
+
+ def eprompt(self, message):
+ """Display a user question depending on a color mode.
+
+ @param message: text string to display
+
+ @output to stdout
+ """
+ if not self.options["nocolor"]:
+ prefix = " " + red(">") + " "
+ else:
+ prefix = "??? "
+ sys.stdout.write(prefix + message)
+ sys.stdout.flush()
+
+ def prettySize(self, size, justify=False, color=None):
+ """int -> byte/kilo/mega/giga converter. Optionally
+ justify the result. Output is a string.
+
+ @param size: integer
+ @param justify: optional boolean, defaults to False
+ @param color: optional color, defaults to green
+ as defined in portage.output
+
+ @returns a formatted and (escape sequenced)
+ colorized text string
+ """
+ if color == None:
+ color = self.numbers
+ units = [" G", " M", " K", " B"]
+ # by using 1000 as the changeover, the integer portion
+ # of the number will never be more than 3 digits long
+ # but the true base 2 value of 1024 is used for the actual
+ # calulation to maintain better accuracy.
+ while len(units) and size >= 1000:
+ size = size / 1024.0
+ units.pop()
+ sizestr = "%.1f" % (round(size, 1)) + units[-1]
+ if justify:
+ sizestr = (
+ " " + self.brace("[ ") + color(sizestr.rjust(8)) + self.brace(" ]")
+ )
+ return sizestr
+
+ def yesNoAllPrompt(self, message="Do you want to proceed?"):
+ """Print a prompt until user answer in yes/no/all. Return a
+ boolean for answer, and also may affect the 'accept_all' option.
+
+ @param message: optional different input string from the default
+ message of: "Do you want to proceed?"
+ @outputs to stdout
+ @modifies class var options['accept_all']
+ @rtype: bool
+ """
+ user_string = "xxx"
+ while not user_string.lower() in ["", "y", "n", "a", "yes", "no", "all"]:
+ self.eprompt(message + " [Y/n/a]: ")
+ user_string = sys.stdin.readline().rstrip("\n")
+ user_string = user_string.strip()
+ if user_string.lower() in ["a", "all"]:
+ self.options["accept_all"] = True
+ answer = user_string.lower() in ["", "y", "a", "yes", "all"]
+ return answer
+
+ def progress_controller(self, size, key, clean_list, file_type):
+ """Callback function for doCleanup. It outputs data according to the
+ options configured.
+ Alternatively it handles user interaction for decisions that are
+ required.
+
+ @param size: Integer of the file(s) size
+ @param key: the filename/pkgname currently being processed
+ @param clean_list: list of files being processed.
+ """
+ if not self.options["quiet"]:
+ # pretty print mode
+ print(self.prettySize(size, True), self.pkg_color(key))
+ elif self.options["pretend"] or self.options["interactive"]:
+ # file list mode
+ for file_ in clean_list:
+ print(file_)
+ if self.options["pretend"]:
+ return False
+ elif (
+ not self.options["interactive"]
+ or self.options["accept_all"]
+ or self.yesNoAllPrompt("Do you want to delete this " + file_type + "?")
+ ):
+ return True
+ return False
+
+ def total(self, mode, size, num_files, verb, action):
+ """outputs the formatted totals to stdout
+
+ @param mode: sets color and message. 1 of ['normal', 'deprecated']
+ @param size: total space savings
+ @param num_files: total number of files
+ @param verb: string eg. 1 of ["would be", "has been"]
+ @param action: string eg 1 of ['distfiles', 'packages']
+ """
+ self.set_colors(mode)
+ if mode == "normal":
+ message = (
+ "Total space from "
+ + red(str(num_files))
+ + " files "
+ + verb
+ + " freed in the "
+ + action
+ + " directory"
+ )
+ print(" ===========")
+ print(self.prettySize(size, True, red), message)
+ elif mode == "deprecated":
+ message = (
+ "Total space from "
+ + red(str(num_files))
+ + " package files\n"
+ + " Re-run the last command with the -D "
+ + "option to clean them as well"
+ )
+ print(" ===========")
+ print(self.prettySize(size, True, red), message)
+
+ def list_pkgs(self, pkgs):
+ """outputs the packages to stdout
+
+ @param pkgs: dict. of {cat/pkg-ver: src_uri,}
+ """
+ indent = " " * 12
+ keys = sorted(pkgs)
+ for key in keys:
+ if pkgs[key]:
+ saved = ""
+ else:
+ saved = " ...distfile name(s) not known/saved"
+ print(indent, self.pkg_color(key) + saved)
+ print()