rails_best_practices 1.10.1 → 1.11.0

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 (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