theme-check 1.6.0 → 1.7.1

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.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -0
  3. data/data/shopify_liquid/tags.yml +9 -9
  4. data/docs/api/html_check.md +7 -7
  5. data/docs/api/liquid_check.md +10 -10
  6. data/docs/checks/convert_include_to_render.md +1 -1
  7. data/docs/checks/missing_enable_comment.md +1 -1
  8. data/lib/theme_check/analyzer.rb +41 -17
  9. data/lib/theme_check/asset_file.rb +1 -1
  10. data/lib/theme_check/check.rb +2 -2
  11. data/lib/theme_check/checks/html_parsing_error.rb +2 -2
  12. data/lib/theme_check/checks/matching_translations.rb +1 -1
  13. data/lib/theme_check/checks/missing_template.rb +6 -6
  14. data/lib/theme_check/checks/nested_snippet.rb +2 -2
  15. data/lib/theme_check/checks/required_layout_theme_object.rb +2 -2
  16. data/lib/theme_check/checks/syntax_error.rb +5 -5
  17. data/lib/theme_check/checks/template_length.rb +2 -2
  18. data/lib/theme_check/checks/translation_key_exists.rb +1 -13
  19. data/lib/theme_check/checks/undefined_object.rb +7 -7
  20. data/lib/theme_check/checks/unused_assign.rb +4 -4
  21. data/lib/theme_check/checks/unused_snippet.rb +7 -7
  22. data/lib/theme_check/checks/valid_json.rb +1 -1
  23. data/lib/theme_check/checks.rb +4 -2
  24. data/lib/theme_check/cli.rb +1 -1
  25. data/lib/theme_check/corrector.rb +6 -6
  26. data/lib/theme_check/disabled_check.rb +3 -3
  27. data/lib/theme_check/disabled_checks.rb +9 -9
  28. data/lib/theme_check/exceptions.rb +1 -0
  29. data/lib/theme_check/file_system_storage.rb +4 -0
  30. data/lib/theme_check/html_node.rb +36 -28
  31. data/lib/theme_check/html_visitor.rb +6 -6
  32. data/lib/theme_check/in_memory_storage.rb +1 -1
  33. data/lib/theme_check/json_check.rb +2 -2
  34. data/lib/theme_check/language_server/bridge.rb +128 -0
  35. data/lib/theme_check/language_server/channel.rb +69 -0
  36. data/lib/theme_check/language_server/completion_providers/tag_completion_provider.rb +3 -1
  37. data/lib/theme_check/language_server/diagnostics_engine.rb +125 -0
  38. data/lib/theme_check/language_server/diagnostics_tracker.rb +8 -8
  39. data/lib/theme_check/language_server/handler.rb +20 -117
  40. data/lib/theme_check/language_server/io_messenger.rb +97 -0
  41. data/lib/theme_check/language_server/messenger.rb +27 -0
  42. data/lib/theme_check/language_server/server.rb +95 -104
  43. data/lib/theme_check/language_server.rb +6 -1
  44. data/lib/theme_check/{template.rb → liquid_file.rb} +2 -2
  45. data/lib/theme_check/liquid_node.rb +291 -0
  46. data/lib/theme_check/{visitor.rb → liquid_visitor.rb} +4 -4
  47. data/lib/theme_check/locale_diff.rb +14 -7
  48. data/lib/theme_check/node.rb +12 -225
  49. data/lib/theme_check/offense.rb +15 -15
  50. data/lib/theme_check/position.rb +1 -1
  51. data/lib/theme_check/shopify_liquid/system_translations.rb +35 -0
  52. data/lib/theme_check/shopify_liquid/tag.rb +19 -1
  53. data/lib/theme_check/shopify_liquid.rb +1 -0
  54. data/lib/theme_check/theme.rb +1 -1
  55. data/lib/theme_check/{template_rewriter.rb → theme_file_rewriter.rb} +1 -1
  56. data/lib/theme_check/version.rb +1 -1
  57. data/lib/theme_check.rb +11 -10
  58. data/theme-check.gemspec +1 -1
  59. metadata +14 -7
@@ -5,13 +5,13 @@ module ThemeCheck
5
5
 
6
6
  MAX_SOURCE_EXCERPT_SIZE = 120
7
7
 
8
- attr_reader :check, :message, :template, :node, :markup, :line_number, :correction
8
+ attr_reader :check, :message, :theme_file, :node, :markup, :line_number, :correction
9
9
 
10
10
  def initialize(
11
11
  check:, # instance of a ThemeCheck::Check
12
12
  message: nil, # error message for the offense
13
- template: nil, # Template
14
- node: nil, # Node or HtmlNode
13
+ theme_file: nil, # ThemeFile
14
+ node: nil, # Node
15
15
  markup: nil, # string
16
16
  line_number: nil, # line number of the error (1-indexed)
17
17
  # node_markup_offset is the index inside node.markup to start
@@ -39,11 +39,11 @@ module ThemeCheck
39
39
  end
40
40
 
41
41
  @node = node
42
- @template = nil
42
+ @theme_file = nil
43
43
  if node
44
- @template = node.template
45
- elsif template
46
- @template = template
44
+ @theme_file = node.theme_file
45
+ elsif theme_file
46
+ @theme_file = theme_file
47
47
  end
48
48
 
49
49
  @markup = if markup
@@ -62,7 +62,7 @@ module ThemeCheck
62
62
 
63
63
  @position = Position.new(
64
64
  @markup,
65
- @template&.source,
65
+ @theme_file&.source,
66
66
  line_number_1_indexed: @line_number,
67
67
  node_markup_offset: node_markup_offset,
68
68
  node_markup: node&.markup
@@ -72,7 +72,7 @@ module ThemeCheck
72
72
  def source_excerpt
73
73
  return unless line_number
74
74
  @source_excerpt ||= begin
75
- excerpt = template.source_excerpt(line_number)
75
+ excerpt = theme_file.source_excerpt(line_number)
76
76
  if excerpt.size > MAX_SOURCE_EXCERPT_SIZE
77
77
  excerpt[0, MAX_SOURCE_EXCERPT_SIZE - 3] + '...'
78
78
  else
@@ -126,12 +126,12 @@ module ThemeCheck
126
126
  end
127
127
 
128
128
  def location
129
- tokens = [template&.relative_path, line_number].compact
129
+ tokens = [theme_file&.relative_path, line_number].compact
130
130
  tokens.join(":") if tokens.any?
131
131
  end
132
132
 
133
133
  def location_range
134
- tokens = [template&.relative_path, start_index, end_index].compact
134
+ tokens = [theme_file&.relative_path, start_index, end_index].compact
135
135
  tokens.join(":") if tokens.any?
136
136
  end
137
137
 
@@ -141,7 +141,7 @@ module ThemeCheck
141
141
 
142
142
  def correct
143
143
  if correctable?
144
- corrector = Corrector.new(template: template)
144
+ corrector = Corrector.new(theme_file: theme_file)
145
145
  correction.call(corrector)
146
146
  end
147
147
  rescue => e
@@ -191,7 +191,7 @@ module ThemeCheck
191
191
  alias_method :eql?, :==
192
192
 
193
193
  def to_s
194
- if template
194
+ if theme_file
195
195
  "#{message} at #{location}"
196
196
  else
197
197
  message
@@ -199,7 +199,7 @@ module ThemeCheck
199
199
  end
200
200
 
201
201
  def to_s_range
202
- if template
202
+ if theme_file
203
203
  "#{message} at #{location_range}"
204
204
  else
205
205
  message
@@ -209,7 +209,7 @@ module ThemeCheck
209
209
  def to_h
210
210
  {
211
211
  check: check.code_name,
212
- path: template&.relative_path,
212
+ path: theme_file&.relative_path,
213
213
  severity: check.severity_value,
214
214
  start_line: start_line,
215
215
  start_column: start_column,
@@ -104,7 +104,7 @@ module ThemeCheck
104
104
  end
105
105
 
106
106
  def can_find_needle?
107
- !!contents.index(@needle)
107
+ !!contents.index(@needle, start_offset)
108
108
  end
109
109
 
110
110
  def entire_line_needle
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+ module ThemeCheck
3
+ module ShopifyLiquid
4
+ module SystemTranslations
5
+ extend self
6
+
7
+ def translations
8
+ @translations ||= YAML.load(File.read("#{__dir__}/../../../data/shopify_translation_keys.yml")).to_set
9
+ end
10
+
11
+ def translations_hash
12
+ @translations_hash ||= translations.reduce({}) do |acc, k|
13
+ dig_set(acc, k.split('.'), "")
14
+ end
15
+ end
16
+
17
+ def include?(key)
18
+ translations.include?(key)
19
+ end
20
+
21
+ private
22
+
23
+ def dig_set(obj, keys, value)
24
+ key = keys.first
25
+ if keys.length == 1
26
+ obj[key] = value
27
+ else
28
+ obj[key] = {} unless obj[key]
29
+ dig_set(obj[key], keys.slice(1..-1), value)
30
+ end
31
+ obj
32
+ end
33
+ end
34
+ end
35
+ end
@@ -7,10 +7,17 @@ module ThemeCheck
7
7
  extend self
8
8
 
9
9
  def labels
10
- @tags ||= YAML.load(File.read("#{__dir__}/../../../data/shopify_liquid/tags.yml"))
10
+ @labels ||= tags_file_contents
11
+ .map { |x| to_label(x) }
11
12
  .to_set
12
13
  end
13
14
 
15
+ def end_labels
16
+ @end_labels ||= tags_file_contents
17
+ .select { |x| x.is_a?(Hash) }
18
+ .map { |x| x.values[0] }
19
+ end
20
+
14
21
  def tag_regex(tag)
15
22
  return unless labels.include?(tag)
16
23
  @tag_regexes ||= {}
@@ -22,6 +29,17 @@ module ThemeCheck
22
29
  @tag_liquid_regexes ||= {}
23
30
  @tag_liquid_regexes[tag] ||= /^\s*#{tag}/m
24
31
  end
32
+
33
+ private
34
+
35
+ def to_label(label)
36
+ return label if label.is_a?(String)
37
+ label.keys[0]
38
+ end
39
+
40
+ def tags_file_contents
41
+ @tags_file_contents ||= YAML.load(File.read("#{__dir__}/../../../data/shopify_liquid/tags.yml"))
42
+ end
25
43
  end
26
44
  end
27
45
  end
@@ -3,3 +3,4 @@ require_relative 'shopify_liquid/deprecated_filter'
3
3
  require_relative 'shopify_liquid/filter'
4
4
  require_relative 'shopify_liquid/object'
5
5
  require_relative 'shopify_liquid/tag'
6
+ require_relative 'shopify_liquid/system_translations'
@@ -23,7 +23,7 @@ module ThemeCheck
23
23
  def liquid
24
24
  @liquid ||= @storage.files
25
25
  .select { |path| LIQUID_REGEX.match?(path) }
26
- .map { |path| Template.new(path, @storage) }
26
+ .map { |path| LiquidFile.new(path, @storage) }
27
27
  end
28
28
 
29
29
  def json
@@ -3,7 +3,7 @@
3
3
  require 'parser'
4
4
 
5
5
  module ThemeCheck
6
- class TemplateRewriter
6
+ class ThemeFileRewriter
7
7
  def initialize(name, source)
8
8
  @buffer = Parser::Source::Buffer.new(name, source: source)
9
9
  @rewriter = Parser::Source::TreeRewriter.new(
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ThemeCheck
3
- VERSION = "1.6.0"
3
+ VERSION = "1.7.1"
4
4
  end
data/lib/theme_check.rb CHANGED
@@ -4,20 +4,23 @@ require "liquid"
4
4
  require_relative "theme_check/version"
5
5
  require_relative "theme_check/bug"
6
6
  require_relative "theme_check/exceptions"
7
+ require_relative "theme_check/theme_file_rewriter"
7
8
  require_relative "theme_check/theme_file"
9
+ require_relative "theme_check/liquid_file"
10
+ require_relative "theme_check/asset_file"
11
+ require_relative "theme_check/json_file"
8
12
  require_relative "theme_check/analyzer"
9
13
  require_relative "theme_check/check"
10
14
  require_relative "theme_check/checks_tracking"
15
+ require_relative "theme_check/liquid_check"
16
+ require_relative "theme_check/html_check"
17
+ require_relative "theme_check/json_check"
11
18
  require_relative "theme_check/cli"
12
19
  require_relative "theme_check/disabled_check"
13
20
  require_relative "theme_check/disabled_checks"
14
- require_relative "theme_check/liquid_check"
15
21
  require_relative "theme_check/locale_diff"
16
- require_relative "theme_check/asset_file"
17
22
  require_relative "theme_check/remote_asset_file"
18
23
  require_relative "theme_check/regex_helpers"
19
- require_relative "theme_check/json_check"
20
- require_relative "theme_check/json_file"
21
24
  require_relative "theme_check/json_helpers"
22
25
  require_relative "theme_check/position_helper"
23
26
  require_relative "theme_check/position"
@@ -25,23 +28,21 @@ require_relative "theme_check/language_server"
25
28
  require_relative "theme_check/checks"
26
29
  require_relative "theme_check/config"
27
30
  require_relative "theme_check/node"
31
+ require_relative "theme_check/liquid_node"
32
+ require_relative "theme_check/html_node"
28
33
  require_relative "theme_check/offense"
29
34
  require_relative "theme_check/printer"
30
35
  require_relative "theme_check/json_printer"
31
36
  require_relative "theme_check/shopify_liquid"
32
- require_relative "theme_check/storage"
33
37
  require_relative "theme_check/string_helpers"
38
+ require_relative "theme_check/storage"
34
39
  require_relative "theme_check/file_system_storage"
35
40
  require_relative "theme_check/in_memory_storage"
36
41
  require_relative "theme_check/tags"
37
- require_relative "theme_check/template_rewriter"
38
- require_relative "theme_check/template"
39
42
  require_relative "theme_check/theme"
40
- require_relative "theme_check/visitor"
41
43
  require_relative "theme_check/corrector"
42
- require_relative "theme_check/html_node"
44
+ require_relative "theme_check/liquid_visitor"
43
45
  require_relative "theme_check/html_visitor"
44
- require_relative "theme_check/html_check"
45
46
 
46
47
  Dir[__dir__ + "/theme_check/checks/*.rb"].each { |file| require file }
47
48
 
data/theme-check.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
25
25
  spec.require_paths = ["lib"]
26
26
 
27
- spec.add_dependency('liquid', '>= 5.0.1')
27
+ spec.add_dependency('liquid', '>= 5.1.0')
28
28
  spec.add_dependency('nokogiri', '>= 1.12')
29
29
  spec.add_dependency('parser', '~> 3')
30
30
  end
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: 1.6.0
4
+ version: 1.7.1
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-09-14 00:00:00.000000000 Z
11
+ date: 2021-09-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 5.0.1
19
+ version: 5.1.0
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 5.0.1
26
+ version: 5.1.0
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: nokogiri
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -201,6 +201,8 @@ files:
201
201
  - lib/theme_check/json_helpers.rb
202
202
  - lib/theme_check/json_printer.rb
203
203
  - lib/theme_check/language_server.rb
204
+ - lib/theme_check/language_server/bridge.rb
205
+ - lib/theme_check/language_server/channel.rb
204
206
  - lib/theme_check/language_server/completion_engine.rb
205
207
  - lib/theme_check/language_server/completion_helper.rb
206
208
  - lib/theme_check/language_server/completion_provider.rb
@@ -209,6 +211,7 @@ files:
209
211
  - lib/theme_check/language_server/completion_providers/render_snippet_completion_provider.rb
210
212
  - lib/theme_check/language_server/completion_providers/tag_completion_provider.rb
211
213
  - lib/theme_check/language_server/constants.rb
214
+ - lib/theme_check/language_server/diagnostics_engine.rb
212
215
  - lib/theme_check/language_server/diagnostics_tracker.rb
213
216
  - lib/theme_check/language_server/document_link_engine.rb
214
217
  - lib/theme_check/language_server/document_link_provider.rb
@@ -217,12 +220,17 @@ files:
217
220
  - lib/theme_check/language_server/document_link_providers/render_document_link_provider.rb
218
221
  - lib/theme_check/language_server/document_link_providers/section_document_link_provider.rb
219
222
  - lib/theme_check/language_server/handler.rb
223
+ - lib/theme_check/language_server/io_messenger.rb
224
+ - lib/theme_check/language_server/messenger.rb
220
225
  - lib/theme_check/language_server/protocol.rb
221
226
  - lib/theme_check/language_server/server.rb
222
227
  - lib/theme_check/language_server/tokens.rb
223
228
  - lib/theme_check/language_server/uri_helper.rb
224
229
  - lib/theme_check/language_server/variable_lookup_finder.rb
225
230
  - lib/theme_check/liquid_check.rb
231
+ - lib/theme_check/liquid_file.rb
232
+ - lib/theme_check/liquid_node.rb
233
+ - lib/theme_check/liquid_visitor.rb
226
234
  - lib/theme_check/locale_diff.rb
227
235
  - lib/theme_check/node.rb
228
236
  - lib/theme_check/offense.rb
@@ -238,16 +246,15 @@ files:
238
246
  - lib/theme_check/shopify_liquid/deprecated_filter.rb
239
247
  - lib/theme_check/shopify_liquid/filter.rb
240
248
  - lib/theme_check/shopify_liquid/object.rb
249
+ - lib/theme_check/shopify_liquid/system_translations.rb
241
250
  - lib/theme_check/shopify_liquid/tag.rb
242
251
  - lib/theme_check/storage.rb
243
252
  - lib/theme_check/string_helpers.rb
244
253
  - lib/theme_check/tags.rb
245
- - lib/theme_check/template.rb
246
- - lib/theme_check/template_rewriter.rb
247
254
  - lib/theme_check/theme.rb
248
255
  - lib/theme_check/theme_file.rb
256
+ - lib/theme_check/theme_file_rewriter.rb
249
257
  - lib/theme_check/version.rb
250
- - lib/theme_check/visitor.rb
251
258
  - packaging/homebrew/theme_check.base.rb
252
259
  - theme-check.gemspec
253
260
  homepage: https://github.com/Shopify/theme-check