radius-spec 0.5.0 → 0.9.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.
@@ -0,0 +1,285 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Data values are taken from the Rubocop Style/HashLikeCase example
4
+ #
5
+ # https://docs.rubocop.org/rubocop/1.21/cops_style.html#styleredundantfileextensioninrequire
6
+
7
+ # Run from the command line: bundle exec ruby benchmarks/style_hash_like_case.rb
8
+ require_relative 'bm_setup'
9
+
10
+ display_benchmark_header
11
+
12
+ # rubocop:disable Style/HashLikeCase
13
+ def case_check3(value)
14
+ case value
15
+ when 'europe'
16
+ 'http://eu.example.com'
17
+ when 'america'
18
+ 'http://us.example.com'
19
+ when 'australia'
20
+ 'http://au.example.com'
21
+ end
22
+ end
23
+
24
+ HASH_CASE3 = {
25
+ 'europe' => 'http://eu.example.com',
26
+ 'america' => 'http://us.example.com',
27
+ 'australia' => 'http://au.example.com',
28
+ }.freeze
29
+
30
+ def hash_check3(value)
31
+ HASH_CASE3[value]
32
+ end
33
+
34
+ section "Style/HashLikeCase(3) - First Match" do |bench|
35
+ bench.report("case") do |times|
36
+ i = 0
37
+ while i < times
38
+ case_check3('europe')
39
+ i += 1
40
+ end
41
+ end
42
+
43
+ bench.report("hash") do |times|
44
+ i = 0
45
+ while i < times
46
+ hash_check3('europe')
47
+ i += 1
48
+ end
49
+ end
50
+ end
51
+
52
+ section "Style/HashLikeCase(3) - Last Match" do |bench|
53
+ bench.report("case") do |times|
54
+ i = 0
55
+ while i < times
56
+ case_check3('australia')
57
+ i += 1
58
+ end
59
+ end
60
+
61
+ bench.report("hash") do |times|
62
+ i = 0
63
+ while i < times
64
+ hash_check3('australia')
65
+ i += 1
66
+ end
67
+ end
68
+ end
69
+
70
+ section "Style/HashLikeCase(3) - No Match" do |bench|
71
+ bench.report("case") do |times|
72
+ i = 0
73
+ while i < times
74
+ case_check3('any other place')
75
+ i += 1
76
+ end
77
+ end
78
+
79
+ bench.report("hash") do |times|
80
+ i = 0
81
+ while i < times
82
+ hash_check3('any other place')
83
+ i += 1
84
+ end
85
+ end
86
+ end
87
+
88
+ def case_check5(value) # rubocop:disable Metrics/MethodLength
89
+ case value
90
+ when 'europe'
91
+ 'http://eu.example.com'
92
+ when 'america'
93
+ 'http://us.example.com'
94
+ when 'australia'
95
+ 'http://au.example.com'
96
+ when 'china'
97
+ 'http://cn.example.com'
98
+ when 'japan'
99
+ 'http://jp.example.com'
100
+ end
101
+ end
102
+
103
+ HASH_CASE5 = {
104
+ 'europe' => 'http://eu.example.com',
105
+ 'america' => 'http://us.example.com',
106
+ 'australia' => 'http://au.example.com',
107
+ 'china' => 'http://cn.example.com',
108
+ 'japan' => 'http://jp.example.com',
109
+ }.freeze
110
+
111
+ def hash_check5(value)
112
+ HASH_CASE5[value]
113
+ end
114
+
115
+ section "Style/HashLikeCase(5) - First Match" do |bench|
116
+ bench.report("case") do |times|
117
+ i = 0
118
+ while i < times
119
+ case_check5('europe')
120
+ i += 1
121
+ end
122
+ end
123
+
124
+ bench.report("hash") do |times|
125
+ i = 0
126
+ while i < times
127
+ hash_check5('europe')
128
+ i += 1
129
+ end
130
+ end
131
+ end
132
+
133
+ section "Style/HashLikeCase(5) - Last Match" do |bench|
134
+ bench.report("case") do |times|
135
+ i = 0
136
+ while i < times
137
+ case_check5('japan')
138
+ i += 1
139
+ end
140
+ end
141
+
142
+ bench.report("hash") do |times|
143
+ i = 0
144
+ while i < times
145
+ hash_check5('japan')
146
+ i += 1
147
+ end
148
+ end
149
+ end
150
+
151
+ section "Style/HashLikeCase(5) - No Match" do |bench|
152
+ bench.report("case") do |times|
153
+ i = 0
154
+ while i < times
155
+ case_check5('any other place')
156
+ i += 1
157
+ end
158
+ end
159
+
160
+ bench.report("hash") do |times|
161
+ i = 0
162
+ while i < times
163
+ hash_check5('any other place')
164
+ i += 1
165
+ end
166
+ end
167
+ end
168
+
169
+ # rubocop:enable Style/HashLikeCase
170
+
171
+ __END__
172
+
173
+ Usage of `case` appears to be more performant than a hash. However, both are
174
+ highly performant, so any difference is likely negligible compared to other
175
+ performance issues.
176
+
177
+ ### Environment
178
+
179
+ Performance-M Dyno
180
+ ruby 2.7.4p191 (2021-07-07 revision a21a3b7d23) [x86_64-linux]
181
+ GC Disabled: true
182
+
183
+ ### Test Cases
184
+
185
+ #### Style/HashLikeCase(3) - First Match
186
+
187
+ ```
188
+ Warming up --------------------------------------
189
+ case 1.768M i/100ms
190
+ hash 1.710M i/100ms
191
+ Calculating -------------------------------------
192
+ case 17.630M (± 0.3%) i/s - 88.418M in 5.016811s
193
+ hash 17.044M (± 0.2%) i/s - 85.504M in 5.017564s
194
+ with 95.0% confidence
195
+
196
+ Comparison:
197
+ case: 17630438.8 i/s
198
+ hash: 17044158.0 i/s - 1.03x (± 0.00) slower
199
+ with 95.0% confidence
200
+ ```
201
+
202
+ #### Style/HashLikeCase(3) - Last Match
203
+
204
+ ```
205
+ Warming up --------------------------------------
206
+ case 1.714M i/100ms
207
+ hash 1.644M i/100ms
208
+ Calculating -------------------------------------
209
+ case 17.066M (± 0.7%) i/s - 85.718M in 5.027638s
210
+ hash 16.432M (± 0.1%) i/s - 82.205M in 5.002925s
211
+ with 95.0% confidence
212
+
213
+ Comparison:
214
+ case: 17066448.1 i/s
215
+ hash: 16432193.1 i/s - 1.04x (± 0.01) slower
216
+ with 95.0% confidence
217
+ ```
218
+
219
+ #### Style/HashLikeCase(3) - No Match
220
+
221
+ ```
222
+ Warming up --------------------------------------
223
+ case 1.706M i/100ms
224
+ hash 1.529M i/100ms
225
+ Calculating -------------------------------------
226
+ case 16.944M (± 0.8%) i/s - 85.300M in 5.041700s
227
+ hash 15.210M (± 0.5%) i/s - 76.428M in 5.028693s
228
+ with 95.0% confidence
229
+
230
+ Comparison:
231
+ case: 16944279.7 i/s
232
+ hash: 15210481.2 i/s - 1.11x (± 0.01) slower
233
+ with 95.0% confidence
234
+ ```
235
+
236
+ #### Style/HashLikeCase(5) - First Match
237
+
238
+ ```
239
+ Warming up --------------------------------------
240
+ case 1.738M i/100ms
241
+ hash 1.704M i/100ms
242
+ Calculating -------------------------------------
243
+ case 17.621M (± 0.5%) i/s - 88.642M in 5.033716s
244
+ hash 16.963M (± 0.5%) i/s - 85.198M in 5.025691s
245
+ with 95.0% confidence
246
+
247
+ Comparison:
248
+ case: 17621070.3 i/s
249
+ hash: 16963331.9 i/s - 1.04x (± 0.01) slower
250
+ with 95.0% confidence
251
+ ```
252
+
253
+ #### Style/HashLikeCase(5) - Last Match
254
+
255
+ ```
256
+ Warming up --------------------------------------
257
+ case 1.718M i/100ms
258
+ hash 1.634M i/100ms
259
+ Calculating -------------------------------------
260
+ case 17.170M (± 0.0%) i/s - 85.898M in 5.002845s
261
+ hash 16.357M (± 0.3%) i/s - 83.338M in 5.097011s
262
+ with 95.0% confidence
263
+
264
+ Comparison:
265
+ case: 17170019.6 i/s
266
+ hash: 16356675.5 i/s - 1.05x (± 0.00) slower
267
+ with 95.0% confidence
268
+ ```
269
+
270
+ #### Style/HashLikeCase(5) - No Match
271
+
272
+ ```
273
+ Warming up --------------------------------------
274
+ case 1.661M i/100ms
275
+ hash 1.501M i/100ms
276
+ Calculating -------------------------------------
277
+ case 16.518M (± 0.6%) i/s - 83.046M in 5.031835s
278
+ hash 14.963M (± 0.5%) i/s - 75.058M in 5.019838s
279
+ with 95.0% confidence
280
+
281
+ Comparison:
282
+ case: 16517985.2 i/s
283
+ hash: 14962803.1 i/s - 1.10x (± 0.01) slower
284
+ with 95.0% confidence
285
+ ```
@@ -5,7 +5,6 @@ require_relative 'bm_setup'
5
5
 
6
6
  display_benchmark_header
7
7
 
8
- # rubocop:disable Performance/UnfreezeString
9
8
  section "Unfreezing empty string" do |bench|
10
9
  bench.report("String.new") do
11
10
  String.new
@@ -34,7 +33,6 @@ section "Unfreezing string" do |bench|
34
33
  STRING.dup
35
34
  end
36
35
  end
37
- # rubocop:enable Performance/UnfreezeString
38
36
 
39
37
  __END__
40
38
 
data/bin/ci CHANGED
@@ -15,7 +15,7 @@ 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-rdoc --no-ri bundler-audit
18
+ gem install --no-document bundler-audit
19
19
  bundle-audit check --update
20
20
 
21
21
  # Run style checker
data/common_rubocop.yml CHANGED
@@ -1,15 +1,26 @@
1
1
  AllCops:
2
- TargetRubyVersion: 2.5.0
2
+ TargetRubyVersion: 2.7.0
3
+ # We choose to opt-in to new checks by default. This allows us to update
4
+ # version by version without having to worry about adding an entry for each
5
+ # new "enabled by default" check. If we want to jump multiple versions and
6
+ # wish to be notified of all the enw check, then we'll need to change
7
+ # `NewCops` to `pending.
8
+ NewCops: enable
3
9
  Exclude:
4
10
  # Exclude generated binstubs
5
11
  - 'bin/bundle'
6
12
  - 'bin/bundler-travis'
13
+ - 'bin/pronto'
7
14
  - 'bin/pry'
15
+ - 'bin/radius-cli'
8
16
  - 'bin/rake'
9
17
  - 'bin/rspec'
10
18
  - 'bin/rubocop'
11
19
  - 'bin/travis'
20
+ - 'bin/webpack'
21
+ - 'bin/webpack-dev-server'
12
22
  - 'bin/yard'
23
+ - 'bin/yarn'
13
24
  # Exclude vendored content
14
25
  - 'vendor/**/*'
15
26
 
@@ -25,6 +36,37 @@ Layout/AccessModifierIndentation:
25
36
  similar to `rescue` and `ensure` in a method.
26
37
  EnforcedStyle: outdent
27
38
 
39
+ # Rubocop 0.60.0 changed how it handled value alignments in this cop. This
40
+ # breaks our preference for wanting keys to be aligned, but allowing values to
41
+ # either use the `key` or `table` style:
42
+ #
43
+ # key_style = {
44
+ # key: :value,
45
+ # another: :value,
46
+ # yet_another: :value
47
+ # }
48
+ # table_style = {
49
+ # key: :value,
50
+ # another: :value
51
+ # yet_another: :value
52
+ # }
53
+ #
54
+ # This is logged with Rubocop: https://github.com/rubocop-hq/rubocop/issues/6410
55
+ #
56
+ # Until Rubocop resolves this we've decided to enforce the key style so that we
57
+ # do not lose all associated formatting checks. Additionally, in response to
58
+ # the referenced issue the Rubocop disables the alignment check by default. To
59
+ # continue using it we force enable it here.
60
+ #
61
+ # Configuration parameters: EnforcedHashRocketStyle, EnforcedColonStyle, EnforcedLastArgumentHashStyle.
62
+ # SupportedHashRocketStyles: key, separator, table
63
+ # SupportedColonStyles: key, separator, table
64
+ # SupportedLastArgumentHashStyles: always_inspect, always_ignore, ignore_implicit, ignore_explicit
65
+ Layout/HashAlignment:
66
+ Enabled: true
67
+ EnforcedHashRocketStyle: key
68
+ EnforcedColonStyle: key
69
+
28
70
  # Disabling this until it is fixed to support multi-line block chains using the
29
71
  # semantic style.
30
72
  #
@@ -43,17 +85,46 @@ Layout/BlockAlignment:
43
85
  # Configuration parameters: EnforcedStyle, IndentationWidth.
44
86
  # SupportedStyles: consistent, consistent_relative_to_receiver,
45
87
  # special_for_inner_method_call, special_for_inner_method_call_in_parentheses
46
- Layout/FirstParameterIndentation:
88
+ #
89
+ # TODO: At some point this is split into both Layout/FirstArgumentIndentation
90
+ # and Layout/FirstParameterIndentation
91
+ Layout/FirstArgumentIndentation:
47
92
  Enabled: false
48
93
 
49
- # This project only uses newer Ruby versions which all support the "squiggly"
50
- # style. We prefer to use pure Ruby calls when possible instead of relying on
51
- # alternatives; even for Rails app.
94
+ # We generally prefer to use the default line length of 80. Though sometimes
95
+ # we just need a little extra space because it makes it easier to read.
52
96
  #
53
- # Configuration parameters: EnforcedStyle.
54
- # SupportedStyles: auto_detection, squiggly, active_support, powerpack, unindent
55
- Layout/IndentHeredoc:
56
- EnforcedStyle: squiggly
97
+ # The only way to disable Rubocop for a single line is either to wrap the line
98
+ # with two comments or append the disable comment to the end of the line. For
99
+ # guard clauses, we tend to prefer trailing comments to avoid adding two lines
100
+ # just to disable a cop on one line.
101
+ #
102
+ # Sometimes comments include ASCII diagrams, flow charts, etc. These cannot
103
+ # always be reformatted to fit within the 80 column limit. Also, we write most
104
+ # comments in markdown format. Rubocop isn't very good at understanding when
105
+ # the line is long because of a URL in a markdown link. Instead of requiring
106
+ # additional comments to turn this cop off for comments we ignore any long
107
+ # lines which are only comments.
108
+ #
109
+ # There are also cases where for one valid reason or another we have a trailing
110
+ # comment that extends a little too far. We'd like to be able to ignore those
111
+ # as well. This _attempts_ to do that, however, as this uses simple regular
112
+ # expressions we can only attempt to match so much. We probably should change
113
+ # this for a node pattern matcher in the future.
114
+ #
115
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes,
116
+ # IgnoreCopDirectives, IgnoredPatterns.
117
+ # URISchemes: http, https
118
+ Layout/LineLength:
119
+ IgnoreCopDirectives: true
120
+ IgnoredPatterns:
121
+ # Leading comments
122
+ - '\A\s*#'
123
+ # Attempt at trailing comments
124
+ - '\A.{1,78}\s#\s.*\z'
125
+ Max: 100
126
+ Exclude:
127
+ - '**/*.gemspec'
57
128
 
58
129
  # We tend to indent multi-line operation statements. I think this is because it
59
130
  # tends to be the default style auto-formatted by VIM (which many of us use).
@@ -88,6 +159,31 @@ Lint/AmbiguousBlockAssociation:
88
159
  Exclude:
89
160
  - 'spec/**/*_spec.rb'
90
161
 
162
+ # We prefer to enforce a consistent usage for readability
163
+ #
164
+ # <<~SQL.strip
165
+ # bar
166
+ # SQL
167
+ #
168
+ # display(<<~SQL.strip)
169
+ # bar
170
+ # SQL
171
+ #
172
+ # Alternatively, refactoring the heredoc into a local also improves
173
+ # readability:
174
+ #
175
+ # custom_sql = <<~SQL
176
+ # bar
177
+ # SQL
178
+ # display(custom_sql.strip)
179
+ Lint/HeredocMethodCallPosition:
180
+ Enabled: true
181
+
182
+ # We prefer people suggesting people subclass `StandardError` for their custom
183
+ # exceptions as this is a relatively common Ruby idiom.
184
+ Lint/InheritException:
185
+ EnforcedStyle: standard_error
186
+
91
187
  # Often with benchmarking we don't explicitly "use" a variable or return value.
92
188
  # We simply need to perform the operation which generates said value for the
93
189
  # benchmark.
@@ -97,9 +193,22 @@ Lint/Void:
97
193
  Exclude:
98
194
  - 'benchmarks/**/*'
99
195
 
196
+ Metrics/AbcSize:
197
+ # TODO: When we are able to upgrade to Rubocop 1.5.0 we want to enable the
198
+ # following `CountRepeatedAttributes` option. We often find the
199
+ # multi-references to the same object to be necessary for reability and that
200
+ # for our team it does not increase complexity.
201
+ #
202
+ # CountRepeatedAttributes: false
203
+ Max: 17
204
+
100
205
  # Configuration parameters: CountComments, ExcludedMethods, Max.
101
206
  # ExcludedMethods: refine
102
207
  Metrics/BlockLength:
208
+ CountAsOne:
209
+ - 'array'
210
+ - 'hash'
211
+ - 'heredoc'
103
212
  Exclude:
104
213
  - '**/Rakefile'
105
214
  - '**/*.rake'
@@ -107,42 +216,31 @@ Metrics/BlockLength:
107
216
  - 'spec/**/*_spec.rb'
108
217
  - 'spec/support/model_factories.rb'
109
218
  ExcludedMethods:
219
+ - 'chdir'
110
220
  - 'refine'
221
+ - 'Capybara.register_driver'
111
222
  - 'RSpec.configure'
112
223
  - 'VCR.configure'
113
224
 
114
- # We generally prefer to use the default line length of 80. Though sometimes
115
- # we just need a little extra space because it makes it easier to read.
116
- #
117
- # The only way to disable Rubocop for a single line is either to wrap the line
118
- # with two comments or append the disable comment to the end of the line. For
119
- # guard clauses, we tend to prefer trailing comments to avoid adding two lines
120
- # just to disable a cop on one line.
121
- #
122
- # Sometimes comments include ASCII diagrams, flow charts, etc. These cannot
123
- # always be reformatted to fit within the 80 column limit. Also, we write most
124
- # comments in markdown format. Rubocop isn't very good at understanding when
125
- # the line is long because of a URL in a markdown link. Instead of requiring
126
- # additional comments to turn this cop off for comments we ignore any long
127
- # lines which are only comments.
128
- #
129
- # There are also cases where for one valid reason or another we have a trailing
130
- # comment that extends a little too far. We'd like to be able to ignore those
131
- # as well. This _attempts_ to do that, however, as this uses simple regular
132
- # expressions we can only attempt to match so much. We probably should change
133
- # this for a node pattern matcher in the future.
134
- #
135
- # Configuration parameters: AllowHeredoc, AllowURI, URISchemes,
136
- # IgnoreCopDirectives, IgnoredPatterns.
137
- # URISchemes: http, https
138
- Metrics/LineLength:
139
- IgnoreCopDirectives: true
140
- IgnoredPatterns:
141
- # Leading comments
142
- - '\A\s*#'
143
- # Attempt at trailing comments
144
- - '\A.{1,78}\s#\s.*\z'
145
- Max: 100
225
+ # We want length related code metrics to count Hashs, Arrays, and
226
+ # Heredocs as one "line"
227
+ Metrics/ClassLength:
228
+ CountAsOne:
229
+ - 'array'
230
+ - 'hash'
231
+ - 'heredoc'
232
+
233
+ Metrics/ModuleLength:
234
+ CountAsOne:
235
+ - 'array'
236
+ - 'hash'
237
+ - 'heredoc'
238
+
239
+ Metrics/MethodLength:
240
+ CountAsOne:
241
+ - 'array'
242
+ - 'hash'
243
+ - 'heredoc'
146
244
 
147
245
  # This is overly pedantic (only allowing `other` as the parameter name). Ruby
148
246
  # core doesn't follow this consistently either. Looking at several classes
@@ -165,14 +263,14 @@ Naming/FileName:
165
263
  # `EOF` is a common terminal abbreviate indicating end-of-file. We allow this
166
264
  # for those heredocs which represent "file" text.
167
265
  #
168
- # Configuration parameters: Blacklist.
169
- # Blacklist: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
266
+ # Configuration parameters: ForbiddenDelimiters.
267
+ # ForbiddenDelimiters: (?-mix:(^|\s)(EO[A-Z]{1}|END)(\s|$))
170
268
  Naming/HeredocDelimiterNaming:
171
269
  Details: |
172
270
 
173
271
  Use meaningful delimiter names to provide context to the text. The only
174
272
  allowed `EO*` variant if `EOF` which has specific meaning for file content.
175
- Blacklist:
273
+ ForbiddenDelimiters:
176
274
  - !ruby/regexp '/(^|\s)(EO[A-EG-Z]{1}|END)(\s|$)/'
177
275
 
178
276
  # It is generally a good idea to match the instance variable names with their
@@ -194,6 +292,13 @@ Naming/MemoizedInstanceVariableName:
194
292
  acceptable.
195
293
  EnforcedStyleForLeadingUnderscores: optional
196
294
 
295
+ # We don't really care about this check. Sometimes using something simple such
296
+ # as `err` is just fine. Other times it may improve readability to have a more
297
+ # descriptive name. We feel this is a personal judgement call and not something
298
+ # that needs to be enforced.
299
+ Naming/RescuedExceptionsVariableName:
300
+ Enabled: false
301
+
197
302
  # `alias` behavior changes on scope. In general we expect the behavior to be
198
303
  # that which is defined by `alias_method`.
199
304
  #
@@ -243,7 +348,10 @@ Style/AsciiComments:
243
348
  # - Prefer `{...}` over `do...end` for functional blocks.
244
349
  #
245
350
  # When the return value of the method receiving the block is important prefer
246
- # `{..}` over `do..end`.
351
+ # `{...}` over `do...end`.
352
+ #
353
+ # Some people enjoy the compact readability of `{...}` for one-liners so we
354
+ # allow that style as well.
247
355
  #
248
356
  # Configuration parameters: EnforcedStyle, ProceduralMethods, FunctionalMethods, IgnoredMethods.
249
357
  # SupportedStyles: line_count_based, semantic, braces_for_chaining
@@ -256,6 +364,7 @@ Style/BlockDelimiters:
256
364
 
257
365
  When the return value of the method receiving the block is important prefer
258
366
  `{..}` over `do..end`.
367
+ AllowBracesOnProceduralOneLiners: true
259
368
  Enabled: true
260
369
  EnforcedStyle: semantic
261
370
  ProceduralMethods:
@@ -360,6 +469,13 @@ Style/EmptyCaseCondition:
360
469
  Style/EmptyMethod:
361
470
  EnforcedStyle: expanded
362
471
 
472
+ # Always require the pragma comment to be true
473
+ #
474
+ # Configuration parameters: EnforcedStyle.
475
+ # SupportedStyles: always, always_true, never
476
+ Style/FrozenStringLiteralComment:
477
+ EnforcedStyle: always_true
478
+
363
479
  # Prefer symbol keys using the 1.9 hash syntax. However, when keys are mixed
364
480
  # use a consistent mapping style; which generally means using hash rockets:
365
481
  #
@@ -533,6 +649,11 @@ Style/RescueStandardError:
533
649
  Avoid rescuing `Exception` as this may hide system errors.
534
650
  EnforcedStyle: implicit
535
651
 
652
+ # We don't really care which style we use here and would prefer rubocop not
653
+ # complain about this.
654
+ Style/SlicingWithRange:
655
+ Enabled: false
656
+
536
657
  # We generally prefer double quotes but many generators use single quotes. We
537
658
  # don't view the performance difference to be all that much so we don't care
538
659
  # if the style is mixed or double quotes are used for static strings.