ruby-beautify 0.92.2 → 0.93.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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/README.md +44 -13
- data/bin/rbeautify +164 -12
- data/lib/ruby-beautify.rb +0 -6
- data/lib/ruby-beautify/version.rb +1 -1
- data/ruby-beautify.gemspec +1 -1
- metadata +11 -40
- data/lib/beautifier.rb +0 -168
- data/lib/ruby-beautify/block_end.rb +0 -23
- data/lib/ruby-beautify/block_matcher.rb +0 -153
- data/lib/ruby-beautify/block_start.rb +0 -119
- data/lib/ruby-beautify/config/ruby.rb +0 -131
- data/lib/ruby-beautify/language.rb +0 -37
- data/lib/ruby-beautify/line.rb +0 -53
- data/spec/fixtures/ruby.yml +0 -408
- data/spec/rbeautify/block_matcher_spec.rb +0 -89
- data/spec/rbeautify/block_start_spec.rb +0 -51
- data/spec/rbeautify/config/ruby_spec.rb +0 -183
- data/spec/rbeautify/line_spec.rb +0 -73
- data/spec/rbeautify_spec.rb +0 -1
- data/spec/spec_helper.rb +0 -124
@@ -1,23 +0,0 @@
|
|
1
|
-
module RBeautify
|
2
|
-
|
3
|
-
class BlockEnd
|
4
|
-
|
5
|
-
attr_accessor :block_start, :offset, :match, :after_match
|
6
|
-
|
7
|
-
def initialize(block_start, offset, match, after_match)
|
8
|
-
self.block_start = block_start
|
9
|
-
self.offset = offset
|
10
|
-
self.match = match
|
11
|
-
self.after_match = after_match
|
12
|
-
end
|
13
|
-
|
14
|
-
def end_offset
|
15
|
-
offset + match.length
|
16
|
-
end
|
17
|
-
|
18
|
-
def end_can_also_be_start?
|
19
|
-
block_start.block_matcher.end_can_also_be_start?
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
23
|
-
end
|
@@ -1,153 +0,0 @@
|
|
1
|
-
module RBeautify
|
2
|
-
|
3
|
-
class BlockMatcher
|
4
|
-
|
5
|
-
attr_reader :language, :name, :starts, :ends, :options
|
6
|
-
|
7
|
-
def initialize(language, name, starts, ends, options = {})
|
8
|
-
@language = language
|
9
|
-
@name = name
|
10
|
-
@starts = starts
|
11
|
-
@ends = ends.nil? ? starts : ends
|
12
|
-
@options = options
|
13
|
-
end
|
14
|
-
|
15
|
-
class << self
|
16
|
-
def parse(language, original_block, line_number, string, current_offset)
|
17
|
-
block_end = original_block && original_block.parse_block_end(string, current_offset)
|
18
|
-
|
19
|
-
if (block_start = first_block_start(language,
|
20
|
-
original_block,
|
21
|
-
line_number,
|
22
|
-
string,
|
23
|
-
current_offset,
|
24
|
-
block_end.nil? ? nil : block_end.offset))
|
25
|
-
|
26
|
-
block_end = nil
|
27
|
-
end
|
28
|
-
|
29
|
-
if block_end
|
30
|
-
# Check whether the section of the line which is a block end is also a block start
|
31
|
-
if block_end.end_can_also_be_start? &&
|
32
|
-
(block_start_candidate = first_block_start(language, block_end.block_start.parent, line_number, string, current_offset)) &&
|
33
|
-
block_start_candidate.offset == block_end.offset
|
34
|
-
block_start = block_start_candidate
|
35
|
-
end
|
36
|
-
|
37
|
-
end
|
38
|
-
|
39
|
-
if block_start
|
40
|
-
if debug
|
41
|
-
puts "MATCH: '#{string.slice(0, string.length - block_start.match.length - block_start.after_match.length)}<START type=#{block_start.name}>#{block_start.match}</START>#{block_start.after_match}'"
|
42
|
-
end
|
43
|
-
parse(language, block_start, line_number, block_start.after_match, block_start.end_offset)
|
44
|
-
elsif block_end
|
45
|
-
if debug
|
46
|
-
puts "MATCH: '#{string.slice(0, string.length - block_end.match.length - block_end.after_match.length)}<END>#{block_end.match}</END>#{block_end.after_match}'"
|
47
|
-
end
|
48
|
-
parse(language, block_end.block_start.parent, line_number, block_end.after_match, block_end.end_offset)
|
49
|
-
else
|
50
|
-
original_block
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
def debug=(value)
|
55
|
-
@debug = value
|
56
|
-
end
|
57
|
-
|
58
|
-
def debug
|
59
|
-
@debug
|
60
|
-
end
|
61
|
-
|
62
|
-
private
|
63
|
-
def first_block_start(language, parent_block, line_number, string, offset, maximum_offset = nil)
|
64
|
-
first_block_start = nil
|
65
|
-
language.matchers.each do |matcher|
|
66
|
-
if matcher.can_nest?(parent_block)
|
67
|
-
if (block_start_candidate = matcher.parse_block_start(string, parent_block, offset, line_number)) &&
|
68
|
-
(maximum_offset.nil? || maximum_offset > block_start_candidate.offset)
|
69
|
-
first_block_start = block_start_candidate
|
70
|
-
maximum_offset = first_block_start.offset
|
71
|
-
end
|
72
|
-
end
|
73
|
-
end
|
74
|
-
first_block_start
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
|
-
def parse_block_start(string, parent_block, offset, line_number)
|
79
|
-
if !string.empty? && (match = starts.match(string))
|
80
|
-
RBeautify::BlockStart.new(self, parent_block, line_number, offset + match.begin(0), match[0], match.post_match)
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def indent_end_line?(block)
|
85
|
-
evaluate_option_for_block(:indent_end_line, block)
|
86
|
-
end
|
87
|
-
|
88
|
-
def indent_size(block)
|
89
|
-
evaluate_option_for_block(:indent_size, block) || language.indent_size
|
90
|
-
end
|
91
|
-
|
92
|
-
# Look for blocks within the content of this one
|
93
|
-
def parse_content?
|
94
|
-
options[:parse_content] != false
|
95
|
-
end
|
96
|
-
|
97
|
-
# Indent the content of this block
|
98
|
-
def format_content?
|
99
|
-
options[:format_content] != false
|
100
|
-
end
|
101
|
-
|
102
|
-
def can_nest?(parent_block)
|
103
|
-
return false unless parent_block.nil? || parent_block.parse_content?
|
104
|
-
|
105
|
-
if options[:nest_only]
|
106
|
-
parent_block && options[:nest_only].include?(parent_block.name)
|
107
|
-
else
|
108
|
-
parent_block.nil? ||
|
109
|
-
options[:nest_except].nil? || !options[:nest_except].include?(parent_block.name)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
def ends?
|
114
|
-
ends != false
|
115
|
-
end
|
116
|
-
|
117
|
-
def end_is_implicit?
|
118
|
-
options[:end] == :implicit
|
119
|
-
end
|
120
|
-
|
121
|
-
def end_can_also_be_start?
|
122
|
-
if ends == starts
|
123
|
-
options[:end_can_also_be_start] == true
|
124
|
-
else
|
125
|
-
options[:end_can_also_be_start] != false
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def negate_ends_match?
|
130
|
-
options[:negate_ends_match]
|
131
|
-
end
|
132
|
-
|
133
|
-
# True if blocks can contain the escape character \ which needs to be
|
134
|
-
# checked for on end match
|
135
|
-
def escape_character?
|
136
|
-
options[:escape_character] == true
|
137
|
-
end
|
138
|
-
|
139
|
-
def inspect
|
140
|
-
name
|
141
|
-
end
|
142
|
-
|
143
|
-
private
|
144
|
-
def evaluate_option_for_block(key, block)
|
145
|
-
if options[key] && options[key].respond_to?(:call)
|
146
|
-
options[key].call(block)
|
147
|
-
else
|
148
|
-
options[key]
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
end
|
153
|
-
end
|
@@ -1,119 +0,0 @@
|
|
1
|
-
module RBeautify
|
2
|
-
|
3
|
-
class BlockStart
|
4
|
-
|
5
|
-
attr_reader :block_matcher, :parent, :offset, :match, :after_match, :line_number
|
6
|
-
|
7
|
-
class << self
|
8
|
-
def first_common_ancestor(first, second)
|
9
|
-
if first.nil? || second.nil?
|
10
|
-
nil
|
11
|
-
else
|
12
|
-
(first.ancestors & second.ancestors).last
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize(block_matcher, parent, line_number, offset, match, after_match)
|
18
|
-
@block_matcher = block_matcher
|
19
|
-
@parent = parent
|
20
|
-
@offset = offset
|
21
|
-
@match = match
|
22
|
-
@after_match = after_match
|
23
|
-
@line_number = line_number
|
24
|
-
end
|
25
|
-
|
26
|
-
def end_offset
|
27
|
-
offset + match.length
|
28
|
-
end
|
29
|
-
|
30
|
-
def parse_block_end(string, offset)
|
31
|
-
block_end = parse_explicit_block_end(string, offset)
|
32
|
-
|
33
|
-
# Handle case where end is implicit
|
34
|
-
if block_end.nil? && end_is_implicit? && parent
|
35
|
-
block_end = parent.parse_block_end(string, offset)
|
36
|
-
end
|
37
|
-
|
38
|
-
block_end
|
39
|
-
end
|
40
|
-
|
41
|
-
def format_content?
|
42
|
-
block_matcher.format_content?
|
43
|
-
end
|
44
|
-
|
45
|
-
def parse_content?
|
46
|
-
block_matcher.parse_content?
|
47
|
-
end
|
48
|
-
|
49
|
-
def indent_end_line?
|
50
|
-
block_matcher.indent_end_line?(self)
|
51
|
-
end
|
52
|
-
|
53
|
-
def total_indent_size
|
54
|
-
parent.nil? ? indent_size : parent.total_indent_size + indent_size
|
55
|
-
end
|
56
|
-
|
57
|
-
def indent_size
|
58
|
-
block_matcher.indent_size(self)
|
59
|
-
end
|
60
|
-
|
61
|
-
def end_is_implicit?
|
62
|
-
block_matcher.end_is_implicit?
|
63
|
-
end
|
64
|
-
|
65
|
-
def name
|
66
|
-
block_matcher.name
|
67
|
-
end
|
68
|
-
|
69
|
-
# Returns true if strict ancestor of
|
70
|
-
def strict_ancestor_of?(block_start)
|
71
|
-
block_start && block_start.parent && (self == block_start.parent || strict_ancestor_of?(block_start.parent))
|
72
|
-
end
|
73
|
-
|
74
|
-
def ancestors
|
75
|
-
if parent
|
76
|
-
parent.ancestors + [self]
|
77
|
-
else
|
78
|
-
[self]
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
private
|
83
|
-
def ends?
|
84
|
-
block_matcher.ends?
|
85
|
-
end
|
86
|
-
|
87
|
-
def negate_ends_match?
|
88
|
-
block_matcher.negate_ends_match?
|
89
|
-
end
|
90
|
-
|
91
|
-
def escape_character?
|
92
|
-
block_matcher.escape_character?
|
93
|
-
end
|
94
|
-
|
95
|
-
def parse_explicit_block_end(string, offset)
|
96
|
-
block_end = nil
|
97
|
-
|
98
|
-
if ends?
|
99
|
-
|
100
|
-
if match = block_matcher.ends.match(string)
|
101
|
-
unless negate_ends_match?
|
102
|
-
if escape_character? &&
|
103
|
-
((escape_chars = match.pre_match.match(/\\*$/)) && (escape_chars[0].size % 2 == 1))
|
104
|
-
# If there are an odd number of escape characters just before
|
105
|
-
# the match then this match should be skipped
|
106
|
-
return parse_explicit_block_end(match.post_match, offset + escape_chars[0].size + match[0].length)
|
107
|
-
else
|
108
|
-
return RBeautify::BlockEnd.new(self, offset + match.begin(0), match[0], match.post_match)
|
109
|
-
end
|
110
|
-
end
|
111
|
-
elsif negate_ends_match?
|
112
|
-
return RBeautify::BlockEnd.new(self, offset, '', string)
|
113
|
-
end
|
114
|
-
|
115
|
-
end
|
116
|
-
end
|
117
|
-
|
118
|
-
end
|
119
|
-
end
|
@@ -1,131 +0,0 @@
|
|
1
|
-
# define ruby language
|
2
|
-
|
3
|
-
unless RBeautify::Language.language(:ruby)
|
4
|
-
|
5
|
-
ruby = RBeautify::Language.add_language(:ruby)
|
6
|
-
|
7
|
-
pre_keyword_boundary = '(^|[^a-z0-9A-Z:._])' # like \b but with : , . _ all added to list of exceptions
|
8
|
-
start_statement_boundary = '(^|(;|=)\s*)'
|
9
|
-
continue_statement_boundary = '(^|;\s*)'
|
10
|
-
ruby.indent_size = 2
|
11
|
-
|
12
|
-
ruby.add_matcher(:program_end, /^__END__$/, false, :format_content => false, :parse_content => false)
|
13
|
-
|
14
|
-
ruby.add_matcher(:multiline_comment, /^=begin/, /^=end/, :format_content => false, :parse_content => false)
|
15
|
-
|
16
|
-
ruby.add_matcher(:double_quote,
|
17
|
-
/"/,
|
18
|
-
/"/,
|
19
|
-
:parse_content => true,
|
20
|
-
:format_content => false,
|
21
|
-
:escape_character => true,
|
22
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
23
|
-
|
24
|
-
# NEED TO MODIFY DOUBLE QUOTE TO BE FORMATTED to get this to work
|
25
|
-
ruby.add_matcher(:interpolation,
|
26
|
-
/#\{/,
|
27
|
-
/\}/,
|
28
|
-
:nest_only => [:double_quote, :regex, :backtick])
|
29
|
-
|
30
|
-
ruby.add_matcher(:single_quote,
|
31
|
-
/'/,
|
32
|
-
/'/,
|
33
|
-
:parse_content => false,
|
34
|
-
:format_content => false,
|
35
|
-
:escape_character => true,
|
36
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
37
|
-
|
38
|
-
ruby.add_matcher(:regex,
|
39
|
-
/(^|((,|=|~)\s*))\//, # Try to distinguish it from division sign
|
40
|
-
/\//,
|
41
|
-
:format_content => false,
|
42
|
-
:escape_character => true,
|
43
|
-
:end_can_also_be_start => false,
|
44
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
45
|
-
|
46
|
-
ruby.add_matcher(:back_tick,
|
47
|
-
/`/,
|
48
|
-
/`/,
|
49
|
-
:format_content => false,
|
50
|
-
:escape_character => true,
|
51
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
52
|
-
|
53
|
-
ruby.add_matcher(:standard,
|
54
|
-
/((#{start_statement_boundary}(module|class|def))|#{pre_keyword_boundary}do)\b/,
|
55
|
-
/(((^|;|\s)end)|#{continue_statement_boundary}(rescue|ensure))\b/,
|
56
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
57
|
-
|
58
|
-
ruby.add_matcher(:more,
|
59
|
-
/#{start_statement_boundary}(until|for|while)\b/,
|
60
|
-
/(((^|;|\s)end)|#{continue_statement_boundary}(rescue|ensure))\b/,
|
61
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
62
|
-
|
63
|
-
ruby.add_matcher(:begin,
|
64
|
-
/((#{start_statement_boundary}begin)|(#{continue_statement_boundary}(ensure|rescue)))\b/,
|
65
|
-
/(((^|;|\s)end)|#{continue_statement_boundary}(rescue|ensure|else))\b/,
|
66
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
67
|
-
|
68
|
-
ruby.add_matcher(:if,
|
69
|
-
/((#{start_statement_boundary}(if|unless))|#{continue_statement_boundary}(then|elsif|else))\b/,
|
70
|
-
/(((^|;|\s)end)|(#{continue_statement_boundary}(then|elsif|else)))\b/,
|
71
|
-
:nest_except => [:case, :double_quote, :regex, :backtick])
|
72
|
-
|
73
|
-
ruby.add_matcher(:case,
|
74
|
-
/#{pre_keyword_boundary}case\b/,
|
75
|
-
/(^|;|\s)end\b/,
|
76
|
-
:nest_except => [:double_quote, :regex, :backtick],
|
77
|
-
:indent_size => 0)
|
78
|
-
|
79
|
-
ruby.add_matcher(:inner_case,
|
80
|
-
/#{continue_statement_boundary}(when|else|then)\b/,
|
81
|
-
/#{continue_statement_boundary}(when|else|then)\b/,
|
82
|
-
:nest_only => [:case],
|
83
|
-
:end => :implicit,
|
84
|
-
:end_can_also_be_start => true,
|
85
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
86
|
-
|
87
|
-
# TODO: Improve the check that this is not a block with arguments. Will
|
88
|
-
# currently match any bracket followed by spaces and |.
|
89
|
-
bracket_indent_end_line_proc = Proc.new { |block| !block.after_match.empty? && !block.after_match.match(/^\|/) }
|
90
|
-
bracket_indent_size_proc = Proc.new do |block|
|
91
|
-
if bracket_indent_end_line_proc.call(block)
|
92
|
-
strict_ancestors_on_same_line = block.ancestors.select { |a| a != block && a.line_number == block.line_number }
|
93
|
-
block.end_offset - strict_ancestors_on_same_line.inject(0) { |sum, a| sum + a.indent_size }
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
ruby.add_matcher(:curly_bracket,
|
98
|
-
/\{\s*/,
|
99
|
-
/\}/,
|
100
|
-
:indent_end_line => bracket_indent_end_line_proc,
|
101
|
-
:indent_size => bracket_indent_size_proc,
|
102
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
103
|
-
|
104
|
-
ruby.add_matcher(:round_bracket,
|
105
|
-
/\(\s*/,
|
106
|
-
/\)/,
|
107
|
-
:indent_end_line => bracket_indent_end_line_proc,
|
108
|
-
:indent_size => bracket_indent_size_proc,
|
109
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
110
|
-
|
111
|
-
ruby.add_matcher(:square_bracket,
|
112
|
-
/\[\s*/,
|
113
|
-
/\]/,
|
114
|
-
:indent_end_line => bracket_indent_end_line_proc,
|
115
|
-
:indent_size => bracket_indent_size_proc,
|
116
|
-
:nest_except => [:double_quote, :regex, :backtick])
|
117
|
-
|
118
|
-
ruby.add_matcher(:comment, /(\s*)?#/,
|
119
|
-
/$/,
|
120
|
-
:parse_content => false,
|
121
|
-
:format_content => false,
|
122
|
-
:nest_except => [:double_quote, :single_quote, :regex, :back_tick])
|
123
|
-
|
124
|
-
ruby.add_matcher(:continuing_line,
|
125
|
-
/(,|\.|\+|-|=\>|=|&&|\|\||\\|==|\s\?|:|<<)(\s*)?(#.*)?$/,
|
126
|
-
/(^|(,|\.|\+|-|=\>|=|&&|\|\||\\|==|\s\?|:|<<)(\s*)?)(#.*)?$/,
|
127
|
-
:indent_end_line => true,
|
128
|
-
:negate_ends_match => true,
|
129
|
-
:nest_except => [:continuing_line, :curly_bracket, :round_bracket, :square_bracket, :double_quote, :single_quote, :regex, :back_tick])
|
130
|
-
|
131
|
-
end
|
@@ -1,37 +0,0 @@
|
|
1
|
-
module RBeautify
|
2
|
-
class Language
|
3
|
-
|
4
|
-
@@languages = {}
|
5
|
-
|
6
|
-
attr_reader :matchers
|
7
|
-
attr_accessor :indent_size
|
8
|
-
|
9
|
-
class << self
|
10
|
-
|
11
|
-
def language(name)
|
12
|
-
languages[name]
|
13
|
-
end
|
14
|
-
|
15
|
-
def languages
|
16
|
-
@@languages
|
17
|
-
end
|
18
|
-
|
19
|
-
def add_language(name)
|
20
|
-
languages[name] = new()
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def initialize
|
25
|
-
@matchers = []
|
26
|
-
end
|
27
|
-
|
28
|
-
def add_matcher(name, starts, ends, options = {})
|
29
|
-
self.matchers << BlockMatcher.new(self, name, starts, ends, options)
|
30
|
-
end
|
31
|
-
|
32
|
-
def matcher(name)
|
33
|
-
self.matchers.detect { |matcher| matcher.name == name}
|
34
|
-
end
|
35
|
-
|
36
|
-
end
|
37
|
-
end
|