theme-check 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CONTRIBUTING.md +2 -0
- data/README.md +45 -2
- data/RELEASING.md +41 -0
- data/Rakefile +24 -4
- data/config/default.yml +15 -0
- data/data/shopify_liquid/plus_objects.yml +15 -0
- data/dev.yml +2 -0
- data/lib/theme_check.rb +4 -0
- data/lib/theme_check/analyzer.rb +0 -6
- data/lib/theme_check/check.rb +11 -0
- data/lib/theme_check/checks.rb +10 -0
- data/lib/theme_check/checks/missing_enable_comment.rb +31 -0
- data/lib/theme_check/checks/parser_blocking_javascript.rb +55 -0
- data/lib/theme_check/checks/space_inside_braces.rb +1 -0
- data/lib/theme_check/checks/template_length.rb +11 -3
- data/lib/theme_check/checks/undefined_object.rb +8 -0
- data/lib/theme_check/checks/valid_html_translation.rb +2 -2
- data/lib/theme_check/cli.rb +9 -1
- data/lib/theme_check/config.rb +95 -43
- data/lib/theme_check/corrector.rb +0 -4
- data/lib/theme_check/disabled_checks.rb +77 -0
- data/lib/theme_check/file_system_storage.rb +51 -0
- data/lib/theme_check/in_memory_storage.rb +37 -0
- data/lib/theme_check/json_file.rb +12 -10
- data/lib/theme_check/language_server/handler.rb +23 -10
- data/lib/theme_check/language_server/server.rb +2 -2
- data/lib/theme_check/shopify_liquid/object.rb +6 -0
- data/lib/theme_check/storage.rb +25 -0
- data/lib/theme_check/template.rb +26 -21
- data/lib/theme_check/theme.rb +14 -9
- data/lib/theme_check/version.rb +1 -1
- data/lib/theme_check/visitor.rb +14 -3
- data/packaging/homebrew/theme_check.base.rb +10 -6
- metadata +10 -2
@@ -14,6 +14,7 @@ module ThemeCheck
|
|
14
14
|
|
15
15
|
def initialize(server)
|
16
16
|
@server = server
|
17
|
+
@previously_reported_files = Set.new
|
17
18
|
end
|
18
19
|
|
19
20
|
def on_initialize(id, params)
|
@@ -41,28 +42,40 @@ module ThemeCheck
|
|
41
42
|
def analyze_and_send_offenses(file_path)
|
42
43
|
root = ThemeCheck::Config.find(file_path) || @root_path
|
43
44
|
config = ThemeCheck::Config.from_path(root)
|
44
|
-
|
45
|
-
|
45
|
+
storage = ThemeCheck::FileSystemStorage.new(
|
46
|
+
config.root,
|
47
|
+
ignored_patterns: config.ignored_patterns
|
48
|
+
)
|
49
|
+
theme = ThemeCheck::Theme.new(storage)
|
50
|
+
|
51
|
+
offenses = analyze(theme, config)
|
52
|
+
log("Found #{theme.all.size} templates, and #{offenses.size} offenses")
|
53
|
+
send_diagnostics(offenses)
|
54
|
+
end
|
46
55
|
|
56
|
+
def analyze(theme, config)
|
57
|
+
analyzer = ThemeCheck::Analyzer.new(theme, config.enabled_checks)
|
47
58
|
log("Checking #{config.root}")
|
48
59
|
analyzer.analyze_theme
|
49
|
-
|
50
|
-
send_diagnostics(analyzer.offenses, theme.all)
|
60
|
+
analyzer.offenses
|
51
61
|
end
|
52
62
|
|
53
|
-
def send_diagnostics(offenses
|
54
|
-
|
63
|
+
def send_diagnostics(offenses)
|
64
|
+
reported_files = Set.new
|
55
65
|
|
56
66
|
offenses.group_by(&:template).each do |template, template_offenses|
|
57
67
|
next unless template
|
58
68
|
send_diagnostic(template.path, template_offenses)
|
59
|
-
|
69
|
+
reported_files << template.path
|
60
70
|
end
|
61
71
|
|
62
|
-
# Publish diagnostics with empty array if
|
63
|
-
|
64
|
-
|
72
|
+
# Publish diagnostics with empty array if all issues on a previously reported template
|
73
|
+
# have been solved.
|
74
|
+
(@previously_reported_files - reported_files).each do |path|
|
75
|
+
send_diagnostic(path, [])
|
65
76
|
end
|
77
|
+
|
78
|
+
@previously_reported_files = reported_files
|
66
79
|
end
|
67
80
|
|
68
81
|
def send_diagnostic(path, offenses)
|
@@ -9,6 +9,8 @@ module ThemeCheck
|
|
9
9
|
class IncompatibleStream < StandardError; end
|
10
10
|
|
11
11
|
class Server
|
12
|
+
attr_reader :handler
|
13
|
+
|
12
14
|
def initialize(
|
13
15
|
in_stream: STDIN,
|
14
16
|
out_stream: STDOUT,
|
@@ -87,8 +89,6 @@ module ThemeCheck
|
|
87
89
|
|
88
90
|
if @handler.respond_to?(method_name)
|
89
91
|
@handler.send(method_name, id, params)
|
90
|
-
else
|
91
|
-
log("Handler does not respond to #{method_name}")
|
92
92
|
end
|
93
93
|
end
|
94
94
|
|
@@ -11,6 +11,12 @@ module ThemeCheck
|
|
11
11
|
YAML.load(File.read("#{__dir__}/../../../data/shopify_liquid/objects.yml"))
|
12
12
|
end
|
13
13
|
end
|
14
|
+
|
15
|
+
def plus_labels
|
16
|
+
@plus_labels ||= begin
|
17
|
+
YAML.load(File.read("#{__dir__}/../../../data/shopify_liquid/plus_objects.yml"))
|
18
|
+
end
|
19
|
+
end
|
14
20
|
end
|
15
21
|
end
|
16
22
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ThemeCheck
|
4
|
+
class Storage
|
5
|
+
def read(relative_path)
|
6
|
+
raise NotImplementedError
|
7
|
+
end
|
8
|
+
|
9
|
+
def write(relative_path, content)
|
10
|
+
raise NotImplementedError
|
11
|
+
end
|
12
|
+
|
13
|
+
def path(relative_path)
|
14
|
+
raise NotImplementedError
|
15
|
+
end
|
16
|
+
|
17
|
+
def files
|
18
|
+
raise NotImplementedError
|
19
|
+
end
|
20
|
+
|
21
|
+
def directories
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/theme_check/template.rb
CHANGED
@@ -3,16 +3,29 @@ require "pathname"
|
|
3
3
|
|
4
4
|
module ThemeCheck
|
5
5
|
class Template
|
6
|
-
|
6
|
+
def initialize(relative_path, storage)
|
7
|
+
@storage = storage
|
8
|
+
@relative_path = relative_path
|
9
|
+
end
|
7
10
|
|
8
|
-
def
|
9
|
-
@path
|
10
|
-
@root = Pathname(root)
|
11
|
-
@updated = false
|
11
|
+
def path
|
12
|
+
@storage.path(@relative_path)
|
12
13
|
end
|
13
14
|
|
14
15
|
def relative_path
|
15
|
-
@
|
16
|
+
@relative_pathname ||= Pathname.new(@relative_path)
|
17
|
+
end
|
18
|
+
|
19
|
+
def source
|
20
|
+
@source ||= @storage.read(@relative_path)
|
21
|
+
end
|
22
|
+
|
23
|
+
def write
|
24
|
+
content = updated_content
|
25
|
+
if source != content
|
26
|
+
@storage.write(@relative_path, content)
|
27
|
+
@source = content
|
28
|
+
end
|
16
29
|
end
|
17
30
|
|
18
31
|
def name
|
@@ -31,15 +44,17 @@ module ThemeCheck
|
|
31
44
|
name.start_with?('snippets')
|
32
45
|
end
|
33
46
|
|
34
|
-
def source
|
35
|
-
@source ||= @path.read
|
36
|
-
end
|
37
|
-
|
38
47
|
def lines
|
39
48
|
# Retain trailing newline character
|
40
49
|
@lines ||= source.split("\n", -1)
|
41
50
|
end
|
42
51
|
|
52
|
+
# Not entirely obvious but lines is mutable, corrections are to be
|
53
|
+
# applied on @lines.
|
54
|
+
def updated_content
|
55
|
+
lines.join("\n")
|
56
|
+
end
|
57
|
+
|
43
58
|
def excerpt(line)
|
44
59
|
lines[line - 1].strip
|
45
60
|
end
|
@@ -65,18 +80,8 @@ module ThemeCheck
|
|
65
80
|
parse.root
|
66
81
|
end
|
67
82
|
|
68
|
-
def update!
|
69
|
-
@updated = true
|
70
|
-
end
|
71
|
-
|
72
|
-
def write
|
73
|
-
if @updated
|
74
|
-
@path.write(lines.join("\n"))
|
75
|
-
end
|
76
|
-
end
|
77
|
-
|
78
83
|
def ==(other)
|
79
|
-
other.is_a?(Template) &&
|
84
|
+
other.is_a?(Template) && relative_path == other.relative_path
|
80
85
|
end
|
81
86
|
|
82
87
|
def self.parse(source)
|
data/lib/theme_check/theme.rb
CHANGED
@@ -4,18 +4,27 @@ require "pathname"
|
|
4
4
|
module ThemeCheck
|
5
5
|
class Theme
|
6
6
|
DEFAULT_LOCALE_REGEXP = %r{^locales/(.*)\.default$}
|
7
|
-
|
7
|
+
LIQUID_REGEX = /\.liquid$/i
|
8
|
+
JSON_REGEX = /\.json$/i
|
8
9
|
|
9
|
-
def initialize(
|
10
|
-
@
|
10
|
+
def initialize(storage)
|
11
|
+
@storage = storage
|
11
12
|
end
|
12
13
|
|
13
14
|
def liquid
|
14
|
-
@liquid ||= @
|
15
|
+
@liquid ||= @storage.files
|
16
|
+
.select { |path| LIQUID_REGEX.match?(path) }
|
17
|
+
.map { |path| Template.new(path, @storage) }
|
15
18
|
end
|
16
19
|
|
17
20
|
def json
|
18
|
-
@json ||= @
|
21
|
+
@json ||= @storage.files
|
22
|
+
.select { |path| JSON_REGEX.match?(path) }
|
23
|
+
.map { |path| JsonFile.new(path, @storage) }
|
24
|
+
end
|
25
|
+
|
26
|
+
def directories
|
27
|
+
@storage.directories
|
19
28
|
end
|
20
29
|
|
21
30
|
def default_locale_json
|
@@ -52,9 +61,5 @@ module ThemeCheck
|
|
52
61
|
def snippets
|
53
62
|
liquid.select(&:snippet?)
|
54
63
|
end
|
55
|
-
|
56
|
-
def directories
|
57
|
-
@directories ||= @root.glob('*').select { |f| File.directory?(f) }.map { |f| f.relative_path_from(@root) }
|
58
|
-
end
|
59
64
|
end
|
60
65
|
end
|
data/lib/theme_check/version.rb
CHANGED
data/lib/theme_check/visitor.rb
CHANGED
@@ -6,12 +6,15 @@ module ThemeCheck
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def visit_template(template)
|
9
|
+
@disabled_checks = DisabledChecks.new
|
9
10
|
visit(Node.new(template.root, nil, template))
|
10
11
|
rescue Liquid::Error => exception
|
11
12
|
exception.template_name = template.name
|
12
13
|
call_checks(:on_error, exception)
|
13
14
|
end
|
14
15
|
|
16
|
+
private
|
17
|
+
|
15
18
|
def visit(node)
|
16
19
|
call_checks(:on_node, node)
|
17
20
|
call_checks(:on_tag, node) if node.tag?
|
@@ -22,16 +25,24 @@ module ThemeCheck
|
|
22
25
|
call_checks(:after_tag, node) if node.tag?
|
23
26
|
call_checks(:after_node, node)
|
24
27
|
end
|
25
|
-
end
|
26
28
|
|
27
|
-
|
29
|
+
@disabled_checks.update(node) if node.comment?
|
30
|
+
end
|
28
31
|
|
29
32
|
def visit_children(node)
|
30
33
|
node.children.each { |child| visit(child) }
|
31
34
|
end
|
32
35
|
|
33
36
|
def call_checks(method, *args)
|
34
|
-
|
37
|
+
checks.call(method, *args)
|
38
|
+
end
|
39
|
+
|
40
|
+
def checks
|
41
|
+
return @checks unless @disabled_checks.any?
|
42
|
+
|
43
|
+
return @checks.always_enabled if @disabled_checks.all_disabled?
|
44
|
+
|
45
|
+
@checks.except_for(@disabled_checks)
|
35
46
|
end
|
36
47
|
end
|
37
48
|
end
|
@@ -61,12 +61,16 @@ class ThemeCheck < Formula
|
|
61
61
|
ENV['PATH'] = ENV['PATH'].sub(HOMEBREW_SHIMS_PATH.to_s, '/usr/local/bin')
|
62
62
|
end
|
63
63
|
|
64
|
-
system(
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
64
|
+
system(
|
65
|
+
"#{ruby_bin}/gem",
|
66
|
+
"install",
|
67
|
+
cached_download,
|
68
|
+
"--no-document",
|
69
|
+
"--no-wrapper",
|
70
|
+
"--no-user-install",
|
71
|
+
"--install-dir", prefix,
|
72
|
+
"--bindir", bin
|
73
|
+
)
|
70
74
|
|
71
75
|
raise "gem install 'theme-check' failed with status #{$CHILD_STATUS.exitstatus}" unless $CHILD_STATUS.success?
|
72
76
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: theme-check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marc-André Cournoyer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-02-16 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: liquid
|
@@ -71,12 +71,14 @@ files:
|
|
71
71
|
- Guardfile
|
72
72
|
- LICENSE.md
|
73
73
|
- README.md
|
74
|
+
- RELEASING.md
|
74
75
|
- Rakefile
|
75
76
|
- bin/liquid-server
|
76
77
|
- config/default.yml
|
77
78
|
- data/shopify_liquid/deprecated_filters.yml
|
78
79
|
- data/shopify_liquid/filters.yml
|
79
80
|
- data/shopify_liquid/objects.yml
|
81
|
+
- data/shopify_liquid/plus_objects.yml
|
80
82
|
- dev.yml
|
81
83
|
- docs/preview.png
|
82
84
|
- exe/theme-check
|
@@ -91,9 +93,11 @@ files:
|
|
91
93
|
- lib/theme_check/checks/liquid_tag.rb
|
92
94
|
- lib/theme_check/checks/matching_schema_translations.rb
|
93
95
|
- lib/theme_check/checks/matching_translations.rb
|
96
|
+
- lib/theme_check/checks/missing_enable_comment.rb
|
94
97
|
- lib/theme_check/checks/missing_required_template_files.rb
|
95
98
|
- lib/theme_check/checks/missing_template.rb
|
96
99
|
- lib/theme_check/checks/nested_snippet.rb
|
100
|
+
- lib/theme_check/checks/parser_blocking_javascript.rb
|
97
101
|
- lib/theme_check/checks/required_directories.rb
|
98
102
|
- lib/theme_check/checks/required_layout_theme_object.rb
|
99
103
|
- lib/theme_check/checks/space_inside_braces.rb
|
@@ -111,6 +115,9 @@ files:
|
|
111
115
|
- lib/theme_check/cli.rb
|
112
116
|
- lib/theme_check/config.rb
|
113
117
|
- lib/theme_check/corrector.rb
|
118
|
+
- lib/theme_check/disabled_checks.rb
|
119
|
+
- lib/theme_check/file_system_storage.rb
|
120
|
+
- lib/theme_check/in_memory_storage.rb
|
114
121
|
- lib/theme_check/json_check.rb
|
115
122
|
- lib/theme_check/json_file.rb
|
116
123
|
- lib/theme_check/json_helpers.rb
|
@@ -128,6 +135,7 @@ files:
|
|
128
135
|
- lib/theme_check/shopify_liquid/deprecated_filter.rb
|
129
136
|
- lib/theme_check/shopify_liquid/filter.rb
|
130
137
|
- lib/theme_check/shopify_liquid/object.rb
|
138
|
+
- lib/theme_check/storage.rb
|
131
139
|
- lib/theme_check/tags.rb
|
132
140
|
- lib/theme_check/template.rb
|
133
141
|
- lib/theme_check/theme.rb
|