Skip to content

Commit 250fd87

Browse files
committed
coala-quickstart.py: Change the printing of bears
Remove duplicate printing of `relevant_bears` and instead change `print_relevant_bears` to inform the user both of the usable and unusable bears. Closes #220
1 parent 6fbaebd commit 250fd87

File tree

4 files changed

+85
-27
lines changed

4 files changed

+85
-27
lines changed

coala_quickstart/Strings.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,18 @@
5050
5151
You can see all of them here: {}
5252
""".format(BEAR_DOCS_URL)
53+
54+
PRINT_BEARS = {'unusable':
55+
{'msg': """
56+
Based on the configuration options the following bears have been identified
57+
as unusable (options '-C' or '--ci' (non interactive mode) make the bears that
58+
need to be configured by the user unusable: don't run in non interactive mode
59+
or check '--allow-incomplete-sections' for more information on how to include
60+
the unusable bears):
61+
""",
62+
'colors': ('green', 'red')},
63+
'usable': {'msg': """
64+
Based on the languages used in project the following bears have been identified
65+
as usable:
66+
""",
67+
'colors': ('green', 'cyan')}}

coala_quickstart/coala_quickstart.py

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import logging
33
import os
44
import sys
5+
from collections import OrderedDict
56

67
from pyprint.ConsolePrinter import ConsolePrinter
78

@@ -90,15 +91,24 @@ def main():
9091

9192
extracted_information = collect_info(project_dir)
9293

93-
relevant_bears = filter_relevant_bears(
94-
used_languages, printer, arg_parser, extracted_information)
95-
96-
print_relevant_bears(printer, relevant_bears)
94+
# OrderedDict used for print_relevant_bears to first print unusable bears
95+
relevant_bears = OrderedDict(
96+
[('unusable', {}),
97+
('usable',
98+
filter_relevant_bears(used_languages,
99+
printer,
100+
arg_parser,
101+
extracted_information))])
97102

98103
if args.non_interactive and not args.incomplete_sections:
99-
unusable_bears = get_non_optional_settings_bears(relevant_bears)
104+
unusable_bears = get_non_optional_settings_bears(
105+
relevant_bears['usable'])
100106
remove_unusable_bears(relevant_bears, unusable_bears)
101-
print_relevant_bears(printer, relevant_bears, 'usable')
107+
108+
print_relevant_bears(printer, relevant_bears)
109+
110+
# Drop unusable bears
111+
relevant_bears = relevant_bears['usable']
102112

103113
settings = generate_settings(
104114
project_dir,

coala_quickstart/generation/Bears.py

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
from coala_quickstart.Constants import (
88
IMPORTANT_BEAR_LIST, ALL_CAPABILITIES, DEFAULT_CAPABILTIES)
9-
from coala_quickstart.Strings import BEAR_HELP
9+
from coala_quickstart.Strings import PRINT_BEARS, BEAR_HELP
1010
from coala_quickstart.generation.SettingsFilling import is_autofill_possible
1111
from coalib.bearlib.abstractions.LinterClass import LinterClass
1212
from coalib.settings.ConfigurationGathering import get_filtered_bears
@@ -200,38 +200,48 @@ def get_non_optional_settings_bears(bears):
200200

201201
def remove_unusable_bears(bears, unusable_bears):
202202
"""
203-
From the bears dict, filter the bears appearing in unusable_bears.
203+
From the bears dict, filter the bears appearing in unusable_bears
204+
and save them under “unusable” key for printing later.
204205
205206
:param bears:
206207
A dict with language name as key and bear classes as value.
207208
:param unusable_bears:
208209
A collection of Bear classes.
209210
"""
210-
for language, language_bears in bears.items():
211+
for language, language_bears in bears['usable'].items():
211212
for bear in tuple(language_bears):
212213
if bear in unusable_bears:
213-
bears[language].remove(bear)
214+
bears['usable'][language].remove(bear)
215+
bears['unusable'][language] = bears['unusable'].get(
216+
language, ()) + (bear, )
214217

215218

216-
def print_relevant_bears(printer, relevant_bears, label='relevant'):
219+
def print_relevant_bears(printer, relevant_bears):
217220
"""
218-
Prints the relevant bears in sections separated by language.
221+
Prints both the usable and unusable, relevant bears
222+
in sections indexed by language.
219223
220224
:param printer:
221225
A ``ConsolePrinter`` object used for console interactions.
222226
:param relevant_bears:
223-
A dict with language name as key and bear classes as value.
227+
An ``OrderedDict`` indexed by “usable” and “unusable” bears stored in
228+
dictionaries that use language as key and bear classes as value.
224229
"""
225-
if label == 'relevant':
226-
printer.print(BEAR_HELP)
227-
228-
printer.print('\nBased on the languages used in project the following '
229-
'bears have been identified to be %s:' % label)
230-
for language in relevant_bears:
231-
printer.print(' [' + language + ']', color='green')
232-
for bear in relevant_bears[language]:
233-
printer.print(' ' + bear.name, color='cyan')
234-
printer.print('')
230+
printer.print(BEAR_HELP)
231+
232+
# Don't print anything for empty bear sets
233+
nonempty_label_bears = (
234+
label for label in relevant_bears if len(relevant_bears[label]) > 0)
235+
236+
for label_bears in nonempty_label_bears:
237+
printer.print(PRINT_BEARS[label_bears]['msg'])
238+
for language in relevant_bears[label_bears]:
239+
printer.print(' [' + language + ']',
240+
color=PRINT_BEARS[label_bears]['colors'][0])
241+
for bear in relevant_bears[label_bears][language]:
242+
printer.print(' ' + bear.name,
243+
color=PRINT_BEARS[label_bears]['colors'][1])
244+
printer.print('')
235245

236246

237247
def generate_requirements_map(bears):

tests/generation/Bears.py

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
import sys
33
import unittest
44
from copy import deepcopy
5+
from collections import OrderedDict
56

67

78
from pyprint.ConsolePrinter import ConsolePrinter
@@ -286,10 +287,27 @@ def test_filter_relevant_bears_gruntfile_present(self):
286287

287288
def test_print_relevant_bears(self):
288289
with retrieve_stdout() as custom_stdout:
289-
print_relevant_bears(self.printer, filter_relevant_bears(
290-
[('Python', 70), ('Unknown', 30)], self.printer,
291-
self.arg_parser, {}))
290+
languages = [('Python', 70), ('Unknown', 30)]
291+
bears_filtered = filter_relevant_bears(languages,
292+
self.printer,
293+
self.arg_parser, {})
294+
relevant_bears = OrderedDict([('unusable', {}),
295+
('usable', bears_filtered)])
296+
297+
print_relevant_bears(self.printer, relevant_bears)
292298
self.assertIn("PycodestyleBear", custom_stdout.getvalue())
299+
# Should print only the usable bears
300+
self.assertNotIn("unusable",
301+
custom_stdout.getvalue())
302+
303+
def test_print_relevant_bears_no_bears(self):
304+
with retrieve_stdout() as custom_stdout:
305+
print_relevant_bears(self.printer, OrderedDict([('unusable', {}),
306+
('usable', {})]))
307+
# No bears to print
308+
self.assertNotIn("usable", custom_stdout.getvalue())
309+
self.assertNotIn("unusable",
310+
custom_stdout.getvalue())
293311

294312
def test_bears_allow_incomplete_sections_mode(self):
295313
sys.argv.append('--ci')
@@ -299,7 +317,10 @@ def test_bears_allow_incomplete_sections_mode(self):
299317
os.chdir("bears_ci_testfiles")
300318
with retrieve_stdout() as custom_stdout:
301319
main()
302-
self.assertNotIn("usable",
320+
# Should print only the usable bears
321+
self.assertIn("usable",
322+
custom_stdout.getvalue())
323+
self.assertNotIn("unusable",
303324
custom_stdout.getvalue())
304325
os.remove('.coafile')
305326
os.chdir(orig_cwd)
@@ -311,8 +332,10 @@ def test_bears_ci_mode(self):
311332
os.chdir("bears_ci_testfiles")
312333
with retrieve_stdout() as custom_stdout:
313334
main()
335+
# Should print both the usable and unusable bears
314336
self.assertIn("usable",
315337
custom_stdout.getvalue())
338+
self.assertIn("unusable", custom_stdout.getvalue())
316339
os.remove('.coafile')
317340
os.chdir(orig_cwd)
318341

0 commit comments

Comments
 (0)