diff --git a/coala_quickstart/Strings.py b/coala_quickstart/Strings.py index d944dcb..9099947 100644 --- a/coala_quickstart/Strings.py +++ b/coala_quickstart/Strings.py @@ -50,3 +50,26 @@ You can see all of them here: {} """.format(BEAR_DOCS_URL) + +PRINT_UNUSABLE = """ +The following bears have been dropped because '-C'/'--ci' (non +interactive mode) option has been selected. Remove the option or +check '--allow-incomplete-sections' option for more information +on how to include them: +""" + +PRINT_USABLE = """ +Based on the languages used in project the following bears have been +identified as usable: +""" + +PRINT_BEARS = { + 'unusable': { + 'msg': PRINT_UNUSABLE, + 'colors': ('green', 'red') + }, + 'usable': { + 'msg': PRINT_USABLE, + 'colors': ('green', 'cyan') + } +} diff --git a/coala_quickstart/coala_quickstart.py b/coala_quickstart/coala_quickstart.py index e6dd8a7..9bf7055 100644 --- a/coala_quickstart/coala_quickstart.py +++ b/coala_quickstart/coala_quickstart.py @@ -2,6 +2,7 @@ import logging import os import sys +from collections import OrderedDict from pyprint.ConsolePrinter import ConsolePrinter @@ -17,7 +18,7 @@ filter_relevant_bears, print_relevant_bears, get_non_optional_settings_bears, - remove_unusable_bears, + filter_unusable_bears, ) from coala_quickstart.generation.Settings import ( generate_settings, write_coafile) @@ -103,18 +104,27 @@ def main(): extracted_information = collect_info(project_dir) - relevant_bears = filter_relevant_bears( + selected_bears = filter_relevant_bears( used_languages, printer, arg_parser, extracted_information) if args.green_mode: - collect_bear_settings(relevant_bears) + collect_bear_settings(selected_bears) - print_relevant_bears(printer, relevant_bears) + # OrderedDict used for print_relevant_bears to first print unusable bears + relevant_bears = OrderedDict( + [('unusable', {}), + ('usable', + selected_bears)]) if args.non_interactive and not args.incomplete_sections: - unusable_bears = get_non_optional_settings_bears(relevant_bears) - remove_unusable_bears(relevant_bears, unusable_bears) - print_relevant_bears(printer, relevant_bears, 'usable') + unusable_bears = get_non_optional_settings_bears( + relevant_bears['usable']) + filter_unusable_bears(relevant_bears, unusable_bears) + + print_relevant_bears(printer, relevant_bears) + + # Drop unusable bears + relevant_bears = relevant_bears['usable'] settings = generate_settings( project_dir, diff --git a/coala_quickstart/generation/Bears.py b/coala_quickstart/generation/Bears.py index db8c99b..5abe429 100644 --- a/coala_quickstart/generation/Bears.py +++ b/coala_quickstart/generation/Bears.py @@ -6,7 +6,7 @@ from coala_quickstart.Constants import ( IMPORTANT_BEAR_LIST, ALL_CAPABILITIES, DEFAULT_CAPABILTIES) -from coala_quickstart.Strings import BEAR_HELP +from coala_quickstart.Strings import PRINT_BEARS, BEAR_HELP from coala_quickstart.generation.SettingsFilling import is_autofill_possible from coalib.bearlib.abstractions.LinterClass import LinterClass from coalib.settings.ConfigurationGathering import get_filtered_bears @@ -201,40 +201,52 @@ def get_non_optional_settings_bears(bears): return non_optional_settings -def remove_unusable_bears(bears, unusable_bears): +def filter_unusable_bears(bears, unusable_bears): """ - From the bears dict, filter the bears appearing in unusable_bears. + From the bears dict, filter the bears appearing in unusable_bears + and save them under “unusable” key for printing later. :param bears: A dict with language name as key and bear classes as value. :param unusable_bears: A collection of Bear classes. """ - for language, language_bears in bears.items(): + for language, language_bears in bears['usable'].items(): for bear in tuple(language_bears): if bear in unusable_bears: - bears[language].remove(bear) + bears['usable'][language].remove(bear) + bears['unusable'][language] = bears['unusable'].get( + language, ()) + (bear, ) -def print_relevant_bears(printer, relevant_bears, label='relevant'): +def print_relevant_bears(printer, relevant_bears): """ - Prints the relevant bears in sections separated by language. + Prints both the usable and unusable, relevant bears + in sections indexed by language. :param printer: A ``ConsolePrinter`` object used for console interactions. :param relevant_bears: - A dict with language name as key and bear classes as value. + An ``OrderedDict`` indexed by “usable” and “unusable” bears stored in + dictionaries that use language as key and bear classes as value. """ - if label == 'relevant': - printer.print(BEAR_HELP) - - printer.print('\nBased on the languages used in project the following ' - 'bears have been identified to be %s:' % label) - for language in relevant_bears: - printer.print(' [' + language + ']', color='green') - for bear in relevant_bears[language]: - printer.print(' ' + bear.name, color='cyan') - printer.print('') + printer.print(BEAR_HELP) + + nonempty_label_bears = [ + label for label in relevant_bears if len(relevant_bears[label]) > 0] + + if not nonempty_label_bears: + printer.print('No relevant bears were found.') + else: + for label_bears in nonempty_label_bears: + printer.print(PRINT_BEARS[label_bears]['msg']) + for language in relevant_bears[label_bears]: + printer.print(' [' + language + ']', + color=PRINT_BEARS[label_bears]['colors'][0]) + for bear in relevant_bears[label_bears][language]: + printer.print(' ' + bear.name, + color=PRINT_BEARS[label_bears]['colors'][1]) + printer.print('') def generate_requirements_map(bears): diff --git a/tests/generation/Bears.py b/tests/generation/Bears.py index 8e9700d..6eb400b 100644 --- a/tests/generation/Bears.py +++ b/tests/generation/Bears.py @@ -2,6 +2,7 @@ import sys import unittest from copy import deepcopy +from collections import OrderedDict from pyprint.ConsolePrinter import ConsolePrinter @@ -304,10 +305,27 @@ def test_filter_relevant_bears_gruntfile_present(self): def test_print_relevant_bears(self): with retrieve_stdout() as custom_stdout: - print_relevant_bears(self.printer, filter_relevant_bears( - [('Python', 70), ('Unknown', 30)], self.printer, - self.arg_parser, {})) + languages = [('Python', 70), ('Unknown', 30)] + bears_filtered = filter_relevant_bears(languages, + self.printer, + self.arg_parser, {}) + relevant_bears = OrderedDict([('unusable', {}), + ('usable', bears_filtered)]) + + print_relevant_bears(self.printer, relevant_bears) self.assertIn("PycodestyleBear", custom_stdout.getvalue()) + # Should print only the usable bears + self.assertNotIn("dropped", + custom_stdout.getvalue()) + + def test_print_relevant_bears_no_bears(self): + with retrieve_stdout() as custom_stdout: + print_relevant_bears(self.printer, OrderedDict([('unusable', {}), + ('usable', {})])) + # No bears to print + self.assertNotIn("usable", custom_stdout.getvalue()) + self.assertNotIn("dropped", custom_stdout.getvalue()) + self.assertIn("No relevant", custom_stdout.getvalue()) def test_bears_allow_incomplete_sections_mode(self): sys.argv.append('--ci') @@ -317,7 +335,10 @@ def test_bears_allow_incomplete_sections_mode(self): os.chdir("bears_ci_testfiles") with retrieve_stdout() as custom_stdout: main() - self.assertNotIn("usable", + # Should print only the usable bears + self.assertIn("usable", + custom_stdout.getvalue()) + self.assertNotIn("dropped", custom_stdout.getvalue()) os.remove('.coafile') os.chdir(orig_cwd) @@ -329,8 +350,10 @@ def test_bears_ci_mode(self): os.chdir("bears_ci_testfiles") with retrieve_stdout() as custom_stdout: main() + # Should print both the usable and unusable bears self.assertIn("usable", custom_stdout.getvalue()) + self.assertIn("dropped", custom_stdout.getvalue()) os.remove('.coafile') os.chdir(orig_cwd)