method_man 0.0.2 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
@@ -1,2 +1 @@
1
- 1.9.3-p374
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 implements Kent Beck's "[method object](http://c2.com/cgi/wiki?MethodObject)".
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(name, age = 21, &test_block)
12
- [shortname, age, yield(1), test_value]
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 shortname
18
- # all passed (not optional default) arguments in the
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(name: 'Elliot') { |input| input + 1 }
30
- => ["ELLI", 21, 2, 3]
36
+
37
+ MakeArbitraryArray.call(
38
+ first_name: 'John',
39
+ last_name: 'Smith',
40
+ message: 'Hi',
41
+ )
42
+ => ["John Smith", 'Hi', 42]
31
43
  ```
@@ -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(&definition_block)
10
- @definition_block = definition_block
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
- add_generator
15
- add_getters
16
- method_object_class
17
- end
18
-
19
- def block_name
20
- block_parameter.fetch(1)
21
- end
22
-
23
- def parameter_names
24
- @parameter_names ||= parameters.map(&:last)
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 method_object_class
42
- @method_object_class ||= Class.new(Base, &@definition_block)
43
- end
44
-
45
- def add_getters
46
- parameter_names.each do |parameter_name|
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 parameters
52
- method_object_class.instance_method(:call).parameters
35
+ def required_keyword_args_string
36
+ @required_keyword_args.map { |arg| "#{arg}:" }.join(',')
53
37
  end
54
38
 
55
- def non_block_parameters
56
- parameters - [block_parameter]
39
+ def ordered_args_string
40
+ @required_keyword_args.join(',')
57
41
  end
58
42
  end
@@ -1,3 +1,3 @@
1
1
  class MethodObject
2
- VERSION = '0.0.2'
2
+ VERSION = '1.0.0'
3
3
  end
@@ -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.9'
21
+ spec.required_ruby_version = '>= 2.1'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.3'
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
@@ -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
- required_arg_1,
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
- result = subject.call(
32
- required_arg_1: :required_arg_1,
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
- expect(result).to eq [
41
- :required_arg_1,
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
- context 'without arguments' do
51
- subject do
52
- described_class.new do
53
- def call
54
- end
55
- end
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 'works' do
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.2
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: 2013-10-19 00:00:00.000000000 Z
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.3'
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.3'
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: '0'
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: '0'
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: '0'
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: '0'
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.9'
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: 1.8.23
96
+ rubygems_version: 2.4.5
106
97
  signing_key:
107
- specification_version: 3
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:
@@ -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