benchable 0.2.0 → 0.3.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ea8211a8067a809843da4eb4597f8410b066885729d16a09a5ee5996fb3e2af9
4
- data.tar.gz: 2fa2084edce688c7184591c2ce01b4b4ff7bedb7212a9a4dbbc99f6e3b80ac0b
3
+ metadata.gz: f8cc2eab98fd2843682811029e789c3d50f28cef0cab9e607936700579e65cf6
4
+ data.tar.gz: 38f5b868dece18aaf0567603346ff9677b998486c12236a6915cfbedac0ead13
5
5
  SHA512:
6
- metadata.gz: a1e2f7cb8f1ef3165917b10dee6701ee8397b1b5d65e2d859f43fb0fab3af20858d2b86362cef964282e4978e551e7287ab1927f072c05c8b05620790c3d7e0c
7
- data.tar.gz: 6a1c2a65c2895b296051a4daaa5cc2b20972e747678582fe3459db0f705b9dd558d1de1aa1982725bd3235be462c41732156548405a2b4bf8a54f4e9adfb12c2
6
+ metadata.gz: 555bcfbff720e4f8044504d7055da3b265f3adf0ad73ba8039dd6f3cc31de82cce6932ce100934ddc72356c2e59021334fa9f83eab31f3e9d090f5d9d88d7aed
7
+ data.tar.gz: dbc3b735b5400fa4cd948bc4535cb2a5d2998463b8411b72cd569171dff21058bd89bb6d9c73a2f58d5cd3fdfe4470fbc1d636832c3fa5bbf00b45075afefbb1
@@ -11,12 +11,12 @@ jobs:
11
11
  runs-on: ubuntu-latest
12
12
  strategy:
13
13
  matrix:
14
- ruby: [2.4, 2.5, 2.6, 2.7]
14
+ ruby: [2.6, 2.7, '3.0']
15
15
 
16
16
  steps:
17
17
  - uses: actions/checkout@v2
18
18
  - name: Set up Ruby ${{ matrix.ruby }}
19
- uses: actions/setup-ruby@v1
19
+ uses: ruby/setup-ruby@v1
20
20
  with:
21
21
  ruby-version: ${{ matrix.ruby }}
22
22
  - name: Build and test with Rake
@@ -24,5 +24,5 @@ jobs:
24
24
  gem install bundler
25
25
  bundle install --jobs 4 --retry 3
26
26
  bundle exec rake
27
- - name: Rubocop Linter Action
28
- run: bundle exec rubocop --parallel
27
+ - name: Linter
28
+ run: bundle exec standardrb
data/CHANGELOG.md CHANGED
@@ -6,9 +6,36 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ## [Unreleased]
9
+ ---
10
+
11
+ ## [0.3.0] - 2021-09-09
12
+
13
+ ### Added
14
+
15
+ - Allow running multiple benchmarks at once:
16
+
17
+ ```ruby
18
+ Benchable.bench(:ips, :memory) do
19
+ setup do
20
+ @array = (1..1000000).map { rand }
21
+ end
22
+
23
+ bench 'sort' do
24
+ @array.dup.sort
25
+ end
26
+
27
+ bench 'sort!' do
28
+ @array.dup.sort!
29
+ end
30
+ end
31
+ ```
32
+
33
+ - Compare benchmarks after running them 🤦‍♂️.
34
+
35
+ ### Changed
36
+
37
+ - Require >= Ruby 2.6.
9
38
 
10
- <!-- ### Added -->
11
- <!-- ### Changed -->
12
39
  <!-- ### Removed -->
13
40
  ---
14
41
 
@@ -25,5 +52,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
25
52
  ### Added
26
53
  - Support for `Benchmark.bm`, `Benchmark.bmbm` and `Benchmark.ips`.
27
54
 
28
- [unreleased]: https://github.com/MatheusRich/benchable/compare/v0.1.0...HEAD
29
- [0.1.0]: https://github.com/MatheusRich/benchable/releases/tag/v0.1.0
55
+ [unreleased]: https://github.com/MatheusRich/benchable/compare/v0.3.0...HEAD
56
+ [0.1.0]: https://github.com/MatheusRich/benchable/releases/tag/v0.1.0
57
+ [0.2.0]: https://github.com/MatheusRich/benchable/releases/tag/v0.2.0
58
+ [0.3.0]: https://github.com/MatheusRich/benchable/releases/tag/v0.3.0
data/Gemfile CHANGED
@@ -1,14 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- source 'https://rubygems.org'
3
+ source "https://rubygems.org"
4
4
 
5
5
  # Specify your gem's dependencies in benchable.gemspec
6
6
  gemspec
7
7
 
8
- gem 'guard-rspec', require: false
9
- gem 'rake', '~> 12.0'
10
- gem 'rspec', '~> 3.0'
11
- gem 'rubocop', '~> 0.89.1'
12
- gem 'rubocop-rspec', '~> 1.42', require: false
13
- gem 'simplecov', '~> 0.18.5', require: false
14
- gem 'solargraph', '~> 0.39.14'
8
+ gem "guard-rspec", require: false
9
+ gem "rake", "~> 12.0"
10
+ gem "rspec", "~> 3.0"
11
+ gem "standard", "~> 1.3.0"
12
+ gem "simplecov", "~> 0.18.5", require: false
13
+ gem "solargraph", "~> 0.39"
14
+ gem "yard", "~> 0.9.25"
data/Gemfile.lock CHANGED
@@ -8,25 +8,25 @@ PATH
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- ast (2.4.1)
12
- backport (1.1.2)
13
- benchmark (0.1.0)
14
- benchmark-ips (2.8.3)
11
+ ast (2.4.2)
12
+ backport (1.2.0)
13
+ benchmark (0.1.1)
14
+ benchmark-ips (2.9.1)
15
15
  benchmark-memory (0.1.2)
16
16
  memory_profiler (~> 0.9)
17
17
  coderay (1.1.3)
18
18
  diff-lcs (1.4.4)
19
- docile (1.3.2)
19
+ docile (1.4.0)
20
20
  e2mmap (0.1.0)
21
- ffi (1.13.1)
22
- formatador (0.2.5)
23
- guard (2.16.2)
21
+ ffi (1.15.4)
22
+ formatador (0.3.0)
23
+ guard (2.18.0)
24
24
  formatador (>= 0.2.4)
25
25
  listen (>= 2.7, < 4.0)
26
26
  lumberjack (>= 1.0.12, < 2.0)
27
27
  nenv (~> 0.1)
28
28
  notiffany (~> 0.0)
29
- pry (>= 0.9.12)
29
+ pry (>= 0.13.0)
30
30
  shellany (~> 0.0)
31
31
  thor (>= 0.18.1)
32
32
  guard-compat (1.2.1)
@@ -35,85 +35,95 @@ GEM
35
35
  guard-compat (~> 1.1)
36
36
  rspec (>= 2.99.0, < 4.0)
37
37
  jaro_winkler (1.5.4)
38
- listen (3.2.1)
38
+ kramdown (2.3.1)
39
+ rexml
40
+ kramdown-parser-gfm (1.1.0)
41
+ kramdown (~> 2.0)
42
+ listen (3.7.0)
39
43
  rb-fsevent (~> 0.10, >= 0.10.3)
40
44
  rb-inotify (~> 0.9, >= 0.9.10)
41
- lumberjack (1.2.7)
42
- maruku (0.7.3)
45
+ lumberjack (1.2.8)
43
46
  memory_profiler (0.9.14)
44
47
  method_source (1.0.0)
45
- mini_portile2 (2.4.0)
48
+ mini_portile2 (2.6.1)
46
49
  nenv (0.3.0)
47
- nokogiri (1.10.10)
48
- mini_portile2 (~> 2.4.0)
50
+ nokogiri (1.12.4)
51
+ mini_portile2 (~> 2.6.1)
52
+ racc (~> 1.4)
49
53
  notiffany (0.1.3)
50
54
  nenv (~> 0.1)
51
55
  shellany (~> 0.0)
52
- parallel (1.19.2)
53
- parser (2.7.1.4)
56
+ parallel (1.20.1)
57
+ parser (3.0.2.0)
54
58
  ast (~> 2.4.1)
55
- pry (0.13.1)
59
+ pry (0.14.1)
56
60
  coderay (~> 1.1)
57
61
  method_source (~> 1.0)
62
+ racc (1.5.2)
58
63
  rainbow (3.0.0)
59
64
  rake (12.3.3)
60
- rb-fsevent (0.10.4)
65
+ rb-fsevent (0.11.0)
61
66
  rb-inotify (0.10.1)
62
67
  ffi (~> 1.0)
63
- regexp_parser (1.7.1)
68
+ regexp_parser (2.1.1)
64
69
  reverse_markdown (2.0.0)
65
70
  nokogiri
66
- rexml (3.2.4)
67
- rspec (3.9.0)
68
- rspec-core (~> 3.9.0)
69
- rspec-expectations (~> 3.9.0)
70
- rspec-mocks (~> 3.9.0)
71
- rspec-core (3.9.2)
72
- rspec-support (~> 3.9.3)
73
- rspec-expectations (3.9.2)
71
+ rexml (3.2.5)
72
+ rspec (3.10.0)
73
+ rspec-core (~> 3.10.0)
74
+ rspec-expectations (~> 3.10.0)
75
+ rspec-mocks (~> 3.10.0)
76
+ rspec-core (3.10.1)
77
+ rspec-support (~> 3.10.0)
78
+ rspec-expectations (3.10.1)
74
79
  diff-lcs (>= 1.2.0, < 2.0)
75
- rspec-support (~> 3.9.0)
76
- rspec-mocks (3.9.1)
80
+ rspec-support (~> 3.10.0)
81
+ rspec-mocks (3.10.2)
77
82
  diff-lcs (>= 1.2.0, < 2.0)
78
- rspec-support (~> 3.9.0)
79
- rspec-support (3.9.3)
80
- rubocop (0.89.1)
83
+ rspec-support (~> 3.10.0)
84
+ rspec-support (3.10.2)
85
+ rubocop (1.20.0)
81
86
  parallel (~> 1.10)
82
- parser (>= 2.7.1.1)
87
+ parser (>= 3.0.0.0)
83
88
  rainbow (>= 2.2.2, < 4.0)
84
- regexp_parser (>= 1.7)
89
+ regexp_parser (>= 1.8, < 3.0)
85
90
  rexml
86
- rubocop-ast (>= 0.3.0, < 1.0)
91
+ rubocop-ast (>= 1.9.1, < 2.0)
87
92
  ruby-progressbar (~> 1.7)
88
- unicode-display_width (>= 1.4.0, < 2.0)
89
- rubocop-ast (0.3.0)
90
- parser (>= 2.7.1.4)
91
- rubocop-rspec (1.42.0)
92
- rubocop (>= 0.87.0)
93
- ruby-progressbar (1.10.1)
93
+ unicode-display_width (>= 1.4.0, < 3.0)
94
+ rubocop-ast (1.11.0)
95
+ parser (>= 3.0.1.1)
96
+ rubocop-performance (1.11.5)
97
+ rubocop (>= 1.7.0, < 2.0)
98
+ rubocop-ast (>= 0.4.0)
99
+ ruby-progressbar (1.11.0)
94
100
  shellany (0.0.1)
95
101
  simplecov (0.18.5)
96
102
  docile (~> 1.1)
97
103
  simplecov-html (~> 0.11)
98
- simplecov-html (0.12.2)
99
- solargraph (0.39.14)
100
- backport (~> 1.1)
104
+ simplecov-html (0.12.3)
105
+ solargraph (0.43.0)
106
+ backport (~> 1.2)
101
107
  benchmark
102
108
  bundler (>= 1.17.2)
109
+ diff-lcs (~> 1.4)
103
110
  e2mmap
104
111
  jaro_winkler (~> 1.5)
105
- maruku (~> 0.7, >= 0.7.3)
106
- nokogiri (~> 1.9, >= 1.9.1)
107
- parser (~> 2.3)
112
+ kramdown (~> 2.3)
113
+ kramdown-parser-gfm (~> 1.1)
114
+ parser (~> 3.0)
108
115
  reverse_markdown (>= 1.0.5, < 3)
109
- rubocop (~> 0.52)
116
+ rubocop (>= 0.52)
110
117
  thor (~> 1.0)
111
118
  tilt (~> 2.0)
112
119
  yard (~> 0.9, >= 0.9.24)
113
- thor (1.0.1)
120
+ standard (1.3.0)
121
+ rubocop (= 1.20.0)
122
+ rubocop-performance (= 1.11.5)
123
+ thor (1.1.0)
114
124
  tilt (2.0.10)
115
- unicode-display_width (1.7.0)
116
- yard (0.9.25)
125
+ unicode-display_width (2.0.0)
126
+ yard (0.9.26)
117
127
 
118
128
  PLATFORMS
119
129
  ruby
@@ -123,10 +133,10 @@ DEPENDENCIES
123
133
  guard-rspec
124
134
  rake (~> 12.0)
125
135
  rspec (~> 3.0)
126
- rubocop (~> 0.89.1)
127
- rubocop-rspec (~> 1.42)
128
136
  simplecov (~> 0.18.5)
129
- solargraph (~> 0.39.14)
137
+ solargraph (~> 0.39)
138
+ standard (~> 1.3.0)
139
+ yard (~> 0.9.25)
130
140
 
131
141
  BUNDLED WITH
132
142
  2.1.4
data/Guardfile CHANGED
@@ -26,8 +26,8 @@
26
26
  # * zeus: 'zeus rspec' (requires the server to be started separately)
27
27
  # * 'just' rspec: 'rspec'
28
28
 
29
- guard :rspec, cmd: 'bundle exec rspec' do
30
- require 'guard/rspec/dsl'
29
+ guard :rspec, cmd: "bundle exec rspec" do
30
+ require "guard/rspec/dsl"
31
31
  dsl = Guard::RSpec::Dsl.new(self)
32
32
 
33
33
  # Feel free to open issues for suggestions and improvements
@@ -56,17 +56,17 @@ guard :rspec, cmd: 'bundle exec rspec' do
56
56
  end
57
57
 
58
58
  # Rails config changes
59
- watch(rails.spec_helper) { rspec.spec_dir }
60
- watch(rails.routes) { "#{rspec.spec_dir}/routing" }
61
- watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
59
+ watch(rails.spec_helper) { rspec.spec_dir }
60
+ watch(rails.routes) { "#{rspec.spec_dir}/routing" }
61
+ watch(rails.app_controller) { "#{rspec.spec_dir}/controllers" }
62
62
 
63
63
  # Capybara features specs
64
- watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") }
65
- watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") }
64
+ watch(rails.view_dirs) { |m| rspec.spec.call("features/#{m[1]}") }
65
+ watch(rails.layouts) { |m| rspec.spec.call("features/#{m[1]}") }
66
66
 
67
67
  # Turnip features and steps
68
68
  watch(%r{^spec/acceptance/(.+)\.feature$})
69
69
  watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) do |m|
70
- Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance'
70
+ Dir[File.join("**/#{m[1]}.feature")][0] || "spec/acceptance"
71
71
  end
72
72
  end
data/README.md CHANGED
@@ -1,6 +1,18 @@
1
- # Benchable
2
-
3
- Write benchmarks without the hassle.
1
+ <p align="center">
2
+ <h1 align="center">Benchable</h1>
3
+
4
+ <p align="center">
5
+ <i>Write benchmarks without the hassle.</i>
6
+ <br>
7
+ <br>
8
+ <img src="https://img.shields.io/gem/v/benchable">
9
+ <img src="https://img.shields.io/gem/dt/benchable">
10
+ <img src="https://github.com/MatheusRich/benchable/workflows/Ruby/badge.svg">
11
+ <a href="https://github.com/MatheusRich/benchable/blob/master/LICENSE">
12
+ <img src="https://img.shields.io/github/license/MatheusRich/benchable.svg" alt="License">
13
+ </a>
14
+ </p>
15
+ </p>
4
16
 
5
17
  ## Installation
6
18
 
@@ -19,13 +31,15 @@ Or install it yourself as:
19
31
  $ gem install benchable
20
32
 
21
33
  ## Usage
34
+
22
35
  ### Basic usage
36
+
23
37
  Use the method `Benchable.bench` to declare a benchmark. Write each benchmark case with the `bench` method. The benchmark will run automatically.
24
38
 
25
39
  ```ruby
26
40
  Benchable.bench do
27
41
  bench 'sort' do
28
- (1..1000000).map { rand }.sort
42
+ (1..1000000).map { rand }.sort
29
43
  end
30
44
 
31
45
  bench 'sort!' do
@@ -49,7 +63,7 @@ Benchable.bench do
49
63
  end
50
64
 
51
65
  bench 'sort' do
52
- @array.dup.sort
66
+ @array.dup.sort
53
67
  end
54
68
 
55
69
  bench 'sort!' do
@@ -61,10 +75,12 @@ end
61
75
  # Sort 0.400133 0.011995 0.412128 ( 0.412339)
62
76
  # Sort! 0.388636 0.003980 0.392616 ( 0.393054)
63
77
  ```
78
+
64
79
  > We've used `Array#dup` in the example above to prevent the benchmarks for modifying the original array
65
80
 
66
81
  ### Benchmark types
67
- There are 4 benchmark types available: `bm`, `bmbm`, `ips` and `memory`. You can specify the type by passing it as a symbol on the `Benchable.bench` method. The default type is `bm`.
82
+
83
+ Four benchmark types are available: `bm`, `bmbm`, `ips` and `memory`. You can specify the type by passing it as a symbol on the `Benchable.bench` method. The default type is `bm`.
68
84
 
69
85
  ```ruby
70
86
  Benchable.bench(:bm) do
@@ -84,7 +100,16 @@ Benchable.bench(:memory) do
84
100
  end
85
101
  ```
86
102
 
103
+ You can also run multiple benchmarks at once:
104
+
105
+ ```ruby
106
+ Benchable.bench(:ips, :memory) do
107
+ # ...
108
+ end
109
+ ```
110
+
87
111
  Given an invalid benchmark type, Benchable will raise an exception.
112
+
88
113
  ```ruby
89
114
  Benchable.bench(:invalid) do
90
115
  # ...
@@ -93,9 +118,11 @@ end
93
118
  ```
94
119
 
95
120
  ### Benchmark options
121
+
96
122
  You can provide benchmark options by passing a hash to the `Benchable.bench` method.
97
123
 
98
124
  #### Options for `Benchmark.bm` and `Benchmark.bmbm`
125
+
99
126
  On `bm` and `bmbm` benchmarks the only available option is `width`, which specifies the leading spaces for labels on each line. The default width is `20`.
100
127
 
101
128
  ```ruby
@@ -105,6 +132,7 @@ end
105
132
  ```
106
133
 
107
134
  #### Options for `Benchmark::IPS`
135
+
108
136
  If you're using `::IPS`, you can pass any option accepted by `Benchmark::IPS`' `config` method.
109
137
 
110
138
  ```ruby
@@ -121,6 +149,7 @@ end
121
149
  ```
122
150
 
123
151
  #### Options for `Benchmark::Memory`
152
+
124
153
  You can pass [any option accepted](https://github.com/michaelherold/benchmark-memory#options) by `Benchmark::Memory`.
125
154
 
126
155
  ```ruby
@@ -142,8 +171,8 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
142
171
 
143
172
  Bug reports and pull requests are welcome on GitHub at https://github.com/MatheusRich/benchable. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/MatheusRich/benchable/blob/master/CODE_OF_CONDUCT.md).
144
173
 
145
-
146
174
  ## Acknowledgments
175
+
147
176
  Thanks [@naomik](https://github.com/naomik) for building the base idea for this in [his gist](https://gist.github.com/naomik/6012505)!
148
177
 
149
178
  ## License
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
5
 
6
6
  RSpec::Core::RakeTask.new(:spec)
7
7
 
data/benchable.gemspec CHANGED
@@ -1,32 +1,32 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'lib/benchable/version'
3
+ require_relative "lib/benchable/version"
4
4
 
5
5
  Gem::Specification.new do |spec|
6
- spec.name = 'benchable'
7
- spec.version = Benchable::VERSION
8
- spec.authors = ['Matheus Richard']
9
- spec.email = ['matheusrichardt@gmail.com']
6
+ spec.name = "benchable"
7
+ spec.version = Benchable::VERSION
8
+ spec.authors = ["Matheus Richard"]
9
+ spec.email = ["matheusrichardt@gmail.com"]
10
10
 
11
- spec.summary = 'Write benchmarks without the hassle'
11
+ spec.summary = "Write benchmarks without the hassle"
12
12
  # spec.description = %q{TODO: Write a longer description or delete this line.}
13
- spec.homepage = 'https://github.com/MatheusRich/benchable'
14
- spec.license = 'MIT'
15
- spec.required_ruby_version = Gem::Requirement.new('>= 2.4.0')
13
+ spec.homepage = "https://github.com/MatheusRich/benchable"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.6.0")
16
16
 
17
- spec.metadata['homepage_uri'] = spec.homepage
18
- spec.metadata['source_code_uri'] = 'https://github.com/MatheusRich/benchable'
19
- spec.metadata['changelog_uri'] = 'https://github.com/MatheusRich/benchable/blob/master/CHANGELOG.md'
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "https://github.com/MatheusRich/benchable"
19
+ spec.metadata["changelog_uri"] = "https://github.com/MatheusRich/benchable/blob/master/CHANGELOG.md"
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
23
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
24
24
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
25
  end
26
- spec.bindir = 'exe'
27
- spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ['lib']
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
29
 
30
- spec.add_runtime_dependency 'benchmark-ips', '~> 2.8', '>= 2.8.2'
31
- spec.add_runtime_dependency 'benchmark-memory', '~> 0.1.2'
30
+ spec.add_runtime_dependency "benchmark-ips", "~> 2.8", ">= 2.8.2"
31
+ spec.add_runtime_dependency "benchmark-memory", "~> 0.1.2"
32
32
  end
@@ -1,10 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'benchmark'
4
- require 'benchmark/ips'
5
- require 'benchmark/memory'
3
+ require "benchmark"
4
+ require "benchmark/ips"
5
+ require "benchmark/memory"
6
6
 
7
7
  module Benchable
8
+ # Main class to perform benchmarks.
9
+ #
10
+ # Use the method Benchable.bench to declare a benchmark.
8
11
  class Benchmark
9
12
  DEFAULT_WIDTH = 20
10
13
  BENCHMARK_TYPES = %i[bm bmbm ips memory].freeze
@@ -24,7 +27,8 @@ module Benchable
24
27
  define_method(method_name_for(name), &block)
25
28
  end
26
29
 
27
- def setup; end
30
+ def setup
31
+ end
28
32
 
29
33
  def run
30
34
  setup
@@ -36,7 +40,7 @@ module Benchable
36
40
  end
37
41
 
38
42
  private_class_method def self.method_name_for(name)
39
- "bench_#{name.to_s.gsub(' ', '_').downcase}"
43
+ "bench_#{name.to_s.tr(" ", "_").downcase}"
40
44
  end
41
45
 
42
46
  private
@@ -48,19 +52,21 @@ module Benchable
48
52
  end
49
53
 
50
54
  def run_benchmark
51
- benchmark do |with|
52
- with.config(**options) if benchmark_type == :ips
55
+ benchmark do |b|
56
+ b.config(**options) if benchmark_type == :ips
53
57
 
54
58
  cases.each do |benchmark_case|
55
- with.report(name_for(benchmark_case)) do
59
+ b.report(name_for(benchmark_case)) do
56
60
  method(benchmark_case).call
57
61
  end
58
62
  end
63
+
64
+ b.compare! if b.respond_to? :compare!
59
65
  end
60
66
  end
61
67
 
62
68
  def name_for(benchmark_case)
63
- benchmark_case.to_s.gsub('bench_', '').gsub('_', ' ').capitalize
69
+ benchmark_case.to_s.gsub("bench_", "").tr("_", " ").capitalize
64
70
  end
65
71
 
66
72
  def benchmark(&block)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Benchable
4
- VERSION = '0.2.0'
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/benchable.rb CHANGED
@@ -1,18 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'benchable/benchmark'
4
- require_relative 'benchable/version'
3
+ require_relative "benchable/benchmark"
4
+ require_relative "benchable/version"
5
5
 
6
+ # Benchable is used for automating benchmarks
6
7
  module Benchable
7
8
  class Error < StandardError; end
8
9
 
9
- def self.build(type = :bm, **options, &block)
10
- bench_class = Class.new(Benchmark, &block)
10
+ class << self
11
+ def build(type = :bm, **options, &block)
12
+ bench_class = Class.new(Benchmark, &block)
11
13
 
12
- bench_class.new(type, **options)
13
- end
14
+ bench_class.new(type, **options)
15
+ end
16
+
17
+ def bench(*types, **options, &block)
18
+ types << :bm if types.empty?
14
19
 
15
- def self.bench(type = :bm, **options, &block)
16
- build(type, **options, &block).run
20
+ if options.empty?
21
+ types.map { |type| build(type, &block).run }
22
+ else
23
+ types.map { |type| build(type, **options, &block).run }
24
+ end
25
+ end
17
26
  end
18
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: benchable
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matheus Richard
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-10-24 00:00:00.000000000 Z
11
+ date: 2021-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: benchmark-ips
@@ -44,7 +44,7 @@ dependencies:
44
44
  - - "~>"
45
45
  - !ruby/object:Gem::Version
46
46
  version: 0.1.2
47
- description:
47
+ description:
48
48
  email:
49
49
  - matheusrichardt@gmail.com
50
50
  executables: []
@@ -54,7 +54,6 @@ files:
54
54
  - ".github/workflows/tests-and-linter.yml"
55
55
  - ".gitignore"
56
56
  - ".rspec"
57
- - ".rubocop.yml"
58
57
  - CHANGELOG.md
59
58
  - CODE_OF_CONDUCT.md
60
59
  - Gemfile
@@ -76,7 +75,7 @@ metadata:
76
75
  homepage_uri: https://github.com/MatheusRich/benchable
77
76
  source_code_uri: https://github.com/MatheusRich/benchable
78
77
  changelog_uri: https://github.com/MatheusRich/benchable/blob/master/CHANGELOG.md
79
- post_install_message:
78
+ post_install_message:
80
79
  rdoc_options: []
81
80
  require_paths:
82
81
  - lib
@@ -84,15 +83,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
84
83
  requirements:
85
84
  - - ">="
86
85
  - !ruby/object:Gem::Version
87
- version: 2.4.0
86
+ version: 2.6.0
88
87
  required_rubygems_version: !ruby/object:Gem::Requirement
89
88
  requirements:
90
89
  - - ">="
91
90
  - !ruby/object:Gem::Version
92
91
  version: '0'
93
92
  requirements: []
94
- rubygems_version: 3.1.2
95
- signing_key:
93
+ rubygems_version: 3.2.25
94
+ signing_key:
96
95
  specification_version: 4
97
96
  summary: Write benchmarks without the hassle
98
97
  test_files: []
data/.rubocop.yml DELETED
@@ -1,19 +0,0 @@
1
- require:
2
- - rubocop-rspec
3
-
4
- AllCops:
5
- NewCops: enable
6
-
7
- Layout/LineLength:
8
- Max: 120
9
-
10
- Metrics/BlockLength:
11
- Exclude:
12
- - "spec/**/*"
13
- - "Guardfile"
14
-
15
- Style/Documentation:
16
- Enabled: false
17
-
18
- Style/DocumentationMethod:
19
- Enabled: false