Skip to content

Commit bd7e890

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 bd7e890

File tree

4 files changed

+97
-29
lines changed

4 files changed

+97
-29
lines changed

coala_quickstart/Strings.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,26 @@
5050
5151
You can see all of them here: {}
5252
""".format(BEAR_DOCS_URL)
53+
54+
PRINT_UNUSABLE = """
55+
The following bears have been dropped because '-C'/'--ci' (non
56+
interactive mode) option has been selected. Remove the option or
57+
check '--allow-incomplete-sections' option for more information
58+
on how to include them:
59+
"""
60+
61+
PRINT_USABLE = """
62+
Based on the languages used in project the following bears have been
63+
identified as usable:
64+
"""
65+
66+
PRINT_BEARS = {
67+
'unusable': {
68+
'msg': PRINT_UNUSABLE,
69+
'colors': ('green', 'red')
70+
},
71+
'usable': {
72+
'msg': PRINT_USABLE,
73+
'colors': ('green', 'cyan')
74+
}
75+
}

coala_quickstart/coala_quickstart.py

Lines changed: 17 additions & 7 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

@@ -17,7 +18,7 @@
1718
filter_relevant_bears,
1819
print_relevant_bears,
1920
get_non_optional_settings_bears,
20-
remove_unusable_bears,
21+
filter_unusable_bears,
2122
)
2223
from coala_quickstart.generation.Settings import (
2324
generate_settings, write_coafile)
@@ -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)
116-
remove_unusable_bears(relevant_bears, unusable_bears)
117-
print_relevant_bears(printer, relevant_bears, 'usable')
120+
unusable_bears = get_non_optional_settings_bears(
121+
relevant_bears['usable'])
122+
filter_unusable_bears(relevant_bears, unusable_bears)
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: 30 additions & 18 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
@@ -201,40 +201,52 @@ def get_non_optional_settings_bears(bears):
201201
return non_optional_settings
202202

203203

204-
def remove_unusable_bears(bears, unusable_bears):
204+
def filter_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+
nonempty_label_bears = [
236+
label for label in relevant_bears if len(relevant_bears[label]) > 0]
237+
238+
if not nonempty_label_bears:
239+
printer.print('No relevant bears were found.')
240+
else:
241+
for label_bears in nonempty_label_bears:
242+
printer.print(PRINT_BEARS[label_bears]['msg'])
243+
for language in relevant_bears[label_bears]:
244+
printer.print(' [' + language + ']',
245+
color=PRINT_BEARS[label_bears]['colors'][0])
246+
for bear in relevant_bears[label_bears][language]:
247+
printer.print(' ' + bear.name,
248+
color=PRINT_BEARS[label_bears]['colors'][1])
249+
printer.print('')
238250

239251

240252
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("dropped",
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("dropped", custom_stdout.getvalue())
328+
self.assertIn("No relevant", 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("dropped",
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("dropped", custom_stdout.getvalue())
334357
os.remove('.coafile')
335358
os.chdir(orig_cwd)
336359

0 commit comments

Comments
 (0)