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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f4bd80b45163ec985e39e5755663d53b0931911e
4
- data.tar.gz: 97891fb7b41a5ecfad21e2de5a3b2e173225f23e
3
+ metadata.gz: bd6cf27bd7b2fb2451482dff10c6fe5a3930311e
4
+ data.tar.gz: 7a4eebf1d5df0dc1ae9e05f9a04030cef866cdf2
5
5
  SHA512:
6
- metadata.gz: aa93f77d18292af45a8bc6778c15a61aca17abaf90e512e5226a683f2c91d6d06f02073f16eabf95f10b073b649685b02358ae448c76c5b63a899701ee12ee2f
7
- data.tar.gz: 5ca62d116346c59054241b98f1f944b4fb6e9a7a252d10b19d8960894adb8db1d940f98d3a2d5889dac5c9760a0f4e217a6d00537547706ba7f5ab1bb74b1cb5
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 (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.
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
- success = format_file file
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
@@ -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
- @line_to_comments_position_index = {}
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
- @line_to_comments_position_index[@line] = @comments_positions.size
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, false
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, true, true
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, adjust_comments = true, hash_keys = false)
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 hash_keys
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
- if adjust_comments && (index = @line_to_comments_position_index[line])
3054
- @comments_positions[index][1] += filler_size
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
@@ -1,3 +1,3 @@
1
1
  module Rufo
2
- VERSION = "0.0.22"
2
+ VERSION = "0.0.24"
3
3
  end
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.22
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-25 00:00:00.000000000 Z
11
+ date: 2017-06-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler