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
         |