rails_best_practices 1.10.1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. data/.gitignore +1 -0
  2. data/README.md +11 -6
  3. data/assets/result.html.erb +76 -46
  4. data/install_supported_rubies.sh +3 -0
  5. data/lib/rails_best_practices.rb +2 -1
  6. data/lib/rails_best_practices/analyzer.rb +10 -8
  7. data/lib/rails_best_practices/core.rb +0 -4
  8. data/lib/rails_best_practices/core/check.rb +41 -117
  9. data/lib/rails_best_practices/core/error.rb +3 -9
  10. data/lib/rails_best_practices/core/runner.rb +20 -80
  11. data/lib/rails_best_practices/lexicals/long_line_check.rb +2 -1
  12. data/lib/rails_best_practices/lexicals/remove_tab_check.rb +1 -3
  13. data/lib/rails_best_practices/lexicals/remove_trailing_whitespace_check.rb +1 -3
  14. data/lib/rails_best_practices/prepares/config_prepare.rb +1 -1
  15. data/lib/rails_best_practices/prepares/controller_prepare.rb +7 -8
  16. data/lib/rails_best_practices/prepares/helper_prepare.rb +2 -2
  17. data/lib/rails_best_practices/prepares/mailer_prepare.rb +1 -1
  18. data/lib/rails_best_practices/prepares/model_prepare.rb +6 -7
  19. data/lib/rails_best_practices/prepares/route_prepare.rb +12 -13
  20. data/lib/rails_best_practices/prepares/schema_prepare.rb +2 -2
  21. data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +19 -15
  22. data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +10 -17
  23. data/lib/rails_best_practices/reviews/dry_bundler_in_capistrano_review.rb +2 -5
  24. data/lib/rails_best_practices/reviews/hash_syntax_review.rb +3 -30
  25. data/lib/rails_best_practices/reviews/isolate_seed_data_review.rb +7 -10
  26. data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +5 -9
  27. data/lib/rails_best_practices/reviews/law_of_demeter_review.rb +10 -13
  28. data/lib/rails_best_practices/reviews/move_code_into_controller_review.rb +6 -9
  29. data/lib/rails_best_practices/reviews/move_code_into_helper_review.rb +2 -5
  30. data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +7 -13
  31. data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +3 -6
  32. data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +6 -9
  33. data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +3 -6
  34. data/lib/rails_best_practices/reviews/not_use_default_route_review.rb +4 -7
  35. data/lib/rails_best_practices/reviews/not_use_time_ago_in_words_review.rb +2 -5
  36. data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +7 -10
  37. data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +2 -5
  38. data/lib/rails_best_practices/reviews/remove_empty_helpers_review.rb +2 -5
  39. data/lib/rails_best_practices/reviews/remove_unused_methods_in_controllers_review.rb +8 -6
  40. data/lib/rails_best_practices/reviews/remove_unused_methods_in_helpers_review.rb +1 -2
  41. data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +4 -5
  42. data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +9 -12
  43. data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +2 -13
  44. data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +18 -26
  45. data/lib/rails_best_practices/reviews/review.rb +6 -7
  46. data/lib/rails_best_practices/reviews/simplify_render_in_controllers_review.rb +2 -5
  47. data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +2 -5
  48. data/lib/rails_best_practices/reviews/use_before_filter_review.rb +2 -5
  49. data/lib/rails_best_practices/reviews/use_model_association_review.rb +11 -14
  50. data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +11 -8
  51. data/lib/rails_best_practices/reviews/use_observer_review.rb +8 -11
  52. data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +1 -1
  53. data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +12 -18
  54. data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +7 -10
  55. data/lib/rails_best_practices/reviews/use_scope_access_review.rb +4 -10
  56. data/lib/rails_best_practices/version.rb +1 -1
  57. data/rails_best_practices.gemspec +1 -1
  58. data/rails_best_practices.yml +5 -5
  59. data/spec/rails_best_practices/core/check_spec.rb +0 -67
  60. data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +0 -1
  61. data/spec/rails_best_practices/prepares/model_prepare_spec.rb +0 -4
  62. data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +3 -30
  63. data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +22 -0
  64. data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +19 -0
  65. data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +2 -2
  66. data/spec/spec_helper.rb +0 -4
  67. metadata +28 -41
  68. data/Gemfile.lock +0 -71
  69. data/lib/rails_best_practices/core/checking_visitor.rb +0 -80
  70. data/lib/rails_best_practices/core/nil.rb +0 -37
  71. data/lib/rails_best_practices/core_ext/enumerable.rb +0 -9
  72. data/lib/rails_best_practices/core_ext/sexp.rb +0 -840
  73. data/spec/rails_best_practices/core/checking_visitor_spec.rb +0 -79
  74. data/spec/rails_best_practices/core/nil_spec.rb +0 -37
  75. data/spec/rails_best_practices/core_ext/enumerable_spec.rb +0 -7
  76. data/spec/rails_best_practices/core_ext/sexp_spec.rb +0 -613
@@ -1,79 +0,0 @@
1
- # encoding: utf-8
2
- require 'spec_helper'
3
-
4
- module RailsBestPractices::Core
5
-
6
- class TestLexical1; end
7
- class TestLexical2; end
8
- class TestPrepare1 < Check
9
- interesting_nodes :call
10
- interesting_files MODEL_FILES
11
- end
12
-
13
- class TestPrepare2 < Check
14
- interesting_nodes :class
15
- interesting_files MAILER_FILES
16
- end
17
-
18
- class TestReview1 < Check
19
- interesting_nodes :defn
20
- interesting_files CONTROLLER_FILES
21
- end
22
-
23
- class TestReview2 < Check
24
- interesting_nodes :call
25
- interesting_files VIEW_FILES
26
- end
27
-
28
- describe CheckingVisitor do
29
- let(:lexical1) { TestLexical1.new }
30
- let(:lexical2) { TestLexical2.new }
31
- let(:prepare1) { TestPrepare1.new }
32
- let(:prepare2) { TestPrepare2.new }
33
- let(:review1) { TestReview1.new }
34
- let(:review2) { TestReview2.new }
35
- let(:visitor) {
36
- CheckingVisitor.new(
37
- lexicals: [lexical1, lexical2],
38
- prepares: [prepare1, prepare2],
39
- reviews: [review1, review2]
40
- )
41
- }
42
-
43
- it "should lexical check" do
44
- filename = "app/models/user.rb"
45
- content = "class User; end"
46
- lexical1.should_receive(:check).with(filename, content)
47
- lexical2.should_receive(:check).with(filename, content)
48
- visitor.lexical(filename, content)
49
- end
50
-
51
- it "should prepare model associations" do
52
- node = stub(sexp_type: :call, children: [], file: "app/models/user.rb")
53
- prepare1.should_receive(:node_start).with(node)
54
- prepare1.should_receive(:node_end).with(node)
55
- visitor.prepare(node)
56
- end
57
-
58
- it "should prepare mailer names" do
59
- node = stub(sexp_type: :class, children: [], file: "app/mailers/user_mailer.rb")
60
- prepare2.should_receive(:node_start).with(node)
61
- prepare2.should_receive(:node_end).with(node)
62
- visitor.prepare(node)
63
- end
64
-
65
- it "should review controller method definitions" do
66
- node = stub(sexp_type: :defn, children: [], file: "app/controllers/users_controller.rb")
67
- review1.should_receive(:node_start).with(node)
68
- review1.should_receive(:node_end).with(node)
69
- visitor.review(node)
70
- end
71
-
72
- it "should review view calls" do
73
- node = stub(sexp_type: :call, children: [], file: "app/views/users/new.html.erb")
74
- review2.should_receive(:node_start).with(node)
75
- review2.should_receive(:node_end).with(node)
76
- visitor.review(node)
77
- end
78
- end
79
- end
@@ -1,37 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module RailsBestPractices::Core
4
- describe Nil do
5
- let(:core_nil) { Nil.new }
6
-
7
- context "to_s" do
8
- it "should return self" do
9
- core_nil.to_s.should == core_nil
10
- end
11
- end
12
-
13
- context "hash_size" do
14
- it "should return 0" do
15
- core_nil.hash_size.should == 0
16
- end
17
- end
18
-
19
- context "method_missing" do
20
- it "should return self" do
21
- core_nil.undefined.should == core_nil
22
- end
23
- end
24
-
25
- context "present?" do
26
- it "should return false" do
27
- core_nil.should_not be_present
28
- end
29
- end
30
-
31
- context "blank?" do
32
- it "should return true" do
33
- core_nil.should be_blank
34
- end
35
- end
36
- end
37
- end
@@ -1,7 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Enumerable do
4
- it "should get duplications in enumerable" do
5
- ["hello", "world", "hello", "java"].dups.should == ["hello"]
6
- end
7
- end
@@ -1,613 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Sexp do
4
- describe "line" do
5
- before :each do
6
- content = <<-EOF
7
- class Demo
8
- def test
9
- ActiveRecord::Base.connection
10
- end
11
- alias :test_new :test
12
- CONST = { foo: :bar }
13
- end
14
- EOF
15
- @node = parse_content(content)
16
- end
17
-
18
- it "should return class line" do
19
- @node.grep_node(sexp_type: :class).line.should == 1
20
- end
21
-
22
- it "should return def line" do
23
- @node.grep_node(sexp_type: :def).line.should == 2
24
- end
25
-
26
- it "should return const line" do
27
- @node.grep_node(sexp_type: :const_ref).line.should == 1
28
- end
29
-
30
- it "should return const path line" do
31
- @node.grep_node(sexp_type: :const_path_ref).line.should == 3
32
- end
33
-
34
- it "should return alias line" do
35
- @node.grep_node(sexp_type: :alias).line.should == 5
36
- end
37
-
38
- it "should return hash line" do
39
- @node.grep_node(sexp_type: :hash).line.should == 6
40
- end
41
- end
42
-
43
- describe "grep_nodes" do
44
- before :each do
45
- content = <<-EOF
46
- def show
47
- current_user.posts.find(params[:id])
48
- end
49
- EOF
50
- @node = parse_content(content)
51
- end
52
-
53
- it "should get the call nodes with subject current_user" do
54
- nodes = []
55
- @node.grep_nodes(sexp_type: :call, subject: "current_user") { |node| nodes << node }
56
- if RUBY_VERSION == "1.9.2"
57
- nodes.should == [s(:call, s(:var_ref, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21)))]
58
- else
59
- nodes.should == [s(:call, s(:vcall, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21)))]
60
- end
61
- end
62
-
63
- it "should get the call nodes with different messages" do
64
- nodes = []
65
- @node.grep_nodes(sexp_type: :call, message: ["posts", "find"]) { |node| nodes << node }
66
- if RUBY_VERSION == "1.9.2"
67
- nodes.should == [s(:call, s(:call, s(:var_ref, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21))), :".", s(:@ident, "find", s(2, 27))), s(:call, s(:var_ref, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21)))]
68
- else
69
- nodes.should == [s(:call, s(:call, s(:vcall, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21))), :".", s(:@ident, "find", s(2, 27))), s(:call, s(:vcall, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21)))]
70
- end
71
- end
72
-
73
- if RUBY_VERSION == "1.9.2"
74
- it "should get the var_ref node with to_s" do
75
- nodes = []
76
- @node.grep_nodes(sexp_type: :var_ref, to_s: "current_user") { |node| nodes << node }
77
- nodes.should == [s(:var_ref, s(:@ident, "current_user", s(2, 8)))]
78
- end
79
- else
80
- it "should get the vcall node with to_s" do
81
- nodes = []
82
- @node.grep_nodes(sexp_type: :vcall, to_s: "current_user") { |node| nodes << node }
83
- nodes.should == [s(:vcall, s(:@ident, "current_user", s(2, 8)))]
84
- end
85
- end
86
- end
87
-
88
- describe "grep_node" do
89
- before :each do
90
- content = <<-EOF
91
- def show
92
- current_user.posts.find(params[:id])
93
- end
94
- EOF
95
- @node = parse_content(content)
96
- end
97
-
98
- it "should get first node with empty argument" do
99
- node = @node.grep_node(sexp_type: :call, subject: "current_user")
100
- if RUBY_VERSION == "1.9.2"
101
- node.should == s(:call, s(:var_ref, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21)))
102
- else
103
- node.should == s(:call, s(:vcall, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21)))
104
- end
105
- end
106
- end
107
-
108
- describe "grep_nodes_count" do
109
- before :each do
110
- content = <<-EOF
111
- def show
112
- current_user.posts.find(params[:id])
113
- end
114
- EOF
115
- @node = parse_content(content)
116
- end
117
-
118
- it "should get the count of call nodes" do
119
- @node.grep_nodes_count(sexp_type: :call).should == 2
120
- end
121
- end
122
-
123
- describe "subject" do
124
- it "should get subject of assign node" do
125
- node = parse_content("user.name = params[:name]").grep_node(sexp_type: :assign)
126
- subject = node.subject
127
- subject.sexp_type.should == :field
128
- subject.subject.to_s.should == "user"
129
- subject.message.to_s.should == "name"
130
- end
131
-
132
- it "should get subject of field node" do
133
- node = parse_content("user.name = params[:name]").grep_node(sexp_type: :field)
134
- node.subject.to_s.should == "user"
135
- end
136
-
137
- it "should get subject of call node" do
138
- node = parse_content("user.name").grep_node(sexp_type: :call)
139
- node.subject.to_s.should == "user"
140
- end
141
-
142
- it "should get subject of binary" do
143
- node = parse_content("user == 'user_name'").grep_node(sexp_type: :binary)
144
- node.subject.to_s.should == "user"
145
- end
146
-
147
- it "should get subject of command_call" do
148
- content = <<-EOF
149
- map.resources :posts do
150
- end
151
- EOF
152
- node = parse_content(content).grep_node(sexp_type: :command_call)
153
- node.subject.to_s.should == "map"
154
- end
155
-
156
- it "should get subject of method_add_arg" do
157
- node = parse_content("Post.find(:all)").grep_node(sexp_type: :method_add_arg)
158
- node.subject.to_s.should == "Post"
159
- end
160
-
161
- it "should get subject of method_add_block" do
162
- node = parse_content("Post.save do; end").grep_node(sexp_type: :method_add_block)
163
- node.subject.to_s.should == "Post"
164
- end
165
- end
166
-
167
- describe "module_name" do
168
- it "should get module name of module node" do
169
- node = parse_content("module Admin; end").grep_node(sexp_type: :module)
170
- node.module_name.to_s.should == "Admin"
171
- end
172
- end
173
-
174
- describe "class_name" do
175
- it "should get class name of class node" do
176
- node = parse_content("class User; end").grep_node(sexp_type: :class)
177
- node.class_name.to_s.should == "User"
178
- end
179
- end
180
-
181
- describe "base_class" do
182
- it "should get base class of class node" do
183
- node = parse_content("class User < ActiveRecord::Base; end").grep_node(sexp_type: :class)
184
- node.base_class.to_s.should == "ActiveRecord::Base"
185
- end
186
- end
187
-
188
- describe "left_value" do
189
- it "should get the left value of assign" do
190
- node = parse_content("user = current_user").grep_node(sexp_type: :assign)
191
- node.left_value.to_s.should == "user"
192
- end
193
- end
194
-
195
- describe "right_value" do
196
- it "should get the right value of assign" do
197
- node = parse_content("user = current_user").grep_node(sexp_type: :assign)
198
- node.right_value.to_s.should == "current_user"
199
- end
200
- end
201
-
202
- describe "message" do
203
- it "should get the message of command" do
204
- node = parse_content("has_many :projects").grep_node(sexp_type: :command)
205
- node.message.to_s.should == "has_many"
206
- end
207
-
208
- it "should get the message of command_call" do
209
- node = parse_content("map.resources :posts do; end").grep_node(sexp_type: :command_call)
210
- node.message.to_s.should == "resources"
211
- end
212
-
213
- it "should get the message of field" do
214
- node = parse_content("user.name = 'test'").grep_node(sexp_type: :field)
215
- node.message.to_s.should == "name"
216
- end
217
-
218
- it "should get the message of call" do
219
- node = parse_content("user.name").grep_node(sexp_type: :call)
220
- node.message.to_s.should == "name"
221
- end
222
-
223
- it "should get the message of binary" do
224
- node = parse_content("user.name == 'test'").grep_node(sexp_type: :binary)
225
- node.message.to_s.should == "=="
226
- end
227
-
228
- it "should get the message of fcall" do
229
- node = parse_content("test?('world')").grep_node(sexp_type: :fcall)
230
- node.message.to_s.should == "test?"
231
- end
232
-
233
- it "should get the message of method_add_arg" do
234
- node = parse_content("Post.find(:all)").grep_node(sexp_type: :method_add_arg)
235
- node.message.to_s.should == "find"
236
- end
237
-
238
- it "should get the message of method_add_block" do
239
- node = parse_content("Post.save do; end").grep_node(sexp_type: :method_add_block)
240
- node.message.to_s.should == "save"
241
- end
242
- end
243
-
244
- describe "arguments" do
245
- it "should get the arguments of command" do
246
- node = parse_content("resources :posts do; end").grep_node(sexp_type: :command)
247
- node.arguments.sexp_type.should == :args_add_block
248
- end
249
-
250
- it "should get the arguments of command_call" do
251
- node = parse_content("map.resources :posts do; end").grep_node(sexp_type: :command_call)
252
- node.arguments.sexp_type.should == :args_add_block
253
- end
254
-
255
- it "should get the arguments of method_add_arg" do
256
- node = parse_content("User.find(:all)").grep_node(sexp_type: :method_add_arg)
257
- node.arguments.sexp_type.should == :args_add_block
258
- end
259
-
260
- it "should get the arguments of method_add_block" do
261
- node = parse_content("Post.save(false) do; end").grep_node(sexp_type: :method_add_block)
262
- node.arguments.sexp_type.should == :args_add_block
263
- end
264
- end
265
-
266
- describe "argument" do
267
- it "should get the argument of binary" do
268
- node = parse_content("user == current_user").grep_node(sexp_type: :binary)
269
- node.argument.to_s.should == "current_user"
270
- end
271
- end
272
-
273
- describe "all" do
274
- it "should get all arguments" do
275
- node = parse_content("puts 'hello', 'world'").grep_node(sexp_type: :args_add_block)
276
- node.all.map(&:to_s).should == ["hello", "world"]
277
- end
278
-
279
- it "should get all arguments with &:" do
280
- node = parse_content("user.posts.map(&:title)").grep_node(sexp_type: :args_add_block)
281
- node.all.map(&:to_s).should == ["title"]
282
- end
283
-
284
- it "no error for args_add_star" do
285
- node = parse_content("send(:\"\#{route}_url\", *args)").grep_node(sexp_type: :args_add_block)
286
- lambda { node.all }.should_not raise_error
287
- end
288
- end
289
-
290
- describe "conditional_statement" do
291
- it "should get conditional statement of if" do
292
- node = parse_content("if true; end").grep_node(sexp_type: :if)
293
- node.conditional_statement.to_s.should == "true"
294
- end
295
-
296
- it "should get conditional statement of unless" do
297
- node = parse_content("unless true; end").grep_node(sexp_type: :unless)
298
- node.conditional_statement.to_s.should == "true"
299
- end
300
-
301
- it "should get conditional statement of elsif" do
302
- content =<<-EOF
303
- if true
304
- elsif false
305
- end
306
- EOF
307
- node = parse_content(content).grep_node(sexp_type: :elsif)
308
- node.conditional_statement.to_s.should == "false"
309
- end
310
-
311
- it "should get conditional statement of ifop" do
312
- content =<<-EOF
313
- user ? user.name : nil
314
- EOF
315
- node = parse_content(content).grep_node(sexp_type: :ifop)
316
- node.conditional_statement.to_s.should == "user"
317
- end
318
- end
319
-
320
- describe "all_conditions" do
321
- it "should get all conditions" do
322
- node = parse_content("user == current_user && user.valid? || user.admin?").grep_node(sexp_type: :binary)
323
- node.all_conditions.size.should == 3
324
- end
325
- end
326
-
327
- describe "method_name" do
328
- it "should get the method name of def" do
329
- node = parse_content("def show; end").grep_node(sexp_type: :def)
330
- node.method_name.to_s.should == "show"
331
- end
332
-
333
- it "should get the method name of defs" do
334
- node = parse_content("def self.find; end").grep_node(sexp_type: :defs)
335
- node.method_name.to_s.should == "find"
336
- end
337
- end
338
-
339
- describe "body" do
340
- it "should get body of class" do
341
- node = parse_content("class User; end").grep_node(sexp_type: :class)
342
- node.body.sexp_type.should == :bodystmt
343
- end
344
-
345
- it "should get body of def" do
346
- node = parse_content("def login; end").grep_node(sexp_type: :def)
347
- node.body.sexp_type.should == :bodystmt
348
- end
349
-
350
- it "should get body of defs" do
351
- node = parse_content("def self.login; end").grep_node(sexp_type: :defs)
352
- node.body.sexp_type.should == :bodystmt
353
- end
354
-
355
- it "should get body of module" do
356
- node = parse_content("module Enumerable; end").grep_node(sexp_type: :module)
357
- node.body.sexp_type.should == :bodystmt
358
- end
359
-
360
- it "should get body of if" do
361
- node = parse_content("if true; puts 'hello world'; end").grep_node(sexp_type: :if)
362
- node.body.sexp_type.should == :stmts_add
363
- end
364
-
365
- it "should get body of elsif" do
366
- node = parse_content("if true; elsif true; puts 'hello world'; end").grep_node(sexp_type: :elsif)
367
- node.body.sexp_type.should == :stmts_add
368
- end
369
-
370
- it "should get body of unless" do
371
- node = parse_content("unless true; puts 'hello world'; end").grep_node(sexp_type: :unless)
372
- node.body.sexp_type.should == :stmts_add
373
- end
374
-
375
- it "should get body of else" do
376
- node = parse_content("if true; else; puts 'hello world'; end").grep_node(sexp_type: :else)
377
- node.body.sexp_type.should == :stmts_add
378
- end
379
- end
380
-
381
- describe "block" do
382
- it "sould get block of method_add_block node" do
383
- node = parse_content("resources :posts do; resources :comments; end").grep_node(sexp_type: :method_add_block)
384
- node.block.sexp_type.should == :do_block
385
- end
386
- end
387
-
388
- describe "statements" do
389
- it "should get statements of do_block node" do
390
- node = parse_content("resources :posts do; resources :comments; resources :like; end").grep_node(sexp_type: :do_block)
391
- node.statements.size.should == 2
392
- end
393
-
394
- it "should get statements of bodystmt node" do
395
- node = parse_content("class User; def login?; end; def admin?; end; end").grep_node(sexp_type: :bodystmt)
396
- node.statements.size.should == 2
397
- end
398
- end
399
-
400
- describe "hash_value" do
401
- it "should get value for hash node" do
402
- node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(sexp_type: :hash)
403
- node.hash_value("first_name").to_s.should == "Richard"
404
- node.hash_value("last_name").to_s.should == "Huang"
405
- end
406
-
407
- it "should get value for bare_assoc_hash" do
408
- node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(sexp_type: :bare_assoc_hash)
409
- node.hash_value("first_name").to_s.should == "Richard"
410
- node.hash_value("last_name").to_s.should == "Huang"
411
- end
412
- end
413
-
414
- describe "hash_size" do
415
- it "should get value for hash node" do
416
- node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(sexp_type: :hash)
417
- node.hash_size.should == 2
418
- end
419
-
420
- it "should get value for bare_assoc_hash" do
421
- node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(sexp_type: :bare_assoc_hash)
422
- node.hash_size.should == 2
423
- end
424
- end
425
-
426
- describe "hash_keys" do
427
- it "should get hash_keys for hash node" do
428
- node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(sexp_type: :hash)
429
- node.hash_keys.should == ["first_name", "last_name"]
430
- end
431
-
432
- it "should get hash_keys for bare_assoc_hash" do
433
- node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(sexp_type: :bare_assoc_hash)
434
- node.hash_keys.should == ["first_name", "last_name"]
435
- end
436
- end
437
-
438
- describe "hash_values" do
439
- it "should get hash_values for hash node" do
440
- node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(sexp_type: :hash)
441
- node.hash_values.map(&:to_s).should == ["Richard", "Huang"]
442
- end
443
-
444
- it "should get hash_values for bare_assoc_hash" do
445
- node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(sexp_type: :bare_assoc_hash)
446
- node.hash_values.map(&:to_s).should == ["Richard", "Huang"]
447
- end
448
- end
449
-
450
- describe "array_size" do
451
- it "should get array size" do
452
- node = parse_content("['first_name', 'last_name']").grep_node(sexp_type: :array)
453
- node.array_size.should == 2
454
- end
455
-
456
- it "should get 0" do
457
- node = parse_content("[]").grep_node(sexp_type: :array)
458
- node.array_size.should == 0
459
- end
460
- end
461
-
462
- describe "array_values" do
463
- it "should get array values" do
464
- node = parse_content("['first_name', 'last_name']").grep_node(sexp_type: :array)
465
- node.array_values.map(&:to_s).should == ["first_name", "last_name"]
466
- end
467
-
468
- it "should get empty array values" do
469
- node = parse_content("[]").grep_node(sexp_type: :array)
470
- node.array_values.should == []
471
- end
472
-
473
- it "should get array value with qwords" do
474
- node = parse_content("%w(first_name last_name)").grep_node(sexp_type: :qwords_add)
475
- node.array_values.map(&:to_s).should == ["first_name", "last_name"]
476
- end
477
- end
478
-
479
- describe "alias" do
480
- context "method" do
481
- before do
482
- @node = parse_content("alias new old").grep_node(sexp_type: :alias)
483
- end
484
-
485
- it "should get old_method" do
486
- @node.old_method.to_s.should == "old"
487
- end
488
-
489
- it "should get new_method" do
490
- @node.new_method.to_s.should == "new"
491
- end
492
- end
493
-
494
- context "symbol" do
495
- before do
496
- @node = parse_content("alias :new :old").grep_node(sexp_type: :alias)
497
- end
498
-
499
- it "should get old_method" do
500
- @node.old_method.to_s.should == "old"
501
- end
502
-
503
- it "should get new_method" do
504
- @node.new_method.to_s.should == "new"
505
- end
506
- end
507
- end
508
-
509
- describe "to_object" do
510
- it "should to array" do
511
- node = parse_content("['first_name', 'last_name']").grep_node(sexp_type: :array)
512
- node.to_object.should == ["first_name", "last_name"]
513
- end
514
-
515
- it "should to array with %w()" do
516
- node = parse_content("%w(new create)").grep_node(sexp_type: :array)
517
- node.to_object.should == ["new", "create"]
518
- end
519
-
520
- it "should to array with symbols" do
521
- node = parse_content("[:first_name, :last_name]").grep_node(sexp_type: :array)
522
- node.to_object.should == ["first_name", "last_name"]
523
- end
524
-
525
- it "should to empty array" do
526
- node = parse_content("[]").grep_node(sexp_type: :array)
527
- node.to_object.should == []
528
- end
529
-
530
- it "should to string" do
531
- node = parse_content("'richard'").grep_node(sexp_type: :string_literal)
532
- node.to_object.should == "richard"
533
- end
534
- end
535
-
536
- describe "to_s" do
537
- it "should get to_s for string" do
538
- node = parse_content("'user'").grep_node(sexp_type: :string_literal)
539
- node.to_s.should == "user"
540
- end
541
-
542
- it "should get to_s for symbol" do
543
- node = parse_content(":user").grep_node(sexp_type: :symbol_literal)
544
- node.to_s.should == "user"
545
- end
546
-
547
- it "should get to_s for const" do
548
- node = parse_content("User").grep_node(sexp_type: :@const)
549
- node.to_s.should == "User"
550
- end
551
-
552
- it "should get to_s for ivar" do
553
- node = parse_content("@user").grep_node(sexp_type: :@ivar)
554
- node.to_s.should == "@user"
555
- end
556
-
557
- it "should get to_s for class with module" do
558
- node = parse_content("ActiveRecord::Base").grep_node(sexp_type: :const_path_ref)
559
- node.to_s.should == "ActiveRecord::Base"
560
- end
561
-
562
- it "should get to_s for label" do
563
- node = parse_content("{first_name: 'Richard'}").grep_node(sexp_type: :@label)
564
- node.to_s.should == "first_name"
565
- end
566
-
567
- it "should get to_s for call" do
568
- node = parse_content("current_user.post").grep_node(sexp_type: :call)
569
- node.to_s.should == "current_user.post"
570
- end
571
- end
572
-
573
- describe "const?" do
574
- it "should return true for const with var_ref" do
575
- node = parse_content("User.find").grep_node(sexp_type: :var_ref)
576
- node.should be_const
577
- end
578
-
579
- it "should return true for const with @const" do
580
- node = parse_content("User.find").grep_node(sexp_type: :@const)
581
- node.should be_const
582
- end
583
-
584
- it "should return false for ivar" do
585
- node = parse_content("@user.find").grep_node(sexp_type: :@ivar)
586
- node.should_not be_const
587
- end
588
- end
589
-
590
- describe "present?" do
591
- it "should return true" do
592
- node = parse_content("hello world")
593
- node.should be_present
594
- end
595
- end
596
-
597
- describe "blank?" do
598
- it "should return false" do
599
- node = parse_content("hello world")
600
- node.should_not be_blank
601
- end
602
- end
603
-
604
- describe "remove_line_and_column" do
605
- it "should remove" do
606
- s(:@ident, "test", s(2, 12)).remove_line_and_column.should_equal s(:@ident, "test")
607
- end
608
-
609
- it "should remove child nodes" do
610
- s(:const_ref, s(:@const, "Demo", s(1, 12))).remove_line_and_column.should_equal s(:const_def, s(:@const, "Demo"))
611
- end
612
- end
613
- end