rubocop-standard 1.12.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.
data/STYLEGUIDE.md ADDED
@@ -0,0 +1,763 @@
1
+ # Ruby Style Guide
2
+
3
+ * Use soft-tabs with a two space indent.
4
+
5
+ * Keep each line of code to a readable length. Unless you have a reason to, keep lines to fewer than 100 characters.
6
+
7
+ * Never leave trailing whitespace.
8
+
9
+ * End each file with a [newline](https://github.com/bbatsov/ruby-style-guide#newline-eof).
10
+
11
+ * Use spaces around operators, after commas, colons and semicolons, around `{`
12
+ and before `}`.
13
+
14
+ ``` ruby
15
+ sum = 1 + 2
16
+ a, b = 1, 2
17
+ 1 > 2 ? true : false; puts "Hi"
18
+ [1, 2, 3].each { |e| puts e }
19
+ ```
20
+
21
+ * No spaces after `(`, `[` or before `]`, `)`.
22
+
23
+ ``` ruby
24
+ some(arg).other
25
+ [1, 2, 3].length
26
+ ```
27
+
28
+ * No spaces after `!`.
29
+
30
+ ``` ruby
31
+ !array.include?(element)
32
+ ```
33
+
34
+ * Indent `when` as deep as `case`.
35
+
36
+ ``` ruby
37
+ case
38
+ when song.name == "Misty"
39
+ puts "Not again!"
40
+ when song.duration > 120
41
+ puts "Too long!"
42
+ when Time.now.hour > 21
43
+ puts "It's too late"
44
+ else
45
+ song.play
46
+ end
47
+
48
+ kind = case year
49
+ when 1850..1889 then "Blues"
50
+ when 1890..1909 then "Ragtime"
51
+ when 1910..1929 then "New Orleans Jazz"
52
+ when 1930..1939 then "Swing"
53
+ when 1940..1950 then "Bebop"
54
+ else "Jazz"
55
+ end
56
+ ```
57
+
58
+ * Use empty lines between `def`s and to break up a method into logical
59
+ paragraphs.
60
+
61
+ ``` ruby
62
+ def some_method
63
+ data = initialize(options)
64
+
65
+ data.manipulate!
66
+
67
+ data.result
68
+ end
69
+
70
+ def some_method
71
+ result
72
+ end
73
+ ```
74
+
75
+ ## Classes
76
+
77
+ * Avoid the usage of class (`@@`) variables due to their unusual behavior
78
+ in inheritance.
79
+
80
+ ``` ruby
81
+ class Parent
82
+ @@class_var = "parent"
83
+
84
+ def self.print_class_var
85
+ puts @@class_var
86
+ end
87
+ end
88
+
89
+ class Child < Parent
90
+ @@class_var = "child"
91
+ end
92
+
93
+ Parent.print_class_var # => will print "child"
94
+ ```
95
+
96
+ As you can see all the classes in a class hierarchy actually share one
97
+ class variable. Class instance variables should usually be preferred
98
+ over class variables.
99
+
100
+ * Use `def self.method` to define singleton methods. This makes the methods
101
+ more resistant to refactoring changes.
102
+
103
+ ``` ruby
104
+ class TestClass
105
+ # bad
106
+ def TestClass.some_method
107
+ # body omitted
108
+ end
109
+
110
+ # good
111
+ def self.some_other_method
112
+ # body omitted
113
+ end
114
+ ```
115
+
116
+ * Avoid `class << self` except when necessary, e.g. single accessors and aliased
117
+ attributes.
118
+
119
+ ``` ruby
120
+ class TestClass
121
+ # bad
122
+ class << self
123
+ def first_method
124
+ # body omitted
125
+ end
126
+
127
+ def second_method_etc
128
+ # body omitted
129
+ end
130
+ end
131
+
132
+ # good
133
+ class << self
134
+ attr_accessor :per_page
135
+ alias_method :nwo, :find_by_name_with_owner
136
+ end
137
+
138
+ def self.first_method
139
+ # body omitted
140
+ end
141
+
142
+ def self.second_method_etc
143
+ # body omitted
144
+ end
145
+ end
146
+ ```
147
+
148
+ * Indent the `public`, `protected`, and `private` methods as much the
149
+ method definitions they apply to. Leave one blank line above them.
150
+
151
+ ``` ruby
152
+ class SomeClass
153
+ def public_method
154
+ # ...
155
+ end
156
+
157
+ private
158
+ def private_method
159
+ # ...
160
+ end
161
+ end
162
+ ```
163
+
164
+ * Avoid explicit use of `self` as the recipient of internal class or instance
165
+ messages unless to specify a method shadowed by a variable.
166
+
167
+ ``` ruby
168
+ class SomeClass
169
+ attr_accessor :message
170
+
171
+ def greeting(name)
172
+ message = "Hi #{name}" # local variable in Ruby, not attribute writer
173
+ self.message = message
174
+ end
175
+ end
176
+ ```
177
+
178
+ ## Collections
179
+
180
+ * Prefer `%w` to the literal array syntax when you need an array of
181
+ strings.
182
+
183
+ ``` ruby
184
+ # bad
185
+ STATES = ["draft", "open", "closed"]
186
+
187
+ # good
188
+ STATES = %w(draft open closed)
189
+ ```
190
+
191
+ * Use `Set` instead of `Array` when dealing with unique elements. `Set`
192
+ implements a collection of unordered values with no duplicates. This
193
+ is a hybrid of `Array`'s intuitive inter-operation facilities and
194
+ `Hash`'s fast lookup.
195
+
196
+ * Use symbols instead of strings as hash keys.
197
+
198
+ ``` ruby
199
+ # bad
200
+ hash = { "one" => 1, "two" => 2, "three" => 3 }
201
+
202
+ # good
203
+ hash = { one: 1, two: 2, three: 3 }
204
+ ```
205
+
206
+ ## Documentation
207
+
208
+ Use [TomDoc](http://tomdoc.org) to the best of your ability. It's pretty sweet:
209
+
210
+ ``` ruby
211
+ # Public: Duplicate some text an arbitrary number of times.
212
+ #
213
+ # text - The String to be duplicated.
214
+ # count - The Integer number of times to duplicate the text.
215
+ #
216
+ # Examples
217
+ #
218
+ # multiplex("Tom", 4)
219
+ # # => "TomTomTomTom"
220
+ #
221
+ # Returns the duplicated String.
222
+ def multiplex(text, count)
223
+ text * count
224
+ end
225
+ ```
226
+
227
+ ## Dynamic Dispatch
228
+
229
+ Avoid calling `send` and its cousins unless you really need it. Metaprogramming can be extremely powerful, but in most cases you can write code that captures your meaning by being explicit:
230
+
231
+ ``` ruby
232
+ # avoid
233
+ unless [:base, :head].include?(base_or_head)
234
+ raise ArgumentError, "base_or_head must be either :base or :head"
235
+ end
236
+
237
+ repository = pull.send("#{base_or_head}_repository")
238
+ branch = pull.send("#{base_or_head}_ref_name")
239
+
240
+ # prefer
241
+ case base_or_head
242
+ when :base
243
+ repository = pull.base_repository
244
+ branch = pull.base_ref_name
245
+ when :head
246
+ repository = pull.head_repository
247
+ branch = pull.head_ref_name
248
+ else
249
+ raise ArgumentError, "base_or_head must be either :base or :head"
250
+ end
251
+ ```
252
+ ## Exceptions
253
+
254
+ * Don't use exceptions for flow of control.
255
+
256
+ ``` ruby
257
+ # bad
258
+ begin
259
+ n / d
260
+ rescue ZeroDivisionError
261
+ puts "Cannot divide by 0!"
262
+ end
263
+
264
+ # good
265
+ if d.zero?
266
+ puts "Cannot divide by 0!"
267
+ else
268
+ n / d
269
+ end
270
+ ```
271
+
272
+ * Rescue specific exceptions, not `StandardError` or its superclasses.
273
+
274
+ ``` ruby
275
+ # bad
276
+ begin
277
+ # an exception occurs here
278
+ rescue
279
+ # exception handling
280
+ end
281
+
282
+ # still bad
283
+ begin
284
+ # an exception occurs here
285
+ rescue Exception
286
+ # exception handling
287
+ end
288
+ ```
289
+
290
+ ## Hashes
291
+
292
+ Use the Ruby 1.9 syntax for hash literals when all the keys are symbols:
293
+
294
+ ``` ruby
295
+ # good
296
+ user = {
297
+ login: "defunkt",
298
+ name: "Chris Wanstrath"
299
+ }
300
+
301
+ # bad
302
+ user = {
303
+ :login => "defunkt",
304
+ :name => "Chris Wanstrath"
305
+ }
306
+
307
+ ```
308
+
309
+ Use the 1.9 syntax when calling a method with Hash options arguments or named arguments:
310
+
311
+ ``` ruby
312
+ # good
313
+ user = User.create(login: "jane")
314
+ link_to("Account", controller: "users", action: "show", id: user)
315
+
316
+ # bad
317
+ user = User.create(:login => "jane")
318
+ link_to("Account", :controller => "users", :action => "show", :id => user)
319
+ ```
320
+
321
+ If you have a hash with mixed key types, use the legacy hashrocket style to avoid mixing styles within the same hash:
322
+
323
+ ``` ruby
324
+ # good
325
+ hsh = {
326
+ :user_id => 55,
327
+ "followers-count" => 1000
328
+ }
329
+
330
+ # bad
331
+ hsh = {
332
+ user_id: 55,
333
+ "followers-count" => 1000
334
+ }
335
+ ```
336
+
337
+ ## Keyword Arguments
338
+
339
+ [Keyword arguments](http://magazine.rubyist.net/?Ruby200SpecialEn-kwarg) are recommended but not required when a method's arguments may otherwise be opaque or non-obvious when called. Additionally, prefer them over the old "Hash as pseudo-named args" style from pre-2.0 ruby.
340
+
341
+ So instead of this:
342
+ ``` ruby
343
+ def remove_member(user, skip_membership_check=false)
344
+ # ...
345
+ end
346
+
347
+ # Elsewhere: what does true mean here?
348
+ remove_member(user, true)
349
+ ```
350
+
351
+ Do this, which is much clearer.
352
+ ``` ruby
353
+ def remove_member(user, skip_membership_check: false)
354
+ # ...
355
+ end
356
+
357
+ # Elsewhere, now with more clarity:
358
+ remove_member user, skip_membership_check: true
359
+ ```
360
+
361
+ ## Naming
362
+
363
+ * Use `snake_case` for methods and variables.
364
+
365
+ * Use `CamelCase` for classes and modules. (Keep acronyms like HTTP,
366
+ RFC, XML uppercase.)
367
+
368
+ * Use `SCREAMING_SNAKE_CASE` for other constants.
369
+
370
+ * The names of predicate methods (methods that return a boolean value)
371
+ should end in a question mark. (i.e. `Array#empty?`).
372
+
373
+ * The names of potentially "dangerous" methods (i.e. methods that modify `self` or the
374
+ arguments, `exit!`, etc.) should end with an exclamation mark. Bang methods
375
+ should only exist if a non-bang method exists. ([More on this](http://dablog.rubypal.com/2007/8/15/bang-methods-or-danger-will-rubyist)).
376
+
377
+ ## Percent Literals
378
+
379
+ * Use `%w` freely.
380
+
381
+ ``` ruby
382
+ STATES = %w(draft open closed)
383
+ ```
384
+
385
+ * Use `%()` for single-line strings which require both interpolation
386
+ and embedded double-quotes. For multi-line strings, prefer heredocs.
387
+
388
+ ``` ruby
389
+ # bad (no interpolation needed)
390
+ %(<div class="text">Some text</div>)
391
+ # should be "<div class=\"text\">Some text</div>"
392
+
393
+ # bad (no double-quotes)
394
+ %(This is #{quality} style)
395
+ # should be "This is #{quality} style"
396
+
397
+ # bad (multiple lines)
398
+ %(<div>\n<span class="big">#{exclamation}</span>\n</div>)
399
+ # should be a heredoc.
400
+
401
+ # good (requires interpolation, has quotes, single line)
402
+ %(<tr><td class="name">#{name}</td>)
403
+ ```
404
+
405
+ * Use `%r` only for regular expressions matching *more than* one '/' character.
406
+
407
+ ``` ruby
408
+ # bad
409
+ %r(\s+)
410
+
411
+ # still bad
412
+ %r(^/(.*)$)
413
+ # should be /^\/(.*)$/
414
+
415
+ # good
416
+ %r(^/blog/2011/(.*)$)
417
+ ```
418
+
419
+ ## Regular Expressions
420
+
421
+ * Avoid using $1-9 as it can be hard to track what they contain. Named groups
422
+ can be used instead.
423
+
424
+ ``` ruby
425
+ # bad
426
+ /(regexp)/ =~ string
427
+ ...
428
+ process $1
429
+
430
+ # good
431
+ /(?<meaningful_var>regexp)/ =~ string
432
+ ...
433
+ process meaningful_var
434
+ ```
435
+
436
+ * Be careful with `^` and `$` as they match start/end of line, not string endings.
437
+ If you want to match the whole string use: `\A` and `\z`.
438
+
439
+ ``` ruby
440
+ string = "some injection\nusername"
441
+ string[/^username$/] # matches
442
+ string[/\Ausername\z/] # don't match
443
+ ```
444
+
445
+ * Use `x` modifier for complex regexps. This makes them more readable and you
446
+ can add some useful comments. Just be careful as spaces are ignored.
447
+
448
+ ``` ruby
449
+ regexp = %r{
450
+ start # some text
451
+ \s # white space char
452
+ (group) # first group
453
+ (?:alt1|alt2) # some alternation
454
+ end
455
+ }x
456
+ ```
457
+
458
+ ## Requires
459
+
460
+ Always `require` dependencies used directly in a script at the start of the same file.
461
+ Resources that will get autoloaded on first use—such as Rails models, controllers, or
462
+ helpers—don't need to be required.
463
+
464
+ ``` ruby
465
+ require "set"
466
+ require "time"
467
+
468
+ %w(foo bar).to_set
469
+ Time.parse("2015-10-21")
470
+ ```
471
+
472
+ This not only loads the necessary dependencies if they haven't already, but acts as
473
+ documentation about the libraries that the current file uses.
474
+
475
+ ## Strings
476
+
477
+ * Prefer string interpolation instead of string concatenation:
478
+
479
+ ``` ruby
480
+ # bad
481
+ email_with_name = user.name + " <" + user.email + ">"
482
+
483
+ # good
484
+ email_with_name = "#{user.name} <#{user.email}>"
485
+ ```
486
+
487
+ * Use double-quoted strings. Interpolation and escaped characters
488
+ will always work without a delimiter change, and `'` is a lot more
489
+ common than `"` in string literals.
490
+
491
+ ``` ruby
492
+ # bad
493
+ name = 'Bozhidar'
494
+
495
+ # good
496
+ name = "Bozhidar"
497
+ ```
498
+
499
+ * Avoid using `String#+` when you need to construct large data chunks.
500
+ Instead, use `String#<<`. Concatenation mutates the string instance in-place
501
+ and is always faster than `String#+`, which creates a bunch of new string objects.
502
+
503
+ ``` ruby
504
+ # good and also fast
505
+ html = ""
506
+ html << "<h1>Page title</h1>"
507
+
508
+ paragraphs.each do |paragraph|
509
+ html << "<p>#{paragraph}</p>"
510
+ end
511
+ ```
512
+
513
+ ## Syntax
514
+
515
+ * Use `def` with parentheses when there are arguments. Omit the
516
+ parentheses when the method doesn't accept any arguments.
517
+
518
+ ``` ruby
519
+ def some_method
520
+ # body omitted
521
+ end
522
+
523
+ def some_method_with_arguments(arg1, arg2)
524
+ # body omitted
525
+ end
526
+ ```
527
+
528
+ * Never use `for`, unless you know exactly why. Most of the time iterators
529
+ should be used instead. `for` is implemented in terms of `each` (so
530
+ you're adding a level of indirection), but with a twist - `for`
531
+ doesn't introduce a new scope (unlike `each`) and variables defined
532
+ in its block will be visible outside it.
533
+
534
+ ``` ruby
535
+ arr = [1, 2, 3]
536
+
537
+ # bad
538
+ for elem in arr do
539
+ puts elem
540
+ end
541
+
542
+ # good
543
+ arr.each { |elem| puts elem }
544
+ ```
545
+
546
+ * Never use `then` for multi-line `if/unless`.
547
+
548
+ ``` ruby
549
+ # bad
550
+ if some_condition then
551
+ # body omitted
552
+ end
553
+
554
+ # good
555
+ if some_condition
556
+ # body omitted
557
+ end
558
+ ```
559
+
560
+ * Avoid the ternary operator (`?:`) except in cases where all expressions are extremely
561
+ trivial. However, do use the ternary operator(`?:`) over `if/then/else/end` constructs
562
+ for single line conditionals.
563
+
564
+ ``` ruby
565
+ # bad
566
+ result = if some_condition then something else something_else end
567
+
568
+ # good
569
+ result = some_condition ? something : something_else
570
+ ```
571
+
572
+ * Use one expression per branch in a ternary operator. This
573
+ also means that ternary operators must not be nested. Prefer
574
+ `if/else` constructs in these cases.
575
+
576
+ ``` ruby
577
+ # bad
578
+ some_condition ? (nested_condition ? nested_something : nested_something_else) : something_else
579
+
580
+ # good
581
+ if some_condition
582
+ nested_condition ? nested_something : nested_something_else
583
+ else
584
+ something_else
585
+ end
586
+ ```
587
+
588
+ * The `and` and `or` keywords are banned. It's just not worth it. Always use `&&` and `||` instead.
589
+
590
+ * Avoid multi-line `?:` (the ternary operator), use `if/unless` instead.
591
+
592
+ * Favor modifier `if/unless` usage when you have a single-line
593
+ body.
594
+
595
+ ``` ruby
596
+ # bad
597
+ if some_condition
598
+ do_something
599
+ end
600
+
601
+ # good
602
+ do_something if some_condition
603
+ ```
604
+
605
+ * Never use `unless` with `else`. Rewrite these with the positive case first.
606
+
607
+ ``` ruby
608
+ # bad
609
+ unless success?
610
+ puts "failure"
611
+ else
612
+ puts "success"
613
+ end
614
+
615
+ # good
616
+ if success?
617
+ puts "success"
618
+ else
619
+ puts "failure"
620
+ end
621
+ ```
622
+
623
+ * Don't use parentheses around the condition of an `if/unless/while`.
624
+
625
+ ``` ruby
626
+ # bad
627
+ if (x > 10)
628
+ # body omitted
629
+ end
630
+
631
+ # good
632
+ if x > 10
633
+ # body omitted
634
+ end
635
+ ```
636
+
637
+ * Prefer `{...}` over `do...end` for single-line blocks. Avoid using
638
+ `{...}` for multi-line blocks (multiline chaining is always
639
+ ugly). Always use `do...end` for "control flow" and "method
640
+ definitions" (e.g. in Rakefiles and certain DSLs). Avoid `do...end`
641
+ when chaining.
642
+
643
+ ``` ruby
644
+ names = ["Bozhidar", "Steve", "Sarah"]
645
+
646
+ # good
647
+ names.each { |name| puts name }
648
+
649
+ # bad
650
+ names.each do |name|
651
+ puts name
652
+ end
653
+
654
+ # good
655
+ names.select { |name| name.start_with?("S") }.map { |name| name.upcase }
656
+
657
+ # bad
658
+ names.select do |name|
659
+ name.start_with?("S")
660
+ end.map { |name| name.upcase }
661
+ ```
662
+
663
+ Some will argue that multiline chaining would look OK with the use of {...}, but they should
664
+ ask themselves - is this code really readable and can't the block's contents be extracted into
665
+ nifty methods?
666
+
667
+ * Avoid `return` where not required.
668
+
669
+ ``` ruby
670
+ # bad
671
+ def some_method(some_arr)
672
+ return some_arr.size
673
+ end
674
+
675
+ # good
676
+ def some_method(some_arr)
677
+ some_arr.size
678
+ end
679
+ ```
680
+
681
+ * Use spaces around the `=` operator when assigning default values to method parameters:
682
+
683
+ ``` ruby
684
+ # bad
685
+ def some_method(arg1=:default, arg2=nil, arg3=[])
686
+ # do something...
687
+ end
688
+
689
+ # good
690
+ def some_method(arg1 = :default, arg2 = nil, arg3 = [])
691
+ # do something...
692
+ end
693
+ ```
694
+
695
+ While several Ruby books suggest the first style, the second is much more prominent
696
+ in practice (and arguably a bit more readable).
697
+
698
+ * Using the return value of `=` (an assignment) is ok.
699
+
700
+ ``` ruby
701
+ # bad
702
+ if (v = array.grep(/foo/)) ...
703
+
704
+ # good
705
+ if v = array.grep(/foo/) ...
706
+
707
+ # also good - has correct precedence.
708
+ if (v = next_value) == "hello" ...
709
+ ```
710
+
711
+ * Use `||=` freely to initialize variables.
712
+
713
+ ``` ruby
714
+ # set name to Bozhidar, only if it's nil or false
715
+ name ||= "Bozhidar"
716
+ ```
717
+
718
+ * Don't use `||=` to initialize boolean variables. (Consider what
719
+ would happen if the current value happened to be `false`.)
720
+
721
+ ``` ruby
722
+ # bad - would set enabled to true even if it was false
723
+ enabled ||= true
724
+
725
+ # good
726
+ enabled = true if enabled.nil?
727
+ ```
728
+
729
+ * Avoid using Perl-style special variables (like `$0-9`, `$`,
730
+ etc. ). They are quite cryptic and their use in anything but
731
+ one-liner scripts is discouraged. Prefer long form versions such as
732
+ `$PROGRAM_NAME`.
733
+
734
+ * Never put a space between a method name and the opening parenthesis.
735
+
736
+ ``` ruby
737
+ # bad
738
+ f (3 + 2) + 1
739
+
740
+ # good
741
+ f(3 + 2) + 1
742
+ ```
743
+
744
+ * If the first argument to a method begins with an open parenthesis,
745
+ always use parentheses in the method invocation. For example, write
746
+ `f((3 + 2) + 1)`.
747
+
748
+ * Use `_` for unused block parameters.
749
+
750
+ ``` ruby
751
+ # bad
752
+ result = hash.map { |k, v| v + 1 }
753
+
754
+ # good
755
+ result = hash.map { |_, v| v + 1 }
756
+ ```
757
+
758
+ * Don't use the `===` (threequals) operator to check types. `===` is mostly an
759
+ implementation detail to support Ruby features like `case`, and it's not commutative.
760
+ For example, `String === "hi"` is true and `"hi" === String` is false.
761
+ Instead, use `is_a?` or `kind_of?` if you must.
762
+
763
+ Refactoring is even better. It's worth looking hard at any code that explicitly checks types.