radius-spec 0.2.1 → 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: 72f2b3e03304c307956320dcaf22bf432d7ddbda2cd893c3b9bd772b8bd3a73b
4
- data.tar.gz: cb707ef2cf3c9bdacfefd43047fdb5bf777292acf3adfbb5a251257e63b5d1f7
3
+ metadata.gz: 623e5f2ff9f43d04105288432e6c098baedf4a782cd079015ebeb7aeb1602d25
4
+ data.tar.gz: 5c06b3a06f58ea096cfd940c0366ae83b29254b5580cc53378e0004b36e55a2c
5
5
  SHA512:
6
- metadata.gz: 0df7e27e7c00b3bb076a9b3b84b3076971dd3b15b086e18d350fe43e08116a95637a48213f2a7400169daac766b0e67486fb291bb486906e1cc276acac917490
7
- data.tar.gz: 532110d779de9e684f7dc422dbf6413e3f9162901ea8a11380d1d7878d8622c488e5d005bc81e35081624cbc3f30dc254cfd8e4333eb0020cd161d2838c17fd3
6
+ metadata.gz: 2779d47b61810a6b0f7c079d4e4f993e9564f9e8c63b477e7a79907d857f0c36a00553cb888ea12a6d23d93fedc03193ae55e3e7481274b7e14dbcbcf0cd9b0d
7
+ data.tar.gz: ddd46b237b7fb16f1693ab44c2a1887b98056cebc03276674b1feedf1e8d456836f66ad1691229679cc8bcf9d45539daa2d3aff78043dcde7a3b52e540cf772f
data/.rubocop.yml CHANGED
@@ -8,6 +8,7 @@ inherit_from: common_rubocop.yml
8
8
  # Configuration parameters: CountComments, ExcludedMethods.
9
9
  Metrics/BlockLength:
10
10
  Exclude:
11
+ - 'benchmarks/**/*'
11
12
  - 'lib/radius/spec/rspec.rb'
12
13
 
13
14
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
data/.travis.yml CHANGED
@@ -5,6 +5,8 @@ before_install:
5
5
  - gem update --system
6
6
  - gem install bundler
7
7
  bundler_args: --jobs=3 --retry=3 --without documentation debug
8
+ before_script:
9
+ - "bin/ci-code-review"
8
10
  script: bin/ci
9
11
  rvm:
10
12
  - 2.5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ ## 0.3.0 (June 15, 2018)
2
+
3
+ [Full Changelog](https://github.com/RadiusNetworks/radius-spec/compare/v0.2.1...v0.3.0)
4
+
5
+ ### Breaking Change
6
+
7
+ - Lock Rubocop to a minor release version in gemspec (Aaron Kromer, #5)
8
+
9
+ ### Enhancements
10
+
11
+ - Adjust common Rubocop configuration (Aaron Kromer, #5)
12
+ - Customize `Style/AndOr` to flag only conditionals allowing `and` / `or` for
13
+ control flow
14
+ - Add `find` to functional method blocks
15
+ - Disable `Style/DoubleNegation` as this is a common Ruby idiom
16
+ - Disable `Style/StringLiteralsInInterpolation` to stay consistent with our
17
+ no preferences for single versus double quotes
18
+
19
+ ### Bug Fixes
20
+
21
+ - Remove `Include` from common Rubocop all cops configuration to fix issues
22
+ with Rubocop 0.56.0+ not seeing all expected files. (Aaron Kromer, #5)
23
+
24
+
1
25
  ## 0.2.1 (May 17, 2018)
2
26
 
3
27
  [Full Changelog](https://github.com/RadiusNetworks/radius-spec/compare/v0.2.0...v0.2.1)
data/Gemfile CHANGED
@@ -7,15 +7,18 @@ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
7
7
  # Specify your gem's dependencies in radius-spec.gemspec
8
8
  gemspec
9
9
 
10
+ group :benchmark, optional: true do
11
+ gem 'benchmark-ips', require: false
12
+ # TODO: See if this gem has an update in the future as it's gemspec is too
13
+ # strict and it was blocking other gems from installing / updating
14
+ gem 'kalibera', require: false, git: 'https://github.com/cupakromer/libkalibera.git'
15
+ end
16
+
10
17
  group :debug do
11
18
  gem "pry-byebug", "~> 3.6", require: false
12
19
  gem "travis", require: false
13
20
  end
14
21
 
15
- group :development do
16
- gem "rubocop", "~> 0.53", require: false
17
- end
18
-
19
22
  group :documentation do
20
23
  gem 'yard', '~> 0.9', require: false
21
24
  end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kalibera'
4
+ require 'benchmark/ips'
5
+
6
+ # Enable and start GC before each job run. Disable GC afterwards.
7
+ #
8
+ # Inspired by https://www.omniref.com/ruby/2.2.1/symbols/Benchmark/bm?#annotation=4095926&line=182
9
+ class GCSuite
10
+ def warming(*)
11
+ run_gc
12
+ end
13
+
14
+ def running(*)
15
+ run_gc
16
+ end
17
+
18
+ def warmup_stats(*)
19
+ end
20
+
21
+ def add_report(*)
22
+ end
23
+
24
+ private
25
+
26
+ def run_gc
27
+ GC.enable
28
+ GC.start
29
+ GC.disable
30
+ end
31
+ end
32
+
33
+ def as_boolean(val, default: nil)
34
+ case val.to_s.strip.downcase
35
+ when "true", "t", "yes", "y", "on", "1"
36
+ true
37
+ when "false", "f", "no", "n", "off", "0"
38
+ false
39
+ else
40
+ raise "Unknown boolean value #{val}" if default.nil?
41
+ default
42
+ end
43
+ end
44
+
45
+ def section(title = nil)
46
+ puts "\n#### #{title}" if title
47
+ puts "\n```"
48
+ GC.start
49
+ Benchmark.ips do |bench|
50
+ bench.config suite: GCSuite.new if GC_DISABLED
51
+ bench.config stats: :bootstrap, confidence: 95
52
+
53
+ yield bench
54
+ bench.compare!
55
+ end
56
+ puts "```"
57
+ end
58
+
59
+ def display_benchmark_header
60
+ puts
61
+ puts "### Environment"
62
+ puts
63
+ puts RUBY_DESCRIPTION
64
+ puts "GC Disabled: #{GC_DISABLED}"
65
+ puts
66
+ puts "### Test Cases"
67
+ end
68
+
69
+ GC_DISABLED = as_boolean(ENV['GC_DISABLED'], default: false)
@@ -0,0 +1,148 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/call_vs_yield.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ # rubocop:disable Performance/RedundantBlockCall
9
+ def block_call(&block)
10
+ block.call
11
+ end
12
+
13
+ def block_yield(&_block)
14
+ yield
15
+ end
16
+
17
+ def block_arg(&_block)
18
+ 1 + 1 # Always do the same amount of work
19
+ end
20
+
21
+ def no_arg_yield
22
+ yield
23
+ end
24
+
25
+ def pass_through(&block)
26
+ no_arg_yield(&block)
27
+ end
28
+
29
+ section "Block call vs yield" do |bench|
30
+ bench.report("block.call") do |times|
31
+ i = 0
32
+ while i < times
33
+ block_call do
34
+ 1 + 1
35
+ end
36
+ i += 1
37
+ end
38
+ end
39
+
40
+ bench.report("block yield") do |times|
41
+ i = 0
42
+ while i < times
43
+ block_yield do
44
+ 1 + 1
45
+ end
46
+ i += 1
47
+ end
48
+ end
49
+
50
+ bench.report("block arg only") do |times|
51
+ i = 0
52
+ while i < times
53
+ block_arg do
54
+ 1 + 1
55
+ end
56
+ i += 1
57
+ end
58
+ end
59
+
60
+ bench.report("no arg yield") do |times|
61
+ i = 0
62
+ while i < times
63
+ no_arg_yield do
64
+ 1 + 1
65
+ end
66
+ i += 1
67
+ end
68
+ end
69
+
70
+ bench.report("pass through block") do |times|
71
+ i = 0
72
+ while i < times
73
+ pass_through do
74
+ 1 + 1
75
+ end
76
+ i += 1
77
+ end
78
+ end
79
+ end
80
+ # rubocop:enable Performance/RedundantBlockCall
81
+
82
+ __END__
83
+
84
+ ### Environment
85
+
86
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
87
+ GC Disabled: false
88
+
89
+ ### Test Cases
90
+
91
+ #### Block call vs yield
92
+
93
+ ```
94
+ Warming up --------------------------------------
95
+ block.call 117.672k i/100ms
96
+ block yield 272.613k i/100ms
97
+ block arg only 287.821k i/100ms
98
+ no arg yield 286.217k i/100ms
99
+ pass through block 251.757k i/100ms
100
+ Calculating -------------------------------------
101
+ block.call 3.181M (± 0.9%) i/s - 15.886M in 5.010444s
102
+ block yield 14.017M (± 0.7%) i/s - 70.062M in 5.015163s
103
+ block arg only 17.835M (± 0.7%) i/s - 88.937M in 5.011243s
104
+ no arg yield 18.056M (± 0.6%) i/s - 90.158M in 5.010075s
105
+ pass through block 10.776M (± 0.8%) i/s - 53.876M in 5.019221s
106
+ with 95.0% confidence
107
+
108
+ Comparison:
109
+ no arg yield: 18056296.4 i/s
110
+ block arg only: 17835047.6 i/s - same-ish: difference falls within error
111
+ block yield: 14017426.6 i/s - 1.29x (± 0.01) slower
112
+ pass through block: 10776151.4 i/s - 1.68x (± 0.02) slower
113
+ block.call: 3180610.0 i/s - 5.68x (± 0.06) slower
114
+ with 95.0% confidence
115
+ ```
116
+
117
+ ### Environment
118
+
119
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
120
+ GC Disabled: true
121
+
122
+ ### Test Cases
123
+
124
+ #### Block call vs yield
125
+
126
+ ```
127
+ Warming up --------------------------------------
128
+ block.call 134.623k i/100ms
129
+ block yield 276.955k i/100ms
130
+ block arg only 306.377k i/100ms
131
+ no arg yield 286.201k i/100ms
132
+ pass through block 259.025k i/100ms
133
+ Calculating -------------------------------------
134
+ block.call 3.558M (± 2.6%) i/s - 17.097M in 5.033155s
135
+ block yield 14.469M (± 0.7%) i/s - 72.285M in 5.013029s
136
+ block arg only 18.173M (± 0.6%) i/s - 90.688M in 5.005679s
137
+ no arg yield 18.207M (± 0.6%) i/s - 90.726M in 5.001766s
138
+ pass through block 10.794M (± 0.8%) i/s - 53.877M in 5.010781s
139
+ with 95.0% confidence
140
+
141
+ Comparison:
142
+ no arg yield: 18206595.2 i/s
143
+ block arg only: 18172764.0 i/s - same-ish: difference falls within error
144
+ block yield: 14469142.9 i/s - 1.26x (± 0.01) slower
145
+ pass through block: 10793657.6 i/s - 1.69x (± 0.02) slower
146
+ block.call: 3557929.5 i/s - 5.12x (± 0.14) slower
147
+ with 95.0% confidence
148
+ ```
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/case_equality_vs_class_check.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ section "Class match" do |bench|
9
+ x = "Any String"
10
+
11
+ bench.report("===") do
12
+ String === x # rubocop:disable Style/CaseEquality
13
+ end
14
+
15
+ bench.report("is_a?") do
16
+ x.is_a?(String)
17
+ end
18
+ end
19
+
20
+ section "Class NO match" do |bench|
21
+ x = :any_symbol
22
+
23
+ bench.report("===") do
24
+ String === x # rubocop:disable Style/CaseEquality
25
+ end
26
+
27
+ bench.report("is_a?") do
28
+ x.is_a?(String)
29
+ end
30
+ end
31
+
32
+ __END__
33
+
34
+ ### Environment
35
+
36
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
37
+ GC Disabled: true
38
+
39
+ ### Test Cases
40
+
41
+ #### Class match
42
+
43
+ ```
44
+ Warming up --------------------------------------
45
+ === 284.703k i/100ms
46
+ is_a? 280.367k i/100ms
47
+ Calculating -------------------------------------
48
+ === 11.394M (± 0.8%) i/s - 56.941M in 5.014392s
49
+ is_a? 11.068M (± 0.8%) i/s - 55.232M in 5.007549s
50
+ with 95.0% confidence
51
+
52
+ Comparison:
53
+ ===: 11394313.8 i/s
54
+ is_a?: 11068062.4 i/s - 1.03x (± 0.01) slower
55
+ with 95.0% confidence
56
+ ```
57
+
58
+ #### Class NO match
59
+
60
+ ```
61
+ Warming up --------------------------------------
62
+ === 298.288k i/100ms
63
+ is_a? 290.294k i/100ms
64
+ Calculating -------------------------------------
65
+ === 10.567M (± 0.7%) i/s - 52.797M in 5.007023s
66
+ is_a? 10.405M (± 0.7%) i/s - 51.963M in 5.006983s
67
+ with 95.0% confidence
68
+
69
+ Comparison:
70
+ ===: 10567130.4 i/s
71
+ is_a?: 10405382.6 i/s - 1.02x (± 0.01) slower
72
+ with 95.0% confidence
73
+ ```
@@ -0,0 +1,106 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/cover_vs_include.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ INT_RANGE = (0..15)
9
+ INT_VAR = 10
10
+
11
+ section "Integer ranges" do |bench|
12
+ bench.report('range#cover?') do
13
+ INT_RANGE.cover?(INT_VAR)
14
+ end
15
+
16
+ bench.report('range#include?') do
17
+ INT_RANGE.include?(INT_VAR)
18
+ end
19
+
20
+ bench.report('range#member?') do
21
+ INT_RANGE.member?(INT_VAR)
22
+ end
23
+
24
+ bench.report('plain compare') do
25
+ 0 < INT_VAR && INT_VAR < 15
26
+ end
27
+ end
28
+
29
+ BEGIN_OF_JULY = Time.utc(2015, 7, 1)
30
+ END_OF_JULY = Time.utc(2015, 7, 31)
31
+ DAY_IN_JULY = Time.utc(2015, 7, 15)
32
+
33
+ TIME_RANGE = (BEGIN_OF_JULY..END_OF_JULY)
34
+
35
+ section "Time ranges" do |bench|
36
+ bench.report('range#cover?') do
37
+ TIME_RANGE.cover?(DAY_IN_JULY)
38
+ end
39
+
40
+ bench.report('range#include?') do
41
+ TIME_RANGE.include?(DAY_IN_JULY)
42
+ end
43
+
44
+ bench.report('range#member?') do
45
+ TIME_RANGE.member?(DAY_IN_JULY)
46
+ end
47
+
48
+ bench.report('plain compare') do
49
+ BEGIN_OF_JULY < DAY_IN_JULY && DAY_IN_JULY < END_OF_JULY
50
+ end
51
+ end
52
+
53
+ __END__
54
+
55
+ ### Environment
56
+
57
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
58
+ GC Disabled: false
59
+
60
+ ### Test Cases
61
+
62
+ #### Integer ranges
63
+
64
+ ```
65
+ Warming up --------------------------------------
66
+ range#cover? 247.959k i/100ms
67
+ range#include? 251.846k i/100ms
68
+ range#member? 251.416k i/100ms
69
+ plain compare 305.858k i/100ms
70
+ Calculating -------------------------------------
71
+ range#cover? 6.400M (± 0.8%) i/s - 31.987M in 5.008881s
72
+ range#include? 6.328M (± 0.8%) i/s - 31.733M in 5.025377s
73
+ range#member? 6.366M (± 0.6%) i/s - 31.930M in 5.022146s
74
+ plain compare 11.042M (± 0.8%) i/s - 55.054M in 4.999666s
75
+ with 95.0% confidence
76
+
77
+ Comparison:
78
+ plain compare: 11041684.3 i/s
79
+ range#cover?: 6399832.9 i/s - 1.73x (± 0.02) slower
80
+ range#member?: 6366323.6 i/s - 1.73x (± 0.02) slower
81
+ range#include?: 6327682.0 i/s - 1.75x (± 0.02) slower
82
+ with 95.0% confidence
83
+ ```
84
+
85
+ #### Time ranges
86
+
87
+ ```
88
+ Warming up --------------------------------------
89
+ range#cover? 249.380k i/100ms
90
+ range#include? 247.775k i/100ms
91
+ range#member? 247.446k i/100ms
92
+ plain compare 223.517k i/100ms
93
+ Calculating -------------------------------------
94
+ range#cover? 5.942M (± 0.7%) i/s - 29.676M in 5.002164s
95
+ range#include? 5.724M (± 0.7%) i/s - 28.742M in 5.028509s
96
+ range#member? 5.771M (± 0.7%) i/s - 28.951M in 5.024809s
97
+ plain compare 4.751M (± 0.9%) i/s - 23.916M in 5.046978s
98
+ with 95.0% confidence
99
+
100
+ Comparison:
101
+ range#cover?: 5941582.8 i/s
102
+ range#member?: 5770708.7 i/s - 1.03x (± 0.01) slower
103
+ range#include?: 5723795.5 i/s - 1.04x (± 0.01) slower
104
+ plain compare: 4750545.5 i/s - 1.25x (± 0.01) slower
105
+ with 95.0% confidence
106
+ ```