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,42 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::PathUtil do
6
+ describe '#relative_path' do
7
+ pending 'builds paths relative to the current project by default'
8
+ it 'builds paths relative to PWD by default as a stop-gap' do
9
+ relative = File.join(Dir.pwd, 'relative')
10
+ expect(subject.relative_path(relative)).to eq('relative')
11
+ end
12
+
13
+ it 'supports custom base paths' do
14
+ expect(subject.relative_path('/foo/bar', '/foo')).to eq('bar')
15
+ end
16
+ end
17
+
18
+ describe '#match_path?' do
19
+ it 'matches strings to the basename' do
20
+ expect(subject.match_path?('file', '/dir/file')).to be_true
21
+ expect(subject.match_path?('file', '/dir/files')).to be_false
22
+ expect(subject.match_path?('dir', '/dir/file')).to be_false
23
+ end
24
+
25
+ it 'matches strings to the full path' do
26
+ expect(subject.match_path?('/dir/file', '/dir/file')).to be_true
27
+ expect(subject.match_path?('/dir/file', '/dir/dir/file')).to be_false
28
+ end
29
+
30
+ it 'matches glob expressions' do
31
+ expect(subject.match_path?('dir/*', 'dir/file')).to be_true
32
+ expect(subject.match_path?('dir/*', 'dir/sub/file')).to be_true
33
+ expect(subject.match_path?('dir/**/*', 'dir/sub/file')).to be_true
34
+ expect(subject.match_path?('sub/*', 'dir/sub/file')).to be_false
35
+ end
36
+
37
+ it 'matches regexps' do
38
+ expect(subject.match_path?(/^d.*e$/, 'dir/file')).to be_true
39
+ expect(subject.match_path?(/^d.*e$/, 'dir/filez')).to be_false
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,114 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::ProcessedSource do
6
+ subject(:processed_source) do
7
+ described_class.new(
8
+ buffer,
9
+ double('ast'),
10
+ double('comments'),
11
+ double('tokens'),
12
+ diagnostics
13
+ )
14
+ end
15
+
16
+ let(:diagnostics) { double('diagnostics') }
17
+
18
+ let(:source) do
19
+ [
20
+ 'def some_method',
21
+ " puts 'foo'",
22
+ 'end',
23
+ 'some_method'
24
+ ].join("\n")
25
+ end
26
+
27
+ let(:buffer) do
28
+ buffer = Parser::Source::Buffer.new('(string)', 1)
29
+ buffer.source = source
30
+ buffer
31
+ end
32
+
33
+ describe '#lines' do
34
+ it 'is an array' do
35
+ expect(processed_source.lines).to be_a(Array)
36
+ end
37
+
38
+ it 'has same number of elements as line count' do
39
+ expect(processed_source.lines.size).to eq(4)
40
+ end
41
+
42
+ it 'contains lines as string without linefeed' do
43
+ first_line = processed_source.lines.first
44
+ expect(first_line).to eq('def some_method')
45
+ end
46
+ end
47
+
48
+ describe '#[]' do
49
+ context 'when an index is passed' do
50
+ it 'returns the line' do
51
+ expect(processed_source[2]).to eq('end')
52
+ end
53
+ end
54
+
55
+ context 'when a range is passed' do
56
+ it 'returns the array of lines' do
57
+ expect(processed_source[2..3]).to eq(%w(end some_method))
58
+ end
59
+ end
60
+
61
+ context 'when start index and length are passed' do
62
+ it 'returns the array of lines' do
63
+ expect(processed_source[2, 2]).to eq(%w(end some_method))
64
+ end
65
+ end
66
+ end
67
+
68
+ describe 'valid_syntax?' do
69
+ def create_diagnostics(level)
70
+ Parser::Diagnostic.new(level, :odd_hash, [], double('location'))
71
+ end
72
+
73
+ let(:diagnostics) do
74
+ [create_diagnostics(level)]
75
+ end
76
+
77
+ context 'when the source has diagnostic with error level' do
78
+ let(:level) { :error }
79
+
80
+ it 'returns false' do
81
+ expect(processed_source.valid_syntax?).to be_false
82
+ end
83
+ end
84
+
85
+ context 'when the source has diagnostic with fatal level' do
86
+ let(:level) { :fatal }
87
+
88
+ it 'returns false' do
89
+ expect(processed_source.valid_syntax?).to be_false
90
+ end
91
+ end
92
+
93
+ context 'when the source has diagnostic with warning level' do
94
+ let(:level) { :warning }
95
+
96
+ it 'returns true' do
97
+ expect(processed_source.valid_syntax?).to be_true
98
+ end
99
+ end
100
+
101
+ context 'when the source has diagnostics with error and warning level' do
102
+ let(:diagnostics) do
103
+ [
104
+ create_diagnostics(:error),
105
+ create_diagnostics(:warning)
106
+ ]
107
+ end
108
+
109
+ it 'returns false' do
110
+ expect(processed_source.valid_syntax?).to be_false
111
+ end
112
+ end
113
+ end
114
+ end
@@ -0,0 +1,139 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::SourceParser, :isolated_environment do
6
+ include FileHelper
7
+
8
+ describe '.parse_file' do
9
+ let(:file) { 'example.rb' }
10
+
11
+ let(:source) do
12
+ [
13
+ '# encoding: utf-8',
14
+ '',
15
+ 'def some_method',
16
+ " puts 'foo'",
17
+ 'end',
18
+ '',
19
+ 'some_method'
20
+ ]
21
+ end
22
+
23
+ before do
24
+ create_file(file, source)
25
+ end
26
+
27
+ let(:processed_source) do
28
+ described_class.parse_file(file)
29
+ end
30
+
31
+ it 'returns ProcessedSource' do
32
+ expect(processed_source).to be_a(Rubocop::ProcessedSource)
33
+ end
34
+
35
+ describe 'the returned processed source' do
36
+ it 'has the root node of AST' do
37
+ expect(processed_source.ast).to be_a(Parser::AST::Node)
38
+ end
39
+
40
+ it 'has an array of comments' do
41
+ expect(processed_source.comments).to be_a(Array)
42
+ expect(processed_source.comments.first)
43
+ .to be_a(Parser::Source::Comment)
44
+ end
45
+
46
+ it 'has an array of tokens' do
47
+ expect(processed_source.tokens).to be_a(Array)
48
+ expect(processed_source.tokens.first).to be_a(Rubocop::Token)
49
+ end
50
+
51
+ it 'has a source buffer' do
52
+ expect(processed_source.buffer).to be_a(Parser::Source::Buffer)
53
+ end
54
+
55
+ context 'when the source is valid' do
56
+ it 'does not have diagnostics' do
57
+ expect(processed_source.diagnostics).to be_a(Array)
58
+ expect(processed_source.diagnostics).to be_empty
59
+ end
60
+ end
61
+
62
+ context 'when the source has invalid syntax' do
63
+ let(:source) do
64
+ [
65
+ '# encoding: utf-8',
66
+ '',
67
+ 'def some_method',
68
+ " puts 'foo'",
69
+ 'end',
70
+ '',
71
+ 'some_method',
72
+ '',
73
+ '?invalid_syntax'
74
+ ]
75
+ end
76
+
77
+ it 'has an array of diagnostics' do
78
+ expect(processed_source.diagnostics).to be_a(Array)
79
+ expect(processed_source.diagnostics.first)
80
+ .to be_a(Parser::Diagnostic)
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ describe '.cop_disabled_lines_in' do
87
+ let(:source) do
88
+ [
89
+ '# encoding: utf-8',
90
+ '',
91
+ '# rubocop:disable MethodLength',
92
+ 'def some_method',
93
+ " puts 'foo'",
94
+ 'end',
95
+ '# rubocop:enable MethodLength',
96
+ '',
97
+ '# rubocop:disable all',
98
+ 'some_method',
99
+ '# rubocop:enable all',
100
+ '',
101
+ "code = 'This is evil.'",
102
+ 'eval(code) # rubocop:disable Eval',
103
+ "puts 'This is not evil.'"
104
+ ]
105
+ end
106
+
107
+ let(:disabled_lines) { described_class.cop_disabled_lines_in(source) }
108
+
109
+ it 'has keys for disabled cops' do
110
+ expect(disabled_lines).to have_key('MethodLength')
111
+ expect(disabled_lines).to have_key('Eval')
112
+ end
113
+
114
+ it 'supports disabling multiple lines with a pair of directive' do
115
+ method_length_disabled_lines = disabled_lines['MethodLength']
116
+ expected_part = (3..6).to_a
117
+ expect(method_length_disabled_lines & expected_part)
118
+ .to eq(expected_part)
119
+ end
120
+
121
+ it 'supports disabling single line with a direcive at end of line' do
122
+ eval_disabled_lines = disabled_lines['Eval']
123
+ expect(eval_disabled_lines).to include(14)
124
+ expect(eval_disabled_lines).not_to include(15)
125
+ end
126
+
127
+ it 'supports disabling all cops with keyword all' do
128
+ all_cop_names = Rubocop::Cop::Cop.all.map(&:cop_name).sort
129
+ expect(disabled_lines.keys.sort).to eq(all_cop_names)
130
+
131
+ expected_part = (9..10).to_a
132
+
133
+ disabled_lines.each_value do |each_cop_disabled_lines|
134
+ expect(each_cop_disabled_lines & expected_part)
135
+ .to eq(expected_part)
136
+ end
137
+ end
138
+ end
139
+ end
@@ -0,0 +1,180 @@
1
+ # encoding: utf-8
2
+
3
+ require 'spec_helper'
4
+
5
+ describe Rubocop::TargetFinder, :isolated_environment do
6
+ include FileHelper
7
+
8
+ subject(:target_finder) { described_class.new(config_store, debug) }
9
+ let(:config_store) { Rubocop::ConfigStore.new }
10
+ let(:debug) { false }
11
+
12
+ before do
13
+ create_file('dir1/ruby1.rb', '# encoding: utf-8')
14
+ create_file('dir1/ruby2.rb', '# encoding: utf-8')
15
+ create_file('dir1/file.txt', '# encoding: utf-8')
16
+ create_file('dir1/file', '# encoding: utf-8')
17
+ create_file('dir1/executable', '#!/usr/bin/env ruby')
18
+ create_file('dir2/ruby3.rb', '# encoding: utf-8')
19
+ end
20
+
21
+ describe '#find' do
22
+ let(:found_files) { target_finder.find(args) }
23
+ let(:found_basenames) { found_files.map { |f| File.basename(f) } }
24
+ let(:args) { [] }
25
+
26
+ it 'returns absolute paths' do
27
+ expect(found_files).not_to be_empty
28
+ found_files.each do |file|
29
+ expect(file).to start_with('/')
30
+ end
31
+ end
32
+
33
+ context 'when no argument is passed' do
34
+ let(:args) { [] }
35
+
36
+ it 'finds files under the current directory' do
37
+ Dir.chdir('dir1') do
38
+ expect(found_files).not_to be_empty
39
+ found_files.each do |file|
40
+ expect(file).to include('/dir1/')
41
+ expect(file).not_to include('/dir2/')
42
+ end
43
+ end
44
+ end
45
+ end
46
+
47
+ context 'when a directory path is passed' do
48
+ let(:args) { ['../dir2'] }
49
+
50
+ it 'finds files under the specified directory' do
51
+ Dir.chdir('dir1') do
52
+ expect(found_files).not_to be_empty
53
+ found_files.each do |file|
54
+ expect(file).to include('/dir2/')
55
+ expect(file).not_to include('/dir1/')
56
+ end
57
+ end
58
+ end
59
+ end
60
+
61
+ context 'when a file is passed' do
62
+ let(:args) { ['dir2/file'] }
63
+
64
+ it 'picks the file' do
65
+ expect(found_basenames).to eq(['file'])
66
+ end
67
+ end
68
+
69
+ context 'when a pattern is passed' do
70
+ let(:args) { ['dir1/*2.rb'] }
71
+
72
+ it 'finds files which match the pattern' do
73
+ expect(found_basenames).to eq(['ruby2.rb'])
74
+ end
75
+ end
76
+
77
+ context 'when same paths are passed' do
78
+ let(:args) { %w(dir1 dir1) }
79
+
80
+ it 'does not return duplicated file paths' do
81
+ count = found_basenames.count { |f| f == 'ruby1.rb' }
82
+ expect(count).to eq(1)
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '#target_files_in_dir' do
88
+ let(:found_files) { target_finder.target_files_in_dir(base_dir) }
89
+ let(:found_basenames) { found_files.map { |f| File.basename(f) } }
90
+ let(:base_dir) { '.' }
91
+
92
+ it 'picks files with extension .rb' do
93
+ rb_file_count = found_files.count { |f| f.end_with?('.rb') }
94
+ expect(rb_file_count).to eq(3)
95
+ end
96
+
97
+ it 'picks ruby executable files with no extension' do
98
+ expect(found_basenames).to include('executable')
99
+ end
100
+
101
+ it 'does not pick files with no extension and no ruby shebang' do
102
+ expect(found_basenames).not_to include('file')
103
+ end
104
+
105
+ it 'picks ruby executable files with no extension' do
106
+ expect(found_basenames).to include('executable')
107
+ end
108
+
109
+ it 'does not pick directories' do
110
+ found_basenames = found_files.map { |f| File.basename(f) }
111
+ expect(found_basenames).not_to include('dir1')
112
+ end
113
+
114
+ it 'picks files specified to be included in config' do
115
+ config = double('config')
116
+ allow(config).to receive(:file_to_include?) do |file|
117
+ File.basename(file) == 'file'
118
+ end
119
+ allow(config).to receive(:file_to_exclude?).and_return(false)
120
+ allow(config_store).to receive(:for).and_return(config)
121
+
122
+ expect(found_basenames).to include('file')
123
+ end
124
+
125
+ it 'does not pick files specified to be excluded in config' do
126
+ config = double('config').as_null_object
127
+ allow(config).to receive(:file_to_include?).and_return(false)
128
+ allow(config).to receive(:file_to_exclude?) do |file|
129
+ File.basename(file) == 'ruby2.rb'
130
+ end
131
+ allow(config_store).to receive(:for).and_return(config)
132
+
133
+ expect(found_basenames).not_to include('ruby2.rb')
134
+ end
135
+
136
+ it 'does not return duplicated paths' do
137
+ config = double('config').as_null_object
138
+ allow(config).to receive(:file_to_include?).and_return(true)
139
+ allow(config).to receive(:file_to_exclude?).and_return(false)
140
+ allow(config_store).to receive(:for).and_return(config)
141
+
142
+ count = found_basenames.count { |f| f == 'ruby1.rb' }
143
+ expect(count).to eq(1)
144
+ end
145
+
146
+ context 'when an exception is raised while reading file' do
147
+ around do |example|
148
+ original_stderr = $stderr
149
+ $stderr = StringIO.new
150
+ begin
151
+ example.run
152
+ ensure
153
+ $stderr = original_stderr
154
+ end
155
+ end
156
+
157
+ before do
158
+ allow_any_instance_of(File).to receive(:readline).and_raise(EOFError)
159
+ end
160
+
161
+ context 'and debug mode is enabled' do
162
+ let(:debug) { true }
163
+
164
+ it 'outputs error message' do
165
+ found_files
166
+ expect($stderr.string).to include('Unprocessable file')
167
+ end
168
+ end
169
+
170
+ context 'and debug mode is disabled' do
171
+ let(:debug) { false }
172
+
173
+ it 'outputs nothing' do
174
+ found_files
175
+ expect($stderr.string).to be_empty
176
+ end
177
+ end
178
+ end
179
+ end
180
+ end