receptacle 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: receptacle
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Eger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-04-10 00:00:00.000000000 Z
11
+ date: 2023-01-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -31,7 +31,7 @@ dependencies:
31
31
  - !ruby/object:Gem::Version
32
32
  version: '3'
33
33
  - !ruby/object:Gem::Dependency
34
- name: codecov
34
+ name: pry
35
35
  requirement: !ruby/object:Gem::Requirement
36
36
  requirements:
37
37
  - - ">="
@@ -45,35 +45,35 @@ dependencies:
45
45
  - !ruby/object:Gem::Version
46
46
  version: '0'
47
47
  - !ruby/object:Gem::Dependency
48
- name: guard
48
+ name: rake
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  requirements:
51
- - - ">="
51
+ - - "~>"
52
52
  - !ruby/object:Gem::Version
53
- version: '0'
53
+ version: '10.0'
54
54
  type: :development
55
55
  prerelease: false
56
56
  version_requirements: !ruby/object:Gem::Requirement
57
57
  requirements:
58
- - - ">="
58
+ - - "~>"
59
59
  - !ruby/object:Gem::Version
60
- version: '0'
60
+ version: '10.0'
61
61
  - !ruby/object:Gem::Dependency
62
- name: guard-minitest
62
+ name: rspec
63
63
  requirement: !ruby/object:Gem::Requirement
64
64
  requirements:
65
- - - ">="
65
+ - - "~>"
66
66
  - !ruby/object:Gem::Version
67
- version: '0'
67
+ version: '3.11'
68
68
  type: :development
69
69
  prerelease: false
70
70
  version_requirements: !ruby/object:Gem::Requirement
71
71
  requirements:
72
- - - ">="
72
+ - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '0'
74
+ version: '3.11'
75
75
  - !ruby/object:Gem::Dependency
76
- name: guard-rubocop
76
+ name: rspec_junit_formatter
77
77
  requirement: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - ">="
@@ -87,81 +87,61 @@ dependencies:
87
87
  - !ruby/object:Gem::Version
88
88
  version: '0'
89
89
  - !ruby/object:Gem::Dependency
90
- name: minitest
90
+ name: rt_rubocop_defaults
91
91
  requirement: !ruby/object:Gem::Requirement
92
92
  requirements:
93
93
  - - "~>"
94
94
  - !ruby/object:Gem::Version
95
- version: '5.0'
95
+ version: '2.4'
96
96
  type: :development
97
97
  prerelease: false
98
98
  version_requirements: !ruby/object:Gem::Requirement
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '5.0'
103
- - !ruby/object:Gem::Dependency
104
- name: pry
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: '0'
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: '0'
102
+ version: '2.4'
117
103
  - !ruby/object:Gem::Dependency
118
- name: rake
104
+ name: rubocop
119
105
  requirement: !ruby/object:Gem::Requirement
120
106
  requirements:
121
107
  - - "~>"
122
108
  - !ruby/object:Gem::Version
123
- version: '10.0'
109
+ version: '1.37'
124
110
  type: :development
125
111
  prerelease: false
126
112
  version_requirements: !ruby/object:Gem::Requirement
127
113
  requirements:
128
114
  - - "~>"
129
115
  - !ruby/object:Gem::Version
130
- version: '10.0'
116
+ version: '1.37'
131
117
  - !ruby/object:Gem::Dependency
132
- name: rt_rubocop_defaults
118
+ name: rubocop-rspec
133
119
  requirement: !ruby/object:Gem::Requirement
134
120
  requirements:
135
- - - ">="
136
- - !ruby/object:Gem::Version
137
- version: 1.0.2
138
- - - "<"
121
+ - - "~>"
139
122
  - !ruby/object:Gem::Version
140
- version: '2'
123
+ version: '2.14'
141
124
  type: :development
142
125
  prerelease: false
143
126
  version_requirements: !ruby/object:Gem::Requirement
144
127
  requirements:
145
- - - ">="
146
- - !ruby/object:Gem::Version
147
- version: 1.0.2
148
- - - "<"
128
+ - - "~>"
149
129
  - !ruby/object:Gem::Version
150
- version: '2'
130
+ version: '2.14'
151
131
  - !ruby/object:Gem::Dependency
152
132
  name: rubocop_runner
153
133
  requirement: !ruby/object:Gem::Requirement
154
134
  requirements:
155
135
  - - "~>"
156
136
  - !ruby/object:Gem::Version
157
- version: '2.0'
137
+ version: '2.2'
158
138
  type: :development
159
139
  prerelease: false
160
140
  version_requirements: !ruby/object:Gem::Requirement
161
141
  requirements:
162
142
  - - "~>"
163
143
  - !ruby/object:Gem::Version
164
- version: '2.0'
144
+ version: '2.2'
165
145
  - !ruby/object:Gem::Dependency
166
146
  name: simplecov
167
147
  requirement: !ruby/object:Gem::Requirement
@@ -183,15 +163,13 @@ executables: []
183
163
  extensions: []
184
164
  extra_rdoc_files: []
185
165
  files:
186
- - ".circleci/config.yml"
187
- - ".dir-locals.el"
166
+ - ".github/workflows/matrix.yml"
188
167
  - ".gitignore"
189
168
  - ".rubocop.yml"
190
169
  - CHANGELOG.md
191
170
  - CODE_OF_CONDUCT.md
192
- - Dangerfile
193
171
  - Gemfile
194
- - Guardfile
172
+ - Gemfile.lock
195
173
  - LICENSE.txt
196
174
  - README.md
197
175
  - Rakefile
@@ -200,36 +178,32 @@ files:
200
178
  - examples/simple_repo.rb
201
179
  - lib/receptacle.rb
202
180
  - lib/receptacle/errors.rb
203
- - lib/receptacle/interface_methods.rb
204
- - lib/receptacle/method_cache.rb
205
- - lib/receptacle/method_delegation.rb
206
- - lib/receptacle/registration.rb
181
+ - lib/receptacle/repo.rb
207
182
  - lib/receptacle/test_support.rb
208
183
  - lib/receptacle/version.rb
209
- - performance/benchmark.rb
210
- - performance/profile.rb
211
- - performance/speed_receptacle.rb
212
184
  - receptacle.gemspec
185
+ - upgrade_notes.md
213
186
  homepage: https://github.com/andreaseger/receptacle
214
187
  licenses:
215
188
  - MIT
216
- metadata: {}
189
+ metadata:
190
+ rubygems_mfa_required: 'true'
217
191
  post_install_message:
218
192
  rdoc_options: []
219
193
  require_paths:
220
194
  - lib
221
195
  required_ruby_version: !ruby/object:Gem::Requirement
222
196
  requirements:
223
- - - "~>"
197
+ - - ">="
224
198
  - !ruby/object:Gem::Version
225
- version: '2.4'
199
+ version: '2.7'
226
200
  required_rubygems_version: !ruby/object:Gem::Requirement
227
201
  requirements:
228
202
  - - ">="
229
203
  - !ruby/object:Gem::Version
230
204
  version: '0'
231
205
  requirements: []
232
- rubygems_version: 3.0.2
206
+ rubygems_version: 3.4.1
233
207
  signing_key:
234
208
  specification_version: 4
235
209
  summary: repository pattern
data/.circleci/config.yml DELETED
@@ -1,64 +0,0 @@
1
- # Ruby CircleCI 2.0 configuration file
2
- #
3
- # Check https://circleci.com/docs/2.0/language-ruby/ for more details
4
- #
5
-
6
- version: 2
7
-
8
- common_steps: &common_steps
9
- - checkout
10
- - run: gem update --system
11
- - restore_cache:
12
- key: gem-cache-{{ .Branch }}-{{ checksum "Gemfile" }}
13
- - run:
14
- name: install dependencies
15
- command: |
16
- gem update bundler
17
- bundle install --jobs=4 --retry=3 --path vendor/bundle
18
- - save_cache:
19
- key: gem-cache-{{ .Branch }}-{{ checksum "Gemfile" }}
20
- paths:
21
- - vendor/bundle
22
- - run: bundle exec danger
23
- - run: bundle exec rake test
24
-
25
- jobs:
26
- ruby-2.4:
27
- docker:
28
- - image: circleci/ruby:2.4
29
- steps:
30
- *common_steps
31
- ruby-2.5:
32
- docker:
33
- - image: circleci/ruby:2.5
34
- steps:
35
- *common_steps
36
- ruby-2.6:
37
- docker:
38
- - image: circleci/ruby:2.6
39
- steps:
40
- *common_steps
41
- jruby-9.2:
42
- docker:
43
- - image: circleci/jruby:9.2
44
- environment:
45
- JRUBY_OPTS: '--dev'
46
- steps:
47
- *common_steps
48
- jruby-9.2-indy:
49
- docker:
50
- - image: circleci/jruby:9.2
51
- environment:
52
- JRUBY_OPTS: '-Xcompile.invokedynamic=true'
53
- steps:
54
- *common_steps
55
-
56
- workflows:
57
- version: 2
58
- build:
59
- jobs:
60
- - ruby-2.4
61
- - ruby-2.5
62
- - ruby-2.6
63
- - jruby-9.2
64
- - jruby-9.2-indy
data/.dir-locals.el DELETED
@@ -1 +0,0 @@
1
- ((ruby-mode . ( (ruby-test-runner . minitest)) ) )
data/Dangerfile DELETED
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # -------------------------------------------------------------------------
4
- # Has any changes happened inside the actual library code?
5
- # -------------------------------------------------------------------------
6
- has_app_changes = !git.modified_files.grep(/lib/).empty?
7
- has_test_changes = !git.modified_files.grep(/test/).empty?
8
- is_version_bump = git.modified_files.sort == ["CHANGELOG.md", "lib/receptacle/version.rb"].sort
9
-
10
- if has_app_changes && !has_test_changes && !is_version_bump
11
- warn("Tests were not updated. That's OK if you're refactoring existing code.", sticky: false)
12
- end
13
-
14
- if !git.modified_files.include?("CHANGELOG.md") && has_app_changes
15
- fail(<<~MSG)
16
- Please include a CHANGELOG entry.
17
- You can find it at [CHANGELOG.md](https://github.com/andreaseger/receptacle/blob/master/CHANGELOG.md).
18
- MSG
19
- message "Note, we hard-wrap at 80 chars and use 2 spaces after the last line."
20
- end
21
-
22
- # Make it more obvious that a PR is a work in progress and shouldn't be merged yet
23
- warn("PR is classed as Work in Progress") if github.pr_title.include? "WIP"
24
-
25
- # Warn when there is a big PR
26
- warn("Big PR") if git.lines_of_code > 500
27
-
28
- commit_lint.check warn: :all, disable: [:subject_cap]
29
-
30
- # rubocop
31
- rubocop.lint force_exclusion: true
data/Guardfile DELETED
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- # A sample Guardfile
4
- # More info at https://github.com/guard/guard#readme
5
-
6
- ## Uncomment and set this to only include directories you want to watch
7
- # directories %w(app lib config test spec features) \
8
- # .select{|d| Dir.exists?(d) ? d : UI.warning("Directory #{d} does not exist")}
9
-
10
- ## Note: if you are using the `directories` clause above and you are not
11
- ## watching the project directory ('.'), then you will want to move
12
- ## the Guardfile to a watched dir and symlink it back, e.g.
13
- #
14
- # $ mkdir config
15
- # $ mv Guardfile config/
16
- # $ ln -s config/Guardfile .
17
- #
18
- # and, you'll have to watch "config/Guardfile" instead of "Guardfile"
19
- group :red_green_refactor, halt_on_fail: true do
20
- guard :minitest do
21
- # with Minitest::Unit
22
- watch(%r{^test/(.*)\/?test_(.*)\.rb$})
23
- # watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { |m| "test/#{m[1]}test_#{m[2]}.rb" }
24
- watch(%r{^lib/(.*/)?([^/]+)\.rb$}) { "test" }
25
- watch(%r{^test/test_helper\.rb$}) { "test" }
26
- watch(%r{^test/fixture\.rb$}) { "test" }
27
- end
28
- guard :rubocop, all_on_start: false, cli: ["--auto-correct"] do
29
- watch(/.+\.rb$/)
30
- watch(%r{(?:.+/)?\.rubocop\.yml%}) { |m| File.dirname(m[0]) }
31
- end
32
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "receptacle/registration"
4
- require "receptacle/errors"
5
-
6
- module Receptacle
7
- module InterfaceMethods
8
- RESERVED_METHOD_NAMES = Set.new(%i[wrappers mediate strategy delegate_to_strategy])
9
- private_constant :RESERVED_METHOD_NAMES
10
-
11
- # registers a method_name for the to be mediated or forwarded to the configured strategy
12
- #
13
- # @param method_name [String] name of method to register
14
- def mediate(method_name)
15
- raise Errors::ReservedMethodName if RESERVED_METHOD_NAMES.include?(method_name)
16
-
17
- Registration.repositories[self].methods << method_name
18
- end
19
- alias delegate_to_strategy mediate
20
-
21
- # get or sets the strategy
22
- #
23
- # @note will set the strategy for this receptacle if passed in; will only
24
- # return the current strategy if nil or no parameter passed include
25
- # @param value [Class,nil]
26
- # @return [Class] current configured strategy class
27
- def strategy(value = nil)
28
- if value
29
- Registration.repositories[self].strategy = value
30
- Registration.clear_method_cache(self)
31
- else
32
- Registration.repositories[self].strategy
33
- end
34
- end
35
-
36
- # get or sets the wrappers
37
- #
38
- # @note will set the wrappers for this receptacle if passed in; will only
39
- # return the current wrappers if nil or no parameter passed include
40
- # @param value [Class,Array(Class),nil] wrappers
41
- # @return [Array(Class)] current configured wrappers
42
- def wrappers(value = nil)
43
- if value
44
- Registration.repositories[self].wrappers = Array(value)
45
- Registration.clear_method_cache(self)
46
- else
47
- Registration.repositories[self].wrappers
48
- end
49
- end
50
- end
51
- end
@@ -1,43 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Receptacle
4
- # Cache describing which strategy and wrappers need to be applied for this method
5
- # @api private
6
- class MethodCache
7
- # @return [Symbol] name of the method this cache belongs to
8
- attr_reader :method_name
9
- # @return [Class] strategy class currently setup
10
- attr_reader :strategy
11
- # @return [Array(Class)] Array of wrapper classes which implement a wrapper for this method
12
- attr_reader :wrappers
13
- # @return [Symbol] name of the before action method
14
- attr_reader :before_method_name
15
- # @return [Symbol] name of the after action method
16
- attr_reader :after_method_name
17
- # @return [Integer] arity of strategy method according to https://ruby-doc.org/core-2.3.3/Method.html#method-i-arity
18
- attr_reader :arity
19
-
20
- def initialize(method_name:, strategy:, wrappers:)
21
- @strategy = strategy
22
- @before_method_name = :"before_#{method_name}"
23
- @after_method_name = :"after_#{method_name}"
24
- @method_name = method_name.to_sym
25
- before_wrappers = wrappers.select { |w| w.method_defined?(@before_method_name) }
26
- after_wrappers = wrappers.select { |w| w.method_defined?(@after_method_name) }
27
- @wrappers = wrappers & (before_wrappers | after_wrappers)
28
- @skip_before_wrappers = before_wrappers.empty?
29
- @skip_after_wrappers = after_wrappers.empty?
30
- @arity = strategy.new.method(method_name).arity
31
- end
32
-
33
- # @return [Boolean] true if no before wrappers need to be applied for this method
34
- def skip_before_wrappers?
35
- @skip_before_wrappers
36
- end
37
-
38
- # @return [Boolean] true if no after wrappers need to be applied for this method
39
- def skip_after_wrappers?
40
- @skip_after_wrappers
41
- end
42
- end
43
- end
@@ -1,141 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "receptacle/method_cache"
4
- require "receptacle/registration"
5
- require "receptacle/errors"
6
-
7
- module Receptacle
8
- # module which enables a repository to mediate methods dynamically to wrappers and strategy
9
- # @api private
10
- module MethodDelegation
11
- # dynamically build mediation method on first invocation if the method is registered
12
- def method_missing(method_name, *arguments, &block)
13
- if Registration.repositories[self].methods.include?(method_name)
14
- public_send(__build_method(method_name), *arguments, &block)
15
- else
16
- super
17
- end
18
- end
19
-
20
- def respond_to_missing?(method_name, include_private = false)
21
- Registration.repositories[self].methods.include?(method_name) || super
22
- end
23
-
24
- # @param method_name [#to_sym]
25
- # @return [void]
26
- def __build_method(method_name)
27
- method_cache = __build_method_call_cache(method_name)
28
- if method_cache.wrappers.nil? || method_cache.wrappers.empty?
29
- __define_shortcut_method(method_cache)
30
- elsif method_cache.arity.abs > 1
31
- __define_full_method_high_arity(method_cache)
32
- else
33
- __define_full_method(method_cache)
34
- end
35
- end
36
-
37
- # build method cache for given method name
38
- # @param method_name [#to_sym]
39
- # @return [MethodCache]
40
- def __build_method_call_cache(method_name)
41
- config = Registration.repositories[self]
42
-
43
- raise Errors::NotConfigured.new(repo: self) if config.strategy.nil?
44
-
45
- MethodCache.new(
46
- strategy: config.strategy,
47
- wrappers: config.wrappers,
48
- method_name: method_name
49
- )
50
- end
51
-
52
- # build lightweight method to mediate method calls to strategy without wrappers
53
- # @param method_cache [MethodCache] method_cache of the method to be build
54
- # @return [void]
55
- def __define_shortcut_method(method_cache)
56
- define_singleton_method(method_cache.method_name) do |*args, &inner_block|
57
- method_cache.strategy.new.public_send(method_cache.method_name, *args, &inner_block)
58
- end
59
- end
60
-
61
- # build method to mediate method calls of arity 1 to strategy with full wrapper support
62
- # @param method_cache [MethodCache] method_cache of the method to be build
63
- # @return [void]
64
- def __define_full_method(method_cache)
65
- define_singleton_method(method_cache.method_name) do |*args, &inner_block|
66
- __run_wrappers(method_cache, *args) do |*call_args|
67
- method_cache.strategy.new.public_send(method_cache.method_name, *call_args, &inner_block)
68
- end
69
- end
70
- end
71
-
72
- # build method to mediate method calls of higher arity to strategy with full wrapper support
73
- # @param method_cache [MethodCache] method_cache of the method to be build
74
- # @return [void]
75
- def __define_full_method_high_arity(method_cache)
76
- define_singleton_method(method_cache.method_name) do |*args, &inner_block|
77
- __run_wrappers(method_cache, args, true) do |*call_args|
78
- method_cache.strategy.new.public_send(method_cache.method_name, *call_args, &inner_block)
79
- end
80
- end
81
- end
82
-
83
- # runtime method to call before and after wrapper in correct order
84
- # @param method_cache [MethodCache] method_cache for the current method
85
- # @param input_args input parameter of the repository method call
86
- # @param high_arity [Boolean] if are intended for a higher arity method
87
- # @return strategy method return value after all wrappers where applied
88
- def __run_wrappers(method_cache, input_args, high_arity = false)
89
- wrappers = method_cache.wrappers.map(&:new)
90
- args =
91
- if method_cache.skip_before_wrappers?
92
- input_args
93
- else
94
- __run_before_wrappers(wrappers, method_cache.before_method_name, input_args, high_arity)
95
- end
96
- ret = high_arity ? yield(*args) : yield(args)
97
- return ret if method_cache.skip_after_wrappers?
98
-
99
- __run_after_wrappers(wrappers, method_cache.after_method_name, args, ret, high_arity)
100
- end
101
-
102
- # runtime method to execute all before wrappers
103
- # @param wrappers [Array] all wrapper instances to be executed
104
- # @param method_name [Symbol] name of method to be executed on wrappers
105
- # @param args input args of the repository method
106
- # @param high_arity [Boolean] if are intended for a higher arity method
107
- # @return processed method args by before wrappers
108
- def __run_before_wrappers(wrappers, method_name, args, high_arity = false)
109
- wrappers.each do |wrapper|
110
- next unless wrapper.respond_to?(method_name)
111
-
112
- args = if high_arity
113
- wrapper.public_send(method_name, *args)
114
- else
115
- wrapper.public_send(method_name, args)
116
- end
117
- end
118
- args
119
- end
120
-
121
- # runtime method to execute all after wrappers
122
- # @param wrappers [Array] all wrapper instances to be executed
123
- # @param method_name [Symbol] name of method to be executed on wrappers
124
- # @param args input args to the strategy method (after processing in before wrappers)
125
- # @param return_value return value of strategy method
126
- # @param high_arity [Boolean] if are intended for a higher arity method
127
- # @return processed return value by all after wrappers
128
- def __run_after_wrappers(wrappers, method_name, args, return_value, high_arity = false)
129
- wrappers.reverse_each do |wrapper|
130
- next unless wrapper.respond_to?(method_name)
131
-
132
- return_value = if high_arity
133
- wrapper.public_send(method_name, return_value, *args)
134
- else
135
- wrapper.public_send(method_name, return_value, args)
136
- end
137
- end
138
- return_value
139
- end
140
- end
141
- end
@@ -1,35 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "singleton"
4
- require "set"
5
- module Receptacle
6
- # keeps global state of repositories, the defined strategy, set wrappers and methods to mediate
7
- class Registration
8
- include Singleton
9
- Tuple = Struct.new(:strategy, :wrappers, :methods)
10
-
11
- attr_reader :repositories
12
-
13
- def initialize
14
- @repositories = Hash.new do |h, k|
15
- h[k] = Tuple.new(nil, [], Set.new)
16
- end
17
- end
18
-
19
- def self.repositories
20
- instance.repositories
21
- end
22
-
23
- # {clear_method_cache} removes dynamically defined methods
24
- # this is needed to make strategy and wrappers changes inside the codebase possible
25
- def self.clear_method_cache(receptacle)
26
- instance.repositories[receptacle].methods.each do |method_name|
27
- begin
28
- receptacle.singleton_class.send(:remove_method, method_name)
29
- rescue NameError
30
- nil
31
- end
32
- end
33
- end
34
- end
35
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "bundler/inline"
4
-
5
- gemfile false do
6
- source "https://rubygems.org"
7
- gem "benchmark-ips"
8
- gem "receptacle", path: "./.."
9
- end
10
-
11
- require_relative "speed_receptacle"
12
-
13
- Speed.strategy(Speed::Strategy::One)
14
- Speed.wrappers [Speed::Wrappers::W1,
15
- Speed::Wrappers::W2,
16
- Speed::Wrappers::W3,
17
- Speed::Wrappers::W4,
18
- Speed::Wrappers::W5,
19
- Speed::Wrappers::W6]
20
-
21
- print "w/ wrappers"
22
- Benchmark.ips do |x|
23
- x.warmup = 10 if RUBY_ENGINE == "jruby"
24
- x.report("a: 2x around, 1x before, 1x after") { Speed.a(1) }
25
- x.report("b: 1x around, 1x before, 1x after") { Speed.b(1) }
26
- x.report("c: 1x before, 1x after") { Speed.c(1) }
27
- x.report("d: 1x after") { Speed.d(1) }
28
- x.report("e: 1x before") { Speed.e(1) }
29
- x.report("f: 1x around") { Speed.f(1) }
30
- x.report("g: no wrappers") { Speed.g(1) }
31
- end
32
-
33
- Speed.wrappers []
34
- print "method dispatching w/ wrappers"
35
- Benchmark.ips do |x|
36
- x.warmup = 10 if RUBY_ENGINE == "jruby"
37
- x.report("via receptacle") { Speed.a(:foo) }
38
- x.report("direct via public_send") { Speed::Strategy::One.new.public_send(:a, :foo) }
39
- x.report("direct via method-method") do
40
- m = Speed::Strategy::One.new.method(:a)
41
- m.call(:foo)
42
- end
43
- x.report("direct method-call") { Speed::Strategy::One.new.a(:foo) }
44
- x.compare!
45
- end