Skip to content

Commit 5243841

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 5243841

File tree

4 files changed

+79
-27
lines changed

4 files changed

+79
-27
lines changed

coala_quickstart/Strings.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,17 @@
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 ('-C' or '--ci' set non-interactive mode, making the bears that
58+
need to be configured by the user unusable: check '--allow-incomplete-sections'
59+
for more information):
60+
""",
61+
'colors': ('green', 'red')},
62+
'usable': {'msg': """
63+
Based on the languages used in project the following bears have been identified
64+
as usable:
65+
""",
66+
'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: 22 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,22 @@ 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+
print_relevant_bears(self.printer, OrderedDict([('unusable', {}),
291+
('usable', filter_relevant_bears([('Python', 70), ('Unknown', 30)],
292+
self.printer, self.arg_parser, {}))]))
292293
self.assertIn("PycodestyleBear", custom_stdout.getvalue())
294+
# Should print only the usable bears
295+
self.assertNotIn("unusable",
296+
custom_stdout.getvalue())
297+
298+
def test_print_relevant_bears_no_bears(self):
299+
with retrieve_stdout() as custom_stdout:
300+
print_relevant_bears(self.printer, OrderedDict([('unusable', {}),
301+
('usable', {})]))
302+
self.assertNotIn("usable", custom_stdout.getvalue())
303+
# Should print only the usable bears
304+
self.assertNotIn("unusable",
305+
custom_stdout.getvalue())
293306

294307
def test_bears_allow_incomplete_sections_mode(self):
295308
sys.argv.append('--ci')
@@ -299,7 +312,10 @@ def test_bears_allow_incomplete_sections_mode(self):
299312
os.chdir("bears_ci_testfiles")
300313
with retrieve_stdout() as custom_stdout:
301314
main()
302-
self.assertNotIn("usable",
315+
# Should print only the usable bears
316+
self.assertIn("usable",
317+
custom_stdout.getvalue())
318+
self.assertNotIn("unusable",
303319
custom_stdout.getvalue())
304320
os.remove('.coafile')
305321
os.chdir(orig_cwd)
@@ -311,8 +327,10 @@ def test_bears_ci_mode(self):
311327
os.chdir("bears_ci_testfiles")
312328
with retrieve_stdout() as custom_stdout:
313329
main()
330+
# Should print both the usable and unusable bears
314331
self.assertIn("usable",
315332
custom_stdout.getvalue())
333+
self.assertIn("unusable", custom_stdout.getvalue())
316334
os.remove('.coafile')
317335
os.chdir(orig_cwd)
318336

0 commit comments

Comments
 (0)