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
|