inheritance_module_eval 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.travis.yml +1 -1
- data/HISTORY.md +9 -1
- data/README.md +16 -8
- data/lib/inheritance_module_eval/integration.rb +16 -0
- data/lib/inheritance_module_eval/version.rb +1 -1
- data/lib/inheritance_module_eval.rb +2 -18
- data/spec/inheritance_spec.rb +53 -54
- data/spec/intergation_spec.rb +18 -0
- metadata +8 -7
    
        data/.travis.yml
    CHANGED
    
    
    
        data/HISTORY.md
    CHANGED
    
    
    
        data/README.md
    CHANGED
    
    | @@ -9,30 +9,38 @@ Installation | |
| 9 9 |  | 
| 10 10 | 
             
            Usage
         | 
| 11 11 | 
             
            -----
         | 
| 12 | 
            -
             | 
| 12 | 
            +
            Inheritance module_eval provides 2 methods for eval instance and class methods:
         | 
| 13 13 |  | 
| 14 | 
            -
            *  | 
| 15 | 
            -
            *  | 
| 14 | 
            +
            * instance_eval_on
         | 
| 15 | 
            +
            * class_eval_on
         | 
| 16 16 |  | 
| 17 | 
            -
            instance_module_eval method used to eval instance methods (ie: methods of an object)
         | 
| 18 17 |  | 
| 19 | 
            -
             | 
| 18 | 
            +
                InheritanceModuleEval.instance_eval_on(instance_object, code = nil, &block) #method used to eval instance methods (ie: methods of an object)
         | 
| 19 | 
            +
                InheritanceModuleEval.class_eval_on(class_object, code = nil, &block)       #method used to eval class methods (ie: methods of an class)
         | 
| 20 20 |  | 
| 21 | 
            +
            Note: you may include
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                require "inheritance_module_eval/integration"
         | 
| 24 | 
            +
            to intergate inheritance_module_eval in ruby core. That will give 2 methods:
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            * instance_module_eval(code = nil, &block)
         | 
| 27 | 
            +
            * class_module_eval(code = nil, &block)
         | 
| 21 28 |  | 
| 22 29 | 
             
            Below is some simple example of inheritance_module_eval usage:
         | 
| 23 30 |  | 
| 24 31 | 
             
                require 'inheritance_module_eval'
         | 
| 32 | 
            +
                require "inheritance_module_eval/integration"
         | 
| 25 33 |  | 
| 26 34 | 
             
                # Some dummy class that uses #instance_module_eval
         | 
| 27 35 | 
             
                class Content
         | 
| 28 36 | 
             
                  self.field(name)
         | 
| 29 37 | 
             
                    instance_module_eval %{
         | 
| 30 38 | 
             
                      def #{name}
         | 
| 31 | 
            -
                         | 
| 39 | 
            +
                        @#{name}
         | 
| 32 40 | 
             
                      end
         | 
| 33 41 |  | 
| 34 42 | 
             
                      def #{name}=(new_value)
         | 
| 35 | 
            -
                         | 
| 43 | 
            +
                        @#{name}= new_value
         | 
| 36 44 | 
             
                      end
         | 
| 37 45 | 
             
                    }
         | 
| 38 46 | 
             
                    end
         | 
| @@ -63,7 +71,7 @@ Compatibility | |
| 63 71 | 
             
            -------------
         | 
| 64 72 | 
             
            tested with Ruby
         | 
| 65 73 |  | 
| 66 | 
            -
            * 1.8.7 | 
| 74 | 
            +
            * 1.8.7
         | 
| 67 75 | 
             
            * 1.9.2
         | 
| 68 76 | 
             
            * 1.9.3
         | 
| 69 77 | 
             
            * jruby
         | 
| @@ -0,0 +1,16 @@ | |
| 1 | 
            +
            require "integration_module_eval"
         | 
| 2 | 
            +
            class Module
         | 
| 3 | 
            +
              # acts same as module_eval, but saves method hierarchy
         | 
| 4 | 
            +
              # should be called only for instance methods evaluation
         | 
| 5 | 
            +
              # @params (see Module#module_eval)
         | 
| 6 | 
            +
              def instance_module_eval(code = nil, &block)
         | 
| 7 | 
            +
                InheritanceModuleEval.instance_eval_on self, code, &block
         | 
| 8 | 
            +
              end
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              # acts same as module_eval, but saves method hierarchy
         | 
| 11 | 
            +
              # should be called only for class methods evaluation
         | 
| 12 | 
            +
              # @params (see Module#module_eval)
         | 
| 13 | 
            +
              def class_module_eval(code = nil, &block)
         | 
| 14 | 
            +
                InheritanceModuleEval.class_eval_on self, code, &block
         | 
| 15 | 
            +
              end
         | 
| 16 | 
            +
            end
         | 
| @@ -1,27 +1,11 @@ | |
| 1 1 | 
             
            require "inheritance_module_eval/version"
         | 
| 2 2 |  | 
| 3 | 
            -
            class Module
         | 
| 4 | 
            -
              # acts same as module_eval, but saves method hierarchy
         | 
| 5 | 
            -
              # should be called only for instance methods evaluation
         | 
| 6 | 
            -
              # @params (see Module#module_eval)
         | 
| 7 | 
            -
              def instance_module_eval(code = nil, &block)
         | 
| 8 | 
            -
                InheritanceModuleEval.instance_eval_on self, code, &block
         | 
| 9 | 
            -
              end
         | 
| 10 | 
            -
             | 
| 11 | 
            -
              # acts same as module_eval, but saves method hierarchy
         | 
| 12 | 
            -
              # should be called only for class methods evaluation
         | 
| 13 | 
            -
              # @params (see Module#module_eval)
         | 
| 14 | 
            -
              def class_module_eval(code = nil, &block)
         | 
| 15 | 
            -
                InheritanceModuleEval.class_eval_on self, code, &block
         | 
| 16 | 
            -
              end
         | 
| 17 | 
            -
            end
         | 
| 18 | 
            -
             | 
| 19 3 | 
             
            module InheritanceModuleEval
         | 
| 20 | 
            -
              def self.instance_eval_on(sender, code, &block)
         | 
| 4 | 
            +
              def self.instance_eval_on(sender, code = nil, &block)
         | 
| 21 5 | 
             
                sender.send :include, (get_module_for code, &block)
         | 
| 22 6 | 
             
              end
         | 
| 23 7 |  | 
| 24 | 
            -
              def self.class_eval_on(sender, code, &block)
         | 
| 8 | 
            +
              def self.class_eval_on(sender, code = nil, &block)
         | 
| 25 9 | 
             
                sender.send :extend, (get_module_for code, &block)
         | 
| 26 10 | 
             
              end
         | 
| 27 11 |  | 
    
        data/spec/inheritance_spec.rb
    CHANGED
    
    | @@ -8,55 +8,46 @@ class Child < Parent | |
| 8 8 |  | 
| 9 9 | 
             
            end
         | 
| 10 10 | 
             
            describe InheritanceModuleEval do
         | 
| 11 | 
            -
              describe "integration" do
         | 
| 12 | 
            -
                specify "class should respond to instance_module_eval" do
         | 
| 13 | 
            -
                  Class.new.should respond_to(:instance_module_eval)
         | 
| 14 | 
            -
                end
         | 
| 15 | 
            -
             | 
| 16 | 
            -
                specify "module should respond to instance_module_eval" do
         | 
| 17 | 
            -
                  Module.new.should respond_to(:instance_module_eval)
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
                specify "class should respond to class_module_eval" do
         | 
| 21 | 
            -
                  Class.new.should respond_to(:class_module_eval)
         | 
| 22 | 
            -
                end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                specify "module should respond to class_module_eval" do
         | 
| 25 | 
            -
                  Module.new.should respond_to(:class_module_eval)
         | 
| 26 | 
            -
                end
         | 
| 27 | 
            -
              end
         | 
| 28 | 
            -
             | 
| 29 11 | 
             
              describe "add dynamic methods" do
         | 
| 30 12 | 
             
                before(:each) do
         | 
| 31 13 | 
             
                  @test_object = Class.new
         | 
| 32 14 | 
             
                end
         | 
| 33 15 |  | 
| 34 | 
            -
                 | 
| 35 | 
            -
                   | 
| 36 | 
            -
                  @test_object. | 
| 16 | 
            +
                it "should delegate to module_eval" do
         | 
| 17 | 
            +
                  mock_module = mock(:mock_module)
         | 
| 18 | 
            +
                  @test_object.stub(:include)
         | 
| 19 | 
            +
                  @test_object.stub(:extend)
         | 
| 20 | 
            +
                  Module.stub(:new).and_return(mock_module)
         | 
| 21 | 
            +
             | 
| 22 | 
            +
                  mock_module.should_receive(:module_eval).once
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                  InheritanceModuleEval.instance_eval_on @test_object do
         | 
| 37 25 | 
             
                    def say_hi
         | 
| 38 26 | 
             
                      puts hi
         | 
| 39 27 | 
             
                    end
         | 
| 40 | 
            -
                   | 
| 41 | 
            -
             | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                  mock_module.should_receive(:module_eval).once
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                  InheritanceModuleEval.class_eval_on @test_object do
         | 
| 42 33 | 
             
                    def say_hi
         | 
| 43 34 | 
             
                      puts hi
         | 
| 44 35 | 
             
                    end
         | 
| 45 | 
            -
                   | 
| 36 | 
            +
                  end
         | 
| 46 37 | 
             
                end
         | 
| 47 38 |  | 
| 48 39 | 
             
                describe "instance methods" do
         | 
| 49 40 | 
             
                  it "should eval a string" do
         | 
| 50 | 
            -
                    @test_object | 
| 51 | 
            -
             | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 41 | 
            +
                    InheritanceModuleEval.instance_eval_on @test_object, %{
         | 
| 42 | 
            +
                                                                            def say_hi
         | 
| 43 | 
            +
                                                                              puts 'hi'
         | 
| 44 | 
            +
                                                                            end
         | 
| 45 | 
            +
                                                                          }
         | 
| 55 46 | 
             
                      @test_object.new.should respond_to :say_hi
         | 
| 56 47 |  | 
| 57 48 | 
             
                  end
         | 
| 58 49 | 
             
                  it "should eval a block" do
         | 
| 59 | 
            -
                    @test_object | 
| 50 | 
            +
                    InheritanceModuleEval.instance_eval_on @test_object do
         | 
| 60 51 | 
             
                      def say_hi
         | 
| 61 52 | 
             
                        puts 'hi'
         | 
| 62 53 | 
             
                      end
         | 
| @@ -67,20 +58,21 @@ describe InheritanceModuleEval do | |
| 67 58 |  | 
| 68 59 | 
             
                describe "class_methods" do
         | 
| 69 60 | 
             
                  it "should eval a string" do
         | 
| 70 | 
            -
                    @test_object | 
| 61 | 
            +
                    InheritanceModuleEval.class_eval_on @test_object do
         | 
| 71 62 | 
             
                      def say_hi
         | 
| 72 63 | 
             
                        puts 'hi'
         | 
| 73 64 | 
             
                      end
         | 
| 74 | 
            -
             | 
| 75 | 
            -
                      @test_object.should respond_to :say_hi
         | 
| 65 | 
            +
                    end
         | 
| 76 66 |  | 
| 67 | 
            +
                    @test_object.should respond_to :say_hi
         | 
| 77 68 | 
             
                  end
         | 
| 78 69 | 
             
                  it "should eval a block" do
         | 
| 79 | 
            -
                    @test_object | 
| 70 | 
            +
                    InheritanceModuleEval.class_eval_on @test_object do
         | 
| 80 71 | 
             
                      def say_hi
         | 
| 81 72 | 
             
                        puts 'hi'
         | 
| 82 73 | 
             
                      end
         | 
| 83 74 | 
             
                    end
         | 
| 75 | 
            +
             | 
| 84 76 | 
             
                    @test_object.should respond_to :say_hi
         | 
| 85 77 | 
             
                  end
         | 
| 86 78 | 
             
                end
         | 
| @@ -88,32 +80,35 @@ describe InheritanceModuleEval do | |
| 88 80 |  | 
| 89 81 | 
             
                describe "collisions" do
         | 
| 90 82 | 
             
                  describe "define already defined method in a class" do
         | 
| 91 | 
            -
                     | 
| 83 | 
            +
                    context "redefine it after class declaration" do
         | 
| 92 84 | 
             
                      it "should has lower priority then method, declared in a class" do
         | 
| 93 85 | 
             
                        klass = Class.new
         | 
| 94 86 | 
             
                        klass.class_eval do
         | 
| 95 87 | 
             
                          def say_hi
         | 
| 96 88 | 
             
                            "hi from method" << " " << super
         | 
| 97 89 | 
             
                          end
         | 
| 98 | 
            -
                          instance_module_eval %{
         | 
| 99 | 
            -
                            def say_hi
         | 
| 100 | 
            -
                              "hi from eval"
         | 
| 101 | 
            -
                            end
         | 
| 102 | 
            -
                          }
         | 
| 103 90 | 
             
                        end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
                        InheritanceModuleEval.instance_eval_on klass do
         | 
| 93 | 
            +
                          def say_hi
         | 
| 94 | 
            +
                            "hi from eval"
         | 
| 95 | 
            +
                          end
         | 
| 96 | 
            +
                        end
         | 
| 97 | 
            +
             | 
| 104 98 | 
             
                        klass.new.say_hi.should == "hi from method hi from eval"
         | 
| 105 99 | 
             
                      end
         | 
| 106 100 | 
             
                    end
         | 
| 107 101 |  | 
| 108 | 
            -
                     | 
| 109 | 
            -
                      it "should  | 
| 102 | 
            +
                    context "redefine it before class declaration" do
         | 
| 103 | 
            +
                      it "should has lower priority then method, declared in a class" do
         | 
| 110 104 | 
             
                        klass = Class.new
         | 
| 111 105 | 
             
                        klass.class_eval do
         | 
| 112 | 
            -
                           | 
| 106 | 
            +
                          InheritanceModuleEval.instance_eval_on self do
         | 
| 113 107 | 
             
                            def say_hi
         | 
| 114 108 | 
             
                              "tiny hi"
         | 
| 115 109 | 
             
                            end
         | 
| 116 | 
            -
                           | 
| 110 | 
            +
                          end
         | 
| 111 | 
            +
             | 
| 117 112 | 
             
                          def say_hi
         | 
| 118 113 | 
             
                            super.upcase
         | 
| 119 114 | 
             
                          end
         | 
| @@ -126,26 +121,30 @@ describe InheritanceModuleEval do | |
| 126 121 | 
             
                      it "should push dynamic method up in the inheritance tree" do
         | 
| 127 122 | 
             
                        klass = Class.new
         | 
| 128 123 | 
             
                        klass.class_eval do
         | 
| 129 | 
            -
                           | 
| 124 | 
            +
                          InheritanceModuleEval.instance_eval_on self do
         | 
| 130 125 | 
             
                            def say_hi
         | 
| 131 126 | 
             
                              [5]
         | 
| 132 127 | 
             
                            end
         | 
| 133 | 
            -
                           | 
| 134 | 
            -
             | 
| 128 | 
            +
                          end
         | 
| 129 | 
            +
             | 
| 130 | 
            +
                          InheritanceModuleEval.instance_eval_on self do
         | 
| 135 131 | 
             
                            def say_hi
         | 
| 136 132 | 
             
                              [4] + super
         | 
| 137 133 | 
             
                            end
         | 
| 138 | 
            -
                           | 
| 139 | 
            -
             | 
| 134 | 
            +
                          end
         | 
| 135 | 
            +
             | 
| 136 | 
            +
                          InheritanceModuleEval.instance_eval_on self do
         | 
| 140 137 | 
             
                            def say_hi
         | 
| 141 138 | 
             
                              [3] + super
         | 
| 142 139 | 
             
                            end
         | 
| 143 | 
            -
                           | 
| 144 | 
            -
             | 
| 140 | 
            +
                          end
         | 
| 141 | 
            +
             | 
| 142 | 
            +
                          InheritanceModuleEval.instance_eval_on self do
         | 
| 145 143 | 
             
                            def say_hi
         | 
| 146 144 | 
             
                              [2] + super
         | 
| 147 145 | 
             
                            end
         | 
| 148 | 
            -
                           | 
| 146 | 
            +
                          end
         | 
| 147 | 
            +
             | 
| 149 148 | 
             
                          def say_hi
         | 
| 150 149 | 
             
                            [1] + super
         | 
| 151 150 | 
             
                          end
         | 
| @@ -166,7 +165,7 @@ describe InheritanceModuleEval do | |
| 166 165 | 
             
                        klass = Class.new
         | 
| 167 166 | 
             
                        klass.class_eval do
         | 
| 168 167 | 
             
                          include test_module
         | 
| 169 | 
            -
                           | 
| 168 | 
            +
                          InheritanceModuleEval.instance_eval_on self do
         | 
| 170 169 | 
             
                            def say_hi
         | 
| 171 170 | 
             
                              ["hi from eval"] + super
         | 
| 172 171 | 
             
                            end
         | 
| @@ -185,7 +184,7 @@ describe InheritanceModuleEval do | |
| 185 184 |  | 
| 186 185 | 
             
                describe "#get_module_for" do
         | 
| 187 186 | 
             
                  it "should return Module" do
         | 
| 188 | 
            -
                    InheritanceModuleEval.send :get_module_for, " | 
| 187 | 
            +
                    InheritanceModuleEval.send :get_module_for, "'hi'"
         | 
| 189 188 | 
             
                  end
         | 
| 190 189 |  | 
| 191 190 | 
             
                  it "should raise ArgumentError if no code given" do
         | 
| @@ -0,0 +1,18 @@ | |
| 1 | 
            +
            require "inheritance_module_eval/integration"
         | 
| 2 | 
            +
            describe "integration" do
         | 
| 3 | 
            +
              specify "class should respond to instance_module_eval" do
         | 
| 4 | 
            +
                Class.new.should respond_to(:instance_module_eval)
         | 
| 5 | 
            +
              end
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              specify "module should respond to instance_module_eval" do
         | 
| 8 | 
            +
                Module.new.should respond_to(:instance_module_eval)
         | 
| 9 | 
            +
              end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
              specify "class should respond to class_module_eval" do
         | 
| 12 | 
            +
                Class.new.should respond_to(:class_module_eval)
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              specify "module should respond to class_module_eval" do
         | 
| 16 | 
            +
                Module.new.should respond_to(:class_module_eval)
         | 
| 17 | 
            +
              end
         | 
| 18 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: inheritance_module_eval
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 1.0. | 
| 4 | 
            +
              version: 1.0.1
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,11 +9,11 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2011-11- | 
| 12 | 
            +
            date: 2011-11-13 00:00:00.000000000Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: rspec
         | 
| 16 | 
            -
              requirement: & | 
| 16 | 
            +
              requirement: &19224720 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ! '>='
         | 
| @@ -21,10 +21,10 @@ dependencies: | |
| 21 21 | 
             
                    version: '2.6'
         | 
| 22 22 | 
             
              type: :development
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements: * | 
| 24 | 
            +
              version_requirements: *19224720
         | 
| 25 25 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 26 | 
             
              name: rake
         | 
| 27 | 
            -
              requirement: & | 
| 27 | 
            +
              requirement: &19224100 !ruby/object:Gem::Requirement
         | 
| 28 28 | 
             
                none: false
         | 
| 29 29 | 
             
                requirements:
         | 
| 30 30 | 
             
                - - ! '>='
         | 
| @@ -32,7 +32,7 @@ dependencies: | |
| 32 32 | 
             
                    version: '0'
         | 
| 33 33 | 
             
              type: :development
         | 
| 34 34 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements: * | 
| 35 | 
            +
              version_requirements: *19224100
         | 
| 36 36 | 
             
            description: ! 'saves inheritance structure of dynamically created methods.
         | 
| 37 37 |  | 
| 38 38 | 
             
              Allows to redefine dynamic method in the same class or in any child class, and call
         | 
| @@ -53,8 +53,10 @@ files: | |
| 53 53 | 
             
            - Rakefile
         | 
| 54 54 | 
             
            - inheritance_module_eval.gemspec
         | 
| 55 55 | 
             
            - lib/inheritance_module_eval.rb
         | 
| 56 | 
            +
            - lib/inheritance_module_eval/integration.rb
         | 
| 56 57 | 
             
            - lib/inheritance_module_eval/version.rb
         | 
| 57 58 | 
             
            - spec/inheritance_spec.rb
         | 
| 59 | 
            +
            - spec/intergation_spec.rb
         | 
| 58 60 | 
             
            homepage: http://github.com/AlexParamonov/inheritance_module_eval
         | 
| 59 61 | 
             
            licenses: []
         | 
| 60 62 | 
             
            post_install_message: 
         | 
| @@ -80,4 +82,3 @@ signing_key: | |
| 80 82 | 
             
            specification_version: 3
         | 
| 81 83 | 
             
            summary: inheritance safe module_eval.
         | 
| 82 84 | 
             
            test_files: []
         | 
| 83 | 
            -
            has_rdoc: 
         |