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,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Run from the command line: bundle exec ruby benchmarks/max_ternary.rb
|
4
|
+
require_relative 'bm_setup'
|
5
|
+
|
6
|
+
display_benchmark_header
|
7
|
+
|
8
|
+
section "Min First" do |bench|
|
9
|
+
x = 1
|
10
|
+
y = 2
|
11
|
+
|
12
|
+
bench.report("max") do
|
13
|
+
[x, y].max
|
14
|
+
end
|
15
|
+
|
16
|
+
bench.report("ternary") do
|
17
|
+
(x < y) ? y : x
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
section "Max First" do |bench|
|
22
|
+
x = 2
|
23
|
+
y = 1
|
24
|
+
|
25
|
+
bench.report("max") do
|
26
|
+
[x, y].max
|
27
|
+
end
|
28
|
+
|
29
|
+
bench.report("ternary") do
|
30
|
+
(x < y) ? y : x
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
section "Equal values" do
|
35
|
+
x = 2
|
36
|
+
y = 2
|
37
|
+
|
38
|
+
bench.report("max") do
|
39
|
+
[x, y].max
|
40
|
+
end
|
41
|
+
|
42
|
+
bench.report("ternary") do
|
43
|
+
(x < y) ? y : x
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
__END__
|
48
|
+
|
49
|
+
### Environment
|
50
|
+
|
51
|
+
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
|
52
|
+
GC Disabled: false
|
53
|
+
|
54
|
+
### Test Cases
|
55
|
+
|
56
|
+
#### Min First
|
57
|
+
|
58
|
+
```
|
59
|
+
Warming up --------------------------------------
|
60
|
+
max 349.454k i/100ms
|
61
|
+
ternary 349.128k i/100ms
|
62
|
+
Calculating -------------------------------------
|
63
|
+
max 12.628M (± 0.9%) i/s - 62.902M in 5.000232s
|
64
|
+
ternary 12.853M (± 0.8%) i/s - 64.240M in 5.015540s
|
65
|
+
with 95.0% confidence
|
66
|
+
|
67
|
+
Comparison:
|
68
|
+
ternary: 12852607.6 i/s
|
69
|
+
max: 12628052.1 i/s - 1.02x (± 0.01) slower
|
70
|
+
with 95.0% confidence
|
71
|
+
```
|
72
|
+
|
73
|
+
#### Max First
|
74
|
+
|
75
|
+
```
|
76
|
+
Warming up --------------------------------------
|
77
|
+
max 346.104k i/100ms
|
78
|
+
ternary 344.003k i/100ms
|
79
|
+
Calculating -------------------------------------
|
80
|
+
max 12.788M (± 0.7%) i/s - 64.029M in 5.022073s
|
81
|
+
ternary 12.607M (± 0.7%) i/s - 62.953M in 5.006764s
|
82
|
+
with 95.0% confidence
|
83
|
+
|
84
|
+
Comparison:
|
85
|
+
max: 12787891.5 i/s
|
86
|
+
ternary: 12606659.1 i/s - same-ish: difference falls within error
|
87
|
+
with 95.0% confidence
|
88
|
+
```
|
89
|
+
|
90
|
+
#### Equal values
|
91
|
+
|
92
|
+
```
|
93
|
+
Warming up --------------------------------------
|
94
|
+
max 340.468k i/100ms
|
95
|
+
ternary 343.788k i/100ms
|
96
|
+
Calculating -------------------------------------
|
97
|
+
max 12.278M (± 0.9%) i/s - 61.284M in 5.010572s
|
98
|
+
ternary 12.703M (± 0.9%) i/s - 63.601M in 5.026552s
|
99
|
+
with 95.0% confidence
|
100
|
+
|
101
|
+
Comparison:
|
102
|
+
ternary: 12702775.1 i/s
|
103
|
+
max: 12277915.1 i/s - 1.03x (± 0.01) slower
|
104
|
+
with 95.0% confidence
|
105
|
+
```
|
@@ -0,0 +1,129 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Run from the command line: bundle exec ruby benchmarks/max_ternary_micro.rb
|
4
|
+
require_relative 'bm_setup'
|
5
|
+
|
6
|
+
display_benchmark_header
|
7
|
+
|
8
|
+
section "Min First" do |bench|
|
9
|
+
x = 1
|
10
|
+
y = 2
|
11
|
+
|
12
|
+
bench.report("max") do |times|
|
13
|
+
i = 0
|
14
|
+
while i < times
|
15
|
+
[x, y].max
|
16
|
+
i += 1
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
bench.report("ternary") do |times|
|
21
|
+
i = 0
|
22
|
+
while i < times
|
23
|
+
(x < y) ? y : x
|
24
|
+
i += 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
section "Max First" do |bench|
|
30
|
+
x = 2
|
31
|
+
y = 1
|
32
|
+
|
33
|
+
bench.report("max") do |times|
|
34
|
+
i = 0
|
35
|
+
while i < times
|
36
|
+
[x, y].max
|
37
|
+
i += 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
bench.report("ternary") do |times|
|
42
|
+
i = 0
|
43
|
+
while i < times
|
44
|
+
(x < y) ? y : x
|
45
|
+
i += 1
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
section "Equal values" do |bench|
|
51
|
+
x = 2
|
52
|
+
y = 2
|
53
|
+
|
54
|
+
bench.report("max") do |times|
|
55
|
+
i = 0
|
56
|
+
while i < times
|
57
|
+
[x, y].max
|
58
|
+
i += 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
bench.report("ternary") do |times|
|
63
|
+
i = 0
|
64
|
+
while i < times
|
65
|
+
(x < y) ? y : x
|
66
|
+
i += 1
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
__END__
|
72
|
+
|
73
|
+
### Environment
|
74
|
+
|
75
|
+
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
|
76
|
+
GC Disabled: false
|
77
|
+
|
78
|
+
### Test Cases
|
79
|
+
|
80
|
+
#### Min First
|
81
|
+
|
82
|
+
```
|
83
|
+
Warming up --------------------------------------
|
84
|
+
max 318.262k i/100ms
|
85
|
+
ternary 330.711k i/100ms
|
86
|
+
Calculating -------------------------------------
|
87
|
+
max 38.997M (± 0.6%) i/s - 193.822M in 5.001947s
|
88
|
+
ternary 48.280M (± 0.5%) i/s - 240.096M in 5.002313s
|
89
|
+
with 95.0% confidence
|
90
|
+
|
91
|
+
Comparison:
|
92
|
+
ternary: 48279773.6 i/s
|
93
|
+
max: 38996762.1 i/s - 1.24x (± 0.01) slower
|
94
|
+
with 95.0% confidence
|
95
|
+
```
|
96
|
+
|
97
|
+
#### Max First
|
98
|
+
|
99
|
+
```
|
100
|
+
Warming up --------------------------------------
|
101
|
+
max 336.333k i/100ms
|
102
|
+
ternary 344.267k i/100ms
|
103
|
+
Calculating -------------------------------------
|
104
|
+
max 38.699M (± 0.7%) i/s - 192.046M in 5.000931s
|
105
|
+
ternary 50.601M (± 0.6%) i/s - 251.315M in 5.002150s
|
106
|
+
with 95.0% confidence
|
107
|
+
|
108
|
+
Comparison:
|
109
|
+
ternary: 50601023.9 i/s
|
110
|
+
max: 38699482.7 i/s - 1.31x (± 0.01) slower
|
111
|
+
with 95.0% confidence
|
112
|
+
```
|
113
|
+
|
114
|
+
#### Equal values
|
115
|
+
|
116
|
+
```
|
117
|
+
Warming up --------------------------------------
|
118
|
+
max 331.543k i/100ms
|
119
|
+
ternary 342.686k i/100ms
|
120
|
+
Calculating -------------------------------------
|
121
|
+
max 39.661M (± 0.6%) i/s - 197.268M in 5.004271s
|
122
|
+
ternary 47.147M (± 0.5%) i/s - 234.740M in 5.006089s
|
123
|
+
with 95.0% confidence
|
124
|
+
|
125
|
+
Comparison:
|
126
|
+
ternary: 47147208.6 i/s
|
127
|
+
max: 39660659.9 i/s - 1.19x (± 0.01) slower
|
128
|
+
with 95.0% confidence
|
129
|
+
```
|
@@ -0,0 +1,86 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Run from the command line: bundle exec ruby benchmarks/unfreeze_string.rb
|
4
|
+
require_relative 'bm_setup'
|
5
|
+
|
6
|
+
display_benchmark_header
|
7
|
+
|
8
|
+
# rubocop:disable Performance/UnfreezeString
|
9
|
+
section "Unfreezing empty string" do |bench|
|
10
|
+
bench.report("String.new") do
|
11
|
+
String.new
|
12
|
+
end
|
13
|
+
|
14
|
+
bench.report("+") do
|
15
|
+
+""
|
16
|
+
end
|
17
|
+
|
18
|
+
bench.report("dup") do
|
19
|
+
"".dup
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
STRING = "Any String"
|
24
|
+
section "Unfreezing string" do |bench|
|
25
|
+
bench.report("String.new") do
|
26
|
+
String.new(STRING)
|
27
|
+
end
|
28
|
+
|
29
|
+
bench.report("+") do
|
30
|
+
+STRING
|
31
|
+
end
|
32
|
+
|
33
|
+
bench.report("dup") do
|
34
|
+
STRING.dup
|
35
|
+
end
|
36
|
+
end
|
37
|
+
# rubocop:enable Performance/UnfreezeString
|
38
|
+
|
39
|
+
__END__
|
40
|
+
|
41
|
+
### Environment
|
42
|
+
|
43
|
+
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
|
44
|
+
GC Disabled: false
|
45
|
+
|
46
|
+
### Test Cases
|
47
|
+
|
48
|
+
#### Unfreezing empty string
|
49
|
+
|
50
|
+
```
|
51
|
+
Warming up --------------------------------------
|
52
|
+
String.new 262.027k i/100ms
|
53
|
+
+ 286.997k i/100ms
|
54
|
+
dup 217.963k i/100ms
|
55
|
+
Calculating -------------------------------------
|
56
|
+
String.new 6.791M (± 0.9%) i/s - 34.064M in 5.029927s
|
57
|
+
+ 8.811M (± 1.1%) i/s - 43.911M in 5.011455s
|
58
|
+
dup 4.627M (± 1.0%) i/s - 23.104M in 5.007394s
|
59
|
+
with 95.0% confidence
|
60
|
+
|
61
|
+
Comparison:
|
62
|
+
+: 8810714.9 i/s
|
63
|
+
String.new: 6791074.6 i/s - 1.30x (± 0.02) slower
|
64
|
+
dup: 4626875.0 i/s - 1.90x (± 0.03) slower
|
65
|
+
with 95.0% confidence
|
66
|
+
```
|
67
|
+
|
68
|
+
#### Unfreezing string
|
69
|
+
|
70
|
+
```
|
71
|
+
Warming up --------------------------------------
|
72
|
+
String.new 220.258k i/100ms
|
73
|
+
+ 287.795k i/100ms
|
74
|
+
dup 214.192k i/100ms
|
75
|
+
Calculating -------------------------------------
|
76
|
+
String.new 4.624M (± 0.8%) i/s - 23.127M in 5.010887s
|
77
|
+
+ 8.946M (± 0.9%) i/s - 44.608M in 5.001680s
|
78
|
+
dup 4.513M (± 0.9%) i/s - 22.704M in 5.041383s
|
79
|
+
with 95.0% confidence
|
80
|
+
|
81
|
+
Comparison:
|
82
|
+
+: 8946340.5 i/s
|
83
|
+
String.new: 4624267.9 i/s - 1.93x (± 0.02) slower
|
84
|
+
dup: 4513230.8 i/s - 1.98x (± 0.02) slower
|
85
|
+
with 95.0% confidence
|
86
|
+
```
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Run from the command line: bundle exec ruby benchmarks/unpack_first.rb
|
4
|
+
require_relative 'bm_setup'
|
5
|
+
|
6
|
+
display_benchmark_header
|
7
|
+
|
8
|
+
PACKED_STRING = "foo"
|
9
|
+
PACKED_FORMAT = "h*"
|
10
|
+
|
11
|
+
# rubocop:disable Style/UnpackFirst
|
12
|
+
section "Unpacking strings" do |bench|
|
13
|
+
bench.report("unpack.first") do
|
14
|
+
PACKED_STRING.unpack(PACKED_FORMAT).first
|
15
|
+
end
|
16
|
+
|
17
|
+
bench.report("unpack[0]") do
|
18
|
+
PACKED_STRING.unpack(PACKED_FORMAT)[0]
|
19
|
+
end
|
20
|
+
|
21
|
+
bench.report("unpack1") do
|
22
|
+
PACKED_STRING.unpack1(PACKED_FORMAT)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
# rubocop:enable Style/UnpackFirst
|
26
|
+
|
27
|
+
__END__
|
28
|
+
|
29
|
+
### Environment
|
30
|
+
|
31
|
+
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
|
32
|
+
GC Disabled: false
|
33
|
+
|
34
|
+
### Test Cases
|
35
|
+
|
36
|
+
#### Unpacking strings
|
37
|
+
|
38
|
+
```
|
39
|
+
Warming up --------------------------------------
|
40
|
+
unpack.first 228.848k i/100ms
|
41
|
+
unpack[0] 225.375k i/100ms
|
42
|
+
unpack1 254.431k i/100ms
|
43
|
+
Calculating -------------------------------------
|
44
|
+
unpack.first 5.074M (± 1.0%) i/s - 25.402M in 5.021645s
|
45
|
+
unpack[0] 5.412M (± 1.0%) i/s - 27.045M in 5.012499s
|
46
|
+
unpack1 7.185M (± 0.9%) i/s - 35.875M in 5.011588s
|
47
|
+
with 95.0% confidence
|
48
|
+
|
49
|
+
Comparison:
|
50
|
+
unpack1: 7184877.9 i/s
|
51
|
+
unpack[0]: 5412005.1 i/s - 1.33x (± 0.02) slower
|
52
|
+
unpack.first: 5074389.3 i/s - 1.42x (± 0.02) slower
|
53
|
+
with 95.0% confidence
|
54
|
+
```
|
data/bin/ci
CHANGED
@@ -15,9 +15,9 @@ bin/rspec
|
|
15
15
|
# bundle-audit provides patch-level verification for Bundler
|
16
16
|
# https://github.com/rubysec/bundler-audit.
|
17
17
|
echo " ---> Running bundler-audit"
|
18
|
-
gem install --no-
|
18
|
+
gem install --no-document bundler-audit
|
19
19
|
bundle-audit check --update
|
20
20
|
|
21
21
|
# Run style checker
|
22
22
|
echo " ---> Running rubocop"
|
23
|
-
bin/rubocop --extra-details --display-style-guide
|
23
|
+
bin/rubocop --extra-details --display-style-guide --lint
|
data/bin/ci-code-review
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
# See:
|
4
|
+
# - https://docs.travis-ci.com/user/environment-variables/#Convenience-Variables
|
5
|
+
# - https://docs.travis-ci.com/user/environment-variables/#Default-Environment-Variables
|
6
|
+
# - https://docs.travis-ci.com/user/pull-requests/#Pull-Requests-and-Security-Restrictions
|
7
|
+
if [[ "$TRAVIS_PULL_REQUEST" = "false" ]] || [[ "$TRAVIS_BRANCH" = "production" ]]; then
|
8
|
+
exit
|
9
|
+
fi
|
10
|
+
|
11
|
+
set -e
|
12
|
+
cd "$(dirname "$0")/.."
|
13
|
+
|
14
|
+
REVIEWDOG_VERSION="0.9.9"
|
15
|
+
|
16
|
+
if ! [ "$(./bin/reviewdog -version)" = "$REVIEWDOG_VERSION" ]; then
|
17
|
+
echo "Installing reviewdog version ${REVIEWDOG_VERSION}..."
|
18
|
+
curl -fsSL https://github.com/haya14busa/reviewdog/releases/download/$REVIEWDOG_VERSION/reviewdog_linux_amd64 \
|
19
|
+
-o ./bin/reviewdog
|
20
|
+
chmod +x ./bin/reviewdog
|
21
|
+
fi
|
22
|
+
|
23
|
+
echo Rubocop Version: $(./bin/rubocop --version)
|
24
|
+
echo Review Dog Version: $(./bin/reviewdog -version)
|
25
|
+
|
26
|
+
# Add `-diff="git diff master"` to reviewdog args when running locally
|
27
|
+
./bin/rubocop --config .rubocop.yml --extra-details --display-style-guide --rails | \
|
28
|
+
./bin/reviewdog -f=rubocop -reporter=github-pr-check
|
data/common_rubocop.yml
CHANGED
@@ -4,26 +4,63 @@ AllCops:
|
|
4
4
|
# Exclude generated binstubs
|
5
5
|
- 'bin/bundle'
|
6
6
|
- 'bin/bundler-travis'
|
7
|
+
- 'bin/pronto'
|
7
8
|
- 'bin/pry'
|
9
|
+
- 'bin/radius-cli'
|
8
10
|
- 'bin/rake'
|
9
11
|
- 'bin/rspec'
|
10
12
|
- 'bin/rubocop'
|
11
13
|
- 'bin/travis'
|
14
|
+
- 'bin/webpack'
|
15
|
+
- 'bin/webpack-dev-server'
|
12
16
|
- 'bin/yard'
|
17
|
+
- 'bin/yarn'
|
13
18
|
# Exclude vendored content
|
14
19
|
- 'vendor/**/*'
|
15
|
-
Include:
|
16
|
-
- '**/Brewfile'
|
17
|
-
- '**/Rakefile'
|
18
20
|
|
19
|
-
#
|
20
|
-
# class
|
21
|
+
# We prefer outdented access modifiers as we feel they provide demarcation of
|
22
|
+
# the class similar to `rescue` and `ensure` in a method.
|
21
23
|
#
|
22
|
-
# Configuration parameters: EnforcedStyle,
|
24
|
+
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
23
25
|
# SupportedStyles: outdent, indent
|
24
26
|
Layout/AccessModifierIndentation:
|
27
|
+
Details: |
|
28
|
+
|
29
|
+
Prefer outdented access modifiers to provide demarcation of the class
|
30
|
+
similar to `rescue` and `ensure` in a method.
|
25
31
|
EnforcedStyle: outdent
|
26
32
|
|
33
|
+
# Rubocop 0.60.0 changed how it handled value alignments in this cop. This
|
34
|
+
# breaks our preference for wanting keys to be aligned, but allowing values to
|
35
|
+
# either use the `key` or `table` style:
|
36
|
+
#
|
37
|
+
# key_style = {
|
38
|
+
# key: :value,
|
39
|
+
# another: :value,
|
40
|
+
# yet_another: :value
|
41
|
+
# }
|
42
|
+
# table_style = {
|
43
|
+
# key: :value,
|
44
|
+
# another: :value
|
45
|
+
# yet_another: :value
|
46
|
+
# }
|
47
|
+
#
|
48
|
+
# This is logged with Rubocop: https://github.com/rubocop-hq/rubocop/issues/6410
|
49
|
+
#
|
50
|
+
# Until Rubocop resolves this we've decided to enforce the key style so that we
|
51
|
+
# do not lose all associated formatting checks. Additionally, in response to
|
52
|
+
# the referenced issue the Rubocop disables the alignment check by default. To
|
53
|
+
# continue using it we force enable it here.
|
54
|
+
#
|
55
|
+
# Configuration parameters: EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
|
56
|
+
# SupportedHashRocketStyles: key, separator, table
|
57
|
+
# SupportedColonStyles: key, separator, table
|
58
|
+
# SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
|
59
|
+
Layout/AlignHash:
|
60
|
+
Enabled: true
|
61
|
+
EnforcedHashRocketStyle: key
|
62
|
+
EnforcedColonStyle: key
|
63
|
+
|
27
64
|
# Disabling this until it is fixed to support multi-line block chains using the
|
28
65
|
# semantic style.
|
29
66
|
#
|
@@ -37,17 +74,11 @@ Layout/BlockAlignment:
|
|
37
74
|
# Disabling this until it is fixed to handle multi-line method chains where the
|
38
75
|
# first method call is multi-line.
|
39
76
|
#
|
40
|
-
# See
|
41
|
-
Layout/ClosingParenthesisIndentation:
|
42
|
-
Enabled: false
|
43
|
-
|
44
|
-
# Disabling this until it is fixed to handle multi-line method chains where the
|
45
|
-
# first method call is multi-line.
|
46
|
-
#
|
47
|
-
# See # https://github.com/bbatsov/rubocop/issues/5650
|
77
|
+
# See https://github.com/bbatsov/rubocop/issues/5650
|
48
78
|
#
|
49
79
|
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
50
|
-
# SupportedStyles: consistent,
|
80
|
+
# SupportedStyles: consistent, consistent_relative_to_receiver,
|
81
|
+
# special_for_inner_method_call, special_for_inner_method_call_in_parentheses
|
51
82
|
Layout/FirstParameterIndentation:
|
52
83
|
Enabled: false
|
53
84
|
|
@@ -60,14 +91,15 @@ Layout/FirstParameterIndentation:
|
|
60
91
|
Layout/IndentHeredoc:
|
61
92
|
EnforcedStyle: squiggly
|
62
93
|
|
63
|
-
# We tend to indent multi-line operation statements. I think this is because
|
64
|
-
#
|
65
|
-
#
|
94
|
+
# We tend to indent multi-line operation statements. I think this is because it
|
95
|
+
# tends to be the default style auto-formatted by VIM (which many of us use).
|
96
|
+
# It also helps show the continuation of the statement instead of it
|
66
97
|
# potentially blending in with the start of the next statement.
|
67
98
|
#
|
68
99
|
# Configuration parameters: EnforcedStyle, IndentationWidth.
|
69
100
|
# SupportedStyles: aligned, indented
|
70
101
|
Layout/MultilineOperationIndentation:
|
102
|
+
Details: "This helps show expression continuation setting it apart from the following LOC."
|
71
103
|
EnforcedStyle: indented
|
72
104
|
|
73
105
|
# In our specs Rubocop inconsistently complains when using the block form of
|
@@ -92,7 +124,7 @@ Lint/AmbiguousBlockAssociation:
|
|
92
124
|
Exclude:
|
93
125
|
- 'spec/**/*_spec.rb'
|
94
126
|
|
95
|
-
# Often with benchmarking we don't
|
127
|
+
# Often with benchmarking we don't explicitly "use" a variable or return value.
|
96
128
|
# We simply need to perform the operation which generates said value for the
|
97
129
|
# benchmark.
|
98
130
|
#
|
@@ -102,6 +134,7 @@ Lint/Void:
|
|
102
134
|
- 'benchmarks/**/*'
|
103
135
|
|
104
136
|
# Configuration parameters: CountComments, ExcludedMethods, Max.
|
137
|
+
# ExcludedMethods: refine
|
105
138
|
Metrics/BlockLength:
|
106
139
|
Exclude:
|
107
140
|
- '**/Rakefile'
|
@@ -109,6 +142,13 @@ Metrics/BlockLength:
|
|
109
142
|
- 'spec/spec_helper.rb'
|
110
143
|
- 'spec/**/*_spec.rb'
|
111
144
|
- 'spec/support/model_factories.rb'
|
145
|
+
ExcludedMethods:
|
146
|
+
- 'chdir'
|
147
|
+
- 'refine'
|
148
|
+
- 'Capybara.register_driver'
|
149
|
+
- 'Gem::Specification.new'
|
150
|
+
- 'RSpec.configure'
|
151
|
+
- 'VCR.configure'
|
112
152
|
|
113
153
|
# We generally prefer to use the default line length of 80. Though sometimes
|
114
154
|
# we just need a little extra space because it makes it easier to read.
|
@@ -142,6 +182,16 @@ Metrics/LineLength:
|
|
142
182
|
# Attempt at trailing comments
|
143
183
|
- '\A.{1,78}\s#\s.*\z'
|
144
184
|
Max: 100
|
185
|
+
Exclude:
|
186
|
+
- '**/*.gemspec'
|
187
|
+
|
188
|
+
# This is overly pedantic (only allowing `other` as the parameter name). Ruby
|
189
|
+
# core doesn't follow this consistently either. Looking at several classes
|
190
|
+
# throughout Ruby core we do often see `other`, but also often `obj` or
|
191
|
+
# `other_*`. In some cases, the parameter is named more meaningfully with names
|
192
|
+
# like `real`, `numeric`, or `str`.
|
193
|
+
Naming/BinaryOperatorParameterName:
|
194
|
+
Enabled: false
|
145
195
|
|
146
196
|
# Configuration parameters: ExpectMatchingDefinition, Regex, IgnoreExecutableScripts, AllowedAcronyms.
|
147
197
|
# AllowedAcronyms: CLI, DSL, ACL, API, ASCII, CPU, CSS, DNS, EOF, GUID, HTML, HTTP, HTTPS, ID, IP, JSON, LHS, QPS, RAM, RHS, RPC, SLA, SMTP, SQL, SSH, TCP, TLS, TTL, UDP, UI, UID, UUID, URI, URL, UTF8, VM, XML, XMPP, XSRF, XSS
|
@@ -157,11 +207,33 @@ Naming/FileName:
|
|
157
207
|
# for those heredocs which represent "file" text.
|
158
208
|
#
|
159
209
|
# Configuration parameters: Blacklist.
|
160
|
-
# Blacklist:
|
210
|
+
# Blacklist: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
|
161
211
|
Naming/HeredocDelimiterNaming:
|
212
|
+
Details: |
|
213
|
+
|
214
|
+
Use meaningful delimiter names to provide context to the text. The only
|
215
|
+
allowed `EO*` variant if `EOF` which has specific meaning for file content.
|
162
216
|
Blacklist:
|
163
|
-
- 'END'
|
164
|
-
|
217
|
+
- !ruby/regexp '/(^|\s)(EO[A-EG-Z]{1}|END)(\s|$)/'
|
218
|
+
|
219
|
+
# It is generally a good idea to match the instance variable names with their
|
220
|
+
# methods to keep consistent with the attribute reader / writer pattern.
|
221
|
+
# However, this can pose an issue in Rails. Most notably, when writing modules
|
222
|
+
# that will be used as controller plugins. The reason is that the Rails
|
223
|
+
# controllers-to-view interface is ivars. Using a leading underscore can help
|
224
|
+
# avoid accidental controller ivar naming conflicts.
|
225
|
+
#
|
226
|
+
# Configuration parameters: EnforcedStyleForLeadingUnderscores.
|
227
|
+
# SupportedStylesForLeadingUnderscores: disallowed, required, optional
|
228
|
+
Naming/MemoizedInstanceVariableName:
|
229
|
+
Details: |
|
230
|
+
|
231
|
+
It is generally a good idea to match the instance variable names with their
|
232
|
+
methods to keep consistent with the attribute reader / writer pattern. An
|
233
|
+
exception can be made for modules that want to avoid naming conflicts with
|
234
|
+
classes that include them. In this case a single leading underscore is
|
235
|
+
acceptable.
|
236
|
+
EnforcedStyleForLeadingUnderscores: optional
|
165
237
|
|
166
238
|
# `alias` behavior changes on scope. In general we expect the behavior to be
|
167
239
|
# that which is defined by `alias_method`.
|
@@ -171,8 +243,35 @@ Naming/HeredocDelimiterNaming:
|
|
171
243
|
# Configuration parameters: EnforcedStyle.
|
172
244
|
# SupportedStyles: prefer_alias, prefer_alias_method
|
173
245
|
Style/Alias:
|
246
|
+
Details: |
|
247
|
+
|
248
|
+
Prefer `alias_method` because `alias` behavior changes based on scope.
|
249
|
+
|
250
|
+
See:
|
251
|
+
- https://stackoverflow.com/questions/4763121/should-i-use-alias-or-alias-method
|
252
|
+
- https://blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html
|
174
253
|
EnforcedStyle: prefer_alias_method
|
175
254
|
|
255
|
+
# Keeping with our semantic style we allow use of `and` / `or` conditionals
|
256
|
+
# when it is used for control flow:
|
257
|
+
#
|
258
|
+
# system("some command") or system("another command")
|
259
|
+
#
|
260
|
+
# Used in this manner it provides additional semantic clues to the intent of
|
261
|
+
# the code. However, when there is a conditional, or the intent is to perform
|
262
|
+
# a boolean comparison, the `&&` / `||` style should be used.
|
263
|
+
#
|
264
|
+
# Configuration parameters: EnforcedStyle.
|
265
|
+
# SupportedStyles: always, conditionals
|
266
|
+
Style/AndOr:
|
267
|
+
Details: |
|
268
|
+
|
269
|
+
Use `&&` / `||` for conditionals or general comparison. Use `and` / `or`
|
270
|
+
for control flow to provide additional semantic hints:
|
271
|
+
|
272
|
+
system("some command") or system("another command")
|
273
|
+
EnforcedStyle: conditionals
|
274
|
+
|
176
275
|
# These days most people have editors which support unicode and other
|
177
276
|
# non-ASCII characters.
|
178
277
|
#
|
@@ -187,11 +286,11 @@ Style/AsciiComments:
|
|
187
286
|
# When the return value of the method receiving the block is important prefer
|
188
287
|
# `{..}` over `do..end`.
|
189
288
|
#
|
190
|
-
# Configuration parameters: EnforcedStyle,
|
191
|
-
# FunctionalMethods, IgnoredMethods.
|
289
|
+
# Configuration parameters: EnforcedStyle, ProceduralMethods, FunctionalMethods, IgnoredMethods.
|
192
290
|
# SupportedStyles: line_count_based, semantic, braces_for_chaining
|
193
291
|
Style/BlockDelimiters:
|
194
292
|
Details: |
|
293
|
+
|
195
294
|
Use semantic style for blocks:
|
196
295
|
- Prefer `do...end` over `{...}` for procedural blocks.
|
197
296
|
- Prefer `{...}` over `do...end` for functional blocks.
|
@@ -208,7 +307,14 @@ Style/BlockDelimiters:
|
|
208
307
|
- realtime
|
209
308
|
- with_object
|
210
309
|
FunctionalMethods:
|
310
|
+
- create
|
311
|
+
- create!
|
312
|
+
- build
|
313
|
+
- build!
|
314
|
+
- default_scope
|
211
315
|
- each_with_object
|
316
|
+
- filter_sensitive_data
|
317
|
+
- find
|
212
318
|
- git_source
|
213
319
|
- let
|
214
320
|
- let!
|
@@ -221,6 +327,64 @@ Style/BlockDelimiters:
|
|
221
327
|
- proc
|
222
328
|
- it
|
223
329
|
|
330
|
+
# Prefer `Time` over `DateTime`.
|
331
|
+
#
|
332
|
+
# While these are not necessarily interchangeable we prefer `Time`. According
|
333
|
+
# to the Ruby docs `DateTime` is meant more for historical dates; it also does
|
334
|
+
# not consider leap seconds or summer time rules.
|
335
|
+
#
|
336
|
+
# Lastly, `DateTime` is part of the stdlib which is written in Ruby; where as
|
337
|
+
# `Time` is part of core and written in C.
|
338
|
+
#
|
339
|
+
# Configuration parameters: AllowCoercion
|
340
|
+
Style/DateTime:
|
341
|
+
Enabled: true
|
342
|
+
|
343
|
+
# The double negation idiom is a common Ruby-ism. All languages have various
|
344
|
+
# idioms and part of learning the language is learning the common idioms. Once
|
345
|
+
# learning the meaning it is not cryptic as Rubocop implies.
|
346
|
+
#
|
347
|
+
# > Double negation converts converts a value to boolean.
|
348
|
+
# >
|
349
|
+
# > It converts "truthy" values to `true` and "falsey" values, `nil` and
|
350
|
+
# > `false`, to `false`.
|
351
|
+
#
|
352
|
+
# The [Rubocop style guide](https://github.com/rubocop-hq/ruby-style-guide#no-bang-bang)
|
353
|
+
# does have a valid complaint about it's use in a conditional:
|
354
|
+
#
|
355
|
+
# > you don't need this explicit conversion in the condition of a control
|
356
|
+
# > expression; using it only obscures your intention...
|
357
|
+
# >
|
358
|
+
# > ```ruby
|
359
|
+
# > # bad
|
360
|
+
# > x = 'test'
|
361
|
+
# > # obscure nil check
|
362
|
+
# > if !!x
|
363
|
+
# > # body omitted
|
364
|
+
# > end
|
365
|
+
# >
|
366
|
+
# > # good
|
367
|
+
# > x = 'test'
|
368
|
+
# > if x
|
369
|
+
# > # body omitted
|
370
|
+
# > end
|
371
|
+
# > ```
|
372
|
+
#
|
373
|
+
# This is true and we completely agree. However the check isn't limited to just
|
374
|
+
# conditional control expressions. It affects any use of the idiom.
|
375
|
+
#
|
376
|
+
# We believe using the idiom is completely valid for predicate methods to
|
377
|
+
# ensure either a `true` or `false` return, instead of just a "truthy" or
|
378
|
+
# "falsey" response. As it is an op it is a bit faster than the alternative of
|
379
|
+
# sending `nil?` to the object and more concise than using `obj == nil`. It
|
380
|
+
# also works with something that is potentially `false` as expected.
|
381
|
+
#
|
382
|
+
# As we cannot customize this to only limit it to the conditional control
|
383
|
+
# expressions, or instances which may be better replaced with something else
|
384
|
+
# (like `blank?`), we are disabling it.
|
385
|
+
Style/DoubleNegation:
|
386
|
+
Enabled: false
|
387
|
+
|
224
388
|
# Using `case` instead of an `if` expression when the case condition is empty
|
225
389
|
# can be more expressive of intent. Using multiple "cases" informs the reader
|
226
390
|
# that all of the conditions are related or coupled in a meaningful way.
|
@@ -253,6 +417,7 @@ Style/EmptyMethod:
|
|
253
417
|
# SupportedStyles: ruby19, hash_rockets, no_mixed_keys, ruby19_no_mixed_keys
|
254
418
|
Style/HashSyntax:
|
255
419
|
Details: |
|
420
|
+
|
256
421
|
Prefer symbol keys using the 1.9 hash syntax. However, when keys are mixed
|
257
422
|
use a consistent mapping style; which generally means using hash rockets.
|
258
423
|
EnforcedStyle: ruby19_no_mixed_keys
|
@@ -266,6 +431,7 @@ Style/HashSyntax:
|
|
266
431
|
# SupportedStyles: line_count_dependent, lambda, literal
|
267
432
|
Style/Lambda:
|
268
433
|
Details: |
|
434
|
+
|
269
435
|
As part of our semantic style we generally use the literal `-> { }` format
|
270
436
|
to indicate this is a function with a return value we care about. As this
|
271
437
|
cop doesn't have a more flexible setting we prefer the literal syntax to
|
@@ -285,9 +451,10 @@ Style/MethodCalledOnDoEndBlock:
|
|
285
451
|
Style/MultilineBlockChain:
|
286
452
|
Enabled: false
|
287
453
|
|
288
|
-
# Context for this cop is too dependent.
|
289
|
-
#
|
290
|
-
# comparison is
|
454
|
+
# Context for this cop is too dependent.
|
455
|
+
#
|
456
|
+
# Often using the numeric comparison is faster. Also, depending on the context
|
457
|
+
# a numeric comparison may produce a more consistent style:
|
291
458
|
#
|
292
459
|
# # numeric comparison is more natural and consistent
|
293
460
|
# if n < 0
|
@@ -300,12 +467,55 @@ Style/MultilineBlockChain:
|
|
300
467
|
Style/NumericPredicate:
|
301
468
|
Enabled: false
|
302
469
|
|
470
|
+
# In Ruby every method returns a value. Implicitly this is the value of the
|
471
|
+
# last line of the method. This means using `return` is often redundant.
|
472
|
+
# However, there isn't anything inherently wrong about doing so. In fact, in
|
473
|
+
# some cases it can help with a consistent style in a method:
|
474
|
+
#
|
475
|
+
# def transform(value)
|
476
|
+
# return value.call if value.is_a?(Proc)
|
477
|
+
# return value if value.frozen?
|
478
|
+
# return value.dup
|
479
|
+
# end
|
480
|
+
#
|
481
|
+
# Other times it can add context to a seemingly oddly place value:
|
482
|
+
#
|
483
|
+
# def munge(data)
|
484
|
+
# data.slice! 5
|
485
|
+
# return nil
|
486
|
+
# end
|
487
|
+
#
|
488
|
+
# We often omit the explicit `return` in our code. Though sometimes we include
|
489
|
+
# it for improved contextual clues and we don't want Rubocop to complain for
|
490
|
+
# those cases.
|
491
|
+
#
|
492
|
+
# Configuration parameters: AllowMultipleReturnValues.
|
493
|
+
Style/RedundantReturn:
|
494
|
+
Enabled: false
|
495
|
+
|
303
496
|
# Prefer slashes for simple expressions. For multi-line use percent literal
|
304
|
-
# to support comments and other advanced features.
|
497
|
+
# to support comments and other advanced features. By using the mixed style we
|
498
|
+
# are choosing to use `%r{}` for multi-line regexps. In general we are not a
|
499
|
+
# fan of single vs multi-line dictating a style. We do make an exception in
|
500
|
+
# this case because of the parity the braces give to general code block
|
501
|
+
# grouping:
|
502
|
+
#
|
503
|
+
# regex = %r{
|
504
|
+
# foo
|
505
|
+
# (bar)
|
506
|
+
# (baz)
|
507
|
+
# }x
|
305
508
|
#
|
306
509
|
# Configuration parameters: EnforcedStyle, AllowInnerSlashes.
|
307
510
|
# SupportedStyles: slashes, percent_r, mixed
|
308
511
|
Style/RegexpLiteral:
|
512
|
+
Details: |
|
513
|
+
|
514
|
+
Prefer slashes for simple expressions. Use `%r` for expressions containing
|
515
|
+
slashes and for complex expressions so then can be written across multiple
|
516
|
+
lines (allowing advanced features such as comments). Use of `%r` for
|
517
|
+
expressions spanning multiple lines provides some comprehension parity with
|
518
|
+
general code blocks.
|
309
519
|
EnforcedStyle: mixed
|
310
520
|
|
311
521
|
# If you only need to rescue a single, or predefined set of exceptions, then
|
@@ -347,17 +557,41 @@ Style/RegexpLiteral:
|
|
347
557
|
# Configuration parameters: EnforcedStyle.
|
348
558
|
# SupportedStyles: implicit, explicit
|
349
559
|
Style/RescueStandardError:
|
560
|
+
Details: |
|
561
|
+
|
562
|
+
If you only need to rescue a single, or predefined set of exceptions, then
|
563
|
+
catch each exception explicitly. When you need to include a general error
|
564
|
+
handler or "catch-all" use the "unspecified rescue":
|
565
|
+
|
566
|
+
begin
|
567
|
+
# do something that may cause a standard error
|
568
|
+
rescue TypeError
|
569
|
+
handle_type_error
|
570
|
+
rescue => e
|
571
|
+
handle_error e
|
572
|
+
end
|
573
|
+
|
574
|
+
Avoid rescuing `Exception` as this may hide system errors.
|
350
575
|
EnforcedStyle: implicit
|
351
576
|
|
352
577
|
# We generally prefer double quotes but many generators use single quotes. We
|
353
578
|
# don't view the performance difference to be all that much so we don't care
|
354
579
|
# if the style is mixed or double quotes are used for static strings.
|
355
580
|
#
|
356
|
-
# Configuration parameters: EnforcedStyle,
|
581
|
+
# Configuration parameters: EnforcedStyle, ConsistentQuotesInMultiline.
|
357
582
|
# SupportedStyles: single_quotes, double_quotes
|
358
583
|
Style/StringLiterals:
|
359
584
|
Enabled: false
|
360
585
|
|
586
|
+
# As with regular string literals we have no real preference for this. Forcing
|
587
|
+
# one style of strings over others for this case just adds to Rubocop noise and
|
588
|
+
# in our experience developer frustration.
|
589
|
+
#
|
590
|
+
# Configuration parameters: EnforcedStyle.
|
591
|
+
# SupportedStyles: single_quotes, double_quotes
|
592
|
+
Style/StringLiteralsInInterpolation:
|
593
|
+
Enabled: false
|
594
|
+
|
361
595
|
# We don't feel too strongly about percent vs bracket array style. We tend to
|
362
596
|
# use the percent style, which also happens to be Rubocop's default. So for
|
363
597
|
# pedantic consistency we'll enforce this.
|
@@ -371,7 +605,7 @@ Style/SymbolArray:
|
|
371
605
|
MinSize: 3
|
372
606
|
|
373
607
|
# When ternaries become complex they can be difficult to read due to increased
|
374
|
-
#
|
608
|
+
# cognitive load parsing the expression. Cognitive load can increase further
|
375
609
|
# when assignment is involved.
|
376
610
|
#
|
377
611
|
# Configuration parameters: EnforcedStyle, AllowSafeAssignment.
|
@@ -379,9 +613,10 @@ Style/SymbolArray:
|
|
379
613
|
Style/TernaryParentheses:
|
380
614
|
AllowSafeAssignment: false
|
381
615
|
Details: |
|
616
|
+
|
382
617
|
When ternaries become complex they can be difficult to read due to
|
383
|
-
increased
|
384
|
-
increase further when assignment is involved. To help reduce this
|
618
|
+
increased cognitive load parsing the expression. Cognitive load can
|
619
|
+
increase further when assignment is involved. To help reduce this cognitive
|
385
620
|
use parentheses for complex expressions.
|
386
621
|
EnforcedStyle: require_parentheses_when_complex
|
387
622
|
|
@@ -397,6 +632,7 @@ Style/TernaryParentheses:
|
|
397
632
|
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
398
633
|
Style/TrailingCommaInArguments:
|
399
634
|
Details: |
|
635
|
+
|
400
636
|
Always use trailing commas for multiline arguments. This makes git diffs
|
401
637
|
easier to read by cutting down on noise when commas are appended. It also
|
402
638
|
simplifies adding, removing, and swapping argument orders.
|
@@ -411,6 +647,7 @@ Style/TrailingCommaInArguments:
|
|
411
647
|
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
412
648
|
Style/TrailingCommaInArrayLiteral:
|
413
649
|
Details: |
|
650
|
+
|
414
651
|
Always use trailing commas for multiline arrays. This makes git diffs
|
415
652
|
easier to read by cutting down on noise when commas are appended. It also
|
416
653
|
simplifies adding, removing, and re-arranging the elements.
|
@@ -423,6 +660,7 @@ Style/TrailingCommaInArrayLiteral:
|
|
423
660
|
# SupportedStylesForMultiline: comma, consistent_comma, no_comma
|
424
661
|
Style/TrailingCommaInHashLiteral:
|
425
662
|
Details: |
|
663
|
+
|
426
664
|
Always use trailing commas for multiline hashes. This makes git diffs
|
427
665
|
easier to read by cutting down on noise when commas are appended. It also
|
428
666
|
simplifies adding, removing, and re-arranging the elements.
|