rails_best_practices 1.9.1 → 1.10.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.
- data/.rvmrc +1 -1
- data/Gemfile +1 -1
- data/Gemfile.lock +10 -2
- data/README.md +33 -27
- data/lib/rails_best_practices/analyzer.rb +13 -13
- data/lib/rails_best_practices/core/check.rb +7 -6
- data/lib/rails_best_practices/core/checking_visitor.rb +1 -1
- data/lib/rails_best_practices/core/runner.rb +2 -3
- data/lib/rails_best_practices/core_ext/sexp.rb +18 -17
- data/lib/rails_best_practices/lexicals.rb +1 -0
- data/lib/rails_best_practices/lexicals/long_line_check.rb +31 -0
- data/lib/rails_best_practices/prepares/config_prepare.rb +1 -1
- data/lib/rails_best_practices/reviews.rb +2 -0
- data/lib/rails_best_practices/reviews/add_model_virtual_attribute_review.rb +2 -2
- data/lib/rails_best_practices/reviews/always_add_db_index_review.rb +1 -1
- data/lib/rails_best_practices/reviews/hash_syntax_review.rb +63 -0
- data/lib/rails_best_practices/reviews/keep_finders_on_their_own_model_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_code_into_model_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_finder_to_named_scope_review.rb +1 -1
- data/lib/rails_best_practices/reviews/move_model_logic_into_model_review.rb +1 -1
- data/lib/rails_best_practices/reviews/needless_deep_nesting_review.rb +1 -1
- data/lib/rails_best_practices/reviews/overuse_route_customizations_review.rb +1 -1
- data/lib/rails_best_practices/reviews/protect_mass_assignment_review.rb +15 -6
- data/lib/rails_best_practices/reviews/remove_unused_methods_in_models_review.rb +4 -2
- data/lib/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review.rb +8 -4
- data/lib/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review.rb +2 -1
- data/lib/rails_best_practices/reviews/restrict_auto_generated_routes_review.rb +52 -8
- data/lib/rails_best_practices/reviews/simplify_render_in_views_review.rb +14 -2
- data/lib/rails_best_practices/reviews/use_before_filter_review.rb +8 -3
- data/lib/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review.rb +2 -1
- data/lib/rails_best_practices/reviews/use_observer_review.rb +1 -1
- data/lib/rails_best_practices/reviews/use_parentheses_in_method_def_review.rb +33 -0
- data/lib/rails_best_practices/reviews/use_query_attribute_review.rb +16 -6
- data/lib/rails_best_practices/reviews/use_say_with_time_in_migrations_review.rb +9 -6
- data/lib/rails_best_practices/reviews/use_scope_access_review.rb +8 -3
- data/lib/rails_best_practices/version.rb +1 -1
- data/rails_best_practices.yml +28 -25
- data/rake_rubies.sh +1 -1
- data/spec/rails_best_practices/analyzer_spec.rb +1 -1
- data/spec/rails_best_practices/core/check_spec.rb +7 -7
- data/spec/rails_best_practices/core/checking_visitor_spec.rb +7 -7
- data/spec/rails_best_practices/core/error_spec.rb +12 -12
- data/spec/rails_best_practices/core_ext/sexp_spec.rb +103 -85
- data/spec/rails_best_practices/lexicals/long_line_check_spec.rb +47 -0
- data/spec/rails_best_practices/lexicals/remove_tab_check_spec.rb +1 -1
- data/spec/rails_best_practices/lexicals/remove_trailing_whitespace_check_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/config_prepare_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/controller_prepare_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/helper_prepare_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/mailer_prepare_spec.rb +1 -1
- data/spec/rails_best_practices/prepares/model_prepare_spec.rb +4 -4
- data/spec/rails_best_practices/prepares/route_prepare_spec.rb +54 -54
- data/spec/rails_best_practices/prepares/schema_prepare_spec.rb +6 -6
- data/spec/rails_best_practices/reviews/add_model_virtual_attribute_review_spec.rb +4 -4
- data/spec/rails_best_practices/reviews/always_add_db_index_review_spec.rb +46 -46
- data/spec/rails_best_practices/reviews/dry_bundler_in_capistrano_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/hash_syntax_review_spec.rb +67 -0
- data/spec/rails_best_practices/reviews/isolate_seed_data_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/keep_finders_on_their_own_model_review_spec.rb +9 -9
- data/spec/rails_best_practices/reviews/law_of_demeter_review_spec.rb +7 -7
- data/spec/rails_best_practices/reviews/move_code_into_controller_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/move_code_into_helper_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/move_code_into_model_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/move_finder_to_named_scope_review_spec.rb +13 -13
- data/spec/rails_best_practices/reviews/move_model_logic_into_model_review_spec.rb +2 -2
- data/spec/rails_best_practices/reviews/needless_deep_nesting_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/not_use_default_route_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/not_use_times_ago_in_words_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/overuse_route_customizations_review_spec.rb +26 -26
- data/spec/rails_best_practices/reviews/protect_mass_assignment_review_spec.rb +11 -2
- data/spec/rails_best_practices/reviews/remove_empty_helpers_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_controllers_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_helpers_review_spec.rb +2 -2
- data/spec/rails_best_practices/reviews/remove_unused_methods_in_models_review_spec.rb +25 -10
- data/spec/rails_best_practices/reviews/replace_complex_creation_with_factory_method_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/replace_instance_variable_with_local_variable_review_spec.rb +1 -1
- data/spec/rails_best_practices/reviews/restrict_auto_generated_routes_review_spec.rb +28 -28
- data/spec/rails_best_practices/reviews/simplify_render_in_controllers_review_spec.rb +4 -4
- data/spec/rails_best_practices/reviews/simplify_render_in_views_review_spec.rb +15 -7
- data/spec/rails_best_practices/reviews/use_before_filter_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/use_model_association_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/use_multipart_alternative_as_content_type_of_email_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/use_observer_review_spec.rb +5 -5
- data/spec/rails_best_practices/reviews/use_parenthesis_in_method_def_spec.rb +41 -0
- data/spec/rails_best_practices/reviews/use_query_attribute_review_spec.rb +3 -3
- data/spec/rails_best_practices/reviews/use_say_with_time_in_migrations_review_spec.rb +8 -8
- data/spec/rails_best_practices/reviews/use_scope_access_review_spec.rb +9 -9
- data/spec/spec_helper.rb +1 -1
- metadata +36 -29
- data/.rspec.example +0 -2
- data/.rvmrc.example +0 -2
@@ -3,17 +3,19 @@ require 'rails_best_practices/reviews/review'
|
|
3
3
|
|
4
4
|
module RailsBestPractices
|
5
5
|
module Reviews
|
6
|
-
# Review a migration file to make sure to use say or say_with_time for customized data changes
|
6
|
+
# Review a migration file to make sure to use say or say_with_time for customized data changes
|
7
|
+
# to produce a more readable output.
|
7
8
|
#
|
8
|
-
# See the best practice detials here
|
9
|
+
# See the best practice detials here
|
10
|
+
# http://rails-bestpractices.com/posts/46-use-say-and-say_with_time-in-migrations-to-make-a-useful-migration-log.
|
9
11
|
#
|
10
12
|
# Implementation:
|
11
13
|
#
|
12
14
|
# Review process:
|
13
15
|
# check class method define nodes (self.up or self.down).
|
14
16
|
# if there is a method call in the class method definition,
|
15
|
-
# and the message of method call is not say, say_with_time and default migration methods
|
16
|
-
# then the method call should be wrapped by say or say_with_time.
|
17
|
+
# and the message of method call is not say, say_with_time and default migration methods
|
18
|
+
# (such as add_column and create_table), then the method call should be wrapped by say or say_with_time.
|
17
19
|
class UseSayWithTimeInMigrationsReview < Review
|
18
20
|
interesting_nodes :defs
|
19
21
|
interesting_files MIGRATION_FILES
|
@@ -24,14 +26,15 @@ module RailsBestPractices
|
|
24
26
|
"http://rails-bestpractices.com/posts/46-use-say-and-say_with_time-in-migrations-to-make-a-useful-migration-log"
|
25
27
|
end
|
26
28
|
|
27
|
-
# check a class method define node to see if there are method calls that need to be wrapped by say
|
29
|
+
# check a class method define node to see if there are method calls that need to be wrapped by say
|
30
|
+
# or say_with_time.
|
28
31
|
#
|
29
32
|
# it will check the first block node,
|
30
33
|
# if any method call whose message is not default migration methods in the block node,
|
31
34
|
# then such method call should be wrapped by say or say_with_time
|
32
35
|
def start_defs(node)
|
33
36
|
node.body.statements.each do |child_node|
|
34
|
-
next if child_node.grep_nodes_count(:
|
37
|
+
next if child_node.grep_nodes_count(sexp_type: [:fcall, :command], message: WITH_SAY_METHODS) > 0
|
35
38
|
|
36
39
|
subject_node = if :method_add_block == child_node.sexp_type
|
37
40
|
child_node[1]
|
@@ -42,11 +42,16 @@ module RailsBestPractices
|
|
42
42
|
# and there is a redirect_to method call in the block body,
|
43
43
|
# then it should be replaced by using scope access.
|
44
44
|
def current_user_redirect?(node)
|
45
|
-
all_conditions = node.conditional_statement == node.conditional_statement.all_conditions
|
45
|
+
all_conditions = if node.conditional_statement == node.conditional_statement.all_conditions
|
46
|
+
[node.conditional_statement]
|
47
|
+
else
|
48
|
+
node.conditional_statement.all_conditions
|
49
|
+
end
|
46
50
|
results = all_conditions.map do |condition_node|
|
47
|
-
["==", "!="].include?(condition_node.message.to_s) &&
|
51
|
+
["==", "!="].include?(condition_node.message.to_s) &&
|
52
|
+
(current_user?(condition_node.argument) || current_user?(condition_node.subject))
|
48
53
|
end
|
49
|
-
results.any? { |result| result == true } && node.body.grep_node(:
|
54
|
+
results.any? { |result| result == true } && node.body.grep_node(message: "redirect_to")
|
50
55
|
end
|
51
56
|
|
52
57
|
# check a call node to see if it uses current_user, or current_user.id.
|
data/rails_best_practices.yml
CHANGED
@@ -1,34 +1,37 @@
|
|
1
|
-
MoveFinderToNamedScopeCheck: { }
|
2
|
-
UseModelAssociationCheck: { }
|
3
|
-
UseScopeAccessCheck: { }
|
4
1
|
AddModelVirtualAttributeCheck: { }
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
NotUseDefaultRouteCheck: { }
|
2
|
+
AlwaysAddDbIndexCheck: { }
|
3
|
+
DryBundlerInCapistranoCheck: { }
|
4
|
+
HashSyntaxCheck: { only_symbol: false, only_string: false }
|
5
|
+
IsolateSeedDataCheck: { }
|
10
6
|
KeepFindersOnTheirOwnModelCheck: { }
|
11
7
|
LawOfDemeterCheck: { }
|
12
|
-
|
13
|
-
IsolateSeedDataCheck: { }
|
14
|
-
AlwaysAddDbIndexCheck: { }
|
15
|
-
UseBeforeFilterCheck: { customize_count: 2 }
|
8
|
+
LongLineCheck: { max_line_length: 80 }
|
16
9
|
MoveCodeIntoControllerCheck: { }
|
17
|
-
MoveCodeIntoModelCheck: { use_count: 2 }
|
18
10
|
MoveCodeIntoHelperCheck: { array_count: 3 }
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
11
|
+
MoveCodeIntoModelCheck: { use_count: 2 }
|
12
|
+
MoveFinderToNamedScopeCheck: { }
|
13
|
+
MoveModelLogicIntoModelCheck: { use_count: 4 }
|
14
|
+
NeedlessDeepNestingCheck: { nested_count: 2 }
|
15
|
+
NotUseDefaultRouteCheck: { }
|
16
|
+
NotUseTimeAgoInWordsCheck: { }
|
17
|
+
OveruseRouteCustomizationsCheck: { customize_count: 3 }
|
18
|
+
ProtectMassAssignmentCheck: { }
|
27
19
|
RemoveEmptyHelpersCheck: { }
|
28
20
|
RemoveTabCheck: { }
|
29
|
-
|
30
|
-
RemoveUnusedMethodsInModelsCheck: { except_methods: [] }
|
21
|
+
RemoveTrailingWhitespaceCheck: { }
|
31
22
|
RemoveUnusedMethodsInControllersCheck: { except_methods: [] }
|
32
23
|
RemoveUnusedMethodsInHelpersCheck: { except_methods: [] }
|
33
|
-
|
34
|
-
|
24
|
+
RemoveUnusedMethodsInModelsCheck: { except_methods: [] }
|
25
|
+
ReplaceComplexCreationWithFactoryMethodCheck: { attribute_assignment_count: 2 }
|
26
|
+
ReplaceInstanceVariableWithLocalVariableCheck: { }
|
27
|
+
RestrictAutoGeneratedRoutesCheck: { }
|
28
|
+
SimplifyRenderInControllersCheck: { }
|
29
|
+
SimplifyRenderInViewsCheck: { }
|
30
|
+
UseBeforeFilterCheck: { customize_count: 2 }
|
31
|
+
UseModelAssociationCheck: { }
|
32
|
+
UseMultipartAlternativeAsContentTypeOfEmailCheck: { }
|
33
|
+
UseParenthesesInMethodDefCheck: { }
|
34
|
+
UseObserverCheck: { }
|
35
|
+
UseQueryAttributeCheck: { }
|
36
|
+
UseSayWithTimeInMigrationsCheck: { }
|
37
|
+
UseScopeAccessCheck: { }
|
data/rake_rubies.sh
CHANGED
@@ -29,7 +29,7 @@ module RailsBestPractices
|
|
29
29
|
it "should output errors in terminal" do
|
30
30
|
check1 = Reviews::LawOfDemeterReview.new
|
31
31
|
check2 = Reviews::UseQueryAttributeReview.new
|
32
|
-
runner = Core::Runner.new(:
|
32
|
+
runner = Core::Runner.new(reviews: [check1, check2])
|
33
33
|
check1.add_error "law of demeter", "app/models/user.rb", 10
|
34
34
|
check2.add_error "use query attribute", "app/models/post.rb", 100
|
35
35
|
subject.runner = runner
|
@@ -14,19 +14,19 @@ module RailsBestPractices::Core
|
|
14
14
|
|
15
15
|
context "node_start" do
|
16
16
|
it "should call start_if" do
|
17
|
-
node = stub(:
|
17
|
+
node = stub(sexp_type: :if)
|
18
18
|
check.should_receive(:send).with("start_if", node)
|
19
19
|
check.node_start(node)
|
20
20
|
end
|
21
21
|
|
22
22
|
it "should call start_call" do
|
23
|
-
node = stub(:
|
23
|
+
node = stub(sexp_type: :call)
|
24
24
|
check.should_receive(:send).with("start_call", node)
|
25
25
|
check.node_start(node)
|
26
26
|
end
|
27
27
|
|
28
28
|
it "should print node if debug mode" do
|
29
|
-
node = stub(:
|
29
|
+
node = stub(sexp_type: :call)
|
30
30
|
Check.class_eval { debug }
|
31
31
|
check.should_receive(:send).with("start_call", node)
|
32
32
|
check.should_receive(:ap).with(node)
|
@@ -37,13 +37,13 @@ module RailsBestPractices::Core
|
|
37
37
|
|
38
38
|
context "node_end" do
|
39
39
|
it "should call end_if" do
|
40
|
-
node = stub(:
|
40
|
+
node = stub(sexp_type: :if)
|
41
41
|
check.should_receive(:send).with("end_if", node)
|
42
42
|
check.node_end(node)
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should call end_call" do
|
46
|
-
node = stub(:
|
46
|
+
node = stub(sexp_type: :call)
|
47
47
|
check.should_receive(:send).with("end_call", node)
|
48
48
|
check.node_end(node)
|
49
49
|
end
|
@@ -55,7 +55,7 @@ module RailsBestPractices::Core
|
|
55
55
|
check.class.add_callback "start_call" do
|
56
56
|
execute = true
|
57
57
|
end
|
58
|
-
node = stub(:
|
58
|
+
node = stub(sexp_type: :call)
|
59
59
|
check.node_start(node)
|
60
60
|
execute.should be_true
|
61
61
|
end
|
@@ -65,7 +65,7 @@ module RailsBestPractices::Core
|
|
65
65
|
check.class.add_callback "end_call" do
|
66
66
|
execute = true
|
67
67
|
end
|
68
|
-
node = stub(:
|
68
|
+
node = stub(sexp_type: :call)
|
69
69
|
check.node_end(node)
|
70
70
|
execute.should be_true
|
71
71
|
end
|
@@ -34,9 +34,9 @@ module RailsBestPractices::Core
|
|
34
34
|
let(:review2) { TestReview2.new }
|
35
35
|
let(:visitor) {
|
36
36
|
CheckingVisitor.new(
|
37
|
-
:
|
38
|
-
:
|
39
|
-
:
|
37
|
+
lexicals: [lexical1, lexical2],
|
38
|
+
prepares: [prepare1, prepare2],
|
39
|
+
reviews: [review1, review2]
|
40
40
|
)
|
41
41
|
}
|
42
42
|
|
@@ -49,28 +49,28 @@ module RailsBestPractices::Core
|
|
49
49
|
end
|
50
50
|
|
51
51
|
it "should prepare model associations" do
|
52
|
-
node = stub(:
|
52
|
+
node = stub(sexp_type: :call, children: [], file: "app/models/user.rb")
|
53
53
|
prepare1.should_receive(:node_start).with(node)
|
54
54
|
prepare1.should_receive(:node_end).with(node)
|
55
55
|
visitor.prepare(node)
|
56
56
|
end
|
57
57
|
|
58
58
|
it "should prepare mailer names" do
|
59
|
-
node = stub(:
|
59
|
+
node = stub(sexp_type: :class, children: [], file: "app/mailers/user_mailer.rb")
|
60
60
|
prepare2.should_receive(:node_start).with(node)
|
61
61
|
prepare2.should_receive(:node_end).with(node)
|
62
62
|
visitor.prepare(node)
|
63
63
|
end
|
64
64
|
|
65
65
|
it "should review controller method definitions" do
|
66
|
-
node = stub(:
|
66
|
+
node = stub(sexp_type: :defn, children: [], file: "app/controllers/users_controller.rb")
|
67
67
|
review1.should_receive(:node_start).with(node)
|
68
68
|
review1.should_receive(:node_end).with(node)
|
69
69
|
visitor.review(node)
|
70
70
|
end
|
71
71
|
|
72
72
|
it "should review view calls" do
|
73
|
-
node = stub(:
|
73
|
+
node = stub(sexp_type: :call, children: [], file: "app/views/users/new.html.erb")
|
74
74
|
review2.should_receive(:node_start).with(node)
|
75
75
|
review2.should_receive(:node_end).with(node)
|
76
76
|
visitor.review(node)
|
@@ -8,27 +8,27 @@ module RailsBestPractices::Core
|
|
8
8
|
|
9
9
|
it "should return error with filename, line number and message" do
|
10
10
|
Error.new(
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
11
|
+
filename: "app/models/user.rb",
|
12
|
+
line_number: "100",
|
13
|
+
message: "not good",
|
14
|
+
type: "BogusReview").to_s.should == "app/models/user.rb:100 - not good"
|
15
15
|
end
|
16
16
|
|
17
17
|
it "should return short filename" do
|
18
18
|
Runner.base_path = "../rails-bestpractices.com"
|
19
19
|
Error.new(
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
20
|
+
filename: "../rails-bestpractices.com/app/models/user.rb",
|
21
|
+
line_number: "100",
|
22
|
+
message: "not good",
|
23
|
+
type: "BogusReview").short_filename.should == "app/models/user.rb"
|
24
24
|
end
|
25
25
|
|
26
26
|
it "should return first line number" do
|
27
27
|
Error.new(
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
31
|
-
:
|
28
|
+
filename: "app/models/user.rb",
|
29
|
+
line_number: "50,70,100",
|
30
|
+
message: "not good",
|
31
|
+
type: "BogusReview").first_line_number.should == "50"
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
@@ -9,29 +9,34 @@ describe Sexp do
|
|
9
9
|
ActiveRecord::Base.connection
|
10
10
|
end
|
11
11
|
alias :test_new :test
|
12
|
+
CONST = { foo: :bar }
|
12
13
|
end
|
13
14
|
EOF
|
14
15
|
@node = parse_content(content)
|
15
16
|
end
|
16
17
|
|
17
18
|
it "should return class line" do
|
18
|
-
@node.grep_node(:
|
19
|
+
@node.grep_node(sexp_type: :class).line.should == 1
|
19
20
|
end
|
20
21
|
|
21
22
|
it "should return def line" do
|
22
|
-
@node.grep_node(:
|
23
|
+
@node.grep_node(sexp_type: :def).line.should == 2
|
23
24
|
end
|
24
25
|
|
25
26
|
it "should return const line" do
|
26
|
-
@node.grep_node(:
|
27
|
+
@node.grep_node(sexp_type: :const_ref).line.should == 1
|
27
28
|
end
|
28
29
|
|
29
30
|
it "should return const path line" do
|
30
|
-
@node.grep_node(:
|
31
|
+
@node.grep_node(sexp_type: :const_path_ref).line.should == 3
|
31
32
|
end
|
32
33
|
|
33
34
|
it "should return alias line" do
|
34
|
-
@node.grep_node(:
|
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
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
@@ -47,7 +52,7 @@ describe Sexp do
|
|
47
52
|
|
48
53
|
it "should get the call nodes with subject current_user" do
|
49
54
|
nodes = []
|
50
|
-
@node.grep_nodes(:
|
55
|
+
@node.grep_nodes(sexp_type: :call, subject: "current_user") { |node| nodes << node }
|
51
56
|
if RUBY_VERSION == "1.9.2"
|
52
57
|
nodes.should == [s(:call, s(:var_ref, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21)))]
|
53
58
|
else
|
@@ -57,7 +62,7 @@ describe Sexp do
|
|
57
62
|
|
58
63
|
it "should get the call nodes with different messages" do
|
59
64
|
nodes = []
|
60
|
-
@node.grep_nodes(:
|
65
|
+
@node.grep_nodes(sexp_type: :call, message: ["posts", "find"]) { |node| nodes << node }
|
61
66
|
if RUBY_VERSION == "1.9.2"
|
62
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)))]
|
63
68
|
else
|
@@ -68,13 +73,13 @@ describe Sexp do
|
|
68
73
|
if RUBY_VERSION == "1.9.2"
|
69
74
|
it "should get the var_ref node with to_s" do
|
70
75
|
nodes = []
|
71
|
-
@node.grep_nodes(:
|
76
|
+
@node.grep_nodes(sexp_type: :var_ref, to_s: "current_user") { |node| nodes << node }
|
72
77
|
nodes.should == [s(:var_ref, s(:@ident, "current_user", s(2, 8)))]
|
73
78
|
end
|
74
79
|
else
|
75
80
|
it "should get the vcall node with to_s" do
|
76
81
|
nodes = []
|
77
|
-
@node.grep_nodes(:
|
82
|
+
@node.grep_nodes(sexp_type: :vcall, to_s: "current_user") { |node| nodes << node }
|
78
83
|
nodes.should == [s(:vcall, s(:@ident, "current_user", s(2, 8)))]
|
79
84
|
end
|
80
85
|
end
|
@@ -91,7 +96,7 @@ describe Sexp do
|
|
91
96
|
end
|
92
97
|
|
93
98
|
it "should get first node with empty argument" do
|
94
|
-
node = @node.grep_node(:
|
99
|
+
node = @node.grep_node(sexp_type: :call, subject: "current_user")
|
95
100
|
if RUBY_VERSION == "1.9.2"
|
96
101
|
node.should == s(:call, s(:var_ref, s(:@ident, "current_user", s(2, 8))), :".", s(:@ident, "posts", s(2, 21)))
|
97
102
|
else
|
@@ -111,13 +116,13 @@ describe Sexp do
|
|
111
116
|
end
|
112
117
|
|
113
118
|
it "should get the count of call nodes" do
|
114
|
-
@node.grep_nodes_count(:
|
119
|
+
@node.grep_nodes_count(sexp_type: :call).should == 2
|
115
120
|
end
|
116
121
|
end
|
117
122
|
|
118
123
|
describe "subject" do
|
119
124
|
it "should get subject of assign node" do
|
120
|
-
node = parse_content("user.name = params[:name]").grep_node(:
|
125
|
+
node = parse_content("user.name = params[:name]").grep_node(sexp_type: :assign)
|
121
126
|
subject = node.subject
|
122
127
|
subject.sexp_type.should == :field
|
123
128
|
subject.subject.to_s.should == "user"
|
@@ -125,17 +130,17 @@ describe Sexp do
|
|
125
130
|
end
|
126
131
|
|
127
132
|
it "should get subject of field node" do
|
128
|
-
node = parse_content("user.name = params[:name]").grep_node(:
|
133
|
+
node = parse_content("user.name = params[:name]").grep_node(sexp_type: :field)
|
129
134
|
node.subject.to_s.should == "user"
|
130
135
|
end
|
131
136
|
|
132
137
|
it "should get subject of call node" do
|
133
|
-
node = parse_content("user.name").grep_node(:
|
138
|
+
node = parse_content("user.name").grep_node(sexp_type: :call)
|
134
139
|
node.subject.to_s.should == "user"
|
135
140
|
end
|
136
141
|
|
137
142
|
it "should get subject of binary" do
|
138
|
-
node = parse_content("user == 'user_name'").grep_node(:
|
143
|
+
node = parse_content("user == 'user_name'").grep_node(sexp_type: :binary)
|
139
144
|
node.subject.to_s.should == "user"
|
140
145
|
end
|
141
146
|
|
@@ -144,152 +149,152 @@ describe Sexp do
|
|
144
149
|
map.resources :posts do
|
145
150
|
end
|
146
151
|
EOF
|
147
|
-
node = parse_content(content).grep_node(:
|
152
|
+
node = parse_content(content).grep_node(sexp_type: :command_call)
|
148
153
|
node.subject.to_s.should == "map"
|
149
154
|
end
|
150
155
|
|
151
156
|
it "should get subject of method_add_arg" do
|
152
|
-
node = parse_content("Post.find(:all)").grep_node(:
|
157
|
+
node = parse_content("Post.find(:all)").grep_node(sexp_type: :method_add_arg)
|
153
158
|
node.subject.to_s.should == "Post"
|
154
159
|
end
|
155
160
|
|
156
161
|
it "should get subject of method_add_block" do
|
157
|
-
node = parse_content("Post.save do; end").grep_node(:
|
162
|
+
node = parse_content("Post.save do; end").grep_node(sexp_type: :method_add_block)
|
158
163
|
node.subject.to_s.should == "Post"
|
159
164
|
end
|
160
165
|
end
|
161
166
|
|
162
167
|
describe "module_name" do
|
163
168
|
it "should get module name of module node" do
|
164
|
-
node = parse_content("module Admin; end").grep_node(:
|
169
|
+
node = parse_content("module Admin; end").grep_node(sexp_type: :module)
|
165
170
|
node.module_name.to_s.should == "Admin"
|
166
171
|
end
|
167
172
|
end
|
168
173
|
|
169
174
|
describe "class_name" do
|
170
175
|
it "should get class name of class node" do
|
171
|
-
node = parse_content("class User; end").grep_node(:
|
176
|
+
node = parse_content("class User; end").grep_node(sexp_type: :class)
|
172
177
|
node.class_name.to_s.should == "User"
|
173
178
|
end
|
174
179
|
end
|
175
180
|
|
176
181
|
describe "base_class" do
|
177
182
|
it "should get base class of class node" do
|
178
|
-
node = parse_content("class User < ActiveRecord::Base; end").grep_node(:
|
183
|
+
node = parse_content("class User < ActiveRecord::Base; end").grep_node(sexp_type: :class)
|
179
184
|
node.base_class.to_s.should == "ActiveRecord::Base"
|
180
185
|
end
|
181
186
|
end
|
182
187
|
|
183
188
|
describe "left_value" do
|
184
189
|
it "should get the left value of assign" do
|
185
|
-
node = parse_content("user = current_user").grep_node(:
|
190
|
+
node = parse_content("user = current_user").grep_node(sexp_type: :assign)
|
186
191
|
node.left_value.to_s.should == "user"
|
187
192
|
end
|
188
193
|
end
|
189
194
|
|
190
195
|
describe "right_value" do
|
191
196
|
it "should get the right value of assign" do
|
192
|
-
node = parse_content("user = current_user").grep_node(:
|
197
|
+
node = parse_content("user = current_user").grep_node(sexp_type: :assign)
|
193
198
|
node.right_value.to_s.should == "current_user"
|
194
199
|
end
|
195
200
|
end
|
196
201
|
|
197
202
|
describe "message" do
|
198
203
|
it "should get the message of command" do
|
199
|
-
node = parse_content("has_many :projects").grep_node(:
|
204
|
+
node = parse_content("has_many :projects").grep_node(sexp_type: :command)
|
200
205
|
node.message.to_s.should == "has_many"
|
201
206
|
end
|
202
207
|
|
203
208
|
it "should get the message of command_call" do
|
204
|
-
node = parse_content("map.resources :posts do; end").grep_node(:
|
209
|
+
node = parse_content("map.resources :posts do; end").grep_node(sexp_type: :command_call)
|
205
210
|
node.message.to_s.should == "resources"
|
206
211
|
end
|
207
212
|
|
208
213
|
it "should get the message of field" do
|
209
|
-
node = parse_content("user.name = 'test'").grep_node(:
|
214
|
+
node = parse_content("user.name = 'test'").grep_node(sexp_type: :field)
|
210
215
|
node.message.to_s.should == "name"
|
211
216
|
end
|
212
217
|
|
213
218
|
it "should get the message of call" do
|
214
|
-
node = parse_content("user.name").grep_node(:
|
219
|
+
node = parse_content("user.name").grep_node(sexp_type: :call)
|
215
220
|
node.message.to_s.should == "name"
|
216
221
|
end
|
217
222
|
|
218
223
|
it "should get the message of binary" do
|
219
|
-
node = parse_content("user.name == 'test'").grep_node(:
|
224
|
+
node = parse_content("user.name == 'test'").grep_node(sexp_type: :binary)
|
220
225
|
node.message.to_s.should == "=="
|
221
226
|
end
|
222
227
|
|
223
228
|
it "should get the message of fcall" do
|
224
|
-
node = parse_content("test?('world')").grep_node(:
|
229
|
+
node = parse_content("test?('world')").grep_node(sexp_type: :fcall)
|
225
230
|
node.message.to_s.should == "test?"
|
226
231
|
end
|
227
232
|
|
228
233
|
it "should get the message of method_add_arg" do
|
229
|
-
node = parse_content("Post.find(:all)").grep_node(:
|
234
|
+
node = parse_content("Post.find(:all)").grep_node(sexp_type: :method_add_arg)
|
230
235
|
node.message.to_s.should == "find"
|
231
236
|
end
|
232
237
|
|
233
238
|
it "should get the message of method_add_block" do
|
234
|
-
node = parse_content("Post.save do; end").grep_node(:
|
239
|
+
node = parse_content("Post.save do; end").grep_node(sexp_type: :method_add_block)
|
235
240
|
node.message.to_s.should == "save"
|
236
241
|
end
|
237
242
|
end
|
238
243
|
|
239
244
|
describe "arguments" do
|
240
245
|
it "should get the arguments of command" do
|
241
|
-
node = parse_content("resources :posts do; end").grep_node(:
|
246
|
+
node = parse_content("resources :posts do; end").grep_node(sexp_type: :command)
|
242
247
|
node.arguments.sexp_type.should == :args_add_block
|
243
248
|
end
|
244
249
|
|
245
250
|
it "should get the arguments of command_call" do
|
246
|
-
node = parse_content("map.resources :posts do; end").grep_node(:
|
251
|
+
node = parse_content("map.resources :posts do; end").grep_node(sexp_type: :command_call)
|
247
252
|
node.arguments.sexp_type.should == :args_add_block
|
248
253
|
end
|
249
254
|
|
250
255
|
it "should get the arguments of method_add_arg" do
|
251
|
-
node = parse_content("User.find(:all)").grep_node(:
|
256
|
+
node = parse_content("User.find(:all)").grep_node(sexp_type: :method_add_arg)
|
252
257
|
node.arguments.sexp_type.should == :args_add_block
|
253
258
|
end
|
254
259
|
|
255
260
|
it "should get the arguments of method_add_block" do
|
256
|
-
node = parse_content("Post.save(false) do; end").grep_node(:
|
261
|
+
node = parse_content("Post.save(false) do; end").grep_node(sexp_type: :method_add_block)
|
257
262
|
node.arguments.sexp_type.should == :args_add_block
|
258
263
|
end
|
259
264
|
end
|
260
265
|
|
261
266
|
describe "argument" do
|
262
267
|
it "should get the argument of binary" do
|
263
|
-
node = parse_content("user == current_user").grep_node(:
|
268
|
+
node = parse_content("user == current_user").grep_node(sexp_type: :binary)
|
264
269
|
node.argument.to_s.should == "current_user"
|
265
270
|
end
|
266
271
|
end
|
267
272
|
|
268
273
|
describe "all" do
|
269
274
|
it "should get all arguments" do
|
270
|
-
node = parse_content("puts 'hello', 'world'").grep_node(:
|
275
|
+
node = parse_content("puts 'hello', 'world'").grep_node(sexp_type: :args_add_block)
|
271
276
|
node.all.map(&:to_s).should == ["hello", "world"]
|
272
277
|
end
|
273
278
|
|
274
279
|
it "should get all arguments with &:" do
|
275
|
-
node = parse_content("user.posts.map(&:title)").grep_node(:
|
280
|
+
node = parse_content("user.posts.map(&:title)").grep_node(sexp_type: :args_add_block)
|
276
281
|
node.all.map(&:to_s).should == ["title"]
|
277
282
|
end
|
278
283
|
|
279
284
|
it "no error for args_add_star" do
|
280
|
-
node = parse_content("send(:\"\#{route}_url\", *args)").grep_node(:
|
285
|
+
node = parse_content("send(:\"\#{route}_url\", *args)").grep_node(sexp_type: :args_add_block)
|
281
286
|
lambda { node.all }.should_not raise_error
|
282
287
|
end
|
283
288
|
end
|
284
289
|
|
285
290
|
describe "conditional_statement" do
|
286
291
|
it "should get conditional statement of if" do
|
287
|
-
node = parse_content("if true; end").grep_node(:
|
292
|
+
node = parse_content("if true; end").grep_node(sexp_type: :if)
|
288
293
|
node.conditional_statement.to_s.should == "true"
|
289
294
|
end
|
290
295
|
|
291
296
|
it "should get conditional statement of unless" do
|
292
|
-
node = parse_content("unless true; end").grep_node(:
|
297
|
+
node = parse_content("unless true; end").grep_node(sexp_type: :unless)
|
293
298
|
node.conditional_statement.to_s.should == "true"
|
294
299
|
end
|
295
300
|
|
@@ -299,100 +304,108 @@ describe Sexp do
|
|
299
304
|
elsif false
|
300
305
|
end
|
301
306
|
EOF
|
302
|
-
node = parse_content(content).grep_node(:
|
307
|
+
node = parse_content(content).grep_node(sexp_type: :elsif)
|
303
308
|
node.conditional_statement.to_s.should == "false"
|
304
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
|
305
318
|
end
|
306
319
|
|
307
320
|
describe "all_conditions" do
|
308
321
|
it "should get all conditions" do
|
309
|
-
node = parse_content("user == current_user && user.valid? || user.admin?").grep_node(:
|
322
|
+
node = parse_content("user == current_user && user.valid? || user.admin?").grep_node(sexp_type: :binary)
|
310
323
|
node.all_conditions.size.should == 3
|
311
324
|
end
|
312
325
|
end
|
313
326
|
|
314
327
|
describe "method_name" do
|
315
328
|
it "should get the method name of def" do
|
316
|
-
node = parse_content("def show; end").grep_node(:
|
329
|
+
node = parse_content("def show; end").grep_node(sexp_type: :def)
|
317
330
|
node.method_name.to_s.should == "show"
|
318
331
|
end
|
319
332
|
|
320
333
|
it "should get the method name of defs" do
|
321
|
-
node = parse_content("def self.find; end").grep_node(:
|
334
|
+
node = parse_content("def self.find; end").grep_node(sexp_type: :defs)
|
322
335
|
node.method_name.to_s.should == "find"
|
323
336
|
end
|
324
337
|
end
|
325
338
|
|
326
339
|
describe "body" do
|
327
340
|
it "should get body of class" do
|
328
|
-
node = parse_content("class User; end").grep_node(:
|
341
|
+
node = parse_content("class User; end").grep_node(sexp_type: :class)
|
329
342
|
node.body.sexp_type.should == :bodystmt
|
330
343
|
end
|
331
344
|
|
332
345
|
it "should get body of def" do
|
333
|
-
node = parse_content("def login; end").grep_node(:
|
346
|
+
node = parse_content("def login; end").grep_node(sexp_type: :def)
|
334
347
|
node.body.sexp_type.should == :bodystmt
|
335
348
|
end
|
336
349
|
|
337
350
|
it "should get body of defs" do
|
338
|
-
node = parse_content("def self.login; end").grep_node(:
|
351
|
+
node = parse_content("def self.login; end").grep_node(sexp_type: :defs)
|
339
352
|
node.body.sexp_type.should == :bodystmt
|
340
353
|
end
|
341
354
|
|
342
355
|
it "should get body of module" do
|
343
|
-
node = parse_content("module Enumerable; end").grep_node(:
|
356
|
+
node = parse_content("module Enumerable; end").grep_node(sexp_type: :module)
|
344
357
|
node.body.sexp_type.should == :bodystmt
|
345
358
|
end
|
346
359
|
|
347
360
|
it "should get body of if" do
|
348
|
-
node = parse_content("if true; puts 'hello world'; end").grep_node(:
|
361
|
+
node = parse_content("if true; puts 'hello world'; end").grep_node(sexp_type: :if)
|
349
362
|
node.body.sexp_type.should == :stmts_add
|
350
363
|
end
|
351
364
|
|
352
365
|
it "should get body of elsif" do
|
353
|
-
node = parse_content("if true; elsif true; puts 'hello world'; end").grep_node(:
|
366
|
+
node = parse_content("if true; elsif true; puts 'hello world'; end").grep_node(sexp_type: :elsif)
|
354
367
|
node.body.sexp_type.should == :stmts_add
|
355
368
|
end
|
356
369
|
|
357
370
|
it "should get body of unless" do
|
358
|
-
node = parse_content("unless true; puts 'hello world'; end").grep_node(:
|
371
|
+
node = parse_content("unless true; puts 'hello world'; end").grep_node(sexp_type: :unless)
|
359
372
|
node.body.sexp_type.should == :stmts_add
|
360
373
|
end
|
361
374
|
|
362
375
|
it "should get body of else" do
|
363
|
-
node = parse_content("if true; else; puts 'hello world'; end").grep_node(:
|
376
|
+
node = parse_content("if true; else; puts 'hello world'; end").grep_node(sexp_type: :else)
|
364
377
|
node.body.sexp_type.should == :stmts_add
|
365
378
|
end
|
366
379
|
end
|
367
380
|
|
368
381
|
describe "block" do
|
369
382
|
it "sould get block of method_add_block node" do
|
370
|
-
node = parse_content("resources :posts do; resources :comments; end").grep_node(:
|
383
|
+
node = parse_content("resources :posts do; resources :comments; end").grep_node(sexp_type: :method_add_block)
|
371
384
|
node.block.sexp_type.should == :do_block
|
372
385
|
end
|
373
386
|
end
|
374
387
|
|
375
388
|
describe "statements" do
|
376
389
|
it "should get statements of do_block node" do
|
377
|
-
node = parse_content("resources :posts do; resources :comments; resources :like; end").grep_node(:
|
390
|
+
node = parse_content("resources :posts do; resources :comments; resources :like; end").grep_node(sexp_type: :do_block)
|
378
391
|
node.statements.size.should == 2
|
379
392
|
end
|
380
393
|
|
381
394
|
it "should get statements of bodystmt node" do
|
382
|
-
node = parse_content("class User; def login?; end; def admin?; end; end").grep_node(:
|
395
|
+
node = parse_content("class User; def login?; end; def admin?; end; end").grep_node(sexp_type: :bodystmt)
|
383
396
|
node.statements.size.should == 2
|
384
397
|
end
|
385
398
|
end
|
386
399
|
|
387
400
|
describe "hash_value" do
|
388
401
|
it "should get value for hash node" do
|
389
|
-
node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(:
|
402
|
+
node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(sexp_type: :hash)
|
390
403
|
node.hash_value("first_name").to_s.should == "Richard"
|
391
404
|
node.hash_value("last_name").to_s.should == "Huang"
|
392
405
|
end
|
393
406
|
|
394
407
|
it "should get value for bare_assoc_hash" do
|
395
|
-
node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(:
|
408
|
+
node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(sexp_type: :bare_assoc_hash)
|
396
409
|
node.hash_value("first_name").to_s.should == "Richard"
|
397
410
|
node.hash_value("last_name").to_s.should == "Huang"
|
398
411
|
end
|
@@ -400,65 +413,65 @@ describe Sexp do
|
|
400
413
|
|
401
414
|
describe "hash_size" do
|
402
415
|
it "should get value for hash node" do
|
403
|
-
node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(:
|
416
|
+
node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(sexp_type: :hash)
|
404
417
|
node.hash_size.should == 2
|
405
418
|
end
|
406
419
|
|
407
420
|
it "should get value for bare_assoc_hash" do
|
408
|
-
node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(:
|
421
|
+
node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(sexp_type: :bare_assoc_hash)
|
409
422
|
node.hash_size.should == 2
|
410
423
|
end
|
411
424
|
end
|
412
425
|
|
413
426
|
describe "hash_keys" do
|
414
427
|
it "should get hash_keys for hash node" do
|
415
|
-
node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(:
|
428
|
+
node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(sexp_type: :hash)
|
416
429
|
node.hash_keys.should == ["first_name", "last_name"]
|
417
430
|
end
|
418
431
|
|
419
432
|
it "should get hash_keys for bare_assoc_hash" do
|
420
|
-
node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(:
|
433
|
+
node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(sexp_type: :bare_assoc_hash)
|
421
434
|
node.hash_keys.should == ["first_name", "last_name"]
|
422
435
|
end
|
423
436
|
end
|
424
437
|
|
425
438
|
describe "hash_values" do
|
426
439
|
it "should get hash_values for hash node" do
|
427
|
-
node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(:
|
440
|
+
node = parse_content("{first_name: 'Richard', last_name: 'Huang'}").grep_node(sexp_type: :hash)
|
428
441
|
node.hash_values.map(&:to_s).should == ["Richard", "Huang"]
|
429
442
|
end
|
430
443
|
|
431
444
|
it "should get hash_values for bare_assoc_hash" do
|
432
|
-
node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(:
|
445
|
+
node = parse_content("add_user :user, first_name: 'Richard', last_name: 'Huang'").grep_node(sexp_type: :bare_assoc_hash)
|
433
446
|
node.hash_values.map(&:to_s).should == ["Richard", "Huang"]
|
434
447
|
end
|
435
448
|
end
|
436
449
|
|
437
450
|
describe "array_size" do
|
438
451
|
it "should get array size" do
|
439
|
-
node = parse_content("['first_name', 'last_name']").grep_node(:
|
452
|
+
node = parse_content("['first_name', 'last_name']").grep_node(sexp_type: :array)
|
440
453
|
node.array_size.should == 2
|
441
454
|
end
|
442
455
|
|
443
456
|
it "should get 0" do
|
444
|
-
node = parse_content("[]").grep_node(:
|
457
|
+
node = parse_content("[]").grep_node(sexp_type: :array)
|
445
458
|
node.array_size.should == 0
|
446
459
|
end
|
447
460
|
end
|
448
461
|
|
449
462
|
describe "array_values" do
|
450
463
|
it "should get array values" do
|
451
|
-
node = parse_content("['first_name', 'last_name']").grep_node(:
|
464
|
+
node = parse_content("['first_name', 'last_name']").grep_node(sexp_type: :array)
|
452
465
|
node.array_values.map(&:to_s).should == ["first_name", "last_name"]
|
453
466
|
end
|
454
467
|
|
455
468
|
it "should get empty array values" do
|
456
|
-
node = parse_content("[]").grep_node(:
|
469
|
+
node = parse_content("[]").grep_node(sexp_type: :array)
|
457
470
|
node.array_values.should == []
|
458
471
|
end
|
459
472
|
|
460
473
|
it "should get array value with qwords" do
|
461
|
-
node = parse_content("%w(first_name last_name)").grep_node(:
|
474
|
+
node = parse_content("%w(first_name last_name)").grep_node(sexp_type: :qwords_add)
|
462
475
|
node.array_values.map(&:to_s).should == ["first_name", "last_name"]
|
463
476
|
end
|
464
477
|
end
|
@@ -466,7 +479,7 @@ describe Sexp do
|
|
466
479
|
describe "alias" do
|
467
480
|
context "method" do
|
468
481
|
before do
|
469
|
-
@node = parse_content("alias new old").grep_node(:
|
482
|
+
@node = parse_content("alias new old").grep_node(sexp_type: :alias)
|
470
483
|
end
|
471
484
|
|
472
485
|
it "should get old_method" do
|
@@ -480,7 +493,7 @@ describe Sexp do
|
|
480
493
|
|
481
494
|
context "symbol" do
|
482
495
|
before do
|
483
|
-
@node = parse_content("alias :new :old").grep_node(:
|
496
|
+
@node = parse_content("alias :new :old").grep_node(sexp_type: :alias)
|
484
497
|
end
|
485
498
|
|
486
499
|
it "should get old_method" do
|
@@ -495,76 +508,81 @@ describe Sexp do
|
|
495
508
|
|
496
509
|
describe "to_object" do
|
497
510
|
it "should to array" do
|
498
|
-
node = parse_content("['first_name', 'last_name']").grep_node(:
|
511
|
+
node = parse_content("['first_name', 'last_name']").grep_node(sexp_type: :array)
|
499
512
|
node.to_object.should == ["first_name", "last_name"]
|
500
513
|
end
|
501
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
|
+
|
502
520
|
it "should to array with symbols" do
|
503
|
-
node = parse_content("[:first_name, :last_name]").grep_node(:
|
521
|
+
node = parse_content("[:first_name, :last_name]").grep_node(sexp_type: :array)
|
504
522
|
node.to_object.should == ["first_name", "last_name"]
|
505
523
|
end
|
506
524
|
|
507
525
|
it "should to empty array" do
|
508
|
-
node = parse_content("[]").grep_node(:
|
526
|
+
node = parse_content("[]").grep_node(sexp_type: :array)
|
509
527
|
node.to_object.should == []
|
510
528
|
end
|
511
529
|
|
512
530
|
it "should to string" do
|
513
|
-
node = parse_content("'richard'").grep_node(:
|
531
|
+
node = parse_content("'richard'").grep_node(sexp_type: :string_literal)
|
514
532
|
node.to_object.should == "richard"
|
515
533
|
end
|
516
534
|
end
|
517
535
|
|
518
536
|
describe "to_s" do
|
519
537
|
it "should get to_s for string" do
|
520
|
-
node = parse_content("'user'").grep_node(:
|
538
|
+
node = parse_content("'user'").grep_node(sexp_type: :string_literal)
|
521
539
|
node.to_s.should == "user"
|
522
540
|
end
|
523
541
|
|
524
542
|
it "should get to_s for symbol" do
|
525
|
-
node = parse_content(":user").grep_node(:
|
543
|
+
node = parse_content(":user").grep_node(sexp_type: :symbol_literal)
|
526
544
|
node.to_s.should == "user"
|
527
545
|
end
|
528
546
|
|
529
547
|
it "should get to_s for const" do
|
530
|
-
node = parse_content("User").grep_node(:
|
548
|
+
node = parse_content("User").grep_node(sexp_type: :@const)
|
531
549
|
node.to_s.should == "User"
|
532
550
|
end
|
533
551
|
|
534
552
|
it "should get to_s for ivar" do
|
535
|
-
node = parse_content("@user").grep_node(:
|
553
|
+
node = parse_content("@user").grep_node(sexp_type: :@ivar)
|
536
554
|
node.to_s.should == "@user"
|
537
555
|
end
|
538
556
|
|
539
557
|
it "should get to_s for class with module" do
|
540
|
-
node = parse_content("ActiveRecord::Base").grep_node(:
|
558
|
+
node = parse_content("ActiveRecord::Base").grep_node(sexp_type: :const_path_ref)
|
541
559
|
node.to_s.should == "ActiveRecord::Base"
|
542
560
|
end
|
543
561
|
|
544
562
|
it "should get to_s for label" do
|
545
|
-
node = parse_content("{first_name: 'Richard'}").grep_node(:
|
563
|
+
node = parse_content("{first_name: 'Richard'}").grep_node(sexp_type: :@label)
|
546
564
|
node.to_s.should == "first_name"
|
547
565
|
end
|
548
566
|
|
549
567
|
it "should get to_s for call" do
|
550
|
-
node = parse_content("current_user.post").grep_node(:
|
568
|
+
node = parse_content("current_user.post").grep_node(sexp_type: :call)
|
551
569
|
node.to_s.should == "current_user.post"
|
552
570
|
end
|
553
571
|
end
|
554
572
|
|
555
573
|
describe "const?" do
|
556
574
|
it "should return true for const with var_ref" do
|
557
|
-
node = parse_content("User.find").grep_node(:
|
575
|
+
node = parse_content("User.find").grep_node(sexp_type: :var_ref)
|
558
576
|
node.should be_const
|
559
577
|
end
|
560
578
|
|
561
579
|
it "should return true for const with @const" do
|
562
|
-
node = parse_content("User.find").grep_node(:
|
580
|
+
node = parse_content("User.find").grep_node(sexp_type: :@const)
|
563
581
|
node.should be_const
|
564
582
|
end
|
565
583
|
|
566
584
|
it "should return false for ivar" do
|
567
|
-
node = parse_content("@user.find").grep_node(:
|
585
|
+
node = parse_content("@user.find").grep_node(sexp_type: :@ivar)
|
568
586
|
node.should_not be_const
|
569
587
|
end
|
570
588
|
end
|