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.
@@ -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