rufo 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rufo +5 -0
- data/README.md +53 -2
- data/lib/rufo.rb +1 -0
- data/lib/rufo/command.rb +113 -13
- data/lib/rufo/formatter.rb +85 -70
- data/lib/rufo/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f651b0e7deb5c6d36cbe7632aa761954e7d49939
|
4
|
+
data.tar.gz: 20b7c26c352e682cf72547fdeebf25d31b467aa4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9f40a5d0fd5ad07143ccc49fafddce8bd72cad15ada182f8cdf03b239a956f5a4072fe0df639d53a3c88d928a12058a360158b1a3b61462e073b2d9973cdfb1
|
7
|
+
data.tar.gz: 122c69242308b0999954d684ae4cfb4a0020d5ec9b68de7f76ce449a47076d659d8062f8c69fe9da80057031e07caddcc19f8a0fb653cd1e7ee0be3619d990c9
|
data/.rufo
ADDED
data/README.md
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# Rufo
|
2
2
|
|
3
|
-
**Ru**by **fo**rmatter
|
3
|
+
**Ru**by **fo**rmatter
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
@@ -20,10 +20,61 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
## Usage
|
22
22
|
|
23
|
+
### Format files or directories
|
24
|
+
|
25
|
+
```
|
26
|
+
$ rufo file names or dir names
|
27
|
+
```
|
28
|
+
|
29
|
+
### Format STDIN
|
30
|
+
|
31
|
+
```
|
32
|
+
$ cat file.rb | rufo
|
23
33
|
```
|
24
|
-
|
34
|
+
|
35
|
+
### Check that no formatting changes are produced
|
36
|
+
|
37
|
+
```
|
38
|
+
$ rufo --check file names or dir names
|
39
|
+
```
|
40
|
+
|
41
|
+
This will print one line for each file that isn't correctly formatted
|
42
|
+
according to **rufo**, and will exit with exit code 1.
|
43
|
+
|
44
|
+
## Editor support
|
45
|
+
|
46
|
+
- Sublime Text: [sublime-rufo](https://github.com/asterite/sublime-rufo)
|
47
|
+
|
48
|
+
## Configuration
|
49
|
+
|
50
|
+
Rufo follows most (if not all) 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.
|
51
|
+
|
52
|
+
To configure it, place a `.rufo` file in your project. When formatting a file or a directory
|
53
|
+
via the `rufo` program, a `.rufo` file will try to be found in that directory or parent directories.
|
54
|
+
|
55
|
+
The `.rufo` file is a Ruby file that is evaluated in the context of the formatter. These are the
|
56
|
+
available configurations:
|
57
|
+
|
58
|
+
```ruby
|
59
|
+
# Whether to align successive comments (default: true)
|
60
|
+
align_comments true
|
61
|
+
|
62
|
+
# Whether to align successive assignments (default: true)
|
63
|
+
align_assignments true
|
64
|
+
|
65
|
+
# Whether to align successive hash keys (default: true)
|
66
|
+
align_hash_keys true
|
67
|
+
|
68
|
+
# Whether to convert multiline `{ ... }` block to `do ... end` (default: true)
|
69
|
+
convert_brace_to_do true
|
70
|
+
|
71
|
+
# The indent size (default: 2)
|
72
|
+
indent_size 2
|
25
73
|
```
|
26
74
|
|
75
|
+
As time passes there might be more configurations available. Please open an
|
76
|
+
issue if you need something else to be configurable.
|
77
|
+
|
27
78
|
## Development
|
28
79
|
|
29
80
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
data/lib/rufo.rb
CHANGED
data/lib/rufo/command.rb
CHANGED
@@ -1,27 +1,127 @@
|
|
1
|
+
require "optionparser"
|
2
|
+
|
1
3
|
module Rufo::Command
|
2
4
|
def self.run
|
5
|
+
want_check = parse_options
|
6
|
+
|
3
7
|
if ARGV.empty?
|
4
|
-
format_stdin
|
8
|
+
format_stdin want_check
|
9
|
+
else
|
10
|
+
format_args ARGV, want_check
|
11
|
+
end
|
12
|
+
rescue Rufo::SyntaxError
|
13
|
+
STDERR.puts "Error: the given text is not a valid ruby program (it has syntax errors)"
|
14
|
+
exit 1
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.format_stdin(want_check)
|
18
|
+
code = STDIN.read
|
19
|
+
result = format(code, Dir.getwd)
|
20
|
+
|
21
|
+
if want_check
|
22
|
+
exit 1 if result != code
|
5
23
|
else
|
6
|
-
|
24
|
+
print result
|
7
25
|
end
|
8
26
|
rescue Rufo::Bug => ex
|
9
|
-
STDERR.puts "You've found a bug!
|
27
|
+
STDERR.puts "You've found a bug!"
|
28
|
+
STDERR.puts "Please report it to https://github.com/asterite/rufo/issues with code that triggers it"
|
29
|
+
STDERR.puts
|
30
|
+
raise ex
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.format_args(args, want_check)
|
34
|
+
files = []
|
35
|
+
|
36
|
+
args.each do |arg|
|
37
|
+
if Dir.exist?(arg)
|
38
|
+
files.concat Dir["#{arg}/**/*.rb"]
|
39
|
+
elsif File.exist?(arg)
|
40
|
+
files << arg
|
41
|
+
else
|
42
|
+
STDERR.puts "Error: file or directory not found: #{arg}"
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
changed = false
|
47
|
+
|
48
|
+
files.each do |file|
|
49
|
+
changed ||= format_file file, want_check
|
50
|
+
end
|
51
|
+
|
52
|
+
exit 1 if changed
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.format_file(filename, want_check)
|
56
|
+
code = File.read(filename)
|
57
|
+
result = format(code, File.dirname(filename))
|
58
|
+
|
59
|
+
if code != result
|
60
|
+
if want_check
|
61
|
+
STDERR.puts "Error: formatting #{filename} produced changes"
|
62
|
+
else
|
63
|
+
File.write(filename, result)
|
64
|
+
puts "Format: #{filename}"
|
65
|
+
end
|
66
|
+
|
67
|
+
return true
|
68
|
+
end
|
69
|
+
|
70
|
+
false
|
71
|
+
rescue Rufo::Bug => ex
|
72
|
+
STDERR.puts "You've found a bug!"
|
73
|
+
STDERR.puts "It happened while trying to format the file #{filename}"
|
74
|
+
STDERR.puts "Please report it to https://github.com/asterite/rufo/issues with code that triggers it"
|
10
75
|
STDERR.puts
|
11
76
|
raise ex
|
12
|
-
rescue Rufo::SyntaxError
|
13
|
-
STDERR.puts "Error: the given text is not a valid ruby program (it has syntax errors)"
|
14
77
|
end
|
15
78
|
|
16
|
-
def self.
|
17
|
-
|
18
|
-
|
19
|
-
|
79
|
+
def self.format(code, dir)
|
80
|
+
formatter = Rufo::Formatter.new(code)
|
81
|
+
|
82
|
+
dot_rufo = find_dot_rufo(dir)
|
83
|
+
if dot_rufo
|
84
|
+
begin
|
85
|
+
formatter.instance_eval(File.read(dot_rufo))
|
86
|
+
rescue => ex
|
87
|
+
STDERR.puts "Error evaluating #{dot_rufo}"
|
88
|
+
raise ex
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
formatter.format
|
93
|
+
formatter.result
|
20
94
|
end
|
21
95
|
|
22
|
-
def self.
|
23
|
-
|
24
|
-
|
25
|
-
File.
|
96
|
+
def self.find_dot_rufo(dir)
|
97
|
+
dir = File.expand_path(dir)
|
98
|
+
file = File.join(dir, ".rufo")
|
99
|
+
if File.exist?(file)
|
100
|
+
return file
|
101
|
+
end
|
102
|
+
|
103
|
+
parent_dir = File.dirname(dir)
|
104
|
+
return if parent_dir == dir
|
105
|
+
|
106
|
+
find_dot_rufo(parent_dir)
|
107
|
+
end
|
108
|
+
|
109
|
+
def self.parse_options
|
110
|
+
want_check = false
|
111
|
+
|
112
|
+
OptionParser.new do |opts|
|
113
|
+
opts.banner = "Usage: rufo files or dirs [options]"
|
114
|
+
|
115
|
+
opts.on("-c", "--check", "Only check formating changes") do
|
116
|
+
want_check = true
|
117
|
+
end
|
118
|
+
|
119
|
+
opts.on("-h", "--help", "Show this help") do
|
120
|
+
puts opts
|
121
|
+
exit
|
122
|
+
end
|
123
|
+
end.parse!
|
124
|
+
|
125
|
+
want_check
|
26
126
|
end
|
27
127
|
end
|
data/lib/rufo/formatter.rb
CHANGED
@@ -7,36 +7,20 @@ class Rufo::Formatter
|
|
7
7
|
formatter.result
|
8
8
|
end
|
9
9
|
|
10
|
-
# The indent size (default: 2)
|
11
|
-
attr_accessor :indent_size
|
12
|
-
|
13
|
-
# Whether to align successive comments (default: true)
|
14
|
-
attr_accessor :align_comments
|
15
|
-
|
16
|
-
# Whether to convert multiline `{ ... }` block
|
17
|
-
# to `do ... end` (default: true)
|
18
|
-
attr_accessor :convert_brace_to_do
|
19
|
-
|
20
|
-
# Whether to align successive assignments (default: true)
|
21
|
-
attr_accessor :align_assignments
|
22
|
-
|
23
|
-
# Whether to align successive hash keys (default: true)
|
24
|
-
attr_accessor :align_hash_keys
|
25
|
-
|
26
10
|
def initialize(code, **options)
|
27
|
-
@code
|
11
|
+
@code = code
|
28
12
|
@tokens = Ripper.lex(code).reverse!
|
29
|
-
@sexp
|
13
|
+
@sexp = Ripper.sexp(code)
|
30
14
|
|
31
15
|
unless @sexp
|
32
16
|
raise ::Rufo::SyntaxError.new
|
33
17
|
end
|
34
18
|
|
35
|
-
@indent
|
36
|
-
@line
|
37
|
-
@column
|
19
|
+
@indent = 0
|
20
|
+
@line = 0
|
21
|
+
@column = 0
|
38
22
|
@last_was_newline = false
|
39
|
-
@output
|
23
|
+
@output = ""
|
40
24
|
|
41
25
|
# The column of a `obj.method` call, so we can align
|
42
26
|
# calls to that dot
|
@@ -64,11 +48,37 @@ class Rufo::Formatter
|
|
64
48
|
@hash_keys_positions = []
|
65
49
|
|
66
50
|
# Settings
|
67
|
-
@indent_size
|
68
|
-
@align_comments
|
51
|
+
@indent_size = options.fetch(:indent_size, 2)
|
52
|
+
@align_comments = options.fetch(:align_comments, true)
|
69
53
|
@convert_brace_to_do = options.fetch(:convert_brace_to_do, true)
|
70
|
-
@align_assignments
|
71
|
-
@align_hash_keys
|
54
|
+
@align_assignments = options.fetch(:align_assignments, true)
|
55
|
+
@align_hash_keys = options.fetch(:align_hash_keys, true)
|
56
|
+
end
|
57
|
+
|
58
|
+
# The indent size (default: 2)
|
59
|
+
def indent_size(value)
|
60
|
+
@indent_size = value
|
61
|
+
end
|
62
|
+
|
63
|
+
# Whether to align successive comments (default: true)
|
64
|
+
def align_comments(value)
|
65
|
+
@align_comments = value
|
66
|
+
end
|
67
|
+
|
68
|
+
# Whether to convert multiline `{ ... }` block
|
69
|
+
# to `do ... end` (default: true)
|
70
|
+
def convert_brace_to_do(value)
|
71
|
+
@convert_brace_to_do = value
|
72
|
+
end
|
73
|
+
|
74
|
+
# Whether to align successive assignments (default: true)
|
75
|
+
def align_assignments(value)
|
76
|
+
@align_assignments = value
|
77
|
+
end
|
78
|
+
|
79
|
+
# Whether to align successive hash keys (default: true)
|
80
|
+
def align_hash_keys(value)
|
81
|
+
@align_hash_keys = value
|
72
82
|
end
|
73
83
|
|
74
84
|
def format
|
@@ -105,7 +115,7 @@ class Rufo::Formatter
|
|
105
115
|
when :@tstring_content
|
106
116
|
# [:@tstring_content, "hello ", [1, 1]]
|
107
117
|
heredoc, tilde = @current_heredoc
|
108
|
-
column
|
118
|
+
column = node[2][0]
|
109
119
|
|
110
120
|
# For heredocs with tilde we sometimes need to align the contents
|
111
121
|
if heredoc && tilde && @last_was_newline
|
@@ -306,7 +316,7 @@ class Rufo::Formatter
|
|
306
316
|
# Don't indent if this exp is in the same line as the previous
|
307
317
|
# one (this happens when there's a semicolon between the exps)
|
308
318
|
unless line_before_endline && line_before_endline == @line
|
309
|
-
write_indent
|
319
|
+
write_indent
|
310
320
|
end
|
311
321
|
end
|
312
322
|
|
@@ -340,7 +350,7 @@ class Rufo::Formatter
|
|
340
350
|
def visit_string_literal(node)
|
341
351
|
# [:string_literal, [:string_content, exps]]
|
342
352
|
heredoc = current_token_kind == :on_heredoc_beg
|
343
|
-
tilde
|
353
|
+
tilde = current_token_value.include?("~")
|
344
354
|
|
345
355
|
if heredoc
|
346
356
|
write current_token_value.rstrip
|
@@ -423,7 +433,7 @@ class Rufo::Formatter
|
|
423
433
|
pieces.each_with_index do |piece, i|
|
424
434
|
visit piece
|
425
435
|
unless last?(i, pieces)
|
426
|
-
consume_op "::"
|
436
|
+
consume_op "::"
|
427
437
|
skip_space_or_newline
|
428
438
|
end
|
429
439
|
end
|
@@ -454,7 +464,7 @@ class Rufo::Formatter
|
|
454
464
|
check :on_op
|
455
465
|
|
456
466
|
before = op[1][0...-1]
|
457
|
-
after
|
467
|
+
after = op[1][-1]
|
458
468
|
|
459
469
|
write before
|
460
470
|
track_assignment before.size
|
@@ -491,6 +501,10 @@ class Rufo::Formatter
|
|
491
501
|
end
|
492
502
|
end
|
493
503
|
|
504
|
+
def track_comment
|
505
|
+
@comments_positions << [@line, @column, 0, nil, 0]
|
506
|
+
end
|
507
|
+
|
494
508
|
def track_assignment(offset = 0)
|
495
509
|
track_alignment @assignments_positions, offset
|
496
510
|
end
|
@@ -607,8 +621,8 @@ class Rufo::Formatter
|
|
607
621
|
def visit_call_without_receiver(node)
|
608
622
|
# foo(arg1, ..., argN)
|
609
623
|
#
|
610
|
-
# [:method_add_arg,
|
611
|
-
# [:fcall, [:@ident, "foo", [1, 0]]],
|
624
|
+
# [:method_add_arg,
|
625
|
+
# [:fcall, [:@ident, "foo", [1, 0]]],
|
612
626
|
# [:arg_paren, [:args_add_block, [[:@int, "1", [1, 6]]], false]]]
|
613
627
|
_, name, args = node
|
614
628
|
|
@@ -724,7 +738,7 @@ class Rufo::Formatter
|
|
724
738
|
@current_heredoc = [heredoc, tilde]
|
725
739
|
visit_string_literal_end(heredoc)
|
726
740
|
@current_heredoc = nil
|
727
|
-
printed
|
741
|
+
printed = true
|
728
742
|
end
|
729
743
|
end
|
730
744
|
|
@@ -987,7 +1001,7 @@ class Rufo::Formatter
|
|
987
1001
|
end
|
988
1002
|
|
989
1003
|
def visit_mlhs_paren(node)
|
990
|
-
# [:mlhs_paren,
|
1004
|
+
# [:mlhs_paren,
|
991
1005
|
# [[:mlhs_paren, [:@ident, "x", [1, 12]]]]
|
992
1006
|
# ]
|
993
1007
|
_, args = node
|
@@ -1026,7 +1040,7 @@ class Rufo::Formatter
|
|
1026
1040
|
if inside_call
|
1027
1041
|
if newline? || comment?
|
1028
1042
|
needs_indent = true
|
1029
|
-
base_column
|
1043
|
+
base_column = next_indent
|
1030
1044
|
consume_end_of_line
|
1031
1045
|
write_indent(base_column)
|
1032
1046
|
else
|
@@ -1431,7 +1445,7 @@ class Rufo::Formatter
|
|
1431
1445
|
write_indent(next_indent)
|
1432
1446
|
else
|
1433
1447
|
next_token
|
1434
|
-
write_space " "
|
1448
|
+
write_space " "
|
1435
1449
|
end
|
1436
1450
|
end
|
1437
1451
|
end
|
@@ -1482,11 +1496,11 @@ class Rufo::Formatter
|
|
1482
1496
|
_, key, value = node
|
1483
1497
|
|
1484
1498
|
visit key
|
1485
|
-
|
1499
|
+
|
1486
1500
|
skip_space_or_newline
|
1487
1501
|
consume_space
|
1488
1502
|
|
1489
|
-
track_hash_key
|
1503
|
+
track_hash_key
|
1490
1504
|
|
1491
1505
|
# Don't output `=>` for keys that are `label: value`
|
1492
1506
|
unless key[0] == :@label
|
@@ -1577,7 +1591,7 @@ class Rufo::Formatter
|
|
1577
1591
|
|
1578
1592
|
if args
|
1579
1593
|
indent(needed_indent) do
|
1580
|
-
visit args
|
1594
|
+
visit args
|
1581
1595
|
end
|
1582
1596
|
end
|
1583
1597
|
|
@@ -1603,7 +1617,7 @@ class Rufo::Formatter
|
|
1603
1617
|
end
|
1604
1618
|
|
1605
1619
|
def visit_setter(node)
|
1606
|
-
# foo.bar
|
1620
|
+
# foo.bar
|
1607
1621
|
# (followed by `=`, though not included in this node)
|
1608
1622
|
#
|
1609
1623
|
# [:field, receiver, :".", name]
|
@@ -1926,7 +1940,7 @@ class Rufo::Formatter
|
|
1926
1940
|
end
|
1927
1941
|
|
1928
1942
|
then_keyword = keyword?("then")
|
1929
|
-
inline
|
1943
|
+
inline = then_keyword || semicolon?
|
1930
1944
|
if then_keyword
|
1931
1945
|
next_token
|
1932
1946
|
skip_space
|
@@ -1989,7 +2003,7 @@ class Rufo::Formatter
|
|
1989
2003
|
def skip_space_or_newline(want_semicolon = false)
|
1990
2004
|
found_newline = false
|
1991
2005
|
found_comment = false
|
1992
|
-
last
|
2006
|
+
last = nil
|
1993
2007
|
|
1994
2008
|
while true
|
1995
2009
|
case current_token_kind
|
@@ -1997,7 +2011,7 @@ class Rufo::Formatter
|
|
1997
2011
|
next_token
|
1998
2012
|
when :on_nl, :on_ignored_nl
|
1999
2013
|
next_token
|
2000
|
-
last
|
2014
|
+
last = :newline
|
2001
2015
|
found_newline = true
|
2002
2016
|
when :on_semicolon
|
2003
2017
|
if !found_newline && !found_comment
|
@@ -2017,7 +2031,7 @@ class Rufo::Formatter
|
|
2017
2031
|
end
|
2018
2032
|
next_token
|
2019
2033
|
found_comment = true
|
2020
|
-
last
|
2034
|
+
last = :comment
|
2021
2035
|
else
|
2022
2036
|
break
|
2023
2037
|
end
|
@@ -2048,9 +2062,9 @@ class Rufo::Formatter
|
|
2048
2062
|
# If the value has newlines, we need to adjust line and column
|
2049
2063
|
number_of_lines = value.count("\n")
|
2050
2064
|
if number_of_lines > 0
|
2051
|
-
@line
|
2052
|
-
last_line_index
|
2053
|
-
@column
|
2065
|
+
@line += number_of_lines
|
2066
|
+
last_line_index = value.rindex("\n")
|
2067
|
+
@column = value.size - (last_line_index + 1)
|
2054
2068
|
@last_was_newline = @column == 0
|
2055
2069
|
end
|
2056
2070
|
end
|
@@ -2074,15 +2088,15 @@ class Rufo::Formatter
|
|
2074
2088
|
end
|
2075
2089
|
|
2076
2090
|
# Consume and print an end of line, handling semicolons and comments
|
2077
|
-
#
|
2091
|
+
#
|
2078
2092
|
# - at_prefix: are we at a point before an expression? (if so, we don't need a space before the first comment)
|
2079
2093
|
# - want_semicolon: do we want do print a semicolon to separate expressions?
|
2080
2094
|
# - want_multiline: do we want multiple lines to appear, or at most one?
|
2081
2095
|
def consume_end_of_line(at_prefix = false, want_semicolon = false, want_multiline = true)
|
2082
|
-
found_newline
|
2083
|
-
last
|
2084
|
-
multilple_lines
|
2085
|
-
last_comment_has_newline = false
|
2096
|
+
found_newline = false # Did we find any newline during this method?
|
2097
|
+
last = nil # Last token kind found
|
2098
|
+
multilple_lines = false # Did we pass through more than one newline?
|
2099
|
+
last_comment_has_newline = false # Does the last comment has a newline?
|
2086
2100
|
|
2087
2101
|
while true
|
2088
2102
|
case current_token_kind
|
@@ -2137,13 +2151,13 @@ class Rufo::Formatter
|
|
2137
2151
|
# If we didn't find any newline yet, this is the first comment,
|
2138
2152
|
# so append a space if needed (for example after an expression)
|
2139
2153
|
write_space " " unless at_prefix
|
2140
|
-
|
2154
|
+
track_comment
|
2141
2155
|
end
|
2142
2156
|
end
|
2143
2157
|
last_comment_has_newline = current_token_value.end_with?("\n")
|
2144
2158
|
write current_token_value.rstrip
|
2145
2159
|
next_token
|
2146
|
-
last
|
2160
|
+
last = :comment
|
2147
2161
|
multilple_lines = false
|
2148
2162
|
else
|
2149
2163
|
break
|
@@ -2154,17 +2168,17 @@ class Rufo::Formatter
|
|
2154
2168
|
# either we didn't find a newline and we are at the end of a line (and we didn't just pass a semicolon),
|
2155
2169
|
# or the last thing was a comment (from which we removed the newline)
|
2156
2170
|
# or we just passed multiple lines (but printed only one)
|
2157
|
-
if (!found_newline && !at_prefix && !(want_semicolon && last == :semicolon)) ||
|
2158
|
-
|
2159
|
-
|
2160
|
-
write_line
|
2171
|
+
if (!found_newline && !at_prefix && !(want_semicolon && last == :semicolon)) ||
|
2172
|
+
last == :comment ||
|
2173
|
+
(multilple_lines && want_multiline)
|
2174
|
+
write_line
|
2161
2175
|
end
|
2162
2176
|
end
|
2163
2177
|
|
2164
2178
|
def indent(value = nil)
|
2165
2179
|
if value
|
2166
2180
|
old_indent = @indent
|
2167
|
-
@indent
|
2181
|
+
@indent = value
|
2168
2182
|
yield
|
2169
2183
|
@indent = old_indent
|
2170
2184
|
else
|
@@ -2204,7 +2218,7 @@ class Rufo::Formatter
|
|
2204
2218
|
def write(value)
|
2205
2219
|
@output << value
|
2206
2220
|
@last_was_newline = false
|
2207
|
-
@column
|
2221
|
+
@column += value.size
|
2208
2222
|
end
|
2209
2223
|
|
2210
2224
|
def write_space(value)
|
@@ -2215,15 +2229,15 @@ class Rufo::Formatter
|
|
2215
2229
|
def write_line
|
2216
2230
|
@output << "\n"
|
2217
2231
|
@last_was_newline = true
|
2218
|
-
@column
|
2219
|
-
@line
|
2232
|
+
@column = 0
|
2233
|
+
@line += 1
|
2220
2234
|
end
|
2221
2235
|
|
2222
2236
|
def write_indent(indent = @indent)
|
2223
2237
|
indent.times do
|
2224
2238
|
@output << " "
|
2225
2239
|
end
|
2226
|
-
@column
|
2240
|
+
@column += indent
|
2227
2241
|
@last_was_newline = false
|
2228
2242
|
end
|
2229
2243
|
|
@@ -2328,7 +2342,7 @@ class Rufo::Formatter
|
|
2328
2342
|
end
|
2329
2343
|
|
2330
2344
|
def push_call(call)
|
2331
|
-
old_call
|
2345
|
+
old_call = @current_call
|
2332
2346
|
@current_call = call
|
2333
2347
|
|
2334
2348
|
# A call can specify hash arguments so it acts as a
|
@@ -2341,7 +2355,7 @@ class Rufo::Formatter
|
|
2341
2355
|
end
|
2342
2356
|
|
2343
2357
|
def push_hash(node)
|
2344
|
-
old_hash
|
2358
|
+
old_hash = @current_hash
|
2345
2359
|
@current_hash = node
|
2346
2360
|
yield
|
2347
2361
|
@current_hash = old_hash
|
@@ -2373,18 +2387,19 @@ class Rufo::Formatter
|
|
2373
2387
|
next if comments.size == 1
|
2374
2388
|
|
2375
2389
|
max_column = comments.map { |l, c| c }.max
|
2390
|
+
|
2376
2391
|
comments.each do |(line, column, _, _, offset)|
|
2377
2392
|
next if column == max_column
|
2378
2393
|
|
2379
|
-
split_index
|
2394
|
+
split_index = column
|
2380
2395
|
split_index -= offset if offset
|
2381
2396
|
|
2382
2397
|
target_line = lines[line]
|
2383
2398
|
|
2384
2399
|
before = target_line[0...split_index]
|
2385
|
-
after
|
2400
|
+
after = target_line[split_index..-1]
|
2386
2401
|
|
2387
|
-
filler
|
2402
|
+
filler = " " * (max_column - column)
|
2388
2403
|
lines[line] = "#{before}#{filler}#{after}"
|
2389
2404
|
end
|
2390
2405
|
end
|
@@ -2395,4 +2410,4 @@ class Rufo::Formatter
|
|
2395
2410
|
def result
|
2396
2411
|
@output
|
2397
2412
|
end
|
2398
|
-
end
|
2413
|
+
end
|
data/lib/rufo/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
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.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ary Borenszweig
|
@@ -62,6 +62,7 @@ extra_rdoc_files: []
|
|
62
62
|
files:
|
63
63
|
- ".gitignore"
|
64
64
|
- ".rspec"
|
65
|
+
- ".rufo"
|
65
66
|
- ".travis.yml"
|
66
67
|
- Gemfile
|
67
68
|
- LICENSE.txt
|