Re: [gentoo-portage-dev] [PATCH v2] Add --output-style option to repoman
On 02/13/2014 10:42 AM, Brian Dolbec wrote: On Thu, 13 Feb 2014 03:19:35 -0500 Mike Frysinger vap...@gentoo.org wrote: On Monday, February 10, 2014 20:22:36 Chris Reffett wrote: This patch adds a --output-style option to repoman, which gives the user a choice of output formats for the repoman checks. Choices are default (current style) and column (a greppable format), but it should be easy to add more. Fixes bug 481584. i'd expect a proper structured output would make sense to include in the default set. like JSON. just create a dict and send it to json.dump(). He is working on more changes to repoman and the output. So, if you can, Chris, then do it, add a json option. Will do that after my next set of changes to repoman (to be emailed shortly) v2: Fix docstring to be complete and in the standard format, make use of default choices in --output-style wrt comments by antarus and dol-sen erm, i thought the previous docstring was correct. it followed PEP257 while this new one is like javadoc or something. It is the existing format that has been around in portage for years. There is even a page for it: http://www.gentoo.org/proj/en/portage/doc/policies/docstring-spec.xml It is also the style that epydoc recognizes. -utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) +if options.output_style == 'column': + utilities.format_qa_output_column(f, stats, fails, dofull, dofail, options, qawarnings) +else: + utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) use a func pointer instead. format_outputs = { 'column': utilities.format_qa_output_column, 'default': utilities.format_qa_output, } format_output = format_outputs.get(options.output_style, format_outputs['default']) format_output(f, stats, fails, dofull, dofail, options, qawarnings) yeah, make it so. Good spot, Mike Committed, thanks for the spot. Since Mike was too slow in replying, make another commit to change it. + formatter.add_literal_data(NumberOf + category + ) prefer to use % rather than + like so: 'NumberOf %s ' % category + formatter.add_literal_data(%s % number) well actually, for simple additions like that, string1 + string2, it is actually faster. But for multiple additions, %s is much better, faster. Also if the string is translated, then use %s regardless. That way the %s can be moved around for the translation. str(number) -mike
Re: [gentoo-portage-dev] [PATCH v2] Add --output-style option to repoman
On Thu, 13 Feb 2014 03:19:35 -0500 Mike Frysinger vap...@gentoo.org wrote: On Monday, February 10, 2014 20:22:36 Chris Reffett wrote: This patch adds a --output-style option to repoman, which gives the user a choice of output formats for the repoman checks. Choices are default (current style) and column (a greppable format), but it should be easy to add more. Fixes bug 481584. i'd expect a proper structured output would make sense to include in the default set. like JSON. just create a dict and send it to json.dump(). He is working on more changes to repoman and the output. So, if you can, Chris, then do it, add a json option. v2: Fix docstring to be complete and in the standard format, make use of default choices in --output-style wrt comments by antarus and dol-sen erm, i thought the previous docstring was correct. it followed PEP257 while this new one is like javadoc or something. It is the existing format that has been around in portage for years. There is even a page for it: http://www.gentoo.org/proj/en/portage/doc/policies/docstring-spec.xml It is also the style that epydoc recognizes. -utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) +if options.output_style == 'column': + utilities.format_qa_output_column(f, stats, fails, dofull, dofail, options, qawarnings) +else: + utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) use a func pointer instead. format_outputs = { 'column': utilities.format_qa_output_column, 'default': utilities.format_qa_output, } format_output = format_outputs.get(options.output_style, format_outputs['default']) format_output(f, stats, fails, dofull, dofail, options, qawarnings) yeah, make it so. Good spot, Mike Since Mike was too slow in replying, make another commit to change it. + formatter.add_literal_data(NumberOf + category + ) prefer to use % rather than + like so: 'NumberOf %s ' % category + formatter.add_literal_data(%s % number) well actually, for simple additions like that, string1 + string2, it is actually faster. But for multiple additions, %s is much better, faster. Also if the string is translated, then use %s regardless. That way the %s can be moved around for the translation. str(number) -mike -- Brian Dolbec dolsen signature.asc Description: PGP signature
Re: [gentoo-portage-dev] [PATCH v2] Add --output-style option to repoman
On Thu, Feb 13, 2014 at 7:42 AM, Brian Dolbec dol...@gentoo.org wrote: On Thu, 13 Feb 2014 03:19:35 -0500 Mike Frysinger vap...@gentoo.org wrote: On Monday, February 10, 2014 20:22:36 Chris Reffett wrote: This patch adds a --output-style option to repoman, which gives the user a choice of output formats for the repoman checks. Choices are default (current style) and column (a greppable format), but it should be easy to add more. Fixes bug 481584. i'd expect a proper structured output would make sense to include in the default set. like JSON. just create a dict and send it to json.dump(). He is working on more changes to repoman and the output. So, if you can, Chris, then do it, add a json option. v2: Fix docstring to be complete and in the standard format, make use of default choices in --output-style wrt comments by antarus and dol-sen erm, i thought the previous docstring was correct. it followed PEP257 while this new one is like javadoc or something. It is the existing format that has been around in portage for years. There is even a page for it: http://www.gentoo.org/proj/en/portage/doc/policies/docstring-spec.xml It is also the style that epydoc recognizes. -utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) +if options.output_style == 'column': + utilities.format_qa_output_column(f, stats, fails, dofull, dofail, options, qawarnings) +else: + utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) use a func pointer instead. format_outputs = { 'column': utilities.format_qa_output_column, 'default': utilities.format_qa_output, } format_output = format_outputs.get(options.output_style, format_outputs['default']) format_output(f, stats, fails, dofull, dofail, options, qawarnings) yeah, make it so. Good spot, Mike Since Mike was too slow in replying, make another commit to change it. + formatter.add_literal_data(NumberOf + category + ) prefer to use % rather than + like so: 'NumberOf %s ' % category + formatter.add_literal_data(%s % number) well actually, for simple additions like that, string1 + string2, it is actually faster. But for multiple additions, %s is much better, faster. Also if the string is translated, then use %s regardless. That way the %s can be moved around for the translation. In general we prefer % for readability purposes, not because it is faster. foo = Bar + foo + + baz + , + goat foo = Bar %s %s, %s % (foo, baz, goat) I think this case could go either way, because even with %, NumberOf%s is not much of an improvement. The code is littered with the former though, and it makes it really annoying to read ;) -A str(number) -mike -- Brian Dolbec dolsen
Re: [gentoo-portage-dev] [PATCH v2] Add --output-style option to repoman
On Thu, 13 Feb 2014 10:03:50 -0800 Alec Warner anta...@gentoo.org wrote: On Thu, Feb 13, 2014 at 7:42 AM, Brian Dolbec dol...@gentoo.org wrote: well actually, for simple additions like that, string1 + string2, it is actually faster. But for multiple additions, %s is much better, faster. Also if the string is translated, then use %s regardless. That way the %s can be moved around for the translation. In general we prefer % for readability purposes, not because it is faster. foo = Bar + foo + + baz + , + goat foo = Bar %s %s, %s % (foo, baz, goat) I think this case could go either way, because even with %, NumberOf%s is not much of an improvement. The code is littered with the former though, and it makes it really annoying to read ;) -A Do I have to sick Brian Harring on you ;) I said for simple string addition... string1 + string2 is faster and equally readable Your example goes into the string %s %s, %s example where the string substitution is actually faster. Plus it is a lot more readable. -- Brian Dolbec dolsen
[gentoo-portage-dev] [PATCH v2] Add --output-style option to repoman
This patch adds a --output-style option to repoman, which gives the user a choice of output formats for the repoman checks. Choices are default (current style) and column (a greppable format), but it should be easy to add more. Fixes bug 481584. v2: Fix docstring to be complete and in the standard format, make use of default choices in --output-style wrt comments by antarus and dol-sen --- bin/repoman | 15 ++- pym/repoman/utilities.py | 44 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/bin/repoman b/bin/repoman index 3504b6b..c7a1c4c 100755 --- a/bin/repoman +++ b/bin/repoman @@ -144,9 +144,16 @@ def ParseArgs(argv, qahelp): 'scan' : 'Scan directory tree for QA issues' } + output_choices = { + 'default' : 'The normal output format', + 'column' : 'Columnar output suitable for use with grep' + } + mode_keys = list(modes) mode_keys.sort() + output_keys = sorted(output_choices) + parser = ArgumentParser(usage=repoman [options] [mode], description=Modes: %s % | .join(mode_keys), epilog=For more help consult the man page.) @@ -228,6 +235,9 @@ def ParseArgs(argv, qahelp): parser.add_argument('--without-mask', dest='without_mask', action='store_true', default=False, help='behave as if no package.mask entries exist (not allowed with commit mode)') + parser.add_argument('--output-style', dest='output_style', choices=output_keys, + help='select output type', default='default') + parser.add_argument('--mode', dest='mode', choices=mode_keys, help='specify which mode repoman will run in (default=full)') @@ -2422,7 +2432,10 @@ console_writer.style_listener = style_file.new_styles f = formatter.AbstractFormatter(console_writer) -utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) +if options.output_style == 'column': + utilities.format_qa_output_column(f, stats, fails, dofull, dofail, options, qawarnings) +else: + utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) style_file.flush() del console_writer, f, style_file diff --git a/pym/repoman/utilities.py b/pym/repoman/utilities.py index 3ec3a4a..aec61fe 100644 --- a/pym/repoman/utilities.py +++ b/pym/repoman/utilities.py @@ -330,6 +330,50 @@ def format_qa_output(formatter, stats, fails, dofull, dofail, options, qawarning formatter.add_line_break() +def format_qa_output_column(formatter, stats, fails, dofull, dofail, options, qawarnings): + Helper function that formats output in a machine-parseable column format + + @param formatter: an instance of Formatter + @type formatter: Formatter + @param path: dict of qa status items + @type path: dict + @param fails: dict of qa status failures + @type fails: dict + @param dofull: Whether to print full results or a summary + @type dofull: boolean + @param dofail: Whether failure was hard or soft + @type dofail: boolean + @param options: The command-line options provided to repoman + @type options: Namespace + @param qawarnings: the set of warning types + @type qawarnings: set + @return: None (modifies formatter) + + full = options.mode == 'full' + for category, number in stats.items(): + # we only want key value pairs where value 0 + if number 1: + continue + + formatter.add_literal_data(NumberOf + category + ) + if category in qawarnings: + formatter.push_style(WARN) + else: + formatter.push_style(BAD) + formatter.add_literal_data(%s % number) + formatter.pop_style() + formatter.add_line_break() + if not dofull: + if not full and dofail and category in qawarnings: + # warnings are considered noise when there are failures + continue + fails_list = fails[category] + if not full and len(fails_list) 12: + fails_list = fails_list[:12] + for failure in fails_list: + formatter.add_literal_data(category + + failure) + formatter.add_line_break() + def editor_is_executable(editor): Given an EDITOR string, validate that it refers to -- 1.8.5.3
Re: [gentoo-portage-dev] [PATCH v2] Add --output-style option to repoman
On Mon, 10 Feb 2014 20:22:36 -0500 Chris Reffett creff...@gentoo.org wrote: This patch adds a --output-style option to repoman, which gives the user a choice of output formats for the repoman checks. Choices are default (current style) and column (a greppable format), but it should be easy to add more. Fixes bug 481584. v2: Fix docstring to be complete and in the standard format, make use of default choices in --output-style wrt comments by antarus and dol-sen --- bin/repoman | 15 ++- pym/repoman/utilities.py | 44 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/bin/repoman b/bin/repoman index 3504b6b..c7a1c4c 100755 --- a/bin/repoman +++ b/bin/repoman @@ -144,9 +144,16 @@ def ParseArgs(argv, qahelp): 'scan' : 'Scan directory tree for QA issues' } + output_choices = { + 'default' : 'The normal output format', + 'column' : 'Columnar output suitable for use with grep' + } + mode_keys = list(modes) mode_keys.sort() + output_keys = sorted(output_choices) + parser = ArgumentParser(usage=repoman [options] [mode], description=Modes: %s % | .join(mode_keys), epilog=For more help consult the man page.) @@ -228,6 +235,9 @@ def ParseArgs(argv, qahelp): parser.add_argument('--without-mask', dest='without_mask', action='store_true', default=False, help='behave as if no package.mask entries exist (not allowed with commit mode)') + parser.add_argument('--output-style', dest='output_style', choices=output_keys, + help='select output type', default='default') + parser.add_argument('--mode', dest='mode', choices=mode_keys, help='specify which mode repoman will run in (default=full)') @@ -2422,7 +2432,10 @@ console_writer.style_listener = style_file.new_styles f = formatter.AbstractFormatter(console_writer) -utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) +if options.output_style == 'column': + utilities.format_qa_output_column(f, stats, fails, dofull, dofail, options, qawarnings) +else: + utilities.format_qa_output(f, stats, fails, dofull, dofail, options, qawarnings) style_file.flush() del console_writer, f, style_file diff --git a/pym/repoman/utilities.py b/pym/repoman/utilities.py index 3ec3a4a..aec61fe 100644 --- a/pym/repoman/utilities.py +++ b/pym/repoman/utilities.py @@ -330,6 +330,50 @@ def format_qa_output(formatter, stats, fails, dofull, dofail, options, qawarning formatter.add_line_break() +def format_qa_output_column(formatter, stats, fails, dofull, dofail, options, qawarnings): + Helper function that formats output in a machine-parseable column format + + @param formatter: an instance of Formatter + @type formatter: Formatter + @param path: dict of qa status items + @type path: dict + @param fails: dict of qa status failures + @type fails: dict + @param dofull: Whether to print full results or a summary + @type dofull: boolean + @param dofail: Whether failure was hard or soft + @type dofail: boolean + @param options: The command-line options provided to repoman + @type options: Namespace + @param qawarnings: the set of warning types + @type qawarnings: set + @return: None (modifies formatter) + + full = options.mode == 'full' + for category, number in stats.items(): + # we only want key value pairs where value 0 + if number 1: + continue + + formatter.add_literal_data(NumberOf + category + ) + if category in qawarnings: + formatter.push_style(WARN) + else: + formatter.push_style(BAD) + formatter.add_literal_data(%s % number) + formatter.pop_style() + formatter.add_line_break() + if not dofull: + if not full and dofail and category in qawarnings: + # warnings are considered noise when there are failures + continue + fails_list = fails[category] + if not full and len(fails_list) 12: + fails_list = fails_list[:12] + for failure in fails_list: + formatter.add_literal_data(category + + failure) + formatter.add_line_break() + def editor_is_executable(editor): Given an EDITOR string, validate that it refers to looks good to me. -- Brian Dolbec dolsen