rufo 0.0.18 → 0.0.19

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 82f3fd868e4d701c1e505e16a057d8d8e494a925
4
- data.tar.gz: de7c89b69cac54b2640d899310623539d9ec7e25
3
+ metadata.gz: 37581d331f99c0a339a02883d5eee479441a51c7
4
+ data.tar.gz: 5f65749a69f3d7542630b8509bb75b8925be48d1
5
5
  SHA512:
6
- metadata.gz: 28620000e4f9723f908da738c364c35390ae9308aa79590b3485eed9bc30aa0bba7e709927b2357dcd691bfc14552a209d478d38cce03677d0788b23aafdd18e
7
- data.tar.gz: cece98ad578f1a43dadb98791773c062208b40953394b484315b15268293ae50a0766898c644aeb9dfee36bae2a3dfc9b53ad672ea46cc32bf6f1992ef44a3dd
6
+ metadata.gz: 987ae28a14a0c618bed6d037607d698931b71ce3b2757f59078ec68c58b0f239d66077931d9b53a65aa94c75309961fe5834f6dde425889a24165d55b47fb79f
7
+ data.tar.gz: 7070cc3d2d44f9fc55d1029458cf7145d36b7bf97c438ac2cda077f8c670521d5516d3b817e8cc32d483e3799766650327223c7431eca65a3d96a4dd8b3e9608
data/.rufo CHANGED
@@ -1,4 +1,5 @@
1
- align_comments true
2
- align_assignments true
3
- align_hash_keys true
4
- indent_size 2
1
+ space_after_hash_brace :dynamic
2
+ align_comments true
3
+ align_assignments false
4
+ align_hash_keys true
5
+ indent_size 2
data/README.md CHANGED
@@ -58,17 +58,24 @@ The `.rufo` file is a Ruby file that is evaluated in the context of the formatte
58
58
  available configurations:
59
59
 
60
60
  ```ruby
61
+ # Whether to put a space after a hash brace. Valid values are:
62
+ #
63
+ # * :dynamic: if there's a space, keep it. If not, don't keep it (default)
64
+ # * :always: always put a space after a hash brace
65
+ # * :never: never put a space after a hash brace
66
+ space_after_hash_brace :dynamic
67
+
61
68
  # Whether to align successive comments (default: true)
62
- align_comments true
69
+ align_comments true
63
70
 
64
- # Whether to align successive assignments (default: true)
65
- align_assignments true
71
+ # Whether to align successive assignments (default: false)
72
+ align_assignments false
66
73
 
67
74
  # Whether to align successive hash keys (default: true)
68
- align_hash_keys true
75
+ align_hash_keys true
69
76
 
70
77
  # The indent size (default: 2)
71
- indent_size 2
78
+ indent_size 2
72
79
  ```
73
80
 
74
81
  As time passes there might be more configurations available. Please open an
data/lib/rufo/backport.rb CHANGED
@@ -4,8 +4,8 @@ module Rufo::Backport
4
4
  def self.chunk_while(array)
5
5
  results = []
6
6
  current = []
7
- first = true
8
- last = nil
7
+ first = true
8
+ last = nil
9
9
 
10
10
  array.each do |elem|
11
11
  if first
data/lib/rufo/command.rb CHANGED
@@ -1,21 +1,30 @@
1
1
  require "optionparser"
2
2
 
3
- module Rufo::Command
3
+ class Rufo::Command
4
4
  def self.run(argv)
5
- want_check = parse_options(argv)
5
+ want_check, filename_for_dot_rufo = parse_options(argv)
6
+ new(want_check, filename_for_dot_rufo).run(argv)
7
+ end
8
+
9
+ def initialize(want_check, filename_for_dot_rufo)
10
+ @want_check = want_check
11
+ @filename_for_dot_rufo = filename_for_dot_rufo
12
+ @dot_file = Rufo::DotFile.new
13
+ end
6
14
 
15
+ def run(argv)
7
16
  if argv.empty?
8
- format_stdin want_check
17
+ format_stdin
9
18
  else
10
- format_args argv, want_check
19
+ format_args argv
11
20
  end
12
21
  end
13
22
 
14
- def self.format_stdin(want_check)
15
- code = STDIN.read
16
- result = format(code, Dir.getwd)
23
+ def format_stdin
24
+ code = STDIN.read
25
+ result = format(code, @filename_for_dot_rufo || Dir.getwd)
17
26
 
18
- if want_check
27
+ if @want_check
19
28
  exit 1 if result != code
20
29
  else
21
30
  print result
@@ -30,12 +39,12 @@ module Rufo::Command
30
39
  raise ex
31
40
  end
32
41
 
33
- def self.format_args(args, want_check)
42
+ def format_args(args)
34
43
  files = []
35
44
 
36
45
  args.each do |arg|
37
46
  if Dir.exist?(arg)
38
- files.concat Dir["#{arg}/**/*.rb"]
47
+ files.concat Dir["#{arg}/**/*.rb"].select(&File.method(:file?))
39
48
  elsif File.exist?(arg)
40
49
  files << arg
41
50
  else
@@ -46,14 +55,14 @@ module Rufo::Command
46
55
  changed = false
47
56
 
48
57
  files.each do |file|
49
- success = format_file file, want_check
58
+ success = format_file file
50
59
  changed ||= success
51
60
  end
52
61
 
53
62
  exit 1 if changed
54
63
  end
55
64
 
56
- def self.format_file(filename, want_check)
65
+ def format_file(filename)
57
66
  code = File.read(filename)
58
67
 
59
68
  begin
@@ -66,7 +75,7 @@ module Rufo::Command
66
75
  end
67
76
 
68
77
  if code != result
69
- if want_check
78
+ if @want_check
70
79
  STDERR.puts "Error: formatting #{filename} produced changes"
71
80
  else
72
81
  File.write(filename, result)
@@ -88,13 +97,13 @@ module Rufo::Command
88
97
  raise ex
89
98
  end
90
99
 
91
- def self.format(code, dir)
100
+ def format(code, dir)
92
101
  formatter = Rufo::Formatter.new(code)
93
102
 
94
- dot_rufo = find_dot_rufo(dir)
103
+ dot_rufo = @dot_file.find_in(dir)
95
104
  if dot_rufo
96
105
  begin
97
- formatter.instance_eval(File.read(dot_rufo))
106
+ formatter.instance_eval(dot_rufo)
98
107
  rescue => ex
99
108
  STDERR.puts "Error evaluating #{dot_rufo}"
100
109
  raise ex
@@ -105,21 +114,9 @@ module Rufo::Command
105
114
  formatter.result
106
115
  end
107
116
 
108
- def self.find_dot_rufo(dir)
109
- dir = File.expand_path(dir)
110
- file = File.join(dir, ".rufo")
111
- if File.exist?(file)
112
- return file
113
- end
114
-
115
- parent_dir = File.dirname(dir)
116
- return if parent_dir == dir
117
-
118
- find_dot_rufo(parent_dir)
119
- end
120
-
121
117
  def self.parse_options(argv)
122
118
  want_check = false
119
+ filename_for_dot_rufo = nil
123
120
 
124
121
  OptionParser.new do |opts|
125
122
  opts.banner = "Usage: rufo files or dirs [options]"
@@ -128,12 +125,16 @@ module Rufo::Command
128
125
  want_check = true
129
126
  end
130
127
 
128
+ opts.on("--filename=value", "Filename to use to lookup .rufo (useful for STDIN formatting)") do |value|
129
+ filename_for_dot_rufo = value
130
+ end
131
+
131
132
  opts.on("-h", "--help", "Show this help") do
132
133
  puts opts
133
134
  exit
134
135
  end
135
136
  end.parse!(argv)
136
137
 
137
- want_check
138
+ [want_check, filename_for_dot_rufo]
138
139
  end
139
140
  end
@@ -0,0 +1,24 @@
1
+ class Rufo::DotFile
2
+ def initialize
3
+ @cache = {}
4
+ end
5
+
6
+ def find_in(dir)
7
+ @cache.fetch(dir) do
8
+ @cache[dir] = internal_find_in(dir)
9
+ end
10
+ end
11
+
12
+ def internal_find_in(dir)
13
+ dir = File.expand_path(dir)
14
+ file = File.join(dir, ".rufo")
15
+ if File.exist?(file)
16
+ return File.read(file)
17
+ end
18
+
19
+ parent_dir = File.dirname(dir)
20
+ return if parent_dir == dir
21
+
22
+ find_in(parent_dir)
23
+ end
24
+ end
@@ -8,19 +8,19 @@ class Rufo::Formatter
8
8
  end
9
9
 
10
10
  def initialize(code, **options)
11
- @code = code
11
+ @code = code
12
12
  @tokens = Ripper.lex(code).reverse!
13
- @sexp = Ripper.sexp(code)
13
+ @sexp = Ripper.sexp(code)
14
14
 
15
15
  unless @sexp
16
16
  raise ::Rufo::SyntaxError.new
17
17
  end
18
18
 
19
- @indent = 0
20
- @line = 0
21
- @column = 0
19
+ @indent = 0
20
+ @line = 0
21
+ @column = 0
22
22
  @last_was_newline = false
23
- @output = ""
23
+ @output = ""
24
24
 
25
25
  # The column of a `obj.method` call, so we can align
26
26
  # calls to that dot
@@ -53,10 +53,11 @@ class Rufo::Formatter
53
53
  @hash_keys_positions = []
54
54
 
55
55
  # Settings
56
- @indent_size = options.fetch(:indent_size, 2)
57
- @align_comments = options.fetch(:align_comments, true)
58
- @align_assignments = options.fetch(:align_assignments, true)
59
- @align_hash_keys = options.fetch(:align_hash_keys, true)
56
+ indent_size options.fetch(:indent_size, 2)
57
+ space_after_hash_brace options.fetch(:space_after_hash_brace, :dynamic)
58
+ align_comments options.fetch(:align_comments, true)
59
+ align_assignments options.fetch(:align_assignments, false)
60
+ align_hash_keys options.fetch(:align_hash_keys, true)
60
61
  end
61
62
 
62
63
  # The indent size (default: 2)
@@ -64,12 +65,26 @@ class Rufo::Formatter
64
65
  @indent_size = value
65
66
  end
66
67
 
68
+ # Whether to put a space after a hash brace. Valid values are:
69
+ #
70
+ # * :dynamic: if there's a space, keep it. If not, don't keep it (default)
71
+ # * :always: always put a space after a hash brace
72
+ # * :never: never put a space after a hash brace
73
+ def space_after_hash_brace(value)
74
+ case value
75
+ when :dynamic, :always, :never
76
+ @space_after_hash_brace = value
77
+ else
78
+ raise ArgumentError.new("invalid value for #{space_after_hash_brace}: #{value}. Valid values are: :dynamic, :always, :never")
79
+ end
80
+ end
81
+
67
82
  # Whether to align successive comments (default: true)
68
83
  def align_comments(value)
69
84
  @align_comments = value
70
85
  end
71
86
 
72
- # Whether to align successive assignments (default: true)
87
+ # Whether to align successive assignments (default: false)
73
88
  def align_assignments(value)
74
89
  @align_assignments = value
75
90
  end
@@ -146,7 +161,7 @@ class Rufo::Formatter
146
161
  when :@tstring_content
147
162
  # [:@tstring_content, "hello ", [1, 1]]
148
163
  heredoc, tilde = @current_heredoc
149
- column = node[2][0]
164
+ column = node[2][0]
150
165
 
151
166
  # For heredocs with tilde we sometimes need to align the contents
152
167
  if heredoc && tilde && @last_was_newline
@@ -435,7 +450,7 @@ class Rufo::Formatter
435
450
  def visit_string_literal(node)
436
451
  # [:string_literal, [:string_content, exps]]
437
452
  heredoc = current_token_kind == :on_heredoc_beg
438
- tilde = current_token_value.include?("~")
453
+ tilde = current_token_value.include?("~")
439
454
 
440
455
  if heredoc
441
456
  write current_token_value.rstrip
@@ -590,7 +605,7 @@ class Rufo::Formatter
590
605
  check :on_op
591
606
 
592
607
  before = op[1][0...-1]
593
- after = op[1][-1]
608
+ after = op[1][-1]
594
609
 
595
610
  write before
596
611
  track_assignment before.size
@@ -618,15 +633,25 @@ class Rufo::Formatter
618
633
 
619
634
  def visit_assign_value(value)
620
635
  skip_space
621
- indent_after_space value, indentable_keyword?
636
+
637
+ indent_after_space value, indentable_value?(value)
622
638
  end
623
639
 
624
- def indentable_keyword?
640
+ def indentable_value?(value)
625
641
  return unless current_token_kind == :on_kw
626
642
 
627
643
  case current_token_value
628
644
  when "if", "unless", "case"
629
645
  true
646
+ when "begin"
647
+ # Only indent if it's begin/rescue
648
+ return false unless value[0] == :begin
649
+
650
+ body = value[1]
651
+ return false unless body[0] == :bodystmt
652
+
653
+ _, body, rescue_body, else_body, ensure_body = body
654
+ rescue_body || else_body || ensure_body
630
655
  else
631
656
  false
632
657
  end
@@ -874,7 +899,7 @@ class Rufo::Formatter
874
899
  @current_heredoc = [heredoc, tilde]
875
900
  visit_string_literal_end(heredoc)
876
901
  @current_heredoc = nil
877
- printed = true
902
+ printed = true
878
903
  end
879
904
  end
880
905
 
@@ -1132,7 +1157,7 @@ class Rufo::Formatter
1132
1157
  consume_keyword "rescue"
1133
1158
  if type
1134
1159
  skip_space
1135
- write_space " "
1160
+ write_space
1136
1161
  indent(@column) do
1137
1162
  visit_rescue_types(type)
1138
1163
  end
@@ -1140,10 +1165,10 @@ class Rufo::Formatter
1140
1165
 
1141
1166
  if name
1142
1167
  skip_space
1143
- write_space " "
1168
+ write_space
1144
1169
  consume_op "=>"
1145
1170
  skip_space
1146
- write_space " "
1171
+ write_space
1147
1172
  visit name
1148
1173
  end
1149
1174
 
@@ -1308,7 +1333,7 @@ class Rufo::Formatter
1308
1333
 
1309
1334
  if newline? || comment?
1310
1335
  needs_indent = true
1311
- base_column = next_indent
1336
+ base_column = next_indent
1312
1337
  consume_end_of_line
1313
1338
  write_indent(base_column)
1314
1339
  else
@@ -1336,7 +1361,7 @@ class Rufo::Formatter
1336
1361
  write_indent
1337
1362
  end
1338
1363
  else
1339
- write_space " "
1364
+ write_space
1340
1365
  skip_space_or_newline
1341
1366
  end
1342
1367
  end
@@ -1395,7 +1420,7 @@ class Rufo::Formatter
1395
1420
  write_line
1396
1421
  write_indent(next_indent)
1397
1422
  else
1398
- write_space " " if needs_space
1423
+ write_space if needs_space
1399
1424
  end
1400
1425
 
1401
1426
  consume_op_or_keyword op
@@ -1421,15 +1446,15 @@ class Rufo::Formatter
1421
1446
 
1422
1447
  consume_keyword "class"
1423
1448
  skip_space_or_newline
1424
- write_space " "
1449
+ write_space
1425
1450
  visit name
1426
1451
 
1427
1452
  if superclass
1428
1453
  skip_space_or_newline
1429
- write_space " "
1454
+ write_space
1430
1455
  consume_op "<"
1431
1456
  skip_space_or_newline
1432
- write_space " "
1457
+ write_space
1433
1458
  visit superclass
1434
1459
  end
1435
1460
 
@@ -1444,7 +1469,7 @@ class Rufo::Formatter
1444
1469
 
1445
1470
  consume_keyword "module"
1446
1471
  skip_space_or_newline
1447
- write_space " "
1472
+ write_space
1448
1473
  visit name
1449
1474
  maybe_inline_body body
1450
1475
  end
@@ -1599,10 +1624,10 @@ class Rufo::Formatter
1599
1624
  visit_comma_separated_list(args_with_default) do |arg, default|
1600
1625
  visit arg
1601
1626
  skip_space
1602
- write_space " "
1627
+ write_space
1603
1628
  consume_op "="
1604
1629
  skip_space_or_newline
1605
- write_space " "
1630
+ write_space
1606
1631
  visit default
1607
1632
  end
1608
1633
  needs_comma = true
@@ -1678,7 +1703,7 @@ class Rufo::Formatter
1678
1703
  consume_end_of_line
1679
1704
  write_indent
1680
1705
  else
1681
- write_space " "
1706
+ write_space
1682
1707
  skip_space_or_newline
1683
1708
  end
1684
1709
  end
@@ -1753,14 +1778,14 @@ class Rufo::Formatter
1753
1778
  write_indent(next_indent)
1754
1779
  else
1755
1780
  next_token
1756
- write_space " "
1781
+ write_space
1757
1782
  end
1758
1783
  end
1759
1784
  end
1760
1785
  end
1761
1786
 
1762
1787
  has_newline = false
1763
- last_token = nil
1788
+ last_token = nil
1764
1789
 
1765
1790
  while current_token_kind == :on_words_sep
1766
1791
  has_newline ||= current_token_value.include?("\n")
@@ -1830,7 +1855,7 @@ class Rufo::Formatter
1830
1855
  if symbol || !(key[0] == :@label || key[0] == :dyna_symbol)
1831
1856
  consume_op "=>"
1832
1857
  skip_space_or_newline
1833
- write_space " "
1858
+ write_space
1834
1859
  end
1835
1860
 
1836
1861
  visit value
@@ -2152,10 +2177,17 @@ class Rufo::Formatter
2152
2177
  end
2153
2178
 
2154
2179
  def visit_literal_elements(elements, inside_hash = false)
2155
- base_column = @column
2180
+ base_column = @column
2156
2181
  needs_final_space = inside_hash && space?
2157
2182
  skip_space
2158
2183
 
2184
+ case @space_after_hash_brace
2185
+ when :never
2186
+ needs_final_space = false
2187
+ when :always
2188
+ needs_final_space = true
2189
+ end
2190
+
2159
2191
  if newline? || comment?
2160
2192
  needs_final_space = false
2161
2193
  elsif needs_final_space
@@ -2198,7 +2230,7 @@ class Rufo::Formatter
2198
2230
  write_indent(needed_indent)
2199
2231
  end
2200
2232
  else
2201
- write_space " " unless is_last
2233
+ write_space unless is_last
2202
2234
  end
2203
2235
  end
2204
2236
  end
@@ -2290,7 +2322,7 @@ class Rufo::Formatter
2290
2322
 
2291
2323
  # Keep `while cond; end` as is
2292
2324
  semicolon = semicolon?
2293
- is_do = keyword?("do")
2325
+ is_do = keyword?("do")
2294
2326
 
2295
2327
  if (semicolon || is_do) && void_exps?(body)
2296
2328
  next_token
@@ -2366,7 +2398,7 @@ class Rufo::Formatter
2366
2398
  end
2367
2399
 
2368
2400
  then_keyword = keyword?("then")
2369
- inline = then_keyword || semicolon?
2401
+ inline = then_keyword || semicolon?
2370
2402
  if then_keyword
2371
2403
  next_token
2372
2404
  skip_space
@@ -2406,7 +2438,7 @@ class Rufo::Formatter
2406
2438
  if newline? || semicolon? || comment?
2407
2439
  indent_body next_exp[1]
2408
2440
  else
2409
- write_space " "
2441
+ write_space
2410
2442
  visit_exps next_exp[1]
2411
2443
  end
2412
2444
  else
@@ -2417,7 +2449,7 @@ class Rufo::Formatter
2417
2449
 
2418
2450
  def consume_space
2419
2451
  skip_space_or_newline
2420
- write_space " " unless @output[-1] == " "
2452
+ write_space unless @output[-1] == " "
2421
2453
  end
2422
2454
 
2423
2455
  def skip_space
@@ -2436,10 +2468,10 @@ class Rufo::Formatter
2436
2468
  end
2437
2469
 
2438
2470
  def skip_space_or_newline(want_semicolon = false, write_first_semicolon = false)
2439
- found_newline = false
2440
- found_comment = false
2471
+ found_newline = false
2472
+ found_comment = false
2441
2473
  found_semicolon = false
2442
- last = nil
2474
+ last = nil
2443
2475
 
2444
2476
  while true
2445
2477
  case current_token_kind
@@ -2447,14 +2479,14 @@ class Rufo::Formatter
2447
2479
  next_token
2448
2480
  when :on_nl, :on_ignored_nl
2449
2481
  next_token
2450
- last = :newline
2482
+ last = :newline
2451
2483
  found_newline = true
2452
2484
  when :on_semicolon
2453
2485
  if (!found_newline && !found_comment) || (!found_semicolon && write_first_semicolon)
2454
2486
  write "; "
2455
2487
  end
2456
2488
  next_token
2457
- last = :semicolon
2489
+ last = :semicolon
2458
2490
  found_semicolon = true
2459
2491
  when :on_comment
2460
2492
  write_line if last == :newline
@@ -2468,7 +2500,7 @@ class Rufo::Formatter
2468
2500
  end
2469
2501
  next_token
2470
2502
  found_comment = true
2471
- last = :comment
2503
+ last = :comment
2472
2504
  else
2473
2505
  break
2474
2506
  end
@@ -2501,9 +2533,9 @@ class Rufo::Formatter
2501
2533
  # If the value has newlines, we need to adjust line and column
2502
2534
  number_of_lines = value.count("\n")
2503
2535
  if number_of_lines > 0
2504
- @line += number_of_lines
2505
- last_line_index = value.rindex("\n")
2506
- @column = value.size - (last_line_index + 1)
2536
+ @line += number_of_lines
2537
+ last_line_index = value.rindex("\n")
2538
+ @column = value.size - (last_line_index + 1)
2507
2539
  @last_was_newline = @column == 0
2508
2540
  end
2509
2541
  end
@@ -2532,11 +2564,11 @@ class Rufo::Formatter
2532
2564
  # - want_semicolon: do we want do print a semicolon to separate expressions?
2533
2565
  # - want_multiline: do we want multiple lines to appear, or at most one?
2534
2566
  def consume_end_of_line(at_prefix = false, want_semicolon = false, want_multiline = true, needs_two_lines_on_comment = false)
2535
- found_newline = false # Did we find any newline during this method?
2536
- last = nil # Last token kind found
2537
- multilple_lines = false # Did we pass through more than one newline?
2567
+ found_newline = false # Did we find any newline during this method?
2568
+ last = nil # Last token kind found
2569
+ multilple_lines = false # Did we pass through more than one newline?
2538
2570
  last_comment_has_newline = false # Does the last comment has a newline?
2539
- newline_count = 0 # Number of newlines we passed
2571
+ newline_count = 0 # Number of newlines we passed
2540
2572
 
2541
2573
  while true
2542
2574
  case current_token_kind
@@ -2568,7 +2600,7 @@ class Rufo::Formatter
2568
2600
  end
2569
2601
  found_newline = true
2570
2602
  next_token
2571
- last = :newline
2603
+ last = :newline
2572
2604
  newline_count += 1
2573
2605
  when :on_semicolon
2574
2606
  next_token
@@ -2608,20 +2640,20 @@ class Rufo::Formatter
2608
2640
  else
2609
2641
  # If we didn't find any newline yet, this is the first comment,
2610
2642
  # so append a space if needed (for example after an expression)
2611
- write_space " " unless at_prefix
2643
+ write_space unless at_prefix
2612
2644
  track_comment
2613
2645
  end
2614
2646
  end
2615
2647
  last_comment_has_newline = current_token_value.end_with?("\n")
2616
2648
  write current_token_value.rstrip
2617
2649
  next_token
2618
- last = :comment
2650
+ last = :comment
2619
2651
  multilple_lines = false
2620
2652
  when :on_embdoc_beg
2621
2653
  write_line if multilple_lines
2622
2654
 
2623
2655
  consume_embedded_comment
2624
- last = :comment
2656
+ last = :comment
2625
2657
  last_comment_has_newline = true
2626
2658
  else
2627
2659
  break
@@ -2670,7 +2702,7 @@ class Rufo::Formatter
2670
2702
  def indent(value = nil)
2671
2703
  if value
2672
2704
  old_indent = @indent
2673
- @indent = value
2705
+ @indent = value
2674
2706
  yield
2675
2707
  @indent = old_indent
2676
2708
  else
@@ -2710,26 +2742,24 @@ class Rufo::Formatter
2710
2742
  def write(value)
2711
2743
  @output << value
2712
2744
  @last_was_newline = false
2713
- @column += value.size
2745
+ @column += value.size
2714
2746
  end
2715
2747
 
2716
- def write_space(value)
2717
- @output << value
2718
- @column += value.size
2748
+ def write_space
2749
+ @output << " "
2750
+ @column += 1
2719
2751
  end
2720
2752
 
2721
2753
  def write_line
2722
2754
  @output << "\n"
2723
2755
  @last_was_newline = true
2724
- @column = 0
2725
- @line += 1
2756
+ @column = 0
2757
+ @line += 1
2726
2758
  end
2727
2759
 
2728
2760
  def write_indent(indent = @indent)
2729
- indent.times do
2730
- @output << " "
2731
- end
2732
- @column += indent
2761
+ @output << " " * indent
2762
+ @column += indent
2733
2763
  @last_was_newline = false
2734
2764
  end
2735
2765
 
@@ -2743,7 +2773,7 @@ class Rufo::Formatter
2743
2773
  visit node
2744
2774
  end
2745
2775
  else
2746
- write_space " " if want_space
2776
+ write_space if want_space
2747
2777
  if sticky
2748
2778
  indent(@column) do
2749
2779
  visit node
@@ -2813,9 +2843,9 @@ class Rufo::Formatter
2813
2843
 
2814
2844
  def find_closing_brace_token
2815
2845
  count = 0
2816
- i = @tokens.size - 1
2846
+ i = @tokens.size - 1
2817
2847
  while i >= 0
2818
- token = @tokens[i]
2848
+ token = @tokens[i]
2819
2849
  (line, column), kind = token
2820
2850
  case kind
2821
2851
  when :on_lbrace, :on_tlambeg
@@ -2869,7 +2899,7 @@ class Rufo::Formatter
2869
2899
  end
2870
2900
 
2871
2901
  def push_node(node)
2872
- old_node = @current_node
2902
+ old_node = @current_node
2873
2903
  @current_node = node
2874
2904
 
2875
2905
  yield
@@ -2878,7 +2908,7 @@ class Rufo::Formatter
2878
2908
  end
2879
2909
 
2880
2910
  def push_hash(node)
2881
- old_hash = @current_hash
2911
+ old_hash = @current_hash
2882
2912
  @current_hash = node
2883
2913
  yield
2884
2914
  @current_hash = old_hash
@@ -2893,10 +2923,10 @@ class Rufo::Formatter
2893
2923
  end
2894
2924
 
2895
2925
  def do_align_hash_keys
2896
- do_align @hash_keys_positions
2926
+ do_align @hash_keys_positions, true, true
2897
2927
  end
2898
2928
 
2899
- def do_align(elements, adjust_comments = true)
2929
+ def do_align(elements, adjust_comments = true, hash_keys = false)
2900
2930
  lines = @output.lines
2901
2931
 
2902
2932
  elements.reject! { |l, c, indent, id, off, ignore| ignore == :ignore }
@@ -2909,21 +2939,38 @@ class Rufo::Formatter
2909
2939
  chunks.each do |comments|
2910
2940
  next if comments.size == 1
2911
2941
 
2942
+ if hash_keys
2943
+ # Don't indent successive hash keys if any of them is in turn a hash
2944
+ # or array literal that is formatted in separate lines.
2945
+ has_brace_newline = comments.any? do |(l, c)|
2946
+ line_end = lines[l][c..-1]
2947
+ line_end.start_with?("=> {\n") ||
2948
+ line_end.start_with?("=> [\n") ||
2949
+ line_end.start_with?("=> [ #") ||
2950
+ line_end.start_with?("=> { #") ||
2951
+ line_end.start_with?("[\n") ||
2952
+ line_end.start_with?("{\n") ||
2953
+ line_end.start_with?("[ #") ||
2954
+ line_end.start_with?("{ #")
2955
+ end
2956
+ next if has_brace_newline
2957
+ end
2958
+
2912
2959
  max_column = comments.map { |l, c| c }.max
2913
2960
 
2914
2961
  comments.each do |(line, column, _, _, offset)|
2915
2962
  next if column == max_column
2916
2963
 
2917
- split_index = column
2964
+ split_index = column
2918
2965
  split_index -= offset if offset
2919
2966
 
2920
2967
  target_line = lines[line]
2921
2968
 
2922
2969
  before = target_line[0...split_index]
2923
- after = target_line[split_index..-1]
2970
+ after = target_line[split_index..-1]
2924
2971
 
2925
2972
  filler_size = max_column - column
2926
- filler = " " * filler_size
2973
+ filler = " " * filler_size
2927
2974
 
2928
2975
  if adjust_comments && (index = @line_to_comments_position_index[line])
2929
2976
  @comments_positions[index][1] += filler_size
data/lib/rufo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Rufo
2
- VERSION = "0.0.18"
2
+ VERSION = "0.0.19"
3
3
  end
data/lib/rufo.rb CHANGED
@@ -10,5 +10,6 @@ end
10
10
 
11
11
  require_relative "rufo/backport"
12
12
  require_relative "rufo/command"
13
+ require_relative "rufo/dot_file"
13
14
  require_relative "rufo/formatter"
14
15
  require_relative "rufo/version"
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.18
4
+ version: 0.0.19
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ary Borenszweig
@@ -74,6 +74,7 @@ files:
74
74
  - lib/rufo.rb
75
75
  - lib/rufo/backport.rb
76
76
  - lib/rufo/command.rb
77
+ - lib/rufo/dot_file.rb
77
78
  - lib/rufo/formatter.rb
78
79
  - lib/rufo/version.rb
79
80
  - rakelib/ci.rake