decorations 0.1.4 → 1.0.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -39
- data/README.md +72 -17
- data/bin/console +23 -2
- data/decorations.gemspec +0 -3
- data/lib/decorations.rb +20 -3
- data/lib/decorations/version.rb +1 -1
- data/lib/decorator.rb +26 -41
- data/lib/decorator_dsl.rb +111 -0
- metadata +3 -44
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: e4ee3f37027bf274381c6141e50c22890fffb443c765339da9810715528403a1
         | 
| 4 | 
            +
              data.tar.gz: 0453c34181729f003cbe2434597a4554e97345b7e747ca5eb69fb17dda3a7bbe
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 3ed165419148484137d8651336a6d2811509a61418ba33b2673246dda6aa244fc18ff5c4b40142a430e12e2f21ef8c678651bb0740f10d1de8bc6ab8a086abb6
         | 
| 7 | 
            +
              data.tar.gz: 45b0edd2d3f819c28d80df2edad449396eac6ebbc878d071a574d3161fac889a5aafdc84639c0a338315101ad63c5bd979dce7711ffc350c2a4fe4ee61206222
         | 
    
        data/Gemfile.lock
    CHANGED
    
    | @@ -1,35 +1,17 @@ | |
| 1 1 | 
             
            PATH
         | 
| 2 2 | 
             
              remote: .
         | 
| 3 3 | 
             
              specs:
         | 
| 4 | 
            -
                decorations (0. | 
| 4 | 
            +
                decorations (1.0.0)
         | 
| 5 5 |  | 
| 6 6 | 
             
            GEM
         | 
| 7 7 | 
             
              remote: https://rubygems.org/
         | 
| 8 8 | 
             
              specs:
         | 
| 9 9 | 
             
                ast (2.4.0)
         | 
| 10 10 | 
             
                coderay (1.1.2)
         | 
| 11 | 
            -
                coveralls (0.7.1)
         | 
| 12 | 
            -
                  multi_json (~> 1.3)
         | 
| 13 | 
            -
                  rest-client
         | 
| 14 | 
            -
                  simplecov (>= 0.7)
         | 
| 15 | 
            -
                  term-ansicolor
         | 
| 16 | 
            -
                  thor
         | 
| 17 11 | 
             
                diff-lcs (1.3)
         | 
| 18 | 
            -
                docile (1.3.2)
         | 
| 19 | 
            -
                domain_name (0.5.20190701)
         | 
| 20 | 
            -
                  unf (>= 0.0.5, < 1.0.0)
         | 
| 21 12 | 
             
                gem-release (2.1.1)
         | 
| 22 | 
            -
                http-accept (1.7.0)
         | 
| 23 | 
            -
                http-cookie (1.0.3)
         | 
| 24 | 
            -
                  domain_name (~> 0.5)
         | 
| 25 13 | 
             
                jaro_winkler (1.5.4)
         | 
| 26 | 
            -
                json (2.2.0)
         | 
| 27 14 | 
             
                method_source (0.9.2)
         | 
| 28 | 
            -
                mime-types (3.3)
         | 
| 29 | 
            -
                  mime-types-data (~> 3.2015)
         | 
| 30 | 
            -
                mime-types-data (3.2019.1009)
         | 
| 31 | 
            -
                multi_json (1.14.1)
         | 
| 32 | 
            -
                netrc (0.11.0)
         | 
| 33 15 | 
             
                parallel (1.18.0)
         | 
| 34 16 | 
             
                parser (2.6.5.0)
         | 
| 35 17 | 
             
                  ast (~> 2.4.0)
         | 
| @@ -41,11 +23,6 @@ GEM | |
| 41 23 | 
             
                  yard (~> 0.9.11)
         | 
| 42 24 | 
             
                rainbow (3.0.0)
         | 
| 43 25 | 
             
                rake (10.5.0)
         | 
| 44 | 
            -
                rest-client (2.1.0)
         | 
| 45 | 
            -
                  http-accept (>= 1.7.0, < 2.0)
         | 
| 46 | 
            -
                  http-cookie (>= 1.0.2, < 2.0)
         | 
| 47 | 
            -
                  mime-types (>= 1.16, < 4.0)
         | 
| 48 | 
            -
                  netrc (~> 0.8)
         | 
| 49 26 | 
             
                rspec (3.9.0)
         | 
| 50 27 | 
             
                  rspec-core (~> 3.9.0)
         | 
| 51 28 | 
             
                  rspec-expectations (~> 3.9.0)
         | 
| @@ -67,18 +44,6 @@ GEM | |
| 67 44 | 
             
                  ruby-progressbar (~> 1.7)
         | 
| 68 45 | 
             
                  unicode-display_width (>= 1.4.0, < 1.7)
         | 
| 69 46 | 
             
                ruby-progressbar (1.10.1)
         | 
| 70 | 
            -
                simplecov (0.17.1)
         | 
| 71 | 
            -
                  docile (~> 1.1)
         | 
| 72 | 
            -
                  json (>= 1.8, < 3)
         | 
| 73 | 
            -
                  simplecov-html (~> 0.10.0)
         | 
| 74 | 
            -
                simplecov-html (0.10.2)
         | 
| 75 | 
            -
                term-ansicolor (1.7.1)
         | 
| 76 | 
            -
                  tins (~> 1.0)
         | 
| 77 | 
            -
                thor (0.20.3)
         | 
| 78 | 
            -
                tins (1.22.0)
         | 
| 79 | 
            -
                unf (0.1.4)
         | 
| 80 | 
            -
                  unf_ext
         | 
| 81 | 
            -
                unf_ext (0.0.7.6)
         | 
| 82 47 | 
             
                unicode-display_width (1.6.0)
         | 
| 83 48 | 
             
                yard (0.9.20)
         | 
| 84 49 | 
             
                yardstick (0.9.9)
         | 
| @@ -89,16 +54,13 @@ PLATFORMS | |
| 89 54 |  | 
| 90 55 | 
             
            DEPENDENCIES
         | 
| 91 56 | 
             
              bundler (~> 1.16)
         | 
| 92 | 
            -
              coveralls
         | 
| 93 57 | 
             
              decorations!
         | 
| 94 58 | 
             
              gem-release
         | 
| 95 59 | 
             
              pry
         | 
| 96 60 | 
             
              pry-doc
         | 
| 97 61 | 
             
              rake (~> 10.0)
         | 
| 98 | 
            -
              rest-client (>= 1.8.0)
         | 
| 99 62 | 
             
              rspec (~> 3.0)
         | 
| 100 63 | 
             
              rubocop
         | 
| 101 | 
            -
              simplecov
         | 
| 102 64 | 
             
              yard
         | 
| 103 65 | 
             
              yardstick
         | 
| 104 66 |  | 
    
        data/README.md
    CHANGED
    
    | @@ -2,7 +2,6 @@ | |
| 2 2 |  | 
| 3 3 | 
             
            [](https://badge.fury.io/rb/decorations)
         | 
| 4 4 | 
             
            [](https://travis-ci.org/watmin/Ruby-decorations)
         | 
| 5 | 
            -
            [](https://coveralls.io/github/watmin/Ruby-decorations?branch=master)
         | 
| 6 5 |  | 
| 7 6 | 
             
            Python like decorators for Ruby. Inspired by Rack and previous attempts at decorations
         | 
| 8 7 |  | 
| @@ -24,22 +23,22 @@ Or install it yourself as: | |
| 24 23 |  | 
| 25 24 | 
             
            ## Usage
         | 
| 26 25 |  | 
| 27 | 
            -
            Create a class that will have decorated methods and create decator classes to  | 
| 28 | 
            -
             | 
| 29 | 
            -
            The decorator class must:
         | 
| 30 | 
            -
            * implement #call
         | 
| 31 | 
            -
            * must invoke call\_next(this, chain, \*args)
         | 
| 32 | 
            -
            * must return the result of call\_next.
         | 
| 26 | 
            +
            Create a class that will have decorated methods and create decator classes to be executed around the decorated method.
         | 
| 33 27 |  | 
| 34 28 | 
             
            ```ruby
         | 
| 35 29 | 
             
            require 'decorations'
         | 
| 36 30 |  | 
| 37 31 | 
             
            class LoggingDecorator < Decorator
         | 
| 38 | 
            -
               | 
| 39 | 
            -
             | 
| 40 | 
            -
                 | 
| 41 | 
            -
                puts "[#{ | 
| 42 | 
            -
             | 
| 32 | 
            +
              before
         | 
| 33 | 
            +
              def print_started
         | 
| 34 | 
            +
                @start_time = Time.now
         | 
| 35 | 
            +
                puts "[#{@start_time}] #{decorated_class}.#{decorated_method.name} was called"
         | 
| 36 | 
            +
              end
         | 
| 37 | 
            +
             | 
| 38 | 
            +
              after
         | 
| 39 | 
            +
              def print_finished
         | 
| 40 | 
            +
                end_time = Time.now
         | 
| 41 | 
            +
                puts "[#{end_time}] #{decorated_class}.#{decorated_method.name} has finished. Took #{end_time - @start_time} seconds"
         | 
| 43 42 | 
             
              end
         | 
| 44 43 | 
             
            end
         | 
| 45 44 |  | 
| @@ -47,16 +46,72 @@ class Application | |
| 47 46 | 
             
              extend Decorations
         | 
| 48 47 |  | 
| 49 48 | 
             
              decorate LoggingDecorator
         | 
| 50 | 
            -
              def perform_task
         | 
| 51 | 
            -
                 | 
| 49 | 
            +
              def perform_task(a, b: 2)
         | 
| 50 | 
            +
                a + b
         | 
| 51 | 
            +
              end
         | 
| 52 | 
            +
             | 
| 53 | 
            +
              decorate LoggingDecorator
         | 
| 54 | 
            +
              def perform_task_with_a_block
         | 
| 55 | 
            +
                yield
         | 
| 52 56 | 
             
              end
         | 
| 53 57 | 
             
            end
         | 
| 54 58 |  | 
| 55 59 | 
             
            app = Application.new
         | 
| 56 | 
            -
            app.perform_task
         | 
| 57 | 
            -
            #  | 
| 58 | 
            -
            #  | 
| 60 | 
            +
            app.perform_task(2, b: 2)
         | 
| 61 | 
            +
            # [2019-11-01 19:50:59 -0700] Application.perform_task was called
         | 
| 62 | 
            +
            # [2019-11-01 19:50:59 -0700] Application.perform_task has finished. Took 3.51e-05 seconds
         | 
| 59 63 | 
             
            # => 4
         | 
| 64 | 
            +
             | 
| 65 | 
            +
            app.perform_task_with_a_block { puts 'in a block' }
         | 
| 66 | 
            +
            # [2019-11-01 19:55:37 -0700] Application.perform_task_with_a_block was called
         | 
| 67 | 
            +
            # in a block
         | 
| 68 | 
            +
            # [2019-11-01 19:55:37 -0700] Application.perform_task_with_a_block has finished. Took 5.32e-05 seconds
         | 
| 69 | 
            +
            # => nil
         | 
| 70 | 
            +
            ```
         | 
| 71 | 
            +
             | 
| 72 | 
            +
            You can also pass in parameters to decorator methods:
         | 
| 73 | 
            +
             | 
| 74 | 
            +
            ```
         | 
| 75 | 
            +
            class AnotherDecorator < Decorator
         | 
| 76 | 
            +
              def initialize(some, params)
         | 
| 77 | 
            +
                @some = some
         | 
| 78 | 
            +
                @params = params
         | 
| 79 | 
            +
              end
         | 
| 80 | 
            +
             | 
| 81 | 
            +
              before
         | 
| 82 | 
            +
              def puts_some
         | 
| 83 | 
            +
                puts @some
         | 
| 84 | 
            +
              end
         | 
| 85 | 
            +
             | 
| 86 | 
            +
              after
         | 
| 87 | 
            +
              def puts_params
         | 
| 88 | 
            +
                puts @params
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
            end
         | 
| 91 | 
            +
             | 
| 92 | 
            +
            class AnotherDemo
         | 
| 93 | 
            +
              extends Decorations
         | 
| 94 | 
            +
             | 
| 95 | 
            +
              decorate AnotherDecorator, 'value 1', 'value 2'
         | 
| 96 | 
            +
              def another_method
         | 
| 97 | 
            +
                puts 'running puts in yet another method'
         | 
| 98 | 
            +
              end
         | 
| 99 | 
            +
            end
         | 
| 100 | 
            +
             | 
| 101 | 
            +
            demo = AnotherDemo.new
         | 
| 102 | 
            +
            demo.another_method
         | 
| 103 | 
            +
            # value 1
         | 
| 104 | 
            +
            # running puts in yet another method
         | 
| 105 | 
            +
            # value 2
         | 
| 106 | 
            +
            # => nil
         | 
| 107 | 
            +
             | 
| 108 | 
            +
            ```
         | 
| 109 | 
            +
             | 
| 110 | 
            +
            When testing decorated methods, execute `Decorations.disable` before requiring your source files. In your spec\_helper.rb add the following lines before your library is loaded:
         | 
| 111 | 
            +
             | 
| 112 | 
            +
            ```ruby
         | 
| 113 | 
            +
            require 'decorations'
         | 
| 114 | 
            +
            Decorations.disable
         | 
| 60 115 | 
             
            ```
         | 
| 61 116 |  | 
| 62 117 | 
             
            ## Development
         | 
    
        data/bin/console
    CHANGED
    
    | @@ -7,9 +7,19 @@ require 'decorations' | |
| 7 7 | 
             
            # with your gem easier. You can also use a different console, if you like.
         | 
| 8 8 |  | 
| 9 9 | 
             
            class DecoratorDemo < Decorator
         | 
| 10 | 
            -
               | 
| 10 | 
            +
              before
         | 
| 11 | 
            +
              def print_message
         | 
| 11 12 | 
             
                puts "'#{decorated_class}' has '#{decorated_method.name}' decorated"
         | 
| 12 | 
            -
             | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              after
         | 
| 16 | 
            +
              def do_math
         | 
| 17 | 
            +
                puts 2 + 2
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              after
         | 
| 21 | 
            +
              def something_else
         | 
| 22 | 
            +
                puts 'something else'
         | 
| 13 23 | 
             
              end
         | 
| 14 24 | 
             
            end
         | 
| 15 25 |  | 
| @@ -20,6 +30,17 @@ class Demo | |
| 20 30 | 
             
              def demo_method
         | 
| 21 31 | 
             
                puts 'am I decorated?'
         | 
| 22 32 | 
             
              end
         | 
| 33 | 
            +
             | 
| 34 | 
            +
              decorate DecoratorDemo
         | 
| 35 | 
            +
              def demo_block
         | 
| 36 | 
            +
                yield
         | 
| 37 | 
            +
              end
         | 
| 38 | 
            +
             | 
| 39 | 
            +
              decorate DecoratorDemo
         | 
| 40 | 
            +
              def demo_kwargs(first: 1, second: nil)
         | 
| 41 | 
            +
                puts "first is #{first}"
         | 
| 42 | 
            +
                puts "second is #{second}"
         | 
| 43 | 
            +
              end
         | 
| 23 44 | 
             
            end
         | 
| 24 45 |  | 
| 25 46 | 
             
            require 'pry'
         | 
    
        data/decorations.gemspec
    CHANGED
    
    | @@ -30,15 +30,12 @@ Gem::Specification.new do |spec| | |
| 30 30 | 
             
              spec.require_paths = ['lib']
         | 
| 31 31 |  | 
| 32 32 | 
             
              spec.add_development_dependency 'bundler', '~> 1.16'
         | 
| 33 | 
            -
              spec.add_development_dependency 'coveralls'
         | 
| 34 33 | 
             
              spec.add_development_dependency 'gem-release'
         | 
| 35 34 | 
             
              spec.add_development_dependency 'pry'
         | 
| 36 35 | 
             
              spec.add_development_dependency 'pry-doc'
         | 
| 37 36 | 
             
              spec.add_development_dependency 'rake', '~> 10.0'
         | 
| 38 | 
            -
              spec.add_development_dependency 'rest-client', '>= 1.8.0'
         | 
| 39 37 | 
             
              spec.add_development_dependency 'rspec', '~> 3.0'
         | 
| 40 38 | 
             
              spec.add_development_dependency 'rubocop'
         | 
| 41 | 
            -
              spec.add_development_dependency 'simplecov'
         | 
| 42 39 | 
             
              spec.add_development_dependency 'yard'
         | 
| 43 40 | 
             
              spec.add_development_dependency 'yardstick'
         | 
| 44 41 | 
             
            end
         | 
    
        data/lib/decorations.rb
    CHANGED
    
    | @@ -20,6 +20,19 @@ module Decorations | |
| 20 20 | 
             
                end
         | 
| 21 21 | 
             
              end
         | 
| 22 22 |  | 
| 23 | 
            +
              ##
         | 
| 24 | 
            +
              # Disables injecting decorations. Necessary for testing decorated methods
         | 
| 25 | 
            +
              #
         | 
| 26 | 
            +
              # @return [Void]
         | 
| 27 | 
            +
              #
         | 
| 28 | 
            +
              # @example
         | 
| 29 | 
            +
              #   Decorations.disable
         | 
| 30 | 
            +
              #
         | 
| 31 | 
            +
              # @api public
         | 
| 32 | 
            +
              def self.disable
         | 
| 33 | 
            +
                @disabled = true
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 23 36 | 
             
              ##
         | 
| 24 37 | 
             
              # Decorates a method execute's the klass' #call method around the decorated method
         | 
| 25 38 | 
             
              #
         | 
| @@ -67,7 +80,10 @@ module Decorations | |
| 67 80 | 
             
              # @api private
         | 
| 68 81 | 
             
              def append_decorations(name, decorators, decorated_methods)
         | 
| 69 82 | 
             
                decorators.each do |klass, args|
         | 
| 70 | 
            -
                   | 
| 83 | 
            +
                  decoration = klass.new(*args)
         | 
| 84 | 
            +
                  decoration.__send__(:decorated_class=, self)
         | 
| 85 | 
            +
                  decoration.__send__(:decorated_method=, instance_method(name))
         | 
| 86 | 
            +
                  decorated_methods[name] << decoration
         | 
| 71 87 | 
             
                end
         | 
| 72 88 | 
             
              end
         | 
| 73 89 |  | 
| @@ -80,6 +96,7 @@ module Decorations | |
| 80 96 | 
             
              #
         | 
| 81 97 | 
             
              # @api private
         | 
| 82 98 | 
             
              def method_added(name)
         | 
| 99 | 
            +
                return if @disabled
         | 
| 83 100 | 
             
                return unless @decorators
         | 
| 84 101 |  | 
| 85 102 | 
             
                @decorated_methods ||= Hash.new { |h, k| h[k] = [] }
         | 
| @@ -87,9 +104,9 @@ module Decorations | |
| 87 104 | 
             
                @decorators = nil
         | 
| 88 105 |  | 
| 89 106 | 
             
                class_eval <<-RUBY_EVAL, __FILE__, __LINE__ + 1
         | 
| 90 | 
            -
                  def #{name}(*args, & | 
| 107 | 
            +
                  def #{name}(*args, &block)
         | 
| 91 108 | 
             
                    chain = self.class.decorated_methods[#{name.inspect}].dup
         | 
| 92 | 
            -
                    Decorator.new( | 
| 109 | 
            +
                    Decorator.new.__send__(:call, self, chain, *args, &block)
         | 
| 93 110 | 
             
                  end
         | 
| 94 111 | 
             
                RUBY_EVAL
         | 
| 95 112 | 
             
              end
         | 
    
        data/lib/decorations/version.rb
    CHANGED
    
    
    
        data/lib/decorator.rb
    CHANGED
    
    | @@ -1,71 +1,56 @@ | |
| 1 1 | 
             
            # frozen_string_literal: true
         | 
| 2 2 |  | 
| 3 | 
            +
            require 'decorator_dsl'
         | 
| 4 | 
            +
             | 
| 3 5 | 
             
            ##
         | 
| 4 6 | 
             
            # Base decorator class
         | 
| 5 7 | 
             
            class Decorator
         | 
| 8 | 
            +
              extend DecoratorDsl
         | 
| 9 | 
            +
             | 
| 10 | 
            +
              private
         | 
| 11 | 
            +
             | 
| 6 12 | 
             
              ##
         | 
| 7 | 
            -
              # @!attribute [ | 
| 13 | 
            +
              # @!attribute [a] decorated_class
         | 
| 8 14 | 
             
              # The class being decorated
         | 
| 9 15 | 
             
              #
         | 
| 10 16 | 
             
              # @return [Class]
         | 
| 11 17 | 
             
              #
         | 
| 12 | 
            -
              # @ | 
| 13 | 
            -
               | 
| 14 | 
            -
              #
         | 
| 15 | 
            -
              # @api public
         | 
| 16 | 
            -
              attr_reader :decorated_class
         | 
| 18 | 
            +
              # @api private
         | 
| 19 | 
            +
              attr_accessor :decorated_class
         | 
| 17 20 |  | 
| 18 21 | 
             
              ##
         | 
| 19 | 
            -
              # @!attribute [ | 
| 22 | 
            +
              # @!attribute [a] decorated_class
         | 
| 20 23 | 
             
              # The method being decorated
         | 
| 21 24 | 
             
              #
         | 
| 22 25 | 
             
              # @return [Symbol]
         | 
| 23 26 | 
             
              #
         | 
| 24 | 
            -
              # @example
         | 
| 25 | 
            -
              #   decorator.decorated_method #=> Symbol
         | 
| 26 | 
            -
              #
         | 
| 27 | 
            -
              # @api public
         | 
| 28 | 
            -
              attr_reader :decorated_method
         | 
| 29 | 
            -
             | 
| 30 | 
            -
              ##
         | 
| 31 | 
            -
              # Decorator constructor interface
         | 
| 32 | 
            -
              #
         | 
| 33 | 
            -
              # @param decorated_class [Class] The class that is being decorated
         | 
| 34 | 
            -
              # @param decorated_method [Symbol] The method that is being decorated
         | 
| 35 | 
            -
              #
         | 
| 36 | 
            -
              # @return [Decorator]
         | 
| 37 | 
            -
              #
         | 
| 38 27 | 
             
              # @api private
         | 
| 39 | 
            -
               | 
| 40 | 
            -
                @decorated_class = decorated_class
         | 
| 41 | 
            -
                @decorated_method = decorated_method
         | 
| 42 | 
            -
              end
         | 
| 28 | 
            +
              attr_accessor :decorated_method
         | 
| 43 29 |  | 
| 44 30 | 
             
              ##
         | 
| 45 31 | 
             
              # The hook to call chained decorations
         | 
| 46 32 | 
             
              #
         | 
| 47 33 | 
             
              # @param this [Instance] the instance of the object with the wrapper method
         | 
| 48 34 | 
             
              # @param chain [Array<Decorator>] the remaining decorators to be called
         | 
| 49 | 
            -
              # @param  | 
| 35 | 
            +
              # @param args [Array<Object>] the arguments to pass to the wrapper method
         | 
| 36 | 
            +
              # @param block [Proc] the block to pass to the wrapped method
         | 
| 50 37 | 
             
              #
         | 
| 51 38 | 
             
              # @return [Object] the return value of the next_caller
         | 
| 52 39 | 
             
              #
         | 
| 53 | 
            -
              # @ | 
| 54 | 
            -
               | 
| 55 | 
            -
              #     def call(this, chain, *args)
         | 
| 56 | 
            -
              #       puts "'#{decorated_class}' has '#{decorated_method.name}' decorated"
         | 
| 57 | 
            -
              #       call_next(this, chain, *args)
         | 
| 58 | 
            -
              #     end
         | 
| 59 | 
            -
              #   end
         | 
| 60 | 
            -
              #
         | 
| 61 | 
            -
              # @api public
         | 
| 62 | 
            -
              def call_next(this, chain, *args)
         | 
| 40 | 
            +
              # @api private
         | 
| 41 | 
            +
              def call(this, chain, *args, &block)
         | 
| 63 42 | 
             
                next_caller = chain.shift
         | 
| 64 43 |  | 
| 65 | 
            -
                 | 
| 66 | 
            -
             | 
| 67 | 
            -
                 | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 44 | 
            +
                self.class.__send__(:before_method)&.each { |method_name| __send__(method_name) }
         | 
| 45 | 
            +
             | 
| 46 | 
            +
                ret = if next_caller.nil?
         | 
| 47 | 
            +
                        decorated_method.bind(this).call(*args, &block)
         | 
| 48 | 
            +
                      else
         | 
| 49 | 
            +
                        next_caller.__send__(:call, this, chain, *args, &block)
         | 
| 50 | 
            +
                      end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
                self.class.__send__(:after_method)&.each { |method_name| __send__(method_name) }
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                ret
         | 
| 70 55 | 
             
              end
         | 
| 71 56 | 
             
            end
         | 
| @@ -0,0 +1,111 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            require 'set'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ##
         | 
| 6 | 
            +
            # DSL for Decorator to define before and after hooks for a wrapped method
         | 
| 7 | 
            +
            module DecoratorDsl
         | 
| 8 | 
            +
              ##
         | 
| 9 | 
            +
              # Injects the DSL attributes in the class received
         | 
| 10 | 
            +
              #
         | 
| 11 | 
            +
              # @param receiver [Class] the class extending DecoratorDsl
         | 
| 12 | 
            +
              #
         | 
| 13 | 
            +
              # @return [Void]
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              # @api private
         | 
| 16 | 
            +
              def self.extended(receiver)
         | 
| 17 | 
            +
                class << receiver
         | 
| 18 | 
            +
                  private
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  attr_accessor :before_method, :before_set, :after_method, :after_set
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
             | 
| 24 | 
            +
              ##
         | 
| 25 | 
            +
              # Adds the next method to be hook into executing before decorated method
         | 
| 26 | 
            +
              #
         | 
| 27 | 
            +
              # @return [Void]
         | 
| 28 | 
            +
              #
         | 
| 29 | 
            +
              # @example
         | 
| 30 | 
            +
              #   class DecoratorDemo < Decorator
         | 
| 31 | 
            +
              #     before :print_message
         | 
| 32 | 
            +
              #     def print_message(this, chain, *args)
         | 
| 33 | 
            +
              #       puts "'#{decorated_class}' has '#{decorated_method.name}' decorated"
         | 
| 34 | 
            +
              #     end
         | 
| 35 | 
            +
              #   end
         | 
| 36 | 
            +
              #
         | 
| 37 | 
            +
              #   class Demo
         | 
| 38 | 
            +
              #     extend Decorations
         | 
| 39 | 
            +
              #
         | 
| 40 | 
            +
              #     decorate DecoratorDemo
         | 
| 41 | 
            +
              #     def demo_method
         | 
| 42 | 
            +
              #       puts 'am I decorated?'
         | 
| 43 | 
            +
              #     end
         | 
| 44 | 
            +
              #   end
         | 
| 45 | 
            +
              #
         | 
| 46 | 
            +
              #   demo = Demo.new
         | 
| 47 | 
            +
              #   demo.demo_method
         | 
| 48 | 
            +
              #   # => 'Demo' has 'demo_method' decorated
         | 
| 49 | 
            +
              #   # => am I decorated?
         | 
| 50 | 
            +
              #
         | 
| 51 | 
            +
              # @api public
         | 
| 52 | 
            +
              def before
         | 
| 53 | 
            +
                @before_method ||= Set.new
         | 
| 54 | 
            +
                @before_set = true
         | 
| 55 | 
            +
              end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
              ##
         | 
| 58 | 
            +
              # Adds the next method to be hook into executing after decorated method
         | 
| 59 | 
            +
              #
         | 
| 60 | 
            +
              # @return [Void]
         | 
| 61 | 
            +
              #
         | 
| 62 | 
            +
              # @example
         | 
| 63 | 
            +
              #   class DecoratorDemo < Decorator
         | 
| 64 | 
            +
              #     after
         | 
| 65 | 
            +
              #     def print_message(this, chain, *args)
         | 
| 66 | 
            +
              #       puts "'#{decorated_class}' has '#{decorated_method.name}' decorated"
         | 
| 67 | 
            +
              #     end
         | 
| 68 | 
            +
              #   end
         | 
| 69 | 
            +
              #
         | 
| 70 | 
            +
              #   class Demo
         | 
| 71 | 
            +
              #     extend Decorations
         | 
| 72 | 
            +
              #
         | 
| 73 | 
            +
              #     decorate DecoratorDemo
         | 
| 74 | 
            +
              #     def demo_method
         | 
| 75 | 
            +
              #       puts 'am I decorated?'
         | 
| 76 | 
            +
              #     end
         | 
| 77 | 
            +
              #   end
         | 
| 78 | 
            +
              #
         | 
| 79 | 
            +
              #   demo = Demo.new
         | 
| 80 | 
            +
              #   demo.demo_method
         | 
| 81 | 
            +
              #   # => am I decorated?
         | 
| 82 | 
            +
              #   # => 'Demo' has 'demo_method' decorated
         | 
| 83 | 
            +
              #
         | 
| 84 | 
            +
              # @api public
         | 
| 85 | 
            +
              def after
         | 
| 86 | 
            +
                @after_method ||= Set.new
         | 
| 87 | 
            +
                @after_set = true
         | 
| 88 | 
            +
              end
         | 
| 89 | 
            +
             | 
| 90 | 
            +
              private
         | 
| 91 | 
            +
             | 
| 92 | 
            +
              ##
         | 
| 93 | 
            +
              # Hooks the methods defined for a class
         | 
| 94 | 
            +
              #
         | 
| 95 | 
            +
              # @param name [Symbol] the name of the method being defined
         | 
| 96 | 
            +
              #
         | 
| 97 | 
            +
              # @return [Void]
         | 
| 98 | 
            +
              #
         | 
| 99 | 
            +
              # @api private
         | 
| 100 | 
            +
              def method_added(name)
         | 
| 101 | 
            +
                if before_set
         | 
| 102 | 
            +
                  @before_set = false
         | 
| 103 | 
            +
                  @before_method << name
         | 
| 104 | 
            +
                end
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                return unless after_set
         | 
| 107 | 
            +
             | 
| 108 | 
            +
                @after_set = false
         | 
| 109 | 
            +
                @after_method << name
         | 
| 110 | 
            +
              end
         | 
| 111 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,14 +1,14 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: decorations
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0. | 
| 4 | 
            +
              version: 1.0.0
         | 
| 5 5 | 
             
            platform: ruby
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - John Shields
         | 
| 8 8 | 
             
            autorequire: 
         | 
| 9 9 | 
             
            bindir: exe
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date: 2019- | 
| 11 | 
            +
            date: 2019-11-02 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 14 | 
             
              name: bundler
         | 
| @@ -24,20 +24,6 @@ dependencies: | |
| 24 24 | 
             
                - - "~>"
         | 
| 25 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 26 26 | 
             
                    version: '1.16'
         | 
| 27 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            -
              name: coveralls
         | 
| 29 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 30 | 
            -
                requirements:
         | 
| 31 | 
            -
                - - ">="
         | 
| 32 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 33 | 
            -
                    version: '0'
         | 
| 34 | 
            -
              type: :development
         | 
| 35 | 
            -
              prerelease: false
         | 
| 36 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 37 | 
            -
                requirements:
         | 
| 38 | 
            -
                - - ">="
         | 
| 39 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 40 | 
            -
                    version: '0'
         | 
| 41 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 42 28 | 
             
              name: gem-release
         | 
| 43 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -94,20 +80,6 @@ dependencies: | |
| 94 80 | 
             
                - - "~>"
         | 
| 95 81 | 
             
                  - !ruby/object:Gem::Version
         | 
| 96 82 | 
             
                    version: '10.0'
         | 
| 97 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 98 | 
            -
              name: rest-client
         | 
| 99 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 100 | 
            -
                requirements:
         | 
| 101 | 
            -
                - - ">="
         | 
| 102 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 103 | 
            -
                    version: 1.8.0
         | 
| 104 | 
            -
              type: :development
         | 
| 105 | 
            -
              prerelease: false
         | 
| 106 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 107 | 
            -
                requirements:
         | 
| 108 | 
            -
                - - ">="
         | 
| 109 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 110 | 
            -
                    version: 1.8.0
         | 
| 111 83 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 112 84 | 
             
              name: rspec
         | 
| 113 85 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -136,20 +108,6 @@ dependencies: | |
| 136 108 | 
             
                - - ">="
         | 
| 137 109 | 
             
                  - !ruby/object:Gem::Version
         | 
| 138 110 | 
             
                    version: '0'
         | 
| 139 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 140 | 
            -
              name: simplecov
         | 
| 141 | 
            -
              requirement: !ruby/object:Gem::Requirement
         | 
| 142 | 
            -
                requirements:
         | 
| 143 | 
            -
                - - ">="
         | 
| 144 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 145 | 
            -
                    version: '0'
         | 
| 146 | 
            -
              type: :development
         | 
| 147 | 
            -
              prerelease: false
         | 
| 148 | 
            -
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 149 | 
            -
                requirements:
         | 
| 150 | 
            -
                - - ">="
         | 
| 151 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 152 | 
            -
                    version: '0'
         | 
| 153 111 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 154 112 | 
             
              name: yard
         | 
| 155 113 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| @@ -202,6 +160,7 @@ files: | |
| 202 160 | 
             
            - lib/decorations.rb
         | 
| 203 161 | 
             
            - lib/decorations/version.rb
         | 
| 204 162 | 
             
            - lib/decorator.rb
         | 
| 163 | 
            +
            - lib/decorator_dsl.rb
         | 
| 205 164 | 
             
            homepage: https://github.com/watmin/Ruby-decorations
         | 
| 206 165 | 
             
            licenses:
         | 
| 207 166 | 
             
            - MIT
         |