Skip to content

Commit 4ed36da

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 ba4bcba commit 4ed36da

4 files changed

Lines changed: 84 additions & 26 deletions

File tree

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: 15 additions & 5 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

@@ -103,18 +104,27 @@ def main():
103104

104105
extracted_information = collect_info(project_dir)
105106

106-
relevant_bears = filter_relevant_bears(
107+
selected_bears = filter_relevant_bears(
107108
used_languages, printer, arg_parser, extracted_information)
108109

109110
if args.green_mode:
110-
collect_bear_settings(relevant_bears)
111+
collect_bear_settings(selected_bears)
111112

112-
print_relevant_bears(printer, relevant_bears)
113+
# OrderedDict used for print_relevant_bears to first print unusable bears
114+
relevant_bears = OrderedDict(
115+
[('unusable', {}),
116+
('usable',
117+
selected_bears)])
113118

114119
if args.non_interactive and not args.incomplete_sections:
115-
unusable_bears = get_non_optional_settings_bears(relevant_bears)
120+
unusable_bears = get_non_optional_settings_bears(
121+
relevant_bears['usable'])
116122
remove_unusable_bears(relevant_bears, unusable_bears)
117-
print_relevant_bears(printer, relevant_bears, 'usable')
123+
124+
print_relevant_bears(printer, relevant_bears)
125+
126+
# Drop unusable bears
127+
relevant_bears = relevant_bears['usable']
118128

119129
settings = generate_settings(
120130
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
@@ -203,38 +203,48 @@ def get_non_optional_settings_bears(bears):
203203

204204
def remove_unusable_bears(bears, unusable_bears):
205205
"""
206-
From the bears dict, filter the bears appearing in unusable_bears.
206+
From the bears dict, filter the bears appearing in unusable_bears
207+
and save them under “unusable” key for printing later.
207208
208209
:param bears:
209210
A dict with language name as key and bear classes as value.
210211
:param unusable_bears:
211212
A collection of Bear classes.
212213
"""
213-
for language, language_bears in bears.items():
214+
for language, language_bears in bears['usable'].items():
214215
for bear in tuple(language_bears):
215216
if bear in unusable_bears:
216-
bears[language].remove(bear)
217+
bears['usable'][language].remove(bear)
218+
bears['unusable'][language] = bears['unusable'].get(
219+
language, ()) + (bear, )
217220

218221

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

239249

240250
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
@@ -304,10 +305,27 @@ def test_filter_relevant_bears_gruntfile_present(self):
304305

305306
def test_print_relevant_bears(self):
306307
with retrieve_stdout() as custom_stdout:
307-
print_relevant_bears(self.printer, filter_relevant_bears(
308-
[('Python', 70), ('Unknown', 30)], self.printer,
309-
self.arg_parser, {}))
308+
languages = [('Python', 70), ('Unknown', 30)]
309+
bears_filtered = filter_relevant_bears(languages,
310+
self.printer,
311+
self.arg_parser, {})
312+
relevant_bears = OrderedDict([('unusable', {}),
313+
('usable', bears_filtered)])
314+
315+
print_relevant_bears(self.printer, relevant_bears)
310316
self.assertIn("PycodestyleBear", custom_stdout.getvalue())
317+
# Should print only the usable bears
318+
self.assertNotIn("unusable",
319+
custom_stdout.getvalue())
320+
321+
def test_print_relevant_bears_no_bears(self):
322+
with retrieve_stdout() as custom_stdout:
323+
print_relevant_bears(self.printer, OrderedDict([('unusable', {}),
324+
('usable', {})]))
325+
# No bears to print
326+
self.assertNotIn("usable", custom_stdout.getvalue())
327+
self.assertNotIn("unusable",
328+
custom_stdout.getvalue())
311329

312330
def test_bears_allow_incomplete_sections_mode(self):
313331
sys.argv.append('--ci')
@@ -317,7 +335,10 @@ def test_bears_allow_incomplete_sections_mode(self):
317335
os.chdir("bears_ci_testfiles")
318336
with retrieve_stdout() as custom_stdout:
319337
main()
320-
self.assertNotIn("usable",
338+
# Should print only the usable bears
339+
self.assertIn("usable",
340+
custom_stdout.getvalue())
341+
self.assertNotIn("unusable",
321342
custom_stdout.getvalue())
322343
os.remove('.coafile')
323344
os.chdir(orig_cwd)
@@ -329,8 +350,10 @@ def test_bears_ci_mode(self):
329350
os.chdir("bears_ci_testfiles")
330351
with retrieve_stdout() as custom_stdout:
331352
main()
353+
# Should print both the usable and unusable bears
332354
self.assertIn("usable",
333355
custom_stdout.getvalue())
356+
self.assertIn("unusable", custom_stdout.getvalue())
334357
os.remove('.coafile')
335358
os.chdir(orig_cwd)
336359

0 commit comments

Comments
 (0)