radius-spec 0.2.0 → 0.6.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 +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
|
+
```
|