theme-check 1.4.0 → 1.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e154c11ed7f84b968edac05c97afb2611e816933d790347cdbdca63071d46e88
4
- data.tar.gz: dd8fc72c420412ab3adfad64f3d11197f562904bd0171289debe8e440ca34c86
3
+ metadata.gz: 9bfe8af624c0fe355dedcf6036609fc1366196011af2207b8365c0bb3389f3f5
4
+ data.tar.gz: 526353e93c6d8bc3bb902b24d81084c581cecdbd0bd98e29d9c1fd95ff00aff3
5
5
  SHA512:
6
- metadata.gz: 0315a3eb75f5cda96fe2be02d7533e07aa364fc7b3e08bdb2682edf50f30d13bc2c03099d015c73db2e1c6e7d06c90707068d596db044176ddcdaea4bfe3a65c
7
- data.tar.gz: a7050df945829d05a0440464d0ac309d3cc55d9fdd9909259b95f2405beae746e799aad8beeb564508b0a543568dcd718edb9638c1307bb345051784818ea165
6
+ metadata.gz: 49b583b1bbfa5fb7a59370ec6d09e6b1099ecf3ffa22a6fc55cf099fe26ab682637bf3c943c54786b0a36b80b20501491bb9623255af3323901d33f7cdbb8897
7
+ data.tar.gz: 02ed21413f0d437a77a8859cd7a4df76d296e4bf51f88c4470c8b9f74c89fefe32431cbb2658159fecc48bc79bdf4762f1db00bf21f2ff78fa81c239b29d765e
@@ -4,16 +4,16 @@ on: [push]
4
4
 
5
5
  jobs:
6
6
  test:
7
- runs-on: macos-latest
7
+ runs-on: ${{ matrix.platform }}
8
8
 
9
9
  strategy:
10
10
  matrix:
11
+ platform: [ubuntu-latest, windows-latest]
11
12
  version:
12
13
  - 3.0.0
13
- - 2.7.1
14
14
  - 2.6.6
15
15
 
16
- name: Ruby ${{ matrix.version }}
16
+ name: Ruby ${{ matrix.platform }} ${{ matrix.version }}
17
17
 
18
18
  steps:
19
19
  - uses: actions/checkout@v2
data/.gitignore CHANGED
@@ -12,3 +12,4 @@ Gemfile.lock
12
12
 
13
13
  .rubocop-https---shopify-github-io-ruby-style-guide-rubocop-yml
14
14
  packaging/builds
15
+ .vscode
data/CHANGELOG.md CHANGED
@@ -1,4 +1,17 @@
1
1
 
2
+ v1.5.0 / 2021-09-07
3
+ ==================
4
+
5
+ ### Features
6
+
7
+ * Add [DeprecatedGlobalAppBlockType](docs/checks/deprecated_global_app_block_type.md) ([#402](https://github.com/shopify/theme-check/issues/402))
8
+
9
+ ### Fixes
10
+
11
+ * Add Windows CI
12
+ * Fix multiple Windows bugs ([#413](https://github.com/shopify/theme-check/issues/413), [#415](https://github.com/shopify/theme-check/issues/415))
13
+ * Fix pagination size as string bug in PaginationSize ([#417](https://github.com/shopify/theme-check/issues/417), [#421](https://github.com/shopify/theme-check/issues/421))
14
+
2
15
  v1.4.0 / 2021-08-30
3
16
  ==================
4
17
 
data/config/default.yml CHANGED
@@ -188,3 +188,6 @@ PaginationSize:
188
188
  ignore: []
189
189
  min_size: 1
190
190
  max_size: 50
191
+
192
+ DeprecatedGlobalAppBlockType:
193
+ enabled: true
@@ -0,0 +1,65 @@
1
+ # Check for deprecated global app block type `@global`
2
+ This check makes sure theme sections are not using [deprecated (`@global`)][change_log] global app block type.
3
+
4
+ ## Check Details
5
+ In order for theme sections to [support app blocks][support_app_blocks_in_theme_section], sections need to define a block of type `@app`. This check makes sure that theme sections are not using the deprecated (`@global`) global app block type in theme sections.
6
+
7
+ :-1: Example of **incorrect** theme section for this check:
8
+ ```
9
+ {% for block in section.blocks %}
10
+ {% if block.type = "@global" %}
11
+ {% render block %}
12
+ {% endif %}
13
+ {% endfor %}
14
+
15
+ {% schema %}
16
+ {
17
+ "name": "Product section",
18
+ "blocks": [{"type": "@global"}]
19
+ }
20
+ {% endschema %}
21
+ ```
22
+
23
+ :+1: Examples of **correct** theme section for this check:
24
+ ```
25
+ {% for block in section.blocks %}
26
+ {% if block.type = "@app" %}
27
+ {% render block %}
28
+ {% endif %}
29
+ {% endfor %}
30
+
31
+ {% schema %}
32
+ {
33
+ "name": "Product section",
34
+ "blocks": [{"type": "@app"}]
35
+ }
36
+ {% endschema %}
37
+ ```
38
+
39
+ ## Check Options
40
+
41
+ The default configuration for this check is the following:
42
+
43
+ ```yaml
44
+ DeprecatedGlobalAppBlockType:
45
+ enabled: true
46
+ ```
47
+
48
+ ## When Not To Use It
49
+
50
+ It is discouraged to disable this check.
51
+
52
+ ## Version
53
+
54
+ This check has been introduced in Theme Check 1.5.0.
55
+
56
+ ## Resources
57
+
58
+ - [Rule Source][codesource]
59
+ - [Documentation Source][docsource]
60
+
61
+ [codesource]: /lib/theme_check/checks/deprecated_global_app_block_type.rb
62
+ [docsource]: /docs/checks/deprecated_global_app_block_type.md
63
+ [remote_asset]: /docs/checks/deprecated_global_app_block_type.md
64
+ [support_app_blocks_in_theme_section]: https://shopify.dev/themes/migration#step-8-add-support-for-app-blocks-to-sections
65
+ [change_log]: https://shopify.dev/changelog/removing-the-global-block-type-in-favour-of-the-app-block-type-in-theme-sections
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+ module ThemeCheck
3
+ class DeprecatedGlobalAppBlockType < LiquidCheck
4
+ severity :error
5
+ category :liquid
6
+ doc docs_url(__FILE__)
7
+
8
+ INVALID_GLOBAL_APP_BLOCK_TYPE = "@global"
9
+ VALID_GLOBAL_APP_BLOCK_TYPE = "@app"
10
+
11
+ def on_schema(node)
12
+ schema = JSON.parse(node.value.nodelist.join)
13
+
14
+ if block_types_from(schema).include?(INVALID_GLOBAL_APP_BLOCK_TYPE)
15
+ add_offense(
16
+ "Deprecated '#{INVALID_GLOBAL_APP_BLOCK_TYPE}' block type defined in the schema, use '#{VALID_GLOBAL_APP_BLOCK_TYPE}' block type instead.",
17
+ node: node
18
+ )
19
+ end
20
+ rescue JSON::ParserError
21
+ # Ignored, handled in ValidSchema.
22
+ end
23
+
24
+ def on_case(node)
25
+ if node.value == INVALID_GLOBAL_APP_BLOCK_TYPE
26
+ report_offense(node)
27
+ end
28
+ end
29
+
30
+ def on_condition(node)
31
+ if node.value.right == INVALID_GLOBAL_APP_BLOCK_TYPE || node.value.left == INVALID_GLOBAL_APP_BLOCK_TYPE
32
+ report_offense(node)
33
+ end
34
+ end
35
+
36
+ def on_variable(node)
37
+ if node.value.name == INVALID_GLOBAL_APP_BLOCK_TYPE
38
+ report_offense(node)
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def report_offense(node)
45
+ add_offense(
46
+ "Deprecated '#{INVALID_GLOBAL_APP_BLOCK_TYPE}' block type, use '#{VALID_GLOBAL_APP_BLOCK_TYPE}' block type instead.",
47
+ node: node
48
+ )
49
+ end
50
+
51
+ def block_types_from(schema)
52
+ schema.fetch("blocks", []).map do |block|
53
+ block.fetch("type", "")
54
+ end
55
+ end
56
+ end
57
+ end
@@ -54,12 +54,11 @@ module ThemeCheck
54
54
  private
55
55
 
56
56
  def get_setting_default_value(setting_id)
57
- setting = @schema_settings.select { |s| s['id'] == setting_id }
58
- unless setting.empty?
59
- return setting.last['default']
60
- end
61
- # Setting does not exist
62
- nil
57
+ setting = @schema_settings.find { |s| s['id'] == setting_id }
58
+ return nil if setting.empty?
59
+ default_value = setting['default'].to_i
60
+ return nil if default_value == 0
61
+ default_value
63
62
  end
64
63
  end
65
64
  end
@@ -21,6 +21,7 @@ module ThemeCheck
21
21
  styleCount: path_offenses.count { |offense| offense[:severity] == Check::SEVERITY_VALUES[:style] },
22
22
  }
23
23
  end
24
+ .sort_by { |o| o[:path] }
24
25
  end
25
26
  end
26
27
  end
@@ -5,6 +5,7 @@ module ThemeCheck
5
5
  class DocumentLinkProvider
6
6
  include RegexHelpers
7
7
  include PositionHelper
8
+ include URIHelper
8
9
 
9
10
  class << self
10
11
  attr_accessor :partial_regexp, :destination_directory, :destination_postfix
@@ -63,7 +64,7 @@ module ThemeCheck
63
64
  end
64
65
 
65
66
  def file_link(partial)
66
- "file://#{@storage.path(destination_directory + '/' + partial + destination_postfix)}"
67
+ file_uri(@storage.path(destination_directory + '/' + partial + destination_postfix))
67
68
  end
68
69
  end
69
70
  end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require "benchmark"
3
- require "uri"
4
- require "cgi"
5
4
 
6
5
  module ThemeCheck
7
6
  module LanguageServer
8
7
  class Handler
8
+ include URIHelper
9
+
9
10
  CAPABILITIES = {
10
11
  completionProvider: {
11
12
  triggerCharacters: ['.', '{{ ', '{% '],
@@ -26,7 +27,7 @@ module ThemeCheck
26
27
  end
27
28
 
28
29
  def on_initialize(id, params)
29
- @root_path = path_from_uri(params["rootUri"]) || params["rootPath"]
30
+ @root_path = root_path_from_params(params)
30
31
 
31
32
  # Tell the client we don't support anything if there's no rootPath
32
33
  return send_response(id, { capabilities: {} }) if @root_path.nil?
@@ -96,19 +97,23 @@ module ThemeCheck
96
97
  end
97
98
 
98
99
  def text_document_uri(params)
99
- path_from_uri(params.dig('textDocument', 'uri'))
100
- end
101
-
102
- def path_from_uri(uri_string)
103
- return if uri_string.nil?
104
- uri = URI(uri_string)
105
- CGI.unescape(uri.path)
100
+ file_path(params.dig('textDocument', 'uri'))
106
101
  end
107
102
 
108
103
  def relative_path_from_text_document_uri(params)
109
104
  @storage.relative_path(text_document_uri(params))
110
105
  end
111
106
 
107
+ def root_path_from_params(params)
108
+ root_uri = params["rootUri"]
109
+ root_path = params["rootPath"]
110
+ if root_uri
111
+ file_path(root_uri)
112
+ elsif root_path
113
+ root_path
114
+ end
115
+ end
116
+
112
117
  def text_document_text(params)
113
118
  params.dig('textDocument', 'text')
114
119
  end
@@ -174,7 +179,7 @@ module ThemeCheck
174
179
  def send_diagnostic(path, offenses)
175
180
  # https://microsoft.github.io/language-server-protocol/specifications/specification-current/#notificationMessage
176
181
  send_notification('textDocument/publishDiagnostics', {
177
- uri: "file://#{path}",
182
+ uri: file_uri(path),
178
183
  diagnostics: offenses.map { |offense| offense_to_diagnostic(offense) },
179
184
  })
180
185
  end
@@ -25,6 +25,15 @@ module ThemeCheck
25
25
  @out = out_stream
26
26
  @err = err_stream
27
27
 
28
+ # Because programming is fun,
29
+ #
30
+ # Ruby on Windows turns \n into \r\n. Which means that \r\n
31
+ # gets turned into \r\r\n. Which means that the protocol
32
+ # breaks on windows unless we turn STDOUT into binary mode.
33
+ #
34
+ # Hours wasted: 9.
35
+ @out.binmode
36
+
28
37
  @out.sync = true # do not buffer
29
38
  @err.sync = true # do not buffer
30
39
 
@@ -52,19 +61,8 @@ module ThemeCheck
52
61
  response_body = JSON.dump(response)
53
62
  log(JSON.pretty_generate(response)) if $DEBUG
54
63
 
55
- # Because programming is fun,
56
- #
57
- # Ruby on Windows turns \n into \r\n. Which means that \r\n
58
- # gets turned into \r\r\n. Which means that the protocol
59
- # breaks on windows unless we turn STDOUT into binary mode and
60
- # set the encoding manually (yuk!) or we do this little hack
61
- # here and put \n which gets transformed into \r\n on windows
62
- # only...
63
- #
64
- # Hours wasted: 8.
65
- eol = Gem.win_platform? ? "\n" : "\r\n"
66
- @out.write("Content-Length: #{response_body.bytesize}#{eol}")
67
- @out.write(eol)
64
+ @out.write("Content-Length: #{response_body.bytesize}\r\n")
65
+ @out.write("\r\n")
68
66
  @out.write(response_body)
69
67
  @out.flush
70
68
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "benchmark"
4
+ require "uri"
5
+ require "cgi"
6
+
7
+ module ThemeCheck
8
+ module LanguageServer
9
+ module URIHelper
10
+ # Will URI.encode a string the same way VS Code would. There are two things
11
+ # to watch out for:
12
+ #
13
+ # 1. VS Code still uses the outdated '%20' for spaces
14
+ # 2. VS Code prefixes Windows paths with / (so /C:/Users/... is expected)
15
+ #
16
+ # Exists because of https://github.com/Shopify/theme-check/issues/360
17
+ def file_uri(absolute_path)
18
+ "file://" + absolute_path
19
+ .to_s
20
+ .split('/')
21
+ .map { |x| CGI.escape(x).gsub('+', '%20') }
22
+ .join('/')
23
+ .sub(%r{^/?}, '/') # Windows paths should be prefixed by /c:
24
+ end
25
+
26
+ def file_path(uri_string)
27
+ return if uri_string.nil?
28
+ uri = URI(uri_string)
29
+ path = CGI.unescape(uri.path)
30
+ # On Windows, VS Code sends the URLs as file:///C:/...
31
+ # /C:/1234 is not a valid path in ruby. So we strip the slash.
32
+ path = path.sub(%r{^/([a-z]:/)}i, '\1')
33
+ path
34
+ end
35
+ end
36
+ end
37
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  require_relative "language_server/protocol"
3
3
  require_relative "language_server/constants"
4
+ require_relative "language_server/uri_helper"
4
5
  require_relative "language_server/handler"
5
6
  require_relative "language_server/server"
6
7
  require_relative "language_server/tokens"
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ThemeCheck
3
- VERSION = "1.4.0"
3
+ VERSION = "1.5.0"
4
4
  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.4.0
4
+ version: 1.5.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-08-30 00:00:00.000000000 Z
11
+ date: 2021-09-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: liquid
@@ -90,6 +90,7 @@ files:
90
90
  - docs/checks/deprecate_bgsizes.md
91
91
  - docs/checks/deprecate_lazysizes.md
92
92
  - docs/checks/deprecated_filter.md
93
+ - docs/checks/deprecated_global_app_block_type.md
93
94
  - docs/checks/html_parsing_error.md
94
95
  - docs/checks/img_lazy_loading.md
95
96
  - docs/checks/img_width_and_height.md
@@ -140,6 +141,7 @@ files:
140
141
  - lib/theme_check/checks/deprecate_bgsizes.rb
141
142
  - lib/theme_check/checks/deprecate_lazysizes.rb
142
143
  - lib/theme_check/checks/deprecated_filter.rb
144
+ - lib/theme_check/checks/deprecated_global_app_block_type.rb
143
145
  - lib/theme_check/checks/html_parsing_error.rb
144
146
  - lib/theme_check/checks/img_lazy_loading.rb
145
147
  - lib/theme_check/checks/img_width_and_height.rb
@@ -203,6 +205,7 @@ files:
203
205
  - lib/theme_check/language_server/protocol.rb
204
206
  - lib/theme_check/language_server/server.rb
205
207
  - lib/theme_check/language_server/tokens.rb
208
+ - lib/theme_check/language_server/uri_helper.rb
206
209
  - lib/theme_check/language_server/variable_lookup_finder.rb
207
210
  - lib/theme_check/liquid_check.rb
208
211
  - lib/theme_check/locale_diff.rb