haml_lint 0.14.1 → 0.15.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/config/default.yml +8 -0
- data/lib/haml_lint/cli.rb +22 -5
- data/lib/haml_lint/document.rb +4 -1
- data/lib/haml_lint/exceptions.rb +3 -0
- data/lib/haml_lint/linter/final_newline.rb +21 -0
- data/lib/haml_lint/linter/indentation.rb +23 -0
- data/lib/haml_lint/linter/unnecessary_string_output.rb +1 -1
- data/lib/haml_lint/logger.rb +5 -16
- data/lib/haml_lint/node_transformer.rb +5 -5
- data/lib/haml_lint/options.rb +4 -0
- data/lib/haml_lint/runner.rb +1 -1
- data/lib/haml_lint/tree/tag_node.rb +5 -14
- data/lib/haml_lint/utils.rb +5 -0
- data/lib/haml_lint/version.rb +1 -1
- data/lib/haml_lint.rb +3 -2
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fa23a0a6cf7859c1d52147bb83dffea555ca12ef
|
4
|
+
data.tar.gz: f68ba67d32f4d76cb0632b69ff10e3d801f4e0e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: adbaa7dba069ef58a9522a8b5ad7ce39f21aa54a9aa3fe132799f6f2fee929f7510df2029bb6e55d2a4776a8fb1e091c5896ece3a3b1b73ffcc897df44b15c64
|
7
|
+
data.tar.gz: 8e8246c549c8322a202885179c301f98e5e818aefdb2badc9c0fa83ee4974366d88dee6da61f2a0df571df05829950be26e8ada196e00c4f3ad90ce024235655
|
data/config/default.yml
CHANGED
@@ -27,6 +27,10 @@ linters:
|
|
27
27
|
EmptyScript:
|
28
28
|
enabled: true
|
29
29
|
|
30
|
+
FinalNewline:
|
31
|
+
enabled: true
|
32
|
+
present: true
|
33
|
+
|
30
34
|
HtmlAttributes:
|
31
35
|
enabled: true
|
32
36
|
|
@@ -79,6 +83,10 @@ linters:
|
|
79
83
|
enabled: true
|
80
84
|
style: space
|
81
85
|
|
86
|
+
Indentation:
|
87
|
+
enabled: true
|
88
|
+
character: space # or tab
|
89
|
+
|
82
90
|
TagName:
|
83
91
|
enabled: true
|
84
92
|
|
data/lib/haml_lint/cli.rb
CHANGED
@@ -5,7 +5,7 @@ require 'sysexits'
|
|
5
5
|
|
6
6
|
module HamlLint
|
7
7
|
# Command line application interface.
|
8
|
-
class CLI
|
8
|
+
class CLI # rubocop:disable Metrics/ClassLength
|
9
9
|
# Create a CLI that outputs to the specified logger.
|
10
10
|
#
|
11
11
|
# @param logger [HamlLint::Logger]
|
@@ -38,8 +38,8 @@ module HamlLint
|
|
38
38
|
if options[:help]
|
39
39
|
print_help(options)
|
40
40
|
Sysexits::EX_OK
|
41
|
-
elsif options[:version]
|
42
|
-
print_version
|
41
|
+
elsif options[:version] || options[:verbose_version]
|
42
|
+
print_version(options)
|
43
43
|
Sysexits::EX_OK
|
44
44
|
elsif options[:show_linters]
|
45
45
|
print_available_linters
|
@@ -123,17 +123,34 @@ module HamlLint
|
|
123
123
|
end
|
124
124
|
|
125
125
|
# Outputs the application name and version.
|
126
|
-
def print_version
|
126
|
+
def print_version(options)
|
127
127
|
log.log "#{HamlLint::APP_NAME} #{HamlLint::VERSION}"
|
128
|
+
|
129
|
+
if options[:verbose_version]
|
130
|
+
log.log "haml #{Gem.loaded_specs['haml'].version}"
|
131
|
+
log.log "rubocop #{Gem.loaded_specs['rubocop'].version}"
|
132
|
+
log.log RUBY_DESCRIPTION
|
133
|
+
end
|
128
134
|
end
|
129
135
|
|
130
136
|
# Outputs the backtrace of an exception with instructions on how to report
|
131
137
|
# the issue.
|
132
|
-
def print_unexpected_exception(ex)
|
138
|
+
def print_unexpected_exception(ex) # rubocop:disable Metrics/AbcSize
|
133
139
|
log.bold_error ex.message
|
134
140
|
log.error ex.backtrace.join("\n")
|
135
141
|
log.warning 'Report this bug at ', false
|
136
142
|
log.info HamlLint::BUG_REPORT_URL
|
143
|
+
log.newline
|
144
|
+
log.success 'To help fix this issue, please include:'
|
145
|
+
log.log '- The above stack trace'
|
146
|
+
log.log '- Haml-Lint version: ', false
|
147
|
+
log.info HamlLint::VERSION
|
148
|
+
log.log '- Haml version: ', false
|
149
|
+
log.info Gem.loaded_specs['haml'].version
|
150
|
+
log.log '- RuboCop version: ', false
|
151
|
+
log.info Gem.loaded_specs['rubocop'].version
|
152
|
+
log.log '- Ruby version: ', false
|
153
|
+
log.info RUBY_VERSION
|
137
154
|
end
|
138
155
|
end
|
139
156
|
end
|
data/lib/haml_lint/document.rb
CHANGED
@@ -35,12 +35,15 @@ module HamlLint
|
|
35
35
|
private
|
36
36
|
|
37
37
|
# @param source [String] Haml code to parse
|
38
|
-
# @raise [
|
38
|
+
# @raise [HamlLint::Exceptions::ParseError] if there was a problem parsing
|
39
39
|
def process_source(source)
|
40
40
|
@source = strip_frontmatter(source)
|
41
41
|
@source_lines = @source.split("\n")
|
42
42
|
|
43
43
|
@tree = process_tree(Haml::Parser.new(@source, Haml::Options.new).parse)
|
44
|
+
rescue Haml::Error => ex
|
45
|
+
error = HamlLint::Exceptions::ParseError.new(ex.message, ex.line)
|
46
|
+
raise error
|
44
47
|
end
|
45
48
|
|
46
49
|
# Processes the {Haml::Parser::ParseNode} tree and returns a tree composed
|
data/lib/haml_lint/exceptions.rb
CHANGED
@@ -9,6 +9,9 @@ module HamlLint::Exceptions
|
|
9
9
|
# Raised when an invalid file path is specified
|
10
10
|
class InvalidFilePath < StandardError; end
|
11
11
|
|
12
|
+
# Raised when a problem occurs parsing a HAML document.
|
13
|
+
class ParseError < ::Haml::SyntaxError; end
|
14
|
+
|
12
15
|
# Raised when attempting to execute `Runner` with options that would result in
|
13
16
|
# no linters being enabled.
|
14
17
|
class NoLintersError < StandardError; end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module HamlLint
|
2
|
+
# Checks for final newlines at the end of a file.
|
3
|
+
class Linter::FinalNewline < Linter
|
4
|
+
include LinterRegistry
|
5
|
+
|
6
|
+
def visit_root(_node)
|
7
|
+
return if document.source.empty?
|
8
|
+
|
9
|
+
dummy_node = Struct.new(:line).new(document.source_lines.count)
|
10
|
+
ends_with_newline = document.source.end_with?("\n")
|
11
|
+
|
12
|
+
if config['present']
|
13
|
+
record_lint(dummy_node,
|
14
|
+
'Files should end with a trailing newline') unless ends_with_newline
|
15
|
+
else
|
16
|
+
record_lint(dummy_node,
|
17
|
+
'Files should not end with a trailing newline') if ends_with_newline
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module HamlLint
|
2
|
+
# Checks the character used for indentation.
|
3
|
+
class Linter::Indentation < Linter
|
4
|
+
include LinterRegistry
|
5
|
+
|
6
|
+
# Allowed leading indentation for each character type.
|
7
|
+
INDENT_REGEX = {
|
8
|
+
space: /^[ ]*(?!\t)/,
|
9
|
+
tab: /^\t*(?![ ])/,
|
10
|
+
}
|
11
|
+
|
12
|
+
def visit_root(_node)
|
13
|
+
regex = INDENT_REGEX[config['character'].to_sym]
|
14
|
+
dummy_node = Struct.new(:line)
|
15
|
+
|
16
|
+
document.source_lines.each_with_index do |line, index|
|
17
|
+
next if line =~ regex
|
18
|
+
|
19
|
+
record_lint dummy_node.new(index + 1), 'Line contains tabs in indentation'
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -30,7 +30,7 @@ module HamlLint
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def outputs_string_literal?(script_node)
|
33
|
-
tree = parse_ruby(script_node.script)
|
33
|
+
return unless tree = parse_ruby(script_node.script)
|
34
34
|
[:str, :dstr].include?(tree.type) &&
|
35
35
|
!starts_with_reserved_character?(tree.children.first)
|
36
36
|
rescue ::Parser::SyntaxError # rubocop:disable Lint/HandleExceptions
|
data/lib/haml_lint/logger.rb
CHANGED
@@ -22,7 +22,6 @@ module HamlLint
|
|
22
22
|
#
|
23
23
|
# @param output [String] the output to send
|
24
24
|
# @param newline [true,false] whether to append a newline
|
25
|
-
# @return [nil]
|
26
25
|
def log(output, newline = true)
|
27
26
|
@out.print(output)
|
28
27
|
@out.print("\n") if newline
|
@@ -32,7 +31,6 @@ module HamlLint
|
|
32
31
|
# If output destination is not a TTY, behaves the same as {#log}.
|
33
32
|
#
|
34
33
|
# @param args [Array<String>]
|
35
|
-
# @return [nil]
|
36
34
|
def bold(*args)
|
37
35
|
color('1', *args)
|
38
36
|
end
|
@@ -41,7 +39,6 @@ module HamlLint
|
|
41
39
|
# If output destination is not a TTY, behaves the same as {#log}.
|
42
40
|
#
|
43
41
|
# @param args [Array<String>]
|
44
|
-
# @return [nil]
|
45
42
|
def error(*args)
|
46
43
|
color(31, *args)
|
47
44
|
end
|
@@ -50,7 +47,6 @@ module HamlLint
|
|
50
47
|
# If output destination is not a TTY, behaves the same as {#log}.
|
51
48
|
#
|
52
49
|
# @param args [Array<String>]
|
53
|
-
# @return [nil]
|
54
50
|
def bold_error(*args)
|
55
51
|
color('1;31', *args)
|
56
52
|
end
|
@@ -59,7 +55,6 @@ module HamlLint
|
|
59
55
|
# If output destination is not a TTY, behaves the same as {#log}.
|
60
56
|
#
|
61
57
|
# @param args [Array<String>]
|
62
|
-
# @return [nil]
|
63
58
|
def success(*args)
|
64
59
|
color(32, *args)
|
65
60
|
end
|
@@ -68,29 +63,23 @@ module HamlLint
|
|
68
63
|
# If output destination is not a TTY, behaves the same as {#log}.
|
69
64
|
#
|
70
65
|
# @param args [Array<String>]
|
71
|
-
# @return [nil]
|
72
66
|
def warning(*args)
|
73
67
|
color(33, *args)
|
74
68
|
end
|
75
69
|
|
76
|
-
# Print specified output in bold face in a color indicative of a warning.
|
77
|
-
# If output destination is not a TTY, behaves the same as {#log}.
|
78
|
-
#
|
79
|
-
# @param args [Array<String>]
|
80
|
-
# @return [nil]
|
81
|
-
def bold_warning(*args)
|
82
|
-
color('1;33', *args)
|
83
|
-
end
|
84
|
-
|
85
70
|
# Print the specified output in a color indicating information.
|
86
71
|
# If output destination is not a TTY, behaves the same as {#log}.
|
87
72
|
#
|
88
73
|
# @param args [Array<String>]
|
89
|
-
# @return [nil]
|
90
74
|
def info(*args)
|
91
75
|
color(36, *args)
|
92
76
|
end
|
93
77
|
|
78
|
+
# Print a blank line.
|
79
|
+
def newline
|
80
|
+
log('')
|
81
|
+
end
|
82
|
+
|
94
83
|
# Whether this logger is outputting to a TTY.
|
95
84
|
#
|
96
85
|
# @return [true,false]
|
@@ -14,15 +14,15 @@ module HamlLint
|
|
14
14
|
@document = document
|
15
15
|
end
|
16
16
|
|
17
|
-
#
|
18
|
-
#
|
17
|
+
# Converts the given HAML parse node into its corresponding HAML-Lint parse
|
18
|
+
# node.
|
19
|
+
#
|
20
|
+
# @param haml_node [Haml::Parser::ParseNode]
|
21
|
+
# @return [HamlLint::Tree::Node]
|
19
22
|
def transform(haml_node)
|
20
23
|
node_class = "#{HamlLint::Utils.camel_case(haml_node.type.to_s)}Node"
|
21
24
|
|
22
25
|
HamlLint::Tree.const_get(node_class).new(@document, haml_node)
|
23
|
-
rescue NameError
|
24
|
-
# TODO: Wrap in parser error?
|
25
|
-
raise
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
data/lib/haml_lint/options.rb
CHANGED
@@ -91,6 +91,10 @@ module HamlLint
|
|
91
91
|
parser.on_tail('-v', '--version', 'Display version') do
|
92
92
|
@options[:version] = true
|
93
93
|
end
|
94
|
+
|
95
|
+
parser.on_tail('-V', '--verbose-version', 'Display verbose version information') do
|
96
|
+
@options[:verbose_version] = true
|
97
|
+
end
|
94
98
|
end
|
95
99
|
end
|
96
100
|
end
|
data/lib/haml_lint/runner.rb
CHANGED
@@ -50,7 +50,7 @@ module HamlLint
|
|
50
50
|
def collect_lints(file, linter_selector, config)
|
51
51
|
begin
|
52
52
|
document = HamlLint::Document.new(File.read(file), file: file, config: config)
|
53
|
-
rescue
|
53
|
+
rescue HamlLint::Exceptions::ParseError => ex
|
54
54
|
return [HamlLint::Lint.new(nil, file, ex.line, ex.to_s, :error)]
|
55
55
|
end
|
56
56
|
|
@@ -142,9 +142,10 @@ module HamlLint::Tree
|
|
142
142
|
# @example For `%tag.class(lang=en)`, this returns:
|
143
143
|
# "lang=en"
|
144
144
|
#
|
145
|
-
# @return [String] source without the surrounding parentheses
|
145
|
+
# @return [String,nil] source without the surrounding parentheses, or `nil`
|
146
|
+
# if it has not been defined
|
146
147
|
def html_attributes_source
|
147
|
-
dynamic_attributes_source[:html]
|
148
|
+
dynamic_attributes_source[:html][/\A\((.*)\)\z/, 1] if html_attributes?
|
148
149
|
end
|
149
150
|
|
150
151
|
# Name of the HTML tag.
|
@@ -169,7 +170,7 @@ module HamlLint::Tree
|
|
169
170
|
# @return [String,nil] string source of object reference or `nil` if it has
|
170
171
|
# not been defined
|
171
172
|
def object_reference_source
|
172
|
-
|
173
|
+
@value[:object_ref][/\A\[(.*)\]\z/, 1] if object_reference?
|
173
174
|
end
|
174
175
|
|
175
176
|
# Whether this node had a `<` after it signifying that outer whitespace
|
@@ -185,7 +186,7 @@ module HamlLint::Tree
|
|
185
186
|
#
|
186
187
|
# @return [true,false]
|
187
188
|
def remove_outer_whitespace?
|
188
|
-
@value[:
|
189
|
+
@value[:nuke_outer_whitespace]
|
189
190
|
end
|
190
191
|
|
191
192
|
# Returns the script source that will be evaluated to produce this tag's
|
@@ -196,16 +197,6 @@ module HamlLint::Tree
|
|
196
197
|
(@value[:value] if @value[:parse]) || ''
|
197
198
|
end
|
198
199
|
|
199
|
-
# Returns the static inner content for this tag.
|
200
|
-
#
|
201
|
-
# If this tag contains dynamic content of any kind, this will still return
|
202
|
-
# an empty string, and you'll have to use {#script} to obtain the source.
|
203
|
-
#
|
204
|
-
# @return [String]
|
205
|
-
def text
|
206
|
-
(@value[:value] if @value[:parse]) || ''
|
207
|
-
end
|
208
|
-
|
209
200
|
private
|
210
201
|
|
211
202
|
def parsed_attributes
|
data/lib/haml_lint/utils.rb
CHANGED
@@ -61,6 +61,9 @@ module HamlLint
|
|
61
61
|
end
|
62
62
|
|
63
63
|
# Converts a string containing underscores/hyphens/spaces into CamelCase.
|
64
|
+
#
|
65
|
+
# @param str [String]
|
66
|
+
# @return [String]
|
64
67
|
def camel_case(str)
|
65
68
|
str.split(/_|-| /).map { |part| part.sub(/^\w/) { |c| c.upcase } }.join
|
66
69
|
end
|
@@ -110,6 +113,8 @@ module HamlLint
|
|
110
113
|
|
111
114
|
# Calls a block of code with a modified set of environment variables,
|
112
115
|
# restoring them once the code has executed.
|
116
|
+
#
|
117
|
+
# @param env [Hash] environment variables to set
|
113
118
|
def with_environment(env)
|
114
119
|
old_env = {}
|
115
120
|
env.each do |var, value|
|
data/lib/haml_lint/version.rb
CHANGED
data/lib/haml_lint.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
# Need to load haml before we can reference some Haml modules in our code
|
2
|
+
require 'haml'
|
3
|
+
|
1
4
|
require 'haml_lint/constants'
|
2
5
|
require 'haml_lint/exceptions'
|
3
6
|
require 'haml_lint/configuration'
|
@@ -17,8 +20,6 @@ require 'haml_lint/runner'
|
|
17
20
|
require 'haml_lint/utils'
|
18
21
|
require 'haml_lint/version'
|
19
22
|
|
20
|
-
require 'haml'
|
21
|
-
|
22
23
|
# Load all parse tree node classes
|
23
24
|
require 'haml_lint/tree/node'
|
24
25
|
require 'haml_lint/node_transformer'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haml_lint
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.15.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brigade Engineering
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2015-06-
|
12
|
+
date: 2015-06-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: haml
|
@@ -109,8 +109,10 @@ files:
|
|
109
109
|
- lib/haml_lint/linter/consecutive_comments.rb
|
110
110
|
- lib/haml_lint/linter/consecutive_silent_scripts.rb
|
111
111
|
- lib/haml_lint/linter/empty_script.rb
|
112
|
+
- lib/haml_lint/linter/final_newline.rb
|
112
113
|
- lib/haml_lint/linter/html_attributes.rb
|
113
114
|
- lib/haml_lint/linter/implicit_div.rb
|
115
|
+
- lib/haml_lint/linter/indentation.rb
|
114
116
|
- lib/haml_lint/linter/leading_comment_space.rb
|
115
117
|
- lib/haml_lint/linter/line_length.rb
|
116
118
|
- lib/haml_lint/linter/multiline_pipe.rb
|
@@ -174,3 +176,4 @@ signing_key:
|
|
174
176
|
specification_version: 4
|
175
177
|
summary: HAML lint tool
|
176
178
|
test_files: []
|
179
|
+
has_rdoc:
|