radius-spec 0.2.0 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +6 -0
- data/.travis.yml +4 -5
- data/.yardopts +1 -0
- data/CHANGELOG.md +122 -1
- data/Gemfile +9 -5
- data/README.md +352 -34
- data/benchmarks/bm_setup.rb +70 -0
- data/benchmarks/call_vs_yield.rb +181 -0
- data/benchmarks/case_equality_vs_class_check.rb +73 -0
- data/benchmarks/casecmp_vs_downcase.rb +488 -0
- data/benchmarks/cover_vs_include.rb +106 -0
- data/benchmarks/delete_vs_tr.rb +100 -0
- data/benchmarks/double_negation.rb +167 -0
- data/benchmarks/empty_literal.rb +75 -0
- data/benchmarks/format_string.rb +58 -0
- data/benchmarks/format_string_token.rb +160 -0
- data/benchmarks/gsub_vs_tr.rb +95 -0
- data/benchmarks/hash_merge.rb +112 -0
- data/benchmarks/kwargs.rb +159 -0
- data/benchmarks/max_ternary.rb +105 -0
- data/benchmarks/max_ternary_micro.rb +129 -0
- data/benchmarks/unfreeze_string.rb +86 -0
- data/benchmarks/unpack_first.rb +54 -0
- data/bin/ci +2 -2
- data/bin/ci-code-review +28 -0
- data/common_rubocop.yml +270 -32
- data/common_rubocop_rails.yml +127 -13
- data/lib/radius/spec/model_factory.rb +35 -22
- data/lib/radius/spec/rails.rb +2 -2
- data/lib/radius/spec/rspec.rb +20 -0
- data/lib/radius/spec/rspec/negated_matchers.rb +19 -0
- data/lib/radius/spec/tempfile.rb +162 -0
- data/lib/radius/spec/vcr.rb +100 -0
- data/lib/radius/spec/version.rb +1 -1
- data/radius-spec.gemspec +1 -0
- metadata +43 -10
- data/bin/travis +0 -29
@@ -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
|
+
```
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Run from the command line: bundle exec ruby benchmarks/delete_vs_tr.rb
|
4
|
+
require_relative 'bm_setup'
|
5
|
+
|
6
|
+
display_benchmark_header
|
7
|
+
|
8
|
+
[
|
9
|
+
["No Removal", "Any String Chars", "m", ""],
|
10
|
+
["Single Removal", "Any String Chars", "i", ""],
|
11
|
+
["Multiple Removal", "Any String Chars", "n", ""],
|
12
|
+
["Multi-Char Removal", "Any String Chars", "nar", ""],
|
13
|
+
].each do |title, str, pattern, replacement|
|
14
|
+
section title do |bench|
|
15
|
+
bench.report("delete") do
|
16
|
+
str.delete(pattern)
|
17
|
+
end
|
18
|
+
|
19
|
+
bench.report("tr") do
|
20
|
+
str.tr(pattern, replacement)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
__END__
|
26
|
+
|
27
|
+
### Environment
|
28
|
+
|
29
|
+
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
|
30
|
+
GC Disabled: false
|
31
|
+
|
32
|
+
### Test Cases
|
33
|
+
|
34
|
+
#### No Removal
|
35
|
+
|
36
|
+
```
|
37
|
+
Warming up --------------------------------------
|
38
|
+
delete 164.989k i/100ms
|
39
|
+
tr 163.504k i/100ms
|
40
|
+
Calculating -------------------------------------
|
41
|
+
delete 2.578M (± 0.9%) i/s - 13.034M in 5.065099s
|
42
|
+
tr 2.566M (± 0.8%) i/s - 12.917M in 5.039546s
|
43
|
+
with 95.0% confidence
|
44
|
+
|
45
|
+
Comparison:
|
46
|
+
delete: 2578043.5 i/s
|
47
|
+
tr: 2565794.9 i/s - same-ish: difference falls within error
|
48
|
+
with 95.0% confidence
|
49
|
+
```
|
50
|
+
|
51
|
+
#### Single Removal
|
52
|
+
|
53
|
+
```
|
54
|
+
Warming up --------------------------------------
|
55
|
+
delete 169.321k i/100ms
|
56
|
+
tr 173.594k i/100ms
|
57
|
+
Calculating -------------------------------------
|
58
|
+
delete 2.779M (± 1.1%) i/s - 13.884M in 5.010559s
|
59
|
+
tr 2.721M (± 1.0%) i/s - 13.714M in 5.050566s
|
60
|
+
with 95.0% confidence
|
61
|
+
|
62
|
+
Comparison:
|
63
|
+
delete: 2778762.2 i/s
|
64
|
+
tr: 2721121.1 i/s - 1.02x (± 0.02) slower
|
65
|
+
with 95.0% confidence
|
66
|
+
```
|
67
|
+
|
68
|
+
#### Multiple Removal
|
69
|
+
|
70
|
+
```
|
71
|
+
Warming up --------------------------------------
|
72
|
+
delete 173.074k i/100ms
|
73
|
+
tr 171.824k i/100ms
|
74
|
+
Calculating -------------------------------------
|
75
|
+
delete 2.804M (± 1.0%) i/s - 14.019M in 5.009616s
|
76
|
+
tr 2.739M (± 1.0%) i/s - 13.746M in 5.030533s
|
77
|
+
with 95.0% confidence
|
78
|
+
|
79
|
+
Comparison:
|
80
|
+
delete: 2804348.9 i/s
|
81
|
+
tr: 2739399.1 i/s - 1.02x (± 0.01) slower
|
82
|
+
with 95.0% confidence
|
83
|
+
```
|
84
|
+
|
85
|
+
#### Multi-Char Removal
|
86
|
+
|
87
|
+
```
|
88
|
+
Warming up --------------------------------------
|
89
|
+
delete 165.485k i/100ms
|
90
|
+
tr 158.961k i/100ms
|
91
|
+
Calculating -------------------------------------
|
92
|
+
delete 2.547M (± 1.3%) i/s - 12.742M in 5.019971s
|
93
|
+
tr 2.507M (± 1.0%) i/s - 12.558M in 5.018688s
|
94
|
+
with 95.0% confidence
|
95
|
+
|
96
|
+
Comparison:
|
97
|
+
delete: 2547442.6 i/s
|
98
|
+
tr: 2507427.2 i/s - same-ish: difference falls within error
|
99
|
+
with 95.0% confidence
|
100
|
+
```
|
@@ -0,0 +1,167 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Run from the command line: bundle exec ruby benchmarks/double_negation.rb
|
4
|
+
require_relative 'bm_setup'
|
5
|
+
require 'active_support'
|
6
|
+
require 'active_support/core_ext/object/blank'
|
7
|
+
|
8
|
+
display_benchmark_header
|
9
|
+
|
10
|
+
# rubocop:disable Style/NonNilCheck
|
11
|
+
# As this is basically a micro-benchmark we use the block with `while` idiom
|
12
|
+
[nil, [], Object.new].each do |x|
|
13
|
+
section x.inspect do |bench|
|
14
|
+
bench.report("!!") do |times|
|
15
|
+
i = 0
|
16
|
+
while i < times
|
17
|
+
!!x
|
18
|
+
i += 1
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
bench.report("!nil?") do |times|
|
23
|
+
i = 0
|
24
|
+
while i < times
|
25
|
+
!x.nil?
|
26
|
+
i += 1
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
bench.report("nil !=") do |times|
|
31
|
+
i = 0
|
32
|
+
while i < times
|
33
|
+
nil != x
|
34
|
+
i += 1
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
bench.report("present?") do |times|
|
39
|
+
i = 0
|
40
|
+
while i < times
|
41
|
+
x.present?
|
42
|
+
i += 1
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# When performing the initial testing we used `x == nil`. However, that was
|
49
|
+
# shockingly slow for the empty array case. Because of that we inverted the
|
50
|
+
# conditional in the above condition. However, as proof of this oddity and to
|
51
|
+
# allow us to track behavior in future versions we include this additional
|
52
|
+
# benchmark showing the issue.
|
53
|
+
section "Empty array `nil` comparison" do |bench|
|
54
|
+
x = []
|
55
|
+
|
56
|
+
bench.report("!= nil") do |times|
|
57
|
+
i = 0
|
58
|
+
while i < times
|
59
|
+
nil != x
|
60
|
+
i += 1
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
bench.report("nil !=") do |times|
|
65
|
+
i = 0
|
66
|
+
while i < times
|
67
|
+
x != nil
|
68
|
+
i += 1
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
# rubocop:enable Style/NonNilCheck
|
73
|
+
|
74
|
+
__END__
|
75
|
+
|
76
|
+
### Environment
|
77
|
+
|
78
|
+
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
|
79
|
+
GC Disabled: true
|
80
|
+
|
81
|
+
### Test Cases
|
82
|
+
|
83
|
+
#### nil
|
84
|
+
|
85
|
+
```
|
86
|
+
Warming up --------------------------------------
|
87
|
+
!! 320.852k i/100ms
|
88
|
+
!nil? 313.833k i/100ms
|
89
|
+
nil != 330.298k i/100ms
|
90
|
+
present? 294.813k i/100ms
|
91
|
+
Calculating -------------------------------------
|
92
|
+
!! 41.841M (± 0.6%) i/s - 207.591M in 5.000435s
|
93
|
+
!nil? 30.851M (± 0.7%) i/s - 153.464M in 5.005301s
|
94
|
+
nil != 38.424M (± 0.5%) i/s - 191.573M in 5.007580s
|
95
|
+
present? 19.660M (± 0.7%) i/s - 97.878M in 4.999761s
|
96
|
+
with 95.0% confidence
|
97
|
+
|
98
|
+
Comparison:
|
99
|
+
!!: 41841263.8 i/s
|
100
|
+
nil !=: 38424408.4 i/s - 1.09x (± 0.01) slower
|
101
|
+
!nil?: 30850983.5 i/s - 1.36x (± 0.01) slower
|
102
|
+
present?: 19660459.4 i/s - 2.13x (± 0.02) slower
|
103
|
+
with 95.0% confidence
|
104
|
+
```
|
105
|
+
|
106
|
+
#### []
|
107
|
+
|
108
|
+
```
|
109
|
+
Warming up --------------------------------------
|
110
|
+
!! 317.562k i/100ms
|
111
|
+
!nil? 311.181k i/100ms
|
112
|
+
nil != 319.266k i/100ms
|
113
|
+
present? 293.159k i/100ms
|
114
|
+
Calculating -------------------------------------
|
115
|
+
!! 42.487M (± 0.6%) i/s - 211.179M in 5.005333s
|
116
|
+
!nil? 31.078M (± 0.5%) i/s - 154.968M in 5.005557s
|
117
|
+
nil != 38.313M (± 0.6%) i/s - 190.283M in 5.000799s
|
118
|
+
present? 21.854M (± 0.7%) i/s - 108.762M in 5.002198s
|
119
|
+
with 95.0% confidence
|
120
|
+
|
121
|
+
Comparison:
|
122
|
+
!!: 42487427.1 i/s
|
123
|
+
nil !=: 38312618.0 i/s - 1.11x (± 0.01) slower
|
124
|
+
!nil?: 31078123.9 i/s - 1.37x (± 0.01) slower
|
125
|
+
present?: 21854143.8 i/s - 1.94x (± 0.02) slower
|
126
|
+
with 95.0% confidence
|
127
|
+
```
|
128
|
+
|
129
|
+
#### #<Object:0x00007f9c0a968310>
|
130
|
+
|
131
|
+
```
|
132
|
+
Warming up --------------------------------------
|
133
|
+
!! 328.432k i/100ms
|
134
|
+
!nil? 307.084k i/100ms
|
135
|
+
nil != 324.749k i/100ms
|
136
|
+
present? 261.758k i/100ms
|
137
|
+
Calculating -------------------------------------
|
138
|
+
!! 40.897M (± 0.5%) i/s - 203.628M in 5.005426s
|
139
|
+
!nil? 30.242M (± 0.6%) i/s - 150.471M in 5.000563s
|
140
|
+
nil != 39.610M (± 0.6%) i/s - 197.123M in 5.005610s
|
141
|
+
present? 12.163M (± 0.8%) i/s - 60.728M in 5.011771s
|
142
|
+
with 95.0% confidence
|
143
|
+
|
144
|
+
Comparison:
|
145
|
+
!!: 40897495.2 i/s
|
146
|
+
nil !=: 39610078.3 i/s - 1.03x (± 0.01) slower
|
147
|
+
!nil?: 30242403.1 i/s - 1.35x (± 0.01) slower
|
148
|
+
present?: 12162705.7 i/s - 3.36x (± 0.03) slower
|
149
|
+
with 95.0% confidence
|
150
|
+
```
|
151
|
+
|
152
|
+
#### Empty array `nil` comparison
|
153
|
+
|
154
|
+
```
|
155
|
+
Warming up --------------------------------------
|
156
|
+
!= nil 326.024k i/100ms
|
157
|
+
nil != 270.805k i/100ms
|
158
|
+
Calculating -------------------------------------
|
159
|
+
!= nil 40.133M (± 0.5%) i/s - 199.853M in 5.004102s
|
160
|
+
nil != 11.551M (± 0.9%) i/s - 57.681M in 5.020992s
|
161
|
+
with 95.0% confidence
|
162
|
+
|
163
|
+
Comparison:
|
164
|
+
!= nil: 40133046.7 i/s
|
165
|
+
nil !=: 11551012.8 i/s - 3.47x (± 0.04) slower
|
166
|
+
with 95.0% confidence
|
167
|
+
```
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Run from the command line: bundle exec ruby benchmarks/empty_literal.rb
|
4
|
+
require_relative 'bm_setup'
|
5
|
+
|
6
|
+
display_benchmark_header
|
7
|
+
|
8
|
+
# rubocop:disable Style/EmptyLiteral
|
9
|
+
section "[] vs Array.new" do |bench|
|
10
|
+
bench.report("Array.new") do
|
11
|
+
Array.new
|
12
|
+
nil
|
13
|
+
end
|
14
|
+
|
15
|
+
bench.report("[]") do
|
16
|
+
[]
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
section "{} vs Hash.new" do |bench|
|
22
|
+
bench.report("Hash.new") do
|
23
|
+
Hash.new
|
24
|
+
nil
|
25
|
+
end
|
26
|
+
|
27
|
+
bench.report("{}") do
|
28
|
+
{}
|
29
|
+
nil
|
30
|
+
end
|
31
|
+
end
|
32
|
+
# rubocop:enable Style/EmptyLiteral
|
33
|
+
|
34
|
+
__END__
|
35
|
+
|
36
|
+
### Environment
|
37
|
+
|
38
|
+
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
|
39
|
+
GC Disabled: false
|
40
|
+
|
41
|
+
### Test Cases
|
42
|
+
|
43
|
+
#### [] vs Array.new
|
44
|
+
|
45
|
+
```
|
46
|
+
Warming up --------------------------------------
|
47
|
+
Array.new 238.371k i/100ms
|
48
|
+
[] 336.249k i/100ms
|
49
|
+
Calculating -------------------------------------
|
50
|
+
Array.new 6.298M (± 1.0%) i/s - 31.465M in 5.014660s
|
51
|
+
[] 14.157M (± 0.8%) i/s - 70.612M in 5.004166s
|
52
|
+
with 95.0% confidence
|
53
|
+
|
54
|
+
Comparison:
|
55
|
+
[]: 14157286.9 i/s
|
56
|
+
Array.new: 6297668.8 i/s - 2.25x (± 0.03) slower
|
57
|
+
with 95.0% confidence
|
58
|
+
```
|
59
|
+
|
60
|
+
#### {} vs Hash.new
|
61
|
+
|
62
|
+
```
|
63
|
+
Warming up --------------------------------------
|
64
|
+
Hash.new 140.548k i/100ms
|
65
|
+
{} 348.340k i/100ms
|
66
|
+
Calculating -------------------------------------
|
67
|
+
Hash.new 2.203M (± 1.1%) i/s - 11.103M in 5.056212s
|
68
|
+
{} 14.285M (± 0.6%) i/s - 71.410M in 5.010915s
|
69
|
+
with 95.0% confidence
|
70
|
+
|
71
|
+
Comparison:
|
72
|
+
{}: 14285184.2 i/s
|
73
|
+
Hash.new: 2202622.4 i/s - 6.49x (± 0.08) slower
|
74
|
+
with 95.0% confidence
|
75
|
+
```
|