ridecharge-rubocop 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (219) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +1 -0
  4. data/.travis.yml +14 -0
  5. data/CHANGELOG.md +0 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +22 -0
  8. data/README.md +35 -0
  9. data/Rakefile +22 -0
  10. data/bin/ridecharge-rubocop +49 -0
  11. data/config/0default.yml +8 -0
  12. data/config/fleet-magic-todo.yml +380 -0
  13. data/config/rc-todo.yml +190 -0
  14. data/config/ridecharge-rubocop_todo.yml +73 -0
  15. data/config/rubocop/default.yml +308 -0
  16. data/config/rubocop/disabled.yml +9 -0
  17. data/config/rubocop/enabled.yml +648 -0
  18. data/config/standard-todo.yml +24 -0
  19. data/config/tabs.yml +15 -0
  20. data/config/vehicle-todo.yml +195 -0
  21. data/lib/ridecharge/rubocop.rb +2 -0
  22. data/lib/ridecharge/rubocop/version.rb +5 -0
  23. data/lib/rubocop/config_loader_monkeypatch.rb +117 -0
  24. data/lib/rubocop/ridecharge.rb +1 -0
  25. data/ridecharge-rubocop.gemspec +25 -0
  26. data/spec/isolated_environment_spec.rb +24 -0
  27. data/spec/project_spec.rb +118 -0
  28. data/spec/rubocop/cli_spec.rb +1385 -0
  29. data/spec/rubocop/config_loader_spec.rb +328 -0
  30. data/spec/rubocop/config_spec.rb +179 -0
  31. data/spec/rubocop/config_store_spec.rb +53 -0
  32. data/spec/rubocop/cop/commissioner_spec.rb +83 -0
  33. data/spec/rubocop/cop/cop_spec.rb +114 -0
  34. data/spec/rubocop/cop/corrector_spec.rb +59 -0
  35. data/spec/rubocop/cop/lint/ambiguous_operator_spec.rb +113 -0
  36. data/spec/rubocop/cop/lint/ambiguous_regexp_literal_spec.rb +35 -0
  37. data/spec/rubocop/cop/lint/assignment_in_condition_spec.rb +107 -0
  38. data/spec/rubocop/cop/lint/block_alignment_spec.rb +411 -0
  39. data/spec/rubocop/cop/lint/condition_position_spec.rb +49 -0
  40. data/spec/rubocop/cop/lint/debugger_spec.rb +39 -0
  41. data/spec/rubocop/cop/lint/else_layout_spec.rb +65 -0
  42. data/spec/rubocop/cop/lint/empty_ensure_spec.rb +27 -0
  43. data/spec/rubocop/cop/lint/end_alignment_spec.rb +136 -0
  44. data/spec/rubocop/cop/lint/end_in_method_spec.rb +29 -0
  45. data/spec/rubocop/cop/lint/ensure_return_spec.rb +39 -0
  46. data/spec/rubocop/cop/lint/eval_spec.rb +35 -0
  47. data/spec/rubocop/cop/lint/handle_exceptions_spec.rb +30 -0
  48. data/spec/rubocop/cop/lint/invalid_character_literal_spec.rb +33 -0
  49. data/spec/rubocop/cop/lint/literal_in_condition_spec.rb +63 -0
  50. data/spec/rubocop/cop/lint/loop_spec.rb +27 -0
  51. data/spec/rubocop/cop/lint/parentheses_as_grouped_expression_spec.rb +57 -0
  52. data/spec/rubocop/cop/lint/require_parentheses_spec.rb +82 -0
  53. data/spec/rubocop/cop/lint/rescue_exception_spec.rb +131 -0
  54. data/spec/rubocop/cop/lint/shadowing_outer_local_variable_spec.rb +237 -0
  55. data/spec/rubocop/cop/lint/syntax_spec.rb +34 -0
  56. data/spec/rubocop/cop/lint/unreachable_code_spec.rb +63 -0
  57. data/spec/rubocop/cop/lint/useless_assignment_spec.rb +1570 -0
  58. data/spec/rubocop/cop/lint/useless_comparison_spec.rb +30 -0
  59. data/spec/rubocop/cop/lint/useless_else_without_rescue_spec.rb +48 -0
  60. data/spec/rubocop/cop/lint/useless_setter_call_spec.rb +149 -0
  61. data/spec/rubocop/cop/lint/void_spec.rb +57 -0
  62. data/spec/rubocop/cop/offence_spec.rb +133 -0
  63. data/spec/rubocop/cop/rails/default_scope_spec.rb +37 -0
  64. data/spec/rubocop/cop/rails/has_and_belongs_to_many_spec.rb +13 -0
  65. data/spec/rubocop/cop/rails/output_spec.rb +41 -0
  66. data/spec/rubocop/cop/rails/read_attribute_spec.rb +13 -0
  67. data/spec/rubocop/cop/rails/validation_spec.rb +21 -0
  68. data/spec/rubocop/cop/style/access_modifier_indentation_spec.rb +361 -0
  69. data/spec/rubocop/cop/style/accessor_method_name_spec.rb +81 -0
  70. data/spec/rubocop/cop/style/alias_spec.rb +59 -0
  71. data/spec/rubocop/cop/style/align_array_spec.rb +75 -0
  72. data/spec/rubocop/cop/style/align_hash_spec.rb +310 -0
  73. data/spec/rubocop/cop/style/align_parameters_spec.rb +222 -0
  74. data/spec/rubocop/cop/style/and_or_spec.rb +57 -0
  75. data/spec/rubocop/cop/style/ascii_comments_spec.rb +22 -0
  76. data/spec/rubocop/cop/style/ascii_identifiers_spec.rb +36 -0
  77. data/spec/rubocop/cop/style/attr_spec.rb +19 -0
  78. data/spec/rubocop/cop/style/begin_block_spec.rb +13 -0
  79. data/spec/rubocop/cop/style/block_comments_spec.rb +21 -0
  80. data/spec/rubocop/cop/style/block_nesting_spec.rb +156 -0
  81. data/spec/rubocop/cop/style/blocks_spec.rb +99 -0
  82. data/spec/rubocop/cop/style/braces_around_hash_parameters_spec.rb +284 -0
  83. data/spec/rubocop/cop/style/case_equality_spec.rb +12 -0
  84. data/spec/rubocop/cop/style/case_indentation_spec.rb +289 -0
  85. data/spec/rubocop/cop/style/character_literal_spec.rb +37 -0
  86. data/spec/rubocop/cop/style/class_and_module_camel_case_spec.rb +40 -0
  87. data/spec/rubocop/cop/style/class_length_spec.rb +131 -0
  88. data/spec/rubocop/cop/style/class_methods_spec.rb +45 -0
  89. data/spec/rubocop/cop/style/class_vars_spec.rb +19 -0
  90. data/spec/rubocop/cop/style/collection_methods_spec.rb +48 -0
  91. data/spec/rubocop/cop/style/colon_method_call_spec.rb +60 -0
  92. data/spec/rubocop/cop/style/comment_annotation_spec.rb +86 -0
  93. data/spec/rubocop/cop/style/constant_name_spec.rb +65 -0
  94. data/spec/rubocop/cop/style/cyclomatic_complexity_spec.rb +204 -0
  95. data/spec/rubocop/cop/style/def_with_parentheses_spec.rb +39 -0
  96. data/spec/rubocop/cop/style/documentation_spec.rb +123 -0
  97. data/spec/rubocop/cop/style/dot_position_spec.rb +94 -0
  98. data/spec/rubocop/cop/style/empty_line_between_defs_spec.rb +127 -0
  99. data/spec/rubocop/cop/style/empty_lines_around_access_modifier_spec.rb +56 -0
  100. data/spec/rubocop/cop/style/empty_lines_around_body_spec.rb +131 -0
  101. data/spec/rubocop/cop/style/empty_lines_spec.rb +40 -0
  102. data/spec/rubocop/cop/style/empty_literal_spec.rb +100 -0
  103. data/spec/rubocop/cop/style/encoding_spec.rb +56 -0
  104. data/spec/rubocop/cop/style/end_block_spec.rb +13 -0
  105. data/spec/rubocop/cop/style/end_of_line_spec.rb +47 -0
  106. data/spec/rubocop/cop/style/even_odd_spec.rb +75 -0
  107. data/spec/rubocop/cop/style/favor_join_spec.rb +31 -0
  108. data/spec/rubocop/cop/style/favor_sprintf_spec.rb +47 -0
  109. data/spec/rubocop/cop/style/favor_unless_over_negated_if_spec.rb +76 -0
  110. data/spec/rubocop/cop/style/favor_until_over_negated_while_spec.rb +41 -0
  111. data/spec/rubocop/cop/style/final_newline_spec.rb +30 -0
  112. data/spec/rubocop/cop/style/flip_flop_spec.rb +23 -0
  113. data/spec/rubocop/cop/style/for_spec.rb +105 -0
  114. data/spec/rubocop/cop/style/global_vars_spec.rb +34 -0
  115. data/spec/rubocop/cop/style/hash_methods_spec.rb +45 -0
  116. data/spec/rubocop/cop/style/hash_syntax_spec.rb +131 -0
  117. data/spec/rubocop/cop/style/if_unless_modifier_spec.rb +128 -0
  118. data/spec/rubocop/cop/style/if_with_semicolon_spec.rb +19 -0
  119. data/spec/rubocop/cop/style/indentation_consistency_spec.rb +490 -0
  120. data/spec/rubocop/cop/style/indentation_width_spec.rb +470 -0
  121. data/spec/rubocop/cop/style/lambda_call_spec.rb +65 -0
  122. data/spec/rubocop/cop/style/lambda_spec.rb +41 -0
  123. data/spec/rubocop/cop/style/leading_comment_space_spec.rb +64 -0
  124. data/spec/rubocop/cop/style/line_end_concatenation_spec.rb +34 -0
  125. data/spec/rubocop/cop/style/line_length_spec.rb +20 -0
  126. data/spec/rubocop/cop/style/method_call_parentheses_spec.rb +59 -0
  127. data/spec/rubocop/cop/style/method_called_on_do_end_block_spec.rb +60 -0
  128. data/spec/rubocop/cop/style/method_def_parentheses_spec.rb +106 -0
  129. data/spec/rubocop/cop/style/method_length_spec.rb +147 -0
  130. data/spec/rubocop/cop/style/method_name_spec.rb +125 -0
  131. data/spec/rubocop/cop/style/module_function_spec.rb +24 -0
  132. data/spec/rubocop/cop/style/multiline_block_chain_spec.rb +78 -0
  133. data/spec/rubocop/cop/style/multiline_if_then_spec.rb +107 -0
  134. data/spec/rubocop/cop/style/multiline_ternary_operator_spec.rb +18 -0
  135. data/spec/rubocop/cop/style/nested_ternary_operator_spec.rb +21 -0
  136. data/spec/rubocop/cop/style/nil_comparison_spec.rb +30 -0
  137. data/spec/rubocop/cop/style/not_spec.rb +22 -0
  138. data/spec/rubocop/cop/style/numeric_literals_spec.rb +64 -0
  139. data/spec/rubocop/cop/style/one_line_conditional_spec.rb +13 -0
  140. data/spec/rubocop/cop/style/op_method_spec.rb +74 -0
  141. data/spec/rubocop/cop/style/parameter_lists_spec.rb +44 -0
  142. data/spec/rubocop/cop/style/parentheses_around_condition_spec.rb +122 -0
  143. data/spec/rubocop/cop/style/perl_backrefs_spec.rb +17 -0
  144. data/spec/rubocop/cop/style/predicate_name_spec.rb +25 -0
  145. data/spec/rubocop/cop/style/proc_spec.rb +27 -0
  146. data/spec/rubocop/cop/style/raise_args_spec.rb +82 -0
  147. data/spec/rubocop/cop/style/redundant_begin_spec.rb +57 -0
  148. data/spec/rubocop/cop/style/redundant_exception_spec.rb +27 -0
  149. data/spec/rubocop/cop/style/redundant_return_spec.rb +171 -0
  150. data/spec/rubocop/cop/style/redundant_self_spec.rb +142 -0
  151. data/spec/rubocop/cop/style/regexp_literal_spec.rb +83 -0
  152. data/spec/rubocop/cop/style/rescue_modifier_spec.rb +116 -0
  153. data/spec/rubocop/cop/style/semicolon_spec.rb +100 -0
  154. data/spec/rubocop/cop/style/signal_exception_spec.rb +266 -0
  155. data/spec/rubocop/cop/style/single_line_block_params_spec.rb +68 -0
  156. data/spec/rubocop/cop/style/single_line_methods_spec.rb +52 -0
  157. data/spec/rubocop/cop/style/space_after_colon_spec.rb +38 -0
  158. data/spec/rubocop/cop/style/space_after_comma_spec.rb +30 -0
  159. data/spec/rubocop/cop/style/space_after_control_keyword_spec.rb +84 -0
  160. data/spec/rubocop/cop/style/space_after_method_name_spec.rb +70 -0
  161. data/spec/rubocop/cop/style/space_after_not_spec.rb +22 -0
  162. data/spec/rubocop/cop/style/space_after_semicolon_spec.rb +23 -0
  163. data/spec/rubocop/cop/style/space_around_block_braces_spec.rb +283 -0
  164. data/spec/rubocop/cop/style/space_around_equals_in_parameter_default_spec.rb +33 -0
  165. data/spec/rubocop/cop/style/space_around_operators_spec.rb +325 -0
  166. data/spec/rubocop/cop/style/space_before_modifier_keyword_spec.rb +70 -0
  167. data/spec/rubocop/cop/style/space_inside_brackets_spec.rb +52 -0
  168. data/spec/rubocop/cop/style/space_inside_hash_literal_braces_spec.rb +138 -0
  169. data/spec/rubocop/cop/style/space_inside_parens_spec.rb +34 -0
  170. data/spec/rubocop/cop/style/special_global_vars_spec.rb +56 -0
  171. data/spec/rubocop/cop/style/string_literals_spec.rb +212 -0
  172. data/spec/rubocop/cop/style/symbol_array_spec.rb +37 -0
  173. data/spec/rubocop/cop/style/tab_spec.rb +17 -0
  174. data/spec/rubocop/cop/style/trailing_blank_lines_spec.rb +43 -0
  175. data/spec/rubocop/cop/style/trailing_comma_spec.rb +230 -0
  176. data/spec/rubocop/cop/style/trailing_whitespace_spec.rb +30 -0
  177. data/spec/rubocop/cop/style/trivial_accessors_spec.rb +415 -0
  178. data/spec/rubocop/cop/style/unless_else_spec.rb +25 -0
  179. data/spec/rubocop/cop/style/variable_interpolation_spec.rb +47 -0
  180. data/spec/rubocop/cop/style/variable_name_spec.rb +107 -0
  181. data/spec/rubocop/cop/style/when_then_spec.rb +41 -0
  182. data/spec/rubocop/cop/style/while_until_do_spec.rb +53 -0
  183. data/spec/rubocop/cop/style/while_until_modifier_spec.rb +75 -0
  184. data/spec/rubocop/cop/style/word_array_spec.rb +97 -0
  185. data/spec/rubocop/cop/team_spec.rb +156 -0
  186. data/spec/rubocop/cop/util_spec.rb +49 -0
  187. data/spec/rubocop/cop/variable_inspector/assignment_spec.rb +213 -0
  188. data/spec/rubocop/cop/variable_inspector/locatable_spec.rb +734 -0
  189. data/spec/rubocop/cop/variable_inspector/scope_spec.rb +184 -0
  190. data/spec/rubocop/cop/variable_inspector/variable_spec.rb +73 -0
  191. data/spec/rubocop/cop/variable_inspector/variable_table_spec.rb +269 -0
  192. data/spec/rubocop/cop/variable_inspector_spec.rb +29 -0
  193. data/spec/rubocop/file_inspector_spec.rb +78 -0
  194. data/spec/rubocop/formatter/base_formatter_spec.rb +191 -0
  195. data/spec/rubocop/formatter/clang_style_formatter_spec.rb +114 -0
  196. data/spec/rubocop/formatter/colorizable_spec.rb +107 -0
  197. data/spec/rubocop/formatter/disabled_config_formatter_spec.rb +50 -0
  198. data/spec/rubocop/formatter/emacs_style_formatter_spec.rb +62 -0
  199. data/spec/rubocop/formatter/file_list_formatter_spec.rb +33 -0
  200. data/spec/rubocop/formatter/formatter_set_spec.rb +132 -0
  201. data/spec/rubocop/formatter/json_formatter_spec.rb +148 -0
  202. data/spec/rubocop/formatter/offence_count_formatter_spec.rb +52 -0
  203. data/spec/rubocop/formatter/progress_formatter_spec.rb +182 -0
  204. data/spec/rubocop/formatter/simple_text_formatter_spec.rb +123 -0
  205. data/spec/rubocop/options_spec.rb +145 -0
  206. data/spec/rubocop/path_util_spec.rb +42 -0
  207. data/spec/rubocop/processed_source_spec.rb +114 -0
  208. data/spec/rubocop/source_parser_spec.rb +139 -0
  209. data/spec/rubocop/target_finder_spec.rb +180 -0
  210. data/spec/rubocop/token_spec.rb +25 -0
  211. data/spec/spec_helper.rb +136 -0
  212. data/spec/support/ast_helper.rb +15 -0
  213. data/spec/support/file_helper.rb +21 -0
  214. data/spec/support/isolated_environment.rb +34 -0
  215. data/spec/support/mri_syntax_checker.rb +73 -0
  216. data/spec/support/shared_context.rb +22 -0
  217. data/spec/support/shared_examples.rb +33 -0
  218. data/spec/support/statement_modifier_helper.rb +41 -0
  219. metadata +511 -0
@@ -0,0 +1,50 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'stringio'
5
+ require 'ostruct'
6
+
7
+ module Rubocop
8
+ module Formatter
9
+ describe DisabledConfigFormatter do
10
+ subject(:formatter) { described_class.new(output) }
11
+ let(:output) do
12
+ o = StringIO.new
13
+ def o.path
14
+ 'rubocop-todo.yml'
15
+ end
16
+ o
17
+ end
18
+ let(:offences) do
19
+ [Rubocop::Cop::Offence.new(:convention, location, 'message', 'Cop1'),
20
+ Rubocop::Cop::Offence.new(:convention, location, 'message', 'Cop2')]
21
+ end
22
+ let(:location) { OpenStruct.new(line: 1, column: 5) }
23
+ before { $stdout = StringIO.new }
24
+
25
+ describe '#finished' do
26
+ it 'displays YAML configuration disabling all cops with offences' do
27
+ formatter.file_finished('test.rb', offences)
28
+ formatter.finished(['test.rb'])
29
+ expect(output.string).to eq(described_class::HEADING +
30
+ ['',
31
+ '',
32
+ '# Offence count: 1',
33
+ 'Cop1:',
34
+ ' Enabled: false',
35
+ '',
36
+ '# Offence count: 1',
37
+ 'Cop2:',
38
+ ' Enabled: false',
39
+ ''].join("\n"))
40
+ expect($stdout.string)
41
+ .to eq(['Created rubocop-todo.yml.',
42
+ 'Run rubocop with --config rubocop-todo.yml, or',
43
+ 'add inherit_from: rubocop-todo.yml in a .rubocop.yml ' \
44
+ 'file.',
45
+ ''].join("\n"))
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,62 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'stringio'
5
+
6
+ module Rubocop
7
+ module Formatter
8
+ describe EmacsStyleFormatter do
9
+ subject(:formatter) { described_class.new(output) }
10
+ let(:output) { StringIO.new }
11
+
12
+ describe '#file_finished' do
13
+ it 'displays parsable text' do
14
+ cop = Cop::Cop.new
15
+ source_buffer = Parser::Source::Buffer.new('test', 1)
16
+ source_buffer.source = %w(a b cdefghi).join("\n")
17
+
18
+ cop.add_offence(nil,
19
+ Parser::Source::Range.new(source_buffer, 0, 1),
20
+ 'message 1')
21
+ cop.add_offence(nil,
22
+ Parser::Source::Range.new(source_buffer, 9, 10),
23
+ 'message 2')
24
+
25
+ formatter.file_finished('test', cop.offences)
26
+ expect(output.string).to eq ['test:1:1: C: message 1',
27
+ "test:3:6: C: message 2\n"].join("\n")
28
+ end
29
+
30
+ context 'when the offence is automatically corrected' do
31
+ let(:file) { '/path/to/file' }
32
+
33
+ let(:offence) do
34
+ Cop::Offence.new(:convention, location,
35
+ 'This is a message.', 'CopName', corrected)
36
+ end
37
+
38
+ let(:location) do
39
+ source_buffer = Parser::Source::Buffer.new('test', 1)
40
+ source_buffer.source = "a\n"
41
+ Parser::Source::Range.new(source_buffer, 0, 1)
42
+ end
43
+
44
+ let(:corrected) { true }
45
+
46
+ it 'prints [Corrected] along with message' do
47
+ formatter.file_finished(file, [offence])
48
+ expect(output.string)
49
+ .to include(': [Corrected] This is a message.')
50
+ end
51
+ end
52
+ end
53
+
54
+ describe '#finished' do
55
+ it 'does not report summary' do
56
+ formatter.finished(['/path/to/file'])
57
+ expect(output.string).to be_empty
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'stringio'
5
+
6
+ module Rubocop
7
+ module Formatter
8
+ describe FileListFormatter do
9
+ subject(:formatter) { described_class.new(output) }
10
+ let(:output) { StringIO.new }
11
+
12
+ describe '#file_finished' do
13
+ it 'displays parsable text' do
14
+ cop = Cop::Cop.new
15
+ source_buffer = Parser::Source::Buffer.new('test', 1)
16
+ source_buffer.source = %w(a b cdefghi).join("\n")
17
+
18
+ cop.add_offence(nil,
19
+ Parser::Source::Range.new(source_buffer, 0, 1),
20
+ 'message 1')
21
+ cop.add_offence(nil,
22
+ Parser::Source::Range.new(source_buffer, 9, 10),
23
+ 'message 2')
24
+
25
+ formatter.file_finished('test', cop.offences)
26
+ formatter.file_finished('test_2', cop.offences)
27
+ expect(output.string).to eq ['test',
28
+ "test_2\n"].join("\n")
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,132 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'tempfile'
5
+
6
+ module Rubocop
7
+ module Formatter
8
+ describe FormatterSet do
9
+ subject(:formatter_set) { described_class.new }
10
+
11
+ it 'responds to all formatter API methods' do
12
+ [:started, :file_started, :file_finished, :finished].each do |method|
13
+ expect(formatter_set).to respond_to(method)
14
+ end
15
+ end
16
+
17
+ describe 'formatter API method' do
18
+ before do
19
+ formatter_set.add_formatter('simple')
20
+ formatter_set.add_formatter('emacs')
21
+ end
22
+
23
+ let(:files) { ['/path/to/file1', '/path/to/file2'] }
24
+
25
+ it 'invokes same method of all containing formatters' do
26
+ formatter_set.each do |formatter|
27
+ expect(formatter).to receive(:started).with(files)
28
+ end
29
+ formatter_set.started(files)
30
+ end
31
+ end
32
+
33
+ describe 'add_formatter' do
34
+ it 'adds a formatter to itself' do
35
+ formatter_set.add_formatter('simple')
36
+ expect(formatter_set.size).to eq(1)
37
+ end
38
+
39
+ it 'adds a formatter with specified formatter type' do
40
+ formatter_set.add_formatter('simple')
41
+ expect(formatter_set.first.class).to eq(SimpleTextFormatter)
42
+ end
43
+
44
+ it 'can add multiple formatters by being invoked multiple times' do
45
+ formatter_set.add_formatter('simple')
46
+ formatter_set.add_formatter('emacs')
47
+ expect(formatter_set[0].class).to eq(SimpleTextFormatter)
48
+ expect(formatter_set[1].class).to eq(EmacsStyleFormatter)
49
+ end
50
+
51
+ context 'when output path is omitted' do
52
+ it 'adds a formatter outputs to $stdout' do
53
+ formatter_set.add_formatter('simple')
54
+ expect(formatter_set.first.output).to eq($stdout)
55
+ end
56
+ end
57
+
58
+ context 'when output path is specified' do
59
+ it 'adds a formatter outputs to the specified file' do
60
+ output_path = Tempfile.new('').path
61
+ formatter_set.add_formatter('simple', output_path)
62
+ expect(formatter_set.first.output.class).to eq(File)
63
+ expect(formatter_set.first.output.path).to eq(output_path)
64
+ end
65
+ end
66
+ end
67
+
68
+ describe '#close_output_files' do
69
+ before do
70
+ 2.times do
71
+ output_path = Tempfile.new('').path
72
+ formatter_set.add_formatter('simple', output_path)
73
+ end
74
+ formatter_set.add_formatter('simple')
75
+ end
76
+
77
+ it 'closes all output files' do
78
+ formatter_set.close_output_files
79
+ formatter_set[0..1].each do |formatter|
80
+ expect(formatter.output).to be_closed
81
+ end
82
+ end
83
+
84
+ it 'does not close non file output' do
85
+ expect(formatter_set[2].output).not_to be_closed
86
+ end
87
+ end
88
+
89
+ describe '#builtin_formatter_class' do
90
+ def builtin_formatter_class(string)
91
+ described_class.new.send(:builtin_formatter_class, string)
92
+ end
93
+
94
+ it 'returns class which matches passed alias name exactly' do
95
+ expect(builtin_formatter_class('simple'))
96
+ .to eq(SimpleTextFormatter)
97
+ end
98
+
99
+ it 'returns class whose first letter of alias name ' \
100
+ 'matches passed letter' do
101
+ expect(builtin_formatter_class('s'))
102
+ .to eq(SimpleTextFormatter)
103
+ end
104
+ end
105
+
106
+ describe '#custom_formatter_class' do
107
+ def custom_formatter_class(string)
108
+ described_class.new.send(:custom_formatter_class, string)
109
+ end
110
+
111
+ it 'returns constant represented by the passed string' do
112
+ expect(custom_formatter_class('Rubocop')).to eq(Rubocop)
113
+ end
114
+
115
+ it 'can handle namespaced constant name' do
116
+ expect(custom_formatter_class('Rubocop::CLI')).to eq(Rubocop::CLI)
117
+ end
118
+
119
+ it 'can handle top level namespaced constant name' do
120
+ expect(custom_formatter_class('::Rubocop::CLI')).to eq(Rubocop::CLI)
121
+ end
122
+
123
+ context 'when non-existent constant name is passed' do
124
+ it 'raises error' do
125
+ expect { custom_formatter_class('Rubocop::NonExistentClass') }
126
+ .to raise_error(NameError)
127
+ end
128
+ end
129
+ end
130
+ end
131
+ end
132
+ end
@@ -0,0 +1,148 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'stringio'
5
+
6
+ module Rubocop
7
+ describe Formatter::JSONFormatter do
8
+ subject(:formatter) { described_class.new(output) }
9
+ let(:output) { StringIO.new }
10
+ let(:files) { %w(/path/to/file1 /path/to/file2) }
11
+ let(:location) do
12
+ source_buffer = Parser::Source::Buffer.new('test', 1)
13
+ source_buffer.source = %w(a b cdefghi).join("\n")
14
+ Parser::Source::Range.new(source_buffer, 9, 10)
15
+ end
16
+ let(:offence) do
17
+ Cop::Offence.new(:convention, location,
18
+ 'This is message', 'CopName', true)
19
+ end
20
+
21
+ describe '#started' do
22
+ let(:summary) { formatter.output_hash[:summary] }
23
+
24
+ it 'sets target file count in summary' do
25
+ expect(summary[:target_file_count]).to be_nil
26
+ formatter.started(%w(/path/to/file1 /path/to/file2))
27
+ expect(summary[:target_file_count]).to eq(2)
28
+ end
29
+ end
30
+
31
+ describe '#file_finished' do
32
+ before do
33
+ count = 0
34
+ allow(formatter).to receive(:hash_for_file) do
35
+ count += 1
36
+ end
37
+ end
38
+
39
+ let(:summary) { formatter.output_hash[:summary] }
40
+
41
+ it 'adds detected offence count in summary' do
42
+ expect(summary[:offence_count]).to eq(0)
43
+
44
+ formatter.file_started(files[0], {})
45
+ expect(summary[:offence_count]).to eq(0)
46
+ formatter.file_finished(files[0], [
47
+ double('offence1'), double('offence2')
48
+ ])
49
+ expect(summary[:offence_count]).to eq(2)
50
+ end
51
+
52
+ it 'adds value of #hash_for_file to #output_hash[:files]' do
53
+ expect(formatter.output_hash[:files]).to be_empty
54
+
55
+ formatter.file_started(files[0], {})
56
+ expect(formatter.output_hash[:files]).to be_empty
57
+ formatter.file_finished(files[0], [])
58
+ expect(formatter.output_hash[:files]).to eq([1])
59
+
60
+ formatter.file_started(files[1], {})
61
+ expect(formatter.output_hash[:files]).to eq([1])
62
+ formatter.file_finished(files[1], [])
63
+ expect(formatter.output_hash[:files]).to eq([1, 2])
64
+ end
65
+ end
66
+
67
+ describe '#finished' do
68
+ let(:summary) { formatter.output_hash[:summary] }
69
+
70
+ it 'sets inspected file count in summary' do
71
+ expect(summary[:inspected_file_count]).to be_nil
72
+ formatter.finished(%w(/path/to/file1 /path/to/file2))
73
+ expect(summary[:inspected_file_count]).to eq(2)
74
+ end
75
+
76
+ it 'outputs #output_hash as JSON' do
77
+ formatter.finished(files)
78
+ json = output.string
79
+ restored_hash = JSON.parse(json, symbolize_names: true)
80
+ expect(restored_hash).to eq(formatter.output_hash)
81
+ end
82
+ end
83
+
84
+ describe '#hash_for_file' do
85
+ subject(:hash) { formatter.hash_for_file(file, offences) }
86
+ let(:file) { File.expand_path('spec/spec_helper.rb') }
87
+ let(:offences) { [double('offence1'), double('offence2')] }
88
+
89
+ it 'sets relative file path for :path key' do
90
+ expect(hash[:path]).to eq('spec/spec_helper.rb')
91
+ end
92
+
93
+ before do
94
+ count = 0
95
+ allow(formatter).to receive(:hash_for_offence) do
96
+ count += 1
97
+ end
98
+ end
99
+
100
+ it 'sets an array of #hash_for_offence values for :offences key' do
101
+ expect(hash[:offences]).to eq([1, 2])
102
+ end
103
+ end
104
+
105
+ describe '#hash_for_offence' do
106
+ subject(:hash) { formatter.hash_for_offence(offence) }
107
+
108
+ it 'sets Offence#severity value for :severity key' do
109
+ expect(hash[:severity]).to eq(:convention)
110
+ end
111
+
112
+ it 'sets Offence#message value for :message key' do
113
+ expect(hash[:message]).to eq('This is message')
114
+ end
115
+
116
+ it 'sets Offence#cop_name value for :cop_name key' do
117
+ expect(hash[:cop_name]).to eq('CopName')
118
+ end
119
+
120
+ it 'sets Offence#corrected? value for :corrected key' do
121
+ expect(hash[:corrected]).to be_true
122
+ end
123
+
124
+ before do
125
+ allow(formatter)
126
+ .to receive(:hash_for_location).and_return(location_hash)
127
+ end
128
+
129
+ let(:location_hash) { { line: 1, column: 2 } }
130
+
131
+ it 'sets value of #hash_for_location for :location key' do
132
+ expect(hash[:location]).to eq(location_hash)
133
+ end
134
+ end
135
+
136
+ describe '#hash_for_location' do
137
+ subject(:hash) { formatter.hash_for_location(offence) }
138
+
139
+ it 'sets line value for :line key' do
140
+ expect(hash[:line]).to eq(3)
141
+ end
142
+
143
+ it 'sets column value for :column key' do
144
+ expect(hash[:column]).to eq(6)
145
+ end
146
+ end
147
+ end
148
+ end
@@ -0,0 +1,52 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+ require 'stringio'
5
+ require 'tempfile'
6
+
7
+ module Rubocop
8
+ module Formatter
9
+ describe OffenceCountFormatter do
10
+ subject(:formatter) { described_class.new(output) }
11
+ let(:output) { StringIO.new }
12
+
13
+ let(:files) do
14
+ %w(lib/rubocop.rb spec/spec_helper.rb bin/rubocop).map do |path|
15
+ File.expand_path(path)
16
+ end
17
+ end
18
+
19
+ describe '#file_finished' do
20
+ before { formatter.started(files) }
21
+
22
+ let(:finish) { formatter.file_finished(files.first, offences) }
23
+
24
+ context 'when no offences are detected' do
25
+ let(:offences) { [] }
26
+ it 'shouldn\'t add to offence_counts' do
27
+ expect { finish }.to_not change { formatter.offence_counts }
28
+ end
29
+ end
30
+
31
+ context 'when any offences are detected' do
32
+ let(:offences) { [double('offence', cop_name: 'OffendedCop')] }
33
+ it 'should increment the count for the cop in offence_counts' do
34
+ expect { finish }.to change { formatter.offence_counts }
35
+ end
36
+ end
37
+ end
38
+
39
+ describe '#report_summary' do
40
+ context 'when a offence detected' do
41
+ let(:cop_counts) { { 'OffendedCop' => 1 } }
42
+ it 'shows the cop and the offence count' do
43
+ formatter.report_summary(1, cop_counts)
44
+ expect(output.string).to include(
45
+ "\n1 OffendedCop")
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+ end
52
+ end