method_man 2.1.5 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 831d183e2f5c7237beceebb557306fb9d80cc6b2
4
- data.tar.gz: 35a28df7284c164aac634ca88d8174ff641562ab
2
+ SHA256:
3
+ metadata.gz: 27ac0306df7dc6d12ff3eb481fde1a960c1a5356cad96edcc682058536d2150a
4
+ data.tar.gz: c6b4856e53dc9fd820a32505da6eed2f2da26ba45253f566e735cea9e8aad84b
5
5
  SHA512:
6
- metadata.gz: d2265d8be6ed53fa75b8ec8ff49a6c6dc20d7345f33ad70aa348630fce86830c27dae1748c86efa37b4de466ca448a5f245bcc71c586735f0943ecf4ff1ffa7c
7
- data.tar.gz: 0ca477c07b14d61ea8f201d04735792a359c6ef0870acd777ddddfec901454767db08b0c522a35b3fb705d5796a164ba108cbfdb48d80f049ff8e0038bee8087
6
+ metadata.gz: ab1e722b4c5e2bfd01b3e70c4504a14c1bb592918bd8fe048d14045f937113912ae6341fc2cf144cff4de25b8aa9a0f6489847149866c8308d8fdc13a0b5961c
7
+ data.tar.gz: ffde0b87325abf0f187f4cb712286128151e3e782d027e2f6566bdfd6c5ef58eba9761154b443edd51ceee7c0bebdedda824571b1c84dbfd6d9ccaa52e27edcb
@@ -1,22 +1,27 @@
1
1
  AllCops:
2
- Exclude:
3
- - spec/*
4
- TargetRubyVersion: 2.4
2
+ NewCops: enable
3
+ TargetRubyVersion: 2.5
5
4
 
6
5
  # We don't care about method length, since we check method cyclomatic
7
6
  # complexity.
8
7
  Metrics/MethodLength:
9
8
  Enabled: false
9
+ Metrics/BlockLength:
10
+ Enabled: false
10
11
  Metrics/ClassLength:
11
- Enabled: false
12
+ Enabled: false
12
13
  Metrics/ModuleLength:
13
- Enabled: false
14
+ Enabled: false
15
+ Metrics/AbcSize:
16
+ Enabled: false
14
17
 
15
18
  # Trailing commas make for clearer diffs because the last line won't appear
16
19
  # to have been changed, as it would if it lacked a comma and had one added.
17
20
  Style/TrailingCommaInArguments:
18
21
  EnforcedStyleForMultiline: comma
19
- Style/TrailingCommaInLiteral:
22
+ Style/TrailingCommaInArrayLiteral:
23
+ EnforcedStyleForMultiline: comma
24
+ Style/TrailingCommaInHashLiteral:
20
25
  EnforcedStyleForMultiline: comma
21
26
 
22
27
  # Cop supports --auto-correct.
@@ -1,2 +1,2 @@
1
- 2.4.0
1
+ 2.7.1
2
2
 
data/README.md CHANGED
@@ -64,3 +64,33 @@ Also allows automatic delegation inspired by Go's
64
64
  MakeArbitraryArray.call(company: company)
65
65
  => ['Tyrell Corporation', 'Tyrell Corporation', 'Tyrell Corporation']
66
66
  ```
67
+
68
+ ## Naming
69
+
70
+ Why is the class method called `call`? Some people have argued for names like `TaskSender.send_task` instead of `TaskSender.call`. My reasoning is.
71
+
72
+ 1. `call` is a ubiquitous concept in Ruby, as it's how you invoke `Procs`.
73
+ 2. There's even a syntactic sugar for this, `.()` instead of `.call()`, e.g. `TaskSender.(task)`.
74
+ 3. The name `call` clearly _calls_ out to someone reading the code that "this is an invocation of a method object". I would say this is especially so if you see something like `TaskSender.(task)`.
75
+ 4. Avoiding redundancy. Any custom name will always just match the module/class name, e.g.
76
+ ```ruby
77
+ TaskSender.send_task # This is redundant
78
+ ```
79
+ 5. Minimizing complexity: adding an option to specify the class method would introduce additional complexity.
80
+
81
+ ### History
82
+ In [Refactoring: Ruby Edition](http://www.informit.com/store/refactoring-ruby-edition-9780321603500), we see this at the top of the section on the method object pattern.
83
+
84
+ > Stolen shamelessly from Kent Beck’s Smalltalk Best Practices.
85
+ > 1. Create a new class, name it after the method.
86
+
87
+ In the example, the instance method `Account#gamma` is refactored to `Gamma.compute`. Kent Beck's original example refactored `Obligation#sendTask` to `TaskSender.compute`.
88
+
89
+ ### Noun vs. verb
90
+
91
+ Beck uses `TaskSender`. I personally prefer `SendTask`, essentially just preserving the name of whatever method you're converting to a method object. However I don't think this detail is of much import. I might recommend trying a little of both, and seeing which naming seems least confusing when you're coming back to it weeks later.
92
+
93
+ ## How useful is this pattern?
94
+ Kent Beck has [raved about it](https://twitter.com/kentbeck/status/195168291134783489), saying:
95
+
96
+ > extract method object is such deep deep magic. it brings clarity to the confused and structure to the chaotic.
@@ -1,102 +1,95 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require('delegate')
3
4
  require('method_object/version')
4
5
 
5
- # See gemspec for description
6
- class MethodObject
6
+ # See gemspec for description.
7
+ class MethodObject < SimpleDelegator
7
8
  class AmbigousMethodError < NameError; end
8
9
 
9
10
  class << self
10
- def attrs(*attributes)
11
- @attributes = attributes
12
- Setup.call(attributes: attributes, subclass: self)
13
- end
14
-
15
11
  def call(**args)
16
- new(args).call
12
+ new(__object_factory__&.new(**args)).call
17
13
  end
18
14
 
19
- attr_reader(:attributes)
20
-
21
15
  private(:new)
22
16
 
23
- def inherited(child_class)
24
- child_class.instance_variable_set(:@attributes, [])
17
+ def attrs(*attributes)
18
+ self.__object_factory__ = ObjectFactory.create(*attributes)
25
19
  end
26
- end
27
-
28
- def initialize(_); end
29
20
 
30
- def call
31
- raise NotImplementedError, 'Define the call method'
21
+ attr_accessor(:__object_factory__)
32
22
  end
33
23
 
34
- def method_missing(name, *args, &block)
35
- candidates = candidates_for_method_missing(name)
36
- case candidates.length
37
- when 0
38
- super
39
- when 1
40
- delegate = candidates.first
41
- define_delegated_method(delegate)
42
- public_send(delegate.delegated_method, *args, &block)
43
- else
44
- handle_ambiguous_missing_method(candidates, name)
45
- end
24
+ def call
25
+ raise(NotImplementedError, 'define the call method')
46
26
  end
47
27
 
48
- def respond_to_missing?(name)
49
- candidates_for_method_missing(name).length == 1
50
- end
28
+ # Creates instances for delegation and caching method definitions.
29
+ class ObjectFactory
30
+ STRUCT_DEFINITION = lambda do |_class|
31
+ def method_missing(name, *args)
32
+ candidates = candidates_for_method_missing(name)
33
+ handle_ambiguous_missing_method(candidates, name) if candidates.length > 1
34
+ super
35
+ end
51
36
 
52
- def candidates_for_method_missing(method_name)
53
- potential_candidates =
54
- self.class.attributes.map do |attribute|
55
- PotentialDelegator.new(
56
- attribute,
57
- public_send(attribute),
58
- method_name,
59
- )
60
- end +
61
- self.class.attributes.map do |attribute|
62
- PotentialDelegatorWithPrefix.new(
63
- attribute,
64
- public_send(attribute),
65
- method_name,
66
- )
37
+ def respond_to_missing?(name, _include_private)
38
+ candidates = candidates_for_method_missing(name)
39
+ case candidates.length
40
+ when 0
41
+ return(super)
42
+ when 1
43
+ define_delegated_method(candidates.first)
44
+ end
45
+ true
67
46
  end
68
- potential_candidates.select(&:candidate?)
69
- end
70
47
 
71
- def define_delegated_method(delegate)
72
- self.class.class_eval(
73
- if delegate.method_to_call_on_delegate.to_s.end_with?('=')
74
- <<-RUBY
75
- def #{delegate.delegated_method}(arg)
76
- #{delegate.attribute}.#{delegate.method_to_call_on_delegate}(arg)
48
+ def candidates_for_method_missing(method_name)
49
+ potential_candidates =
50
+ members.map do |attribute|
51
+ PotentialDelegator.new(
52
+ attribute,
53
+ public_send(attribute),
54
+ method_name,
55
+ )
56
+ end +
57
+ members.map do |attribute|
58
+ PotentialDelegatorWithPrefix.new(
59
+ attribute,
60
+ public_send(attribute),
61
+ method_name,
62
+ )
77
63
  end
78
- RUBY
79
- else
80
- <<-RUBY
64
+ potential_candidates.select(&:candidate?)
65
+ end
66
+
67
+ def define_delegated_method(delegate)
68
+ code = <<~RUBY
81
69
  def #{delegate.delegated_method}(*args, &block)
82
70
  #{delegate.attribute}
83
71
  .#{delegate.method_to_call_on_delegate}(*args, &block)
84
72
  end
85
73
  RUBY
74
+ self.class.class_eval(code, __FILE__, __LINE__ + 1)
86
75
  end
87
- )
88
- end
89
76
 
90
- def handle_ambiguous_missing_method(candidates, method_name)
91
- raise(
92
- AmbigousMethodError,
93
- "#{method_name} is ambiguous: " +
94
- candidates
95
- .map do |candidate|
96
- "#{candidate.attribute}.#{candidate.method_to_call_on_delegate}"
97
- end
98
- .join(', '),
99
- )
77
+ def handle_ambiguous_missing_method(candidates, method_name)
78
+ raise(
79
+ AmbigousMethodError,
80
+ "#{method_name} is ambiguous: " +
81
+ candidates
82
+ .map do |candidate|
83
+ "#{candidate.attribute}.#{candidate.method_to_call_on_delegate}"
84
+ end
85
+ .join(', '),
86
+ )
87
+ end
88
+ end
89
+
90
+ def self.create(*attributes)
91
+ Struct.new(*attributes, keyword_init: true, &STRUCT_DEFINITION)
92
+ end
100
93
  end
101
94
 
102
95
  # Represents a possible match of the form:
@@ -124,7 +117,7 @@ class MethodObject
124
117
  private
125
118
 
126
119
  def name_matches?
127
- delegated_method.to_s.start_with?(prefix)
120
+ delegated_method.start_with?(prefix)
128
121
  end
129
122
 
130
123
  def prefix
@@ -132,7 +125,7 @@ class MethodObject
132
125
  end
133
126
  end
134
127
 
135
- # Dynamically defines custom attr_readers and initializer
128
+ # Dynamically defines custom attr_readers and initializer.
136
129
  class Setup < SimpleDelegator
137
130
  def self.call(attributes:, subclass:)
138
131
  new(attributes, subclass).call
@@ -156,18 +149,12 @@ class MethodObject
156
149
  __getobj__.send(:attr_reader, *attributes)
157
150
  end
158
151
 
159
- def attr_accessor(attribute)
160
- super
161
- end
162
-
163
152
  def define_initializer
164
- class_eval(
165
- <<-RUBY
166
- def initialize(#{required_keyword_args_string})
167
- #{assignments}
168
- end
169
- RUBY
170
- )
153
+ class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
154
+ def initialize(#{required_keyword_args_string})
155
+ #{assignments}
156
+ end
157
+ RUBY
171
158
  end
172
159
 
173
160
  def required_keyword_args_string
@@ -178,4 +165,8 @@ class MethodObject
178
165
  attributes.map { |attribute| "@#{attribute} = #{attribute}\n" }.join
179
166
  end
180
167
  end
168
+
169
+ def respond_to_missing?(*args)
170
+ super || __getobj__.respond_to?(*args)
171
+ end
181
172
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- class MethodObject
4
- VERSION = '2.1.5'
3
+ require('delegate')
4
+
5
+ class MethodObject < SimpleDelegator
6
+ VERSION = '3.0.0'
5
7
  end
@@ -1,7 +1,6 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
3
2
 
4
- lib = File.expand_path('../lib', __FILE__)
3
+ lib = File.expand_path('lib', __dir__)
5
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
6
5
  require 'method_object/version'
7
6
 
@@ -10,10 +9,8 @@ Gem::Specification.new do |spec|
10
9
  spec.version = MethodObject::VERSION
11
10
  spec.authors = ['Clay Shentrup']
12
11
  spec.email = %w[cshentrup@gmail.com]
13
- spec.summary = 'Provides a MethodObject class which implements Kent' +
14
- %q(Beck's "method object" pattern.)
15
- spec.description = 'Provides a MethodObject class which implements Kent' +
16
- %q(Beck's "method object" pattern.)
12
+ spec.summary = %(Provides a MethodObject class which implements KentBeck's "method object" pattern.)
13
+ spec.description = %(Provides a MethodObject class which implements KentBeck's "method object" pattern.)
17
14
  spec.homepage = 'https://github.com/brokenladder/method_man'
18
15
  spec.license = 'MIT'
19
16
 
@@ -22,9 +19,10 @@ Gem::Specification.new do |spec|
22
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
23
20
  spec.require_paths = %w[lib]
24
21
 
25
- spec.required_ruby_version = '>= 2.1'
22
+ spec.required_ruby_version = '>= 2.5'
26
23
 
27
- spec.add_development_dependency 'bundler', '~> 1.9'
28
- spec.add_development_dependency 'rake', '~> 10.4'
29
- spec.add_development_dependency 'rspec', '~> 3.2'
24
+ spec.add_development_dependency('bundler')
25
+ spec.add_development_dependency('rake')
26
+ spec.add_development_dependency('rspec')
27
+ spec.add_development_dependency('rubocop')
30
28
  end
@@ -1,208 +1,119 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require('method_object')
4
+ require('ostruct')
4
5
 
5
6
  RSpec.describe(MethodObject) do
6
- it 'makes new a private class method' do
7
- expect { subject.new }.to raise_error(NoMethodError)
8
- end
9
-
10
- context 'without attrs' do
11
- subject do
7
+ context('with attrs') do
8
+ let(:method_object) do
12
9
  Class.new(described_class) do
10
+ attrs(:block, :attr1, :attr2)
11
+
13
12
  def call
14
- true
13
+ instance_eval(&block)
15
14
  end
16
- end
17
- end
18
15
 
19
- describe 'calling a missing method' do
20
- subject do
21
- Class.new(described_class) do
22
- def call
23
- undefined_method
24
- end
16
+ def local_method
17
+ [attr1, attr2]
25
18
  end
26
19
  end
27
-
28
- it 'raises method missing exception' do
29
- expect { subject.call }.to raise_error(NameError, /undefined_method/)
30
- end
20
+ end
21
+ let(:attr1) { double('attr1', ambiguous_method: nil, delegated_method: delegated_value) }
22
+ let(:delegated_value) { 'delegated value' }
23
+ let(:attr2) do
24
+ double('attr2', ambiguous_method: nil, attr1_ambiguous_method: nil)
31
25
  end
32
26
 
33
- specify { expect(subject.call).to be(true) }
34
- end
35
-
36
- context 'with attrs' do
37
- subject do
38
- Class.new(described_class) do
39
- attrs(:company, :user)
40
-
41
- def call
42
- self.name = 'New Company Name'
43
- self.company_name = 'New Company Name 2'
44
- {
45
- address: address,
46
- respond_to_address: respond_to_missing?(:address),
47
- company_address: company_address,
48
- id_for_joe: company_id_for('Joe'),
49
- block_arg: company_run_a_block { |block_arg| block_arg * 2 },
50
- respond_to_company_address: respond_to_missing?(:company_address),
51
- company: company,
52
- respond_to_name: respond_to_missing?(:name),
53
- company_name: company_name,
54
- respond_to_company_name: respond_to_missing?(:company_name),
55
- user: user,
56
- user_name: user_name,
57
- respond_to_user_name: respond_to_missing?(:user_name),
58
- respond_to_missing: respond_to_missing?(:undefined_method),
59
- }
60
- end
61
- end
27
+ def call(&block)
28
+ method_object.call(block: block, attr1: attr1, attr2: attr2)
62
29
  end
63
30
 
64
- let(:company) do
65
- double('company', address: company_address, name: company_name)
66
- .tap do |company|
67
- allow(company).to receive(:id_for).with('Joe').and_return(1234)
68
- allow(company).to receive(:run_a_block) do |&block|
69
- block.call(4321)
70
- end
71
- end
31
+ it('makes .new a private class method') do
32
+ expect { method_object.new }.to(raise_error(NoMethodError))
72
33
  end
73
- let(:company_address) { '101 Minitru Lane' }
74
- let(:company_name) { 'Periscope Data' }
75
- let(:user) { double('user', name: user_name) }
76
- let(:user_name) { 'Woody' }
77
- let(:result) { subject.call(company: company, user: user) }
78
-
79
- specify do
80
- expect(company).to receive(:name=).ordered.with('New Company Name')
81
- expect(company).to receive(:name=).ordered.with('New Company Name 2')
82
- expect(result).to eq(
83
- address: company_address,
84
- respond_to_address: true,
85
- company_address: company_address,
86
- id_for_joe: 1234,
87
- block_arg: 8642,
88
- respond_to_company_address: true,
89
- company: company,
90
- respond_to_name: false,
91
- company_name: company_name,
92
- respond_to_company_name: true,
93
- user: user,
94
- user_name: user_name,
95
- respond_to_user_name: true,
96
- respond_to_missing: false,
97
- )
34
+
35
+ it('raises method missing exception for undefined methods') do
36
+ expect { call { undefined_method } }.to(raise_error(NameError, /undefined_method/))
98
37
  end
99
38
 
100
- it 'uses required keyword arguments' do
101
- expect { subject.call }.to raise_error(ArgumentError)
39
+ it('calls its own methods and passed attrs') do
40
+ expect(call { local_method }).to(eq([attr1, attr2]))
102
41
  end
103
42
 
104
- context 'with ambiguous method call' do
105
- subject do
106
- Class.new(described_class) do
107
- attrs(:company, :user)
43
+ def delegates?(method)
44
+ call { respond_to?(method) }
45
+ end
108
46
 
109
- def call
110
- name
111
- end
112
- end
113
- end
47
+ it('delegates to attrs') do
48
+ expect(delegates?(:delegated_method)).to(be(true))
114
49
 
115
- specify do
116
- expect { result }.to raise_error(
117
- MethodObject::AmbigousMethodError,
118
- a_string_including('company.name, user.name'),
119
- )
120
- end
50
+ expect(call { delegated_method }).to(be(delegated_value))
121
51
  end
122
52
 
123
- context 'ambigous method call due to delegation' do
124
- subject do
125
- Class.new(described_class) do
126
- attrs(:company, :user)
53
+ it('delegates to attrs with prefix') do
54
+ expect(delegates?(:attr1_delegated_method)).to(be(true))
127
55
 
128
- def call
129
- company_address
130
- end
131
- end
132
- end
56
+ expect(call { attr1_delegated_method }).to(be(delegated_value))
57
+ end
133
58
 
134
- let(:user) { double('user', company_address: nil) }
59
+ it('raises for ambiguity on delegated method names') do
60
+ expect(delegates?(:ambiguous_method)).to(be(true))
135
61
 
136
- specify do
137
- expect { result }.to raise_error(
62
+ expect { call { ambiguous_method } }.to(
63
+ raise_error(
138
64
  MethodObject::AmbigousMethodError,
139
- a_string_including('user.company_address, company.address'),
140
- )
141
- end
65
+ a_string_including('ambiguous_method is ambiguous: attr1.ambiguous_method, attr2.ambiguous_method'),
66
+ ),
67
+ )
142
68
  end
143
69
 
144
- describe 'respecting method privacy' do
145
- let(:subject) do
146
- Class.new(described_class) do
147
- attrs(:diary)
70
+ it('raises for ambiguity on delegated and prefixed delegated method names') do
71
+ expect(delegates?(:attr1_ambiguous_method)).to(be(true))
148
72
 
149
- def call
150
- diary_contents
151
- end
152
- end
153
- end
154
- let(:diary) do
155
- Module.new do
156
- def self.contents; end
73
+ expect { call { attr1_ambiguous_method } }.to(
74
+ raise_error(
75
+ MethodObject::AmbigousMethodError,
76
+ a_string_including(
77
+ 'attr1_ambiguous_method is ambiguous: ' \
78
+ 'attr2.attr1_ambiguous_method, attr1.ambiguous_method',
79
+ ),
80
+ ),
81
+ )
82
+ end
157
83
 
158
- private_class_method(:contents)
159
- end
160
- end
84
+ describe('assignments') do
85
+ let(:attr1) { OpenStruct.new }
161
86
 
162
- specify do
163
- expect { subject.call(diary: diary) }.to raise_error(StandardError)
87
+ it('assigns') do
88
+ call { attr1.foo = 'bar' }
89
+ expect(attr1.foo).to(eq('bar'))
164
90
  end
165
91
  end
92
+ end
93
+
94
+ context('without attrs') do
95
+ let(:method_object) do
96
+ Class.new(described_class) do
97
+ def call
98
+ receiver_test
99
+ end
166
100
 
167
- describe '"memoizes" method calls' do
168
- subject do
169
- Class.new(described_class) do
170
- attrs(:company)
171
- @sent_messages = []
172
-
173
- class << self
174
- attr_reader(:sent_messages)
175
- end
176
-
177
- def call
178
- [name, name]
179
- end
180
-
181
- # Ensure it defines resolved methods
182
- def method_missing(method, *_args)
183
- if self.class.sent_messages.include?(method)
184
- raise 'method not memoized'
185
- end
186
- self.class.sent_messages << method
187
- super
188
- end
101
+ def receiver_test
102
+ 42
189
103
  end
190
104
  end
105
+ end
191
106
 
192
- specify do
193
- expect(subject.call(company: company))
194
- .to eq([company_name, company_name])
195
- end
107
+ def call
108
+ method_object.call
196
109
  end
197
- end
198
110
 
199
- context 'without a provided instance call method' do
200
- subject do
201
- Class.new(described_class) { attrs(:user_1_age) }
111
+ it 'makes new a private class method' do
112
+ expect { method_object.new }.to raise_error(NoMethodError)
202
113
  end
203
114
 
204
- specify do
205
- expect { subject.call(user_1_age: user_1_age) }.to raise_error(NameError)
115
+ it('calls itself') do
116
+ expect(call { receiver_test }).to eq(42)
206
117
  end
207
118
  end
208
119
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  # This file was generated by the `rspec --init` command. Conventionally, all
3
4
  # specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
4
5
  # Require this file using `require "spec_helper"` to ensure that it is only
metadata CHANGED
@@ -1,57 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: method_man
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.5
4
+ version: 3.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clay Shentrup
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-01-09 00:00:00.000000000 Z
11
+ date: 2020-09-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.9'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.9'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '10.4'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '10.4'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '3.2'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '3.2'
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubocop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  description: Provides a MethodObject class which implements KentBeck's "method object"
56
70
  pattern.
57
71
  email:
@@ -79,7 +93,7 @@ homepage: https://github.com/brokenladder/method_man
79
93
  licenses:
80
94
  - MIT
81
95
  metadata: {}
82
- post_install_message:
96
+ post_install_message:
83
97
  rdoc_options: []
84
98
  require_paths:
85
99
  - lib
@@ -87,16 +101,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
87
101
  requirements:
88
102
  - - ">="
89
103
  - !ruby/object:Gem::Version
90
- version: '2.1'
104
+ version: '2.5'
91
105
  required_rubygems_version: !ruby/object:Gem::Requirement
92
106
  requirements:
93
107
  - - ">="
94
108
  - !ruby/object:Gem::Version
95
109
  version: '0'
96
110
  requirements: []
97
- rubyforge_project:
98
- rubygems_version: 2.6.13
99
- signing_key:
111
+ rubygems_version: 3.1.2
112
+ signing_key:
100
113
  specification_version: 4
101
114
  summary: Provides a MethodObject class which implements KentBeck's "method object"
102
115
  pattern.