method_man 0.0.2 → 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 +7 -0
- data/.ruby-version +1 -2
- data/README.md +30 -18
- data/lib/method_object.rb +26 -42
- data/lib/method_object/version.rb +1 -1
- data/method_man.gemspec +4 -4
- data/spec/method_man_spec.rb +22 -46
- metadata +23 -32
- data/lib/method_object/base.rb +0 -27
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 3f6ff20e7c2d99f044220e1ec5ac2f2797e1d69e
         | 
| 4 | 
            +
              data.tar.gz: 1c3d343db211b89563d90d542ca55571f7da57f6
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 9ec339e5eb97608a7ef871d8bb2a6481f0e3bdb451de0b887c798ea810133b00afdcdd20398ed084250be4381ab4e36bc3bc7671c6d146e53371fe6e5a822f10
         | 
| 7 | 
            +
              data.tar.gz: 5045fc01e0279d6c99dbe8e5dce37bf612e058f4f6da6edd5768f31ed531565ac610300f03327dbad301b81cbf5168626919f0a9e8053c700e7247620f51e51f
         | 
    
        data/.ruby-version
    CHANGED
    
    | @@ -1,2 +1 @@ | |
| 1 | 
            -
             | 
| 2 | 
            -
             | 
| 1 | 
            +
            2.2.1
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,31 +1,43 @@ | |
| 1 1 | 
             
            # Method Man
         | 
| 2 2 |  | 
| 3 | 
            -
            Defines a MethodObject class which  | 
| 3 | 
            +
            Defines a MethodObject class which facilitates basic setup for Kent Beck's "[method object](http://c2.com/cgi/wiki?MethodObject)".
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            The MethodObject class is largely based on a Ruby Struct, but with a few additional features:
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            * Facilitates basic method object pattern setup. You only need to supply an instance `call` method.
         | 
| 8 | 
            +
            * Accepts a list of arguments which are mapped to required keyword arguments.
         | 
| 9 | 
            +
            * Disallows calling `new` on the resulting MethodObject class instance.
         | 
| 10 | 
            +
             | 
| 11 | 
            +
            ## Bundler usage
         | 
| 12 | 
            +
             | 
| 13 | 
            +
            ```ruby
         | 
| 14 | 
            +
            gem 'method_man', require: 'method_object'
         | 
| 15 | 
            +
            ```
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            ## Requirements
         | 
| 18 | 
            +
            * Ruby >= 2.1
         | 
| 4 19 |  | 
| 5 20 | 
             
            ## Example
         | 
| 6 21 |  | 
| 7 22 | 
             
            ```ruby
         | 
| 8 23 | 
             
              require 'method_object'
         | 
| 9 24 |  | 
| 10 | 
            -
              MakeArbitraryArray = MethodObject.new do
         | 
| 11 | 
            -
                def call | 
| 12 | 
            -
                  [ | 
| 25 | 
            +
              MakeArbitraryArray = MethodObject.new(:first_name, :last_name, :message) do
         | 
| 26 | 
            +
                def call
         | 
| 27 | 
            +
                  [fullname, message, 42]
         | 
| 13 28 | 
             
                end
         | 
| 14 | 
            -
             | 
| 29 | 
            +
             | 
| 15 30 | 
             
                private
         | 
| 16 | 
            -
             | 
| 17 | 
            -
                def  | 
| 18 | 
            -
                  #  | 
| 19 | 
            -
                  # signature for call() are available as instance methods
         | 
| 20 | 
            -
                  name.slice(0,4).upcase
         | 
| 21 | 
            -
                end
         | 
| 22 | 
            -
                
         | 
| 23 | 
            -
                def test_block_value
         | 
| 24 | 
            -
                  # block is available to be called by name
         | 
| 25 | 
            -
                  test_block.call(2)
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                def fullname
         | 
| 33 | 
            +
                  "#{first_name} #{last_name}"
         | 
| 26 34 | 
             
                end
         | 
| 27 35 | 
             
              end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
              MakeArbitraryArray.call( | 
| 30 | 
            -
             | 
| 36 | 
            +
             | 
| 37 | 
            +
              MakeArbitraryArray.call(
         | 
| 38 | 
            +
                first_name: 'John',
         | 
| 39 | 
            +
                last_name: 'Smith',
         | 
| 40 | 
            +
                message: 'Hi',
         | 
| 41 | 
            +
              )
         | 
| 42 | 
            +
              => ["John Smith", 'Hi', 42]
         | 
| 31 43 | 
             
            ```
         | 
    
        data/lib/method_object.rb
    CHANGED
    
    | @@ -1,58 +1,42 @@ | |
| 1 1 | 
             
            require 'method_object/version'
         | 
| 2 | 
            -
            require 'method_object/base'
         | 
| 3 2 |  | 
| 4 3 | 
             
            class MethodObject
         | 
| 5 | 
            -
              def self.new
         | 
| 6 | 
            -
                super.call
         | 
| 4 | 
            +
              def self.new(*args, &block)
         | 
| 5 | 
            +
                super(*args, block).call
         | 
| 7 6 | 
             
              end
         | 
| 8 7 |  | 
| 9 | 
            -
              def initialize( | 
| 10 | 
            -
                @ | 
| 8 | 
            +
              def initialize(*required_keyword_args, block)
         | 
| 9 | 
            +
                @required_keyword_args = required_keyword_args
         | 
| 10 | 
            +
                @block = block
         | 
| 11 11 | 
             
              end
         | 
| 12 12 |  | 
| 13 13 | 
             
              def call
         | 
| 14 | 
            -
                 | 
| 15 | 
            -
                 | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
                 | 
| 25 | 
            -
              end
         | 
| 26 | 
            -
              
         | 
| 27 | 
            -
              def non_block_parameter_names
         | 
| 28 | 
            -
                @non_block_parameter_names ||= non_block_parameters.map { |parameter| parameter.fetch(1) }
         | 
| 29 | 
            -
              end
         | 
| 30 | 
            -
             | 
| 31 | 
            -
              def block_parameter
         | 
| 32 | 
            -
                @block_parameter ||= parameters.find { |parameter| parameter[0] == :block }
         | 
| 33 | 
            -
              end
         | 
| 34 | 
            -
             | 
| 35 | 
            -
              private
         | 
| 36 | 
            -
             | 
| 37 | 
            -
              def add_generator
         | 
| 38 | 
            -
                method_object_class.instance_variable_set(:@generator, self)
         | 
| 14 | 
            +
                code = self.code
         | 
| 15 | 
            +
                block = @block
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                Struct.new(*@required_keyword_args) do
         | 
| 18 | 
            +
                  private_class_method :new
         | 
| 19 | 
            +
                  eval(code)
         | 
| 20 | 
            +
                  def call
         | 
| 21 | 
            +
                    fail NotImplementedError, "Please define the call method"
         | 
| 22 | 
            +
                  end
         | 
| 23 | 
            +
                  class_eval(&block)
         | 
| 24 | 
            +
                end
         | 
| 39 25 | 
             
              end
         | 
| 40 26 |  | 
| 41 | 
            -
              def  | 
| 42 | 
            -
                 | 
| 43 | 
            -
             | 
| 44 | 
            -
             | 
| 45 | 
            -
             | 
| 46 | 
            -
                 | 
| 47 | 
            -
                  method_object_class.send(:attr_reader, parameter_name)
         | 
| 48 | 
            -
                end
         | 
| 27 | 
            +
              def code
         | 
| 28 | 
            +
                <<-CODE
         | 
| 29 | 
            +
                  def self.call(#{required_keyword_args_string})
         | 
| 30 | 
            +
                    new(#{ordered_args_string}).call
         | 
| 31 | 
            +
                  end
         | 
| 32 | 
            +
                CODE
         | 
| 49 33 | 
             
              end
         | 
| 50 34 |  | 
| 51 | 
            -
              def  | 
| 52 | 
            -
                 | 
| 35 | 
            +
              def required_keyword_args_string
         | 
| 36 | 
            +
                @required_keyword_args.map { |arg| "#{arg}:" }.join(',')
         | 
| 53 37 | 
             
              end
         | 
| 54 38 |  | 
| 55 | 
            -
              def  | 
| 56 | 
            -
                 | 
| 39 | 
            +
              def ordered_args_string
         | 
| 40 | 
            +
                @required_keyword_args.join(',')
         | 
| 57 41 | 
             
              end
         | 
| 58 42 | 
             
            end
         | 
    
        data/method_man.gemspec
    CHANGED
    
    | @@ -18,9 +18,9 @@ Gem::Specification.new do |spec| | |
| 18 18 | 
             
              spec.test_files    = spec.files.grep(%r{^(test|spec|features)/})
         | 
| 19 19 | 
             
              spec.require_paths = %w(lib)
         | 
| 20 20 |  | 
| 21 | 
            -
              spec.required_ruby_version = '>= 1 | 
| 21 | 
            +
              spec.required_ruby_version = '>= 2.1'
         | 
| 22 22 |  | 
| 23 | 
            -
              spec.add_development_dependency 'bundler', '~> 1. | 
| 24 | 
            -
              spec.add_development_dependency 'rake'
         | 
| 25 | 
            -
              spec.add_development_dependency 'rspec'
         | 
| 23 | 
            +
              spec.add_development_dependency 'bundler', '~> 1.9'
         | 
| 24 | 
            +
              spec.add_development_dependency 'rake', '~> 10.4'
         | 
| 25 | 
            +
              spec.add_development_dependency 'rspec', '~> 3.2'
         | 
| 26 26 | 
             
            end
         | 
    
        data/spec/method_man_spec.rb
    CHANGED
    
    | @@ -2,61 +2,37 @@ require 'method_object' | |
| 2 2 |  | 
| 3 3 | 
             
            describe MethodObject do
         | 
| 4 4 | 
             
              subject do
         | 
| 5 | 
            -
                described_class.new do
         | 
| 6 | 
            -
                  def call | 
| 7 | 
            -
                     | 
| 8 | 
            -
                    required_arg_2,
         | 
| 9 | 
            -
                    optional_arg_1 = :optional_arg_1,
         | 
| 10 | 
            -
                    optional_arg_2 = :optional_arg_2,
         | 
| 11 | 
            -
                    &my_block)
         | 
| 12 | 
            -
                    result << optional_arg_2 << yield(1)
         | 
| 13 | 
            -
                  end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                  def result
         | 
| 16 | 
            -
                    [
         | 
| 17 | 
            -
                      required_arg_1,
         | 
| 18 | 
            -
                      required_arg_2,
         | 
| 19 | 
            -
                      optional_arg_1,
         | 
| 20 | 
            -
                      my_block.call(2),
         | 
| 21 | 
            -
                    ]
         | 
| 22 | 
            -
                  end
         | 
| 23 | 
            -
             | 
| 24 | 
            -
                  def required_arg_1
         | 
| 25 | 
            -
                    :required_arg_1
         | 
| 5 | 
            +
                described_class.new(:value_one, :value_two) do
         | 
| 6 | 
            +
                  def call
         | 
| 7 | 
            +
                    value_one + value_two
         | 
| 26 8 | 
             
                  end
         | 
| 27 9 | 
             
                end
         | 
| 28 10 | 
             
              end
         | 
| 29 11 |  | 
| 12 | 
            +
              let(:value_one) { 1 }
         | 
| 13 | 
            +
              let(:value_two) { 2 }
         | 
| 14 | 
            +
              let(:actual_result) do
         | 
| 15 | 
            +
                subject.call(value_one: value_one, value_two: value_two)
         | 
| 16 | 
            +
              end
         | 
| 17 | 
            +
             | 
| 30 18 | 
             
              it 'works' do
         | 
| 31 | 
            -
                 | 
| 32 | 
            -
             | 
| 33 | 
            -
                  required_arg_2: :required_arg_2,
         | 
| 34 | 
            -
                  optional_arg_1: :optional_arg_1,
         | 
| 35 | 
            -
                  optional_arg_2: :optional_arg_2,
         | 
| 36 | 
            -
                ) do |block_arg|
         | 
| 37 | 
            -
                  block_arg + 1
         | 
| 38 | 
            -
                end
         | 
| 19 | 
            +
                expect(actual_result).to eq 3
         | 
| 20 | 
            +
              end
         | 
| 39 21 |  | 
| 40 | 
            -
             | 
| 41 | 
            -
             | 
| 42 | 
            -
                                       :required_arg_2,
         | 
| 43 | 
            -
                                       :optional_arg_1,
         | 
| 44 | 
            -
                                       3,
         | 
| 45 | 
            -
                                       :optional_arg_2,
         | 
| 46 | 
            -
                                       2,
         | 
| 47 | 
            -
                                     ]
         | 
| 22 | 
            +
              it 'uses required keyword arguments' do
         | 
| 23 | 
            +
                expect { subject.call }.to raise_error ArgumentError
         | 
| 48 24 | 
             
              end
         | 
| 49 25 |  | 
| 50 | 
            -
               | 
| 51 | 
            -
                subject  | 
| 52 | 
            -
             | 
| 53 | 
            -
             | 
| 54 | 
            -
             | 
| 55 | 
            -
             | 
| 56 | 
            -
                end
         | 
| 26 | 
            +
              it 'makes new a private class method' do
         | 
| 27 | 
            +
                expect { subject.new }.to raise_error NoMethodError
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              context 'without a provided instance call method' do
         | 
| 31 | 
            +
                subject { described_class.new(:value_one) {} }
         | 
| 57 32 |  | 
| 58 | 
            -
                it ' | 
| 59 | 
            -
                  subject.call
         | 
| 33 | 
            +
                it 'raises an error' do
         | 
| 34 | 
            +
                  expect { subject.call(value_one: value_one) }
         | 
| 35 | 
            +
                    .to raise_error NotImplementedError
         | 
| 60 36 | 
             
                end
         | 
| 61 37 | 
             
              end
         | 
| 62 38 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,64 +1,57 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: method_man
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.0 | 
| 5 | 
            -
              prerelease: 
         | 
| 4 | 
            +
              version: 1.0.0
         | 
| 6 5 | 
             
            platform: ruby
         | 
| 7 6 | 
             
            authors:
         | 
| 8 7 | 
             
            - Clay Shentrup
         | 
| 9 8 | 
             
            autorequire: 
         | 
| 10 9 | 
             
            bindir: bin
         | 
| 11 10 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date:  | 
| 11 | 
            +
            date: 2015-06-05 00:00:00.000000000 Z
         | 
| 13 12 | 
             
            dependencies:
         | 
| 14 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 14 | 
             
              name: bundler
         | 
| 16 15 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 17 | 
            -
                none: false
         | 
| 18 16 | 
             
                requirements:
         | 
| 19 | 
            -
                - - ~>
         | 
| 17 | 
            +
                - - "~>"
         | 
| 20 18 | 
             
                  - !ruby/object:Gem::Version
         | 
| 21 | 
            -
                    version: '1. | 
| 19 | 
            +
                    version: '1.9'
         | 
| 22 20 | 
             
              type: :development
         | 
| 23 21 | 
             
              prerelease: false
         | 
| 24 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 25 | 
            -
                none: false
         | 
| 26 23 | 
             
                requirements:
         | 
| 27 | 
            -
                - - ~>
         | 
| 24 | 
            +
                - - "~>"
         | 
| 28 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 29 | 
            -
                    version: '1. | 
| 26 | 
            +
                    version: '1.9'
         | 
| 30 27 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 31 28 | 
             
              name: rake
         | 
| 32 29 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 33 | 
            -
                none: false
         | 
| 34 30 | 
             
                requirements:
         | 
| 35 | 
            -
                - -  | 
| 31 | 
            +
                - - "~>"
         | 
| 36 32 | 
             
                  - !ruby/object:Gem::Version
         | 
| 37 | 
            -
                    version: ' | 
| 33 | 
            +
                    version: '10.4'
         | 
| 38 34 | 
             
              type: :development
         | 
| 39 35 | 
             
              prerelease: false
         | 
| 40 36 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 41 | 
            -
                none: false
         | 
| 42 37 | 
             
                requirements:
         | 
| 43 | 
            -
                - -  | 
| 38 | 
            +
                - - "~>"
         | 
| 44 39 | 
             
                  - !ruby/object:Gem::Version
         | 
| 45 | 
            -
                    version: ' | 
| 40 | 
            +
                    version: '10.4'
         | 
| 46 41 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 47 42 | 
             
              name: rspec
         | 
| 48 43 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 49 | 
            -
                none: false
         | 
| 50 44 | 
             
                requirements:
         | 
| 51 | 
            -
                - -  | 
| 45 | 
            +
                - - "~>"
         | 
| 52 46 | 
             
                  - !ruby/object:Gem::Version
         | 
| 53 | 
            -
                    version: ' | 
| 47 | 
            +
                    version: '3.2'
         | 
| 54 48 | 
             
              type: :development
         | 
| 55 49 | 
             
              prerelease: false
         | 
| 56 50 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 57 | 
            -
                none: false
         | 
| 58 51 | 
             
                requirements:
         | 
| 59 | 
            -
                - -  | 
| 52 | 
            +
                - - "~>"
         | 
| 60 53 | 
             
                  - !ruby/object:Gem::Version
         | 
| 61 | 
            -
                    version: ' | 
| 54 | 
            +
                    version: '3.2'
         | 
| 62 55 | 
             
            description: Provides a MethodObject class which implements Kent Beck's "method object"
         | 
| 63 56 | 
             
              pattern.
         | 
| 64 57 | 
             
            email:
         | 
| @@ -67,16 +60,15 @@ executables: [] | |
| 67 60 | 
             
            extensions: []
         | 
| 68 61 | 
             
            extra_rdoc_files: []
         | 
| 69 62 | 
             
            files:
         | 
| 70 | 
            -
            - .gitignore
         | 
| 71 | 
            -
            - .rspec
         | 
| 72 | 
            -
            - .ruby-version
         | 
| 63 | 
            +
            - ".gitignore"
         | 
| 64 | 
            +
            - ".rspec"
         | 
| 65 | 
            +
            - ".ruby-version"
         | 
| 73 66 | 
             
            - Gemfile
         | 
| 74 67 | 
             
            - LICENSE
         | 
| 75 68 | 
             
            - LICENSE.txt
         | 
| 76 69 | 
             
            - README.md
         | 
| 77 70 | 
             
            - Rakefile
         | 
| 78 71 | 
             
            - lib/method_object.rb
         | 
| 79 | 
            -
            - lib/method_object/base.rb
         | 
| 80 72 | 
             
            - lib/method_object/version.rb
         | 
| 81 73 | 
             
            - method_man.gemspec
         | 
| 82 74 | 
             
            - spec/method_man_spec.rb
         | 
| @@ -84,27 +76,26 @@ files: | |
| 84 76 | 
             
            homepage: https://github.com/brokenladder/method_man
         | 
| 85 77 | 
             
            licenses:
         | 
| 86 78 | 
             
            - MIT
         | 
| 79 | 
            +
            metadata: {}
         | 
| 87 80 | 
             
            post_install_message: 
         | 
| 88 81 | 
             
            rdoc_options: []
         | 
| 89 82 | 
             
            require_paths:
         | 
| 90 83 | 
             
            - lib
         | 
| 91 84 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 92 | 
            -
              none: false
         | 
| 93 85 | 
             
              requirements:
         | 
| 94 | 
            -
              - -  | 
| 86 | 
            +
              - - ">="
         | 
| 95 87 | 
             
                - !ruby/object:Gem::Version
         | 
| 96 | 
            -
                  version: '1 | 
| 88 | 
            +
                  version: '2.1'
         | 
| 97 89 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 98 | 
            -
              none: false
         | 
| 99 90 | 
             
              requirements:
         | 
| 100 | 
            -
              - -  | 
| 91 | 
            +
              - - ">="
         | 
| 101 92 | 
             
                - !ruby/object:Gem::Version
         | 
| 102 93 | 
             
                  version: '0'
         | 
| 103 94 | 
             
            requirements: []
         | 
| 104 95 | 
             
            rubyforge_project: 
         | 
| 105 | 
            -
            rubygems_version:  | 
| 96 | 
            +
            rubygems_version: 2.4.5
         | 
| 106 97 | 
             
            signing_key: 
         | 
| 107 | 
            -
            specification_version:  | 
| 98 | 
            +
            specification_version: 4
         | 
| 108 99 | 
             
            summary: Provides a MethodObject class which implements Kent Beck's "method object"
         | 
| 109 100 | 
             
              pattern.
         | 
| 110 101 | 
             
            test_files:
         | 
    
        data/lib/method_object/base.rb
    DELETED
    
    | @@ -1,27 +0,0 @@ | |
| 1 | 
            -
            class MethodObject::Base
         | 
| 2 | 
            -
              class << self
         | 
| 3 | 
            -
                private :new
         | 
| 4 | 
            -
             | 
| 5 | 
            -
                def call(options = {}, &block)
         | 
| 6 | 
            -
                  new(
         | 
| 7 | 
            -
                    options,
         | 
| 8 | 
            -
                    block,
         | 
| 9 | 
            -
                    @generator)
         | 
| 10 | 
            -
                  .call(*arguments_from_options(options), &block)
         | 
| 11 | 
            -
                end
         | 
| 12 | 
            -
             | 
| 13 | 
            -
                private
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                def arguments_from_options(options)
         | 
| 16 | 
            -
                  options.values_at(*@generator.non_block_parameter_names)
         | 
| 17 | 
            -
                end
         | 
| 18 | 
            -
              end
         | 
| 19 | 
            -
             | 
| 20 | 
            -
              def initialize(options, block, generator)
         | 
| 21 | 
            -
                options.each do |parameter_name, value|
         | 
| 22 | 
            -
                  instance_variable_set("@#{parameter_name}", value)
         | 
| 23 | 
            -
                end
         | 
| 24 | 
            -
                return unless generator.block_parameter
         | 
| 25 | 
            -
                instance_variable_set("@#{generator.block_name}", block)
         | 
| 26 | 
            -
              end
         | 
| 27 | 
            -
            end
         |