method_man 2.1.2 → 3.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 4003ab3ee51fcd4973bbf6766b5a8aff6505ce8d
4
- data.tar.gz: 22ca0e3e65ebe890bcafdeaa5aa2c1484370cb14
2
+ SHA256:
3
+ metadata.gz: b53cee278d7e41a29dccd2ca0219b34d112d4ac7bd1a070662d23a1c29dde5f3
4
+ data.tar.gz: 483d234c24b309e7ad44391f9aa5cd20626d48182da9dae32857abb618b33629
5
5
  SHA512:
6
- metadata.gz: b9a6c8903baf7d83cdf0d46211241a38dd16643690baf27371bcc62a72fea11d3852c28ab3b642d893416603d805267e41ff06824c3b1f3d7dd8c75828606bcf
7
- data.tar.gz: b44775573ba4c9e40d2f6080926c183a2398439d95a25dda82d57c492f7b0e12870c6bc97f306bc47f88020e81f30f4abf30645465d06d7445504265d570d44d
6
+ metadata.gz: 6033ad21000327166dd5cfc3601a649fd51cc54db074e83de454fd999bfae106f7bb5e535896c1bdd0d8c8581b3872b81a7babb6e517db0a8f56bbfee1a74696
7
+ data.tar.gz: 33b950b76bc8657b58214e068275ff2f6497536bdb5443a9a853df35caf74076b71ac1774ed1ab5554caac4dc859bb6ad2d54bad971c68874385beba20a92c10
@@ -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
 
@@ -1,9 +1,18 @@
1
1
  # Change log
2
2
 
3
+ ## 2.1.5
4
+ Fix bug where a MethodObject missing attr would raise a nil MethodObject @attributes error instead of method_missing.
5
+
6
+ ## 2.1.4
7
+ Fix bug with delegating to assignment methods like `foo=`.
8
+
9
+ ## 2.1.1
10
+ Fix bug preventing arguments from being forwarded to delegated methods.
11
+
12
+ ## 2.1.0
13
+ Allow automatic delegation inspired by Golang's embedding.
14
+
3
15
  ## 2.0.0
4
16
  Convert MethodObject to use inheritance and a class method for dynamic setup of class internals
5
17
  - Enables code editors to find declaration of MethodObject
6
18
  - Allows constants to be nested whereas previous implementation was based on a Struct which could not contain constants.
7
-
8
- ## 2.1.0
9
- Allow automatic delegation inspired by Golang's embedding.
data/Gemfile CHANGED
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  source 'https://rubygems.org'
3
4
 
4
5
  # Specify your gem's dependencies in method_man.gemspec
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.
data/Rakefile CHANGED
@@ -1,2 +1,3 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'bundler/gem_tasks'
@@ -1,87 +1,95 @@
1
1
  # frozen_string_literal: true
2
- require 'method_object/version'
3
2
 
4
- # See gemspec for description
5
- class MethodObject
3
+ require('delegate')
4
+ require('method_object/version')
5
+
6
+ # See gemspec for description.
7
+ class MethodObject < SimpleDelegator
6
8
  class AmbigousMethodError < NameError; end
7
9
 
8
10
  class << self
9
- def attrs(*attributes)
10
- @attributes = attributes
11
- Setup.call(attributes: attributes, subclass: self)
12
- end
13
-
14
11
  def call(**args)
15
- new(args).call
12
+ new(__object_factory__&.new(**args)).call
16
13
  end
17
14
 
18
- attr_reader(:attributes)
19
-
20
15
  private(:new)
21
- end
22
-
23
- def initialize(_); end
24
16
 
25
- def call
26
- raise NotImplementedError, 'Define the call method'
27
- end
28
-
29
- def method_missing(name, *args, &block)
30
- candidates = candidates_for_method_missing(name)
31
- case candidates.length
32
- when 0
33
- super
34
- when 1
35
- define_and_call_new_method(candidates.first)
36
- else
37
- handle_ambiguous_missing_method(candidates, name)
17
+ def attrs(*attributes)
18
+ self.__object_factory__ = ObjectFactory.create(*attributes)
38
19
  end
20
+
21
+ attr_accessor(:__object_factory__)
39
22
  end
40
23
 
41
- def respond_to_missing?(name)
42
- candidates_for_method_missing(name).length == 1
24
+ def call
25
+ raise(NotImplementedError, 'define the call method')
43
26
  end
44
27
 
45
- def candidates_for_method_missing(method_name)
46
- potential_candidates =
47
- self.class.attributes.map do |attribute|
48
- PotentialDelegator.new(
49
- attribute,
50
- public_send(attribute),
51
- method_name,
52
- )
53
- end +
54
- self.class.attributes.map do |attribute|
55
- PotentialDelegatorWithPrefix.new(
56
- attribute,
57
- public_send(attribute),
58
- method_name,
59
- )
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
60
35
  end
61
- potential_candidates.select(&:candidate?)
62
- end
63
36
 
64
- def define_and_call_new_method(candidate)
65
- self.class.class_eval(
66
- <<-RUBY
67
- def #{candidate.delegated_method}
68
- #{candidate.attribute}.#{candidate.method_to_call_on_delegate}
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)
69
44
  end
70
- RUBY
71
- )
72
- public_send(candidate.delegated_method)
73
- end
45
+ true
46
+ end
74
47
 
75
- def handle_ambiguous_missing_method(candidates, method_name)
76
- raise(
77
- AmbigousMethodError,
78
- "#{method_name} is ambiguous: " +
79
- candidates
80
- .map do |candidate|
81
- "#{candidate.attribute}.#{candidate.method_to_call_on_delegate}"
82
- end
83
- .join(', '),
84
- )
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
+ )
63
+ end
64
+ potential_candidates.select(&:candidate?)
65
+ end
66
+
67
+ def define_delegated_method(delegate)
68
+ code = <<~RUBY
69
+ def #{delegate.delegated_method}(*args, &block)
70
+ #{delegate.attribute}
71
+ .#{delegate.method_to_call_on_delegate}(*args, &block)
72
+ end
73
+ RUBY
74
+ self.class.class_eval(code, __FILE__, __LINE__ + 1)
75
+ end
76
+
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
85
93
  end
86
94
 
87
95
  # Represents a possible match of the form:
@@ -109,58 +117,11 @@ class MethodObject
109
117
  private
110
118
 
111
119
  def name_matches?
112
- delegated_method.to_s.start_with?(prefix)
120
+ delegated_method.start_with?(prefix)
113
121
  end
114
122
 
115
123
  def prefix
116
124
  "#{attribute}_"
117
125
  end
118
126
  end
119
-
120
- # Dynamically defines custom attr_readers and initializer
121
- class Setup < SimpleDelegator
122
- def self.call(attributes:, subclass:)
123
- new(attributes, subclass).call
124
- end
125
-
126
- attr_accessor(:attributes)
127
-
128
- def initialize(attributes, subclass)
129
- self.attributes = attributes
130
- super(subclass)
131
- end
132
-
133
- def call
134
- define_attr_readers
135
- define_initializer
136
- end
137
-
138
- private
139
-
140
- def define_attr_readers
141
- __getobj__.send(:attr_reader, *attributes)
142
- end
143
-
144
- def attr_accessor(attribute)
145
- super
146
- end
147
-
148
- def define_initializer
149
- class_eval(
150
- <<-RUBY
151
- def initialize(#{required_keyword_args_string})
152
- #{assignments}
153
- end
154
- RUBY
155
- )
156
- end
157
-
158
- def required_keyword_args_string
159
- attributes.map { |arg| "#{arg}:" }.join(', ')
160
- end
161
-
162
- def assignments
163
- attributes.map { |attribute| "@#{attribute} = #{attribute}\n" }.join
164
- end
165
- end
166
127
  end
@@ -1,4 +1,7 @@
1
1
  # frozen_string_literal: true
2
- class MethodObject
3
- VERSION = '2.1.2'
2
+
3
+ require('delegate')
4
+
5
+ class MethodObject < SimpleDelegator
6
+ VERSION = '3.0.1'
4
7
  end
@@ -1,6 +1,6 @@
1
- # coding: utf-8
2
1
  # frozen_string_literal: true
3
- lib = File.expand_path('../lib', __FILE__)
2
+
3
+ lib = File.expand_path('lib', __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require 'method_object/version'
6
6
 
@@ -9,10 +9,8 @@ Gem::Specification.new do |spec|
9
9
  spec.version = MethodObject::VERSION
10
10
  spec.authors = ['Clay Shentrup']
11
11
  spec.email = %w[cshentrup@gmail.com]
12
- spec.summary = 'Provides a MethodObject class which implements Kent' +
13
- %q(Beck's "method object" pattern.)
14
- spec.description = 'Provides a MethodObject class which implements Kent' +
15
- %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.)
16
14
  spec.homepage = 'https://github.com/brokenladder/method_man'
17
15
  spec.license = 'MIT'
18
16
 
@@ -21,9 +19,10 @@ Gem::Specification.new do |spec|
21
19
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
22
20
  spec.require_paths = %w[lib]
23
21
 
24
- spec.required_ruby_version = '>= 2.1'
22
+ spec.required_ruby_version = '>= 2.5'
25
23
 
26
- spec.add_development_dependency 'bundler', '~> 1.9'
27
- spec.add_development_dependency 'rake', '~> 10.4'
28
- 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')
29
28
  end
@@ -1,185 +1,119 @@
1
1
  # frozen_string_literal: true
2
- require 'method_object'
3
2
 
4
- describe MethodObject do
5
- it 'makes new a private class method' do
6
- expect { subject.new }.to raise_error(NoMethodError)
7
- end
3
+ require('method_object')
4
+ require('ostruct')
8
5
 
9
- context 'without attrs' do
10
- subject do
6
+ RSpec.describe(MethodObject) do
7
+ context('with attrs') do
8
+ let(:method_object) do
11
9
  Class.new(described_class) do
10
+ attrs(:block, :attr1, :attr2)
11
+
12
12
  def call
13
- true
13
+ instance_eval(&block)
14
+ end
15
+
16
+ def local_method
17
+ [attr1, attr2]
14
18
  end
15
19
  end
16
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)
25
+ end
17
26
 
18
- specify { expect(subject.call).to be(true) }
19
- end
20
-
21
- context 'with attrs' do
22
- subject do
23
- Class.new(described_class) do
24
- attrs(:company, :user)
25
-
26
- @sent_messages = []
27
-
28
- def self.sent_messages
29
- @sent_messages
30
- end
27
+ def call(&block)
28
+ method_object.call(block: block, attr1: attr1, attr2: attr2)
29
+ end
31
30
 
32
- def call
33
- {
34
- address: address,
35
- respond_to_address: respond_to_missing?(:address),
36
- company_address: company_address,
37
- respond_to_company_address: respond_to_missing?(:company_address),
38
- company: company,
39
- respond_to_name: respond_to_missing?(:name),
40
- company_name: company_name,
41
- respond_to_company_name: respond_to_missing?(:company_name),
42
- user: user,
43
- user_name: user_name,
44
- respond_to_user_name: respond_to_missing?(:user_name),
45
- respond_to_missing: respond_to_missing?(:undefined_method),
46
- }
47
- end
48
- end
31
+ it('makes .new a private class method') do
32
+ expect { method_object.new }.to(raise_error(NoMethodError))
49
33
  end
50
34
 
51
- let(:company) do
52
- double('company', address: company_address, name: company_name)
53
- end
54
- let(:company_address) { '101 Minitru Lane' }
55
- let(:company_name) { 'Periscope Data' }
56
- let(:user) { double('user', name: user_name) }
57
- let(:user_name) { 'Woody' }
58
-
59
- let(:result) { subject.call(company: company, user: user) }
60
-
61
- specify do
62
- expect(result).to eq(
63
- address: company_address,
64
- respond_to_address: true,
65
- company_address: company_address,
66
- respond_to_company_address: true,
67
- company: company,
68
- respond_to_name: false,
69
- company_name: company_name,
70
- respond_to_company_name: true,
71
- user: user,
72
- user_name: user_name,
73
- respond_to_user_name: true,
74
- respond_to_missing: false,
75
- )
35
+ it('raises method missing exception for undefined methods') do
36
+ expect { call { undefined_method } }.to(raise_error(NameError, /undefined_method/))
76
37
  end
77
38
 
78
- it 'uses required keyword arguments' do
79
- 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]))
80
41
  end
81
42
 
82
- context 'with ambiguous method call' do
83
- subject do
84
- Class.new(described_class) do
85
- attrs(:company, :user)
43
+ def delegates?(method)
44
+ call { respond_to?(method) }
45
+ end
86
46
 
87
- def call
88
- name
89
- end
90
- end
91
- end
47
+ it('delegates to attrs') do
48
+ expect(delegates?(:delegated_method)).to(be(true))
92
49
 
93
- specify do
94
- expect { result }.to raise_error(
95
- MethodObject::AmbigousMethodError,
96
- a_string_including('company.name, user.name'),
97
- )
98
- end
50
+ expect(call { delegated_method }).to(be(delegated_value))
99
51
  end
100
52
 
101
- context 'ambigous method call due to delegation' do
102
- subject do
103
- Class.new(described_class) do
104
- attrs(:company, :user)
53
+ it('delegates to attrs with prefix') do
54
+ expect(delegates?(:attr1_delegated_method)).to(be(true))
105
55
 
106
- def call
107
- company_address
108
- end
109
- end
110
- end
56
+ expect(call { attr1_delegated_method }).to(be(delegated_value))
57
+ end
111
58
 
112
- 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))
113
61
 
114
- specify do
115
- expect { result }.to raise_error(
62
+ expect { call { ambiguous_method } }.to(
63
+ raise_error(
116
64
  MethodObject::AmbigousMethodError,
117
- a_string_including('user.company_address, company.address'),
118
- )
119
- end
65
+ a_string_including('ambiguous_method is ambiguous: attr1.ambiguous_method, attr2.ambiguous_method'),
66
+ ),
67
+ )
120
68
  end
121
69
 
122
- describe 'respecting method privacy' do
123
- let(:subject) do
124
- Class.new(described_class) do
125
- attrs(:diary)
70
+ it('raises for ambiguity on delegated and prefixed delegated method names') do
71
+ expect(delegates?(:attr1_ambiguous_method)).to(be(true))
126
72
 
127
- def call
128
- diary_contents
129
- end
130
- end
131
- end
132
- let(:diary) do
133
- Module.new do
134
- 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
135
83
 
136
- private_class_method(:contents)
137
- end
138
- end
84
+ describe('assignments') do
85
+ let(:attr1) { OpenStruct.new }
139
86
 
140
- specify do
141
- 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'))
142
90
  end
143
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
144
100
 
145
- describe '"memoizes" method calls' do
146
- subject do
147
- Class.new(described_class) do
148
- attrs(:company)
149
- @sent_messages = []
150
-
151
- def self.sent_messages
152
- @sent_messages
153
- end
154
-
155
- def call
156
- [name, name]
157
- end
158
-
159
- # Ensure it defines resolved methods
160
- def method_missing(method, *_args)
161
- if self.class.sent_messages.include?(method)
162
- raise 'method not memoized'
163
- end
164
- self.class.sent_messages << method
165
- super
166
- end
101
+ def receiver_test
102
+ 42
167
103
  end
168
104
  end
105
+ end
169
106
 
170
- specify do
171
- expect(subject.call(company: company)).to eq([company_name, company_name])
172
- end
107
+ def call
108
+ method_object.call
173
109
  end
174
- end
175
110
 
176
- context 'without a provided instance call method' do
177
- subject do
178
- 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)
179
113
  end
180
114
 
181
- specify do
182
- 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)
183
117
  end
184
118
  end
185
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.2
4
+ version: 3.0.1
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: 2017-03-15 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.8
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.