rufo 0.0.22 → 0.0.24
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +26 -1
- data/lib/rufo/command.rb +2 -2
- data/lib/rufo/formatter.rb +75 -14
- data/lib/rufo/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bd6cf27bd7b2fb2451482dff10c6fe5a3930311e
|
4
|
+
data.tar.gz: 7a4eebf1d5df0dc1ae9e05f9a04030cef866cdf2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd58dc896ab51bc57c5901fd5d1b46f29784d8f934de72176e21723bf542889520dc1a03f741ca14d2eddf618bbf66522ef758bd4612c1276937d533855d7ced
|
7
|
+
data.tar.gz: a0e7d72efa0b67fc29bb893eac4be54dfdd3dfb9b90700aaef306e34de7303c947f86c3116cad7b0a3c06357a8eaf4ee786954cb6862e83d2998e429f0c3187c
|
data/README.md
CHANGED
@@ -49,7 +49,7 @@ according to **rufo**, and will exit with exit code 1.
|
|
49
49
|
|
50
50
|
## Configuration
|
51
51
|
|
52
|
-
Rufo follows most
|
52
|
+
Rufo follows most of the conventions found in this [Ruby style guide](https://github.com/bbatsov/ruby-style-guide). It does a bit more than that, and it can also be configured a bit.
|
53
53
|
|
54
54
|
To configure it, place a `.rufo` file in your project. When formatting a file or a directory
|
55
55
|
via the `rufo` program, a `.rufo` file will try to be found in that directory or parent directories.
|
@@ -94,6 +94,31 @@ indent_size 2
|
|
94
94
|
As time passes there might be more configurations available. Please open an
|
95
95
|
issue if you need something else to be configurable.
|
96
96
|
|
97
|
+
## Formatting rules
|
98
|
+
|
99
|
+
Rufo follows most of the conventions found in this [Ruby style guide](https://github.com/bbatsov/ruby-style-guide).
|
100
|
+
|
101
|
+
However, there are some differences. Some of them are:
|
102
|
+
|
103
|
+
### `*`, `/` and `**` don't require spaces around them
|
104
|
+
|
105
|
+
All of these are good:
|
106
|
+
|
107
|
+
```ruby
|
108
|
+
# First option
|
109
|
+
2*x + 3*y + z
|
110
|
+
|
111
|
+
# Second option
|
112
|
+
2 * x + 3 * y + z
|
113
|
+
|
114
|
+
# Another option
|
115
|
+
2 * x + 3*y + z
|
116
|
+
```
|
117
|
+
|
118
|
+
Rufo will leave them as they are. The reason is that the first format looks
|
119
|
+
good mathematically. If you do insert a space before the `*` operator,
|
120
|
+
a space will be inserted afterwards.
|
121
|
+
|
97
122
|
## Status
|
98
123
|
|
99
124
|
The formatter is able to format `rails` and other projects, so at this point
|
data/lib/rufo/command.rb
CHANGED
@@ -55,8 +55,7 @@ class Rufo::Command
|
|
55
55
|
changed = false
|
56
56
|
|
57
57
|
files.each do |file|
|
58
|
-
|
59
|
-
changed ||= success
|
58
|
+
changed |= format_file file
|
60
59
|
end
|
61
60
|
|
62
61
|
exit 1 if changed
|
@@ -119,6 +118,7 @@ class Rufo::Command
|
|
119
118
|
filename_for_dot_rufo = nil
|
120
119
|
|
121
120
|
OptionParser.new do |opts|
|
121
|
+
opts.version = Rufo::VERSION
|
122
122
|
opts.banner = "Usage: rufo files or dirs [options]"
|
123
123
|
|
124
124
|
opts.on("-c", "--check", "Only check formating changes") do
|
data/lib/rufo/formatter.rb
CHANGED
@@ -41,14 +41,31 @@ class Rufo::Formatter
|
|
41
41
|
# Position of comments that occur at the end of a line
|
42
42
|
@comments_positions = []
|
43
43
|
|
44
|
+
# Associate lines to alignments
|
44
45
|
# Associate a line to an index inside @comments_position
|
45
46
|
# becuase when aligning something to the left of a comment
|
46
47
|
# we need to adjust the relative comment
|
47
|
-
@
|
48
|
+
@line_to_alignments_positions = Hash.new { |h, k| h[k] = [] }
|
48
49
|
|
49
50
|
# Position of assignments
|
50
51
|
@assignments_positions = []
|
51
52
|
|
53
|
+
# Range of assignment (line => end_line)
|
54
|
+
#
|
55
|
+
# We need this because when we have to format:
|
56
|
+
#
|
57
|
+
# ```
|
58
|
+
# abc = 1
|
59
|
+
# a = foo bar: 2
|
60
|
+
# baz: #
|
61
|
+
# ```
|
62
|
+
#
|
63
|
+
# Because we'll insert two spaces after `a`, this will
|
64
|
+
# result in a mis-alignment for baz (and possibly other lines
|
65
|
+
# below it). So, we remember the line ranges of an assignment,
|
66
|
+
# and once we align the first one we fix the other ones.
|
67
|
+
@assignments_ranges = {}
|
68
|
+
|
52
69
|
# Hash keys positions
|
53
70
|
@hash_keys_positions = []
|
54
71
|
|
@@ -613,11 +630,15 @@ class Rufo::Formatter
|
|
613
630
|
# [:assign, target, value]
|
614
631
|
_, target, value = node
|
615
632
|
|
633
|
+
line = @line
|
634
|
+
|
616
635
|
visit target
|
617
636
|
consume_space(!@align_assignments)
|
618
637
|
track_assignment
|
619
638
|
consume_op "="
|
620
639
|
visit_assign_value value
|
640
|
+
|
641
|
+
@assignments_ranges[line] = @line if @line != line
|
621
642
|
end
|
622
643
|
|
623
644
|
def visit_op_assign(node)
|
@@ -625,6 +646,9 @@ class Rufo::Formatter
|
|
625
646
|
#
|
626
647
|
# [:opassign, target, op, value]
|
627
648
|
_, target, op, value = node
|
649
|
+
|
650
|
+
line = @line
|
651
|
+
|
628
652
|
visit target
|
629
653
|
consume_space(!@align_assignments)
|
630
654
|
|
@@ -640,6 +664,8 @@ class Rufo::Formatter
|
|
640
664
|
next_token
|
641
665
|
|
642
666
|
visit_assign_value value
|
667
|
+
|
668
|
+
@assignments_ranges[line] = @line if @line != line
|
643
669
|
end
|
644
670
|
|
645
671
|
def visit_multiple_assign(node)
|
@@ -686,31 +712,32 @@ class Rufo::Formatter
|
|
686
712
|
end
|
687
713
|
|
688
714
|
def track_comment
|
689
|
-
@
|
715
|
+
@line_to_alignments_positions[@line] << [:comment, @column, @comments_positions, @comments_positions.size]
|
690
716
|
@comments_positions << [@line, @column, 0, nil, 0]
|
691
717
|
end
|
692
718
|
|
693
719
|
def track_assignment(offset = 0)
|
694
|
-
track_alignment @assignments_positions, offset
|
720
|
+
track_alignment :assign, @assignments_positions, offset
|
695
721
|
end
|
696
722
|
|
697
723
|
def track_hash_key
|
698
724
|
return unless @current_hash
|
699
725
|
|
700
|
-
track_alignment @hash_keys_positions, 0, @current_hash.object_id
|
726
|
+
track_alignment :hash_key, @hash_keys_positions, 0, @current_hash.object_id
|
701
727
|
end
|
702
728
|
|
703
729
|
def track_case_when
|
704
|
-
track_alignment @case_when_positions
|
730
|
+
track_alignment :case_whem, @case_when_positions
|
705
731
|
end
|
706
732
|
|
707
|
-
def track_alignment(target, offset = 0, id = nil)
|
733
|
+
def track_alignment(key, target, offset = 0, id = nil)
|
708
734
|
last = target.last
|
709
735
|
if last && last[0] == @line
|
710
736
|
# Track only the first alignment in a line
|
711
737
|
return
|
712
738
|
end
|
713
739
|
|
740
|
+
@line_to_alignments_positions[@line] << [key, @column, target, target.size]
|
714
741
|
target << [@line, @column, @indent, id, offset]
|
715
742
|
end
|
716
743
|
|
@@ -885,6 +912,8 @@ class Rufo::Formatter
|
|
885
912
|
|
886
913
|
if newline? || comment?
|
887
914
|
if needs_trailing_newline
|
915
|
+
write "," unless found_comma
|
916
|
+
|
888
917
|
indent(next_indent) do
|
889
918
|
consume_end_of_line
|
890
919
|
end
|
@@ -894,6 +923,7 @@ class Rufo::Formatter
|
|
894
923
|
end
|
895
924
|
else
|
896
925
|
if needs_trailing_newline && !found_comma
|
926
|
+
write ","
|
897
927
|
consume_end_of_line
|
898
928
|
write_indent
|
899
929
|
end
|
@@ -2792,6 +2822,14 @@ class Rufo::Formatter
|
|
2792
2822
|
consume_end_of_line(false, false, false)
|
2793
2823
|
end
|
2794
2824
|
|
2825
|
+
# A then keyword can appear after a newline after an `if`, `unless`, etc.
|
2826
|
+
# Since that's a super weird formatting for if, probably way too obsolete
|
2827
|
+
# by now, we just remove it.
|
2828
|
+
if keyword?("then")
|
2829
|
+
next_token
|
2830
|
+
skip_space_or_newline
|
2831
|
+
end
|
2832
|
+
|
2795
2833
|
# If the body is [[:void_stmt]] it's an empty body
|
2796
2834
|
# so there's nothing to write
|
2797
2835
|
if exps.size == 1 && exps[0][0] == :void_stmt
|
@@ -2998,22 +3036,22 @@ class Rufo::Formatter
|
|
2998
3036
|
end
|
2999
3037
|
|
3000
3038
|
def do_align_comments
|
3001
|
-
do_align @comments_positions,
|
3039
|
+
do_align @comments_positions, :comment
|
3002
3040
|
end
|
3003
3041
|
|
3004
3042
|
def do_align_assignments
|
3005
|
-
do_align @assignments_positions
|
3043
|
+
do_align @assignments_positions, :assign
|
3006
3044
|
end
|
3007
3045
|
|
3008
3046
|
def do_align_hash_keys
|
3009
|
-
do_align @hash_keys_positions,
|
3047
|
+
do_align @hash_keys_positions, :hash_key
|
3010
3048
|
end
|
3011
3049
|
|
3012
3050
|
def do_align_case_when
|
3013
|
-
do_align @case_when_positions
|
3051
|
+
do_align @case_when_positions, :case
|
3014
3052
|
end
|
3015
3053
|
|
3016
|
-
def do_align(elements,
|
3054
|
+
def do_align(elements, scope)
|
3017
3055
|
lines = @output.lines
|
3018
3056
|
|
3019
3057
|
# Chunk comments that are in consecutive lines
|
@@ -3024,7 +3062,7 @@ class Rufo::Formatter
|
|
3024
3062
|
chunks.each do |comments|
|
3025
3063
|
next if comments.size == 1
|
3026
3064
|
|
3027
|
-
if
|
3065
|
+
if scope == :hash_key
|
3028
3066
|
# Don't indent successive hash keys if any of them is in turn a hash
|
3029
3067
|
# or array literal that is formatted in separate lines.
|
3030
3068
|
has_brace_newline = comments.any? do |(l, c)|
|
@@ -3050,8 +3088,19 @@ class Rufo::Formatter
|
|
3050
3088
|
filler_size = max_column - column
|
3051
3089
|
filler = " " * filler_size
|
3052
3090
|
|
3053
|
-
|
3054
|
-
|
3091
|
+
# Move all lines affected by the assignment shift
|
3092
|
+
if scope == :assign && (range = @assignments_ranges[line])
|
3093
|
+
(line + 1..range).each do |line_number|
|
3094
|
+
lines[line_number] = "#{filler}#{lines[line_number]}"
|
3095
|
+
|
3096
|
+
# And move other elements too if applicable
|
3097
|
+
adjust_other_alignments scope, line_number, column, filler_size
|
3098
|
+
end
|
3099
|
+
end
|
3100
|
+
|
3101
|
+
# Move comments to the right if a change happened
|
3102
|
+
if scope != :comment
|
3103
|
+
adjust_other_alignments scope, line, column, filler_size
|
3055
3104
|
end
|
3056
3105
|
|
3057
3106
|
lines[line] = "#{before}#{filler}#{after}"
|
@@ -3061,6 +3110,18 @@ class Rufo::Formatter
|
|
3061
3110
|
@output = lines.join
|
3062
3111
|
end
|
3063
3112
|
|
3113
|
+
def adjust_other_alignments(scope, line, column, offset)
|
3114
|
+
adjustments = @line_to_alignments_positions[line]
|
3115
|
+
return unless adjustments
|
3116
|
+
|
3117
|
+
adjustments.each do |key, adjustment_column, target, index|
|
3118
|
+
next if adjustment_column <= column
|
3119
|
+
next if scope == key
|
3120
|
+
|
3121
|
+
target[index][1] += offset
|
3122
|
+
end
|
3123
|
+
end
|
3124
|
+
|
3064
3125
|
def chunk_while(array, &block)
|
3065
3126
|
if array.respond_to?(:chunk_while)
|
3066
3127
|
array.chunk_while(&block)
|
data/lib/rufo/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rufo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.24
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ary Borenszweig
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|