shopify-cli 2.32.0 → 2.32.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b1f827e0b1d481a8fdd6e7160ef85d6e63bee0a7607f6bf148693956f901d67c
4
- data.tar.gz: 5882878a69100c7ac97255c80a0ca868ca616be1eca5a523c3e1ddf1e8896dc4
3
+ metadata.gz: cedba2d3c1257478768278fcf18b239d18d49b56dd11ce9cb4eb60810f9bd46c
4
+ data.tar.gz: 252212433092e2df2f821782a58b57f8864bac936d04cac6f51a74a1891b3e59
5
5
  SHA512:
6
- metadata.gz: 5f2335aecb476e962d7283d33187acb94cae34a1b6b23f52f48ad890c4daaeeabf0afeaecb0a3740a57ac98c86a18a7f35422430da2eea5413472fc85c740360
7
- data.tar.gz: 6e9b70d65c59e9531b44e270d752637999bccaaf844c7f89be659c04f3f6f343bd89ce72e1e25c46d0d16dc66873233a5268aba8aab2eed873e0a086a7af0b6a
6
+ metadata.gz: c8d241e1d4353e2dd8e750fb81b47f936a9c35e7117e785ca50444acbf918956925a04657229b2afd84e8bad930d7bdd9cfe5cd0e67f6cf055f6899f91f27d0a
7
+ data.tar.gz: b3eb6d62f7fbc3c566161a8a1c09ed5d7679eda82a81eb0622fe7cc7ef9af391677f8281795fbff40ddec5b63fc529381165de02a91103fc851e96b2baa84d7c
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@ From version 2.6.0, the sections in this file adhere to the [keep a changelog](h
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## Version 2.32.1 - 2022-12-05
6
+
7
+ ### Fixed
8
+ * [#2694](https://github.com/Shopify/shopify-cli/pull/2694): Add sunset warnings
9
+
5
10
  ## Version 2.32.0 - 2022-11-14
6
11
 
7
12
  ### Added
@@ -9,6 +14,7 @@ From version 2.6.0, the sections in this file adhere to the [keep a changelog](h
9
14
 
10
15
  ### Fixed
11
16
  * [#2683](https://github.com/Shopify/shopify-cli/pull/2683): Fix timeout issue with the `shopify theme push` command and the `--json` flag
17
+ * [#2688](https://github.com/Shopify/shopify-cli/pull/2688): Fix `shopify theme push` to report pushes with errors
12
18
 
13
19
  ## Version 2.31.0 - 2022-11-07
14
20
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shopify-cli (2.32.0)
4
+ shopify-cli (2.32.1)
5
5
  bugsnag (~> 6.22)
6
6
  listen (~> 3.7.0)
7
7
  theme-check (~> 1.11.0)
data/README.md CHANGED
@@ -11,17 +11,11 @@
11
11
  <img src="https://img.shields.io/badge/License-MIT-green.svg" alt="License">
12
12
  <img src="https://img.shields.io/badge/Powered%20by-Ruby-red" alt="Powered by Ruby">
13
13
 
14
-
15
14
  Shopify CLI 2.0 is a command line to help you build on Shopify. It's available as a Ruby gem and can be run and installed on Mac, Linux, and Windows systems.
16
15
 
17
- ## Note on Shopify CLI 2.0 versus Shopify CLI 3.0 ##
18
-
19
- Use 2.0 for developing themes. For developing apps and custom storefronts, we recommend using [Shopify CLI 3.0](https://github.com/Shopify/cli).
20
-
21
-
22
- ## Installation
16
+ ## CLI Deprecation & Sunset
23
17
 
24
- Check out our [installation steps](docs/users/installation.md).
18
+ Note that Shopify 2.0 is deprecated and will be [sunset on May 31, 2023](https://shopify.dev/changelog/cli-2-0-to-be-sunset-on-may-31-2023). We encourage using [Shopify CLI 3.0](https://github.com/Shopify/cli) to develop apps, custom storefronts, and themes.
25
19
 
26
20
  ## Contributing 👩‍💻
27
21
 
@@ -5,28 +5,7 @@ module ShopifyCLI
5
5
  module EntryPoint
6
6
  class << self
7
7
  def call(args, ctx = Context.new)
8
- # Only instruct the user to update the CLI, or warn them that they're
9
- # using CLI2 not CLI3, if they're running CLI2 directly. Otherwise the
10
- # warnings will be confusing and/or incorrect.
11
- unless Environment.run_as_subprocess?
12
- if ctx.development? && !ctx.testing?
13
- ctx.warn(
14
- ctx.message(
15
- "core.warning.development_version",
16
- File.join(ShopifyCLI::ROOT, "bin", ShopifyCLI::TOOL_NAME)
17
- )
18
- )
19
- # because `!ctx.new_version.nil?` will change the config by calling ::Config.set
20
- # it's important to keep the checks in this order so that we don't trigger it while testing
21
- # since changing the config will throw errors
22
- elsif !ctx.testing? && !ctx.new_version.nil?
23
- ctx.warn(ctx.message("core.warning.new_version", ShopifyCLI::VERSION, ctx.new_version))
24
- end
25
-
26
- if ShopifyCLI::Core::CliVersion.using_3_0?
27
- ctx.warn(ctx.message("core.warning.in_3_0_directory"))
28
- end
29
- end
8
+ show_warnings(ctx, args.join(" "))
30
9
 
31
10
  ProjectType.load_all
32
11
 
@@ -38,6 +17,47 @@ module ShopifyCLI
38
17
  executor.call(command, command_name, args)
39
18
  end
40
19
  end
20
+
21
+ def show_warnings(ctx, args)
22
+ # Only instruct the user to update the CLI, or warn them that they're
23
+ # using CLI2 not CLI3, if they're running CLI2 directly. Otherwise the
24
+ # warnings will be confusing and/or incorrect.
25
+ return if Environment.run_as_subprocess?
26
+
27
+ show_sunset_warning(ctx, args)
28
+
29
+ if ctx.development? && !ctx.testing?
30
+ ctx.warn(
31
+ ctx.message(
32
+ "core.warning.development_version",
33
+ File.join(ShopifyCLI::ROOT, "bin", ShopifyCLI::TOOL_NAME)
34
+ )
35
+ )
36
+ # because `!ctx.new_version.nil?` will change the config by calling ::Config.set
37
+ # it's important to keep the checks in this order so that we don't trigger it while testing
38
+ # since changing the config will throw errors
39
+ elsif !ctx.testing? && !ctx.new_version.nil?
40
+ ctx.warn(ctx.message("core.warning.new_version", ShopifyCLI::VERSION, ctx.new_version))
41
+ end
42
+
43
+ if ShopifyCLI::Core::CliVersion.using_3_0?
44
+ ctx.warn(ctx.message("core.warning.in_3_0_directory"))
45
+ end
46
+ end
47
+
48
+ def show_sunset_warning(ctx, args)
49
+ return if ctx.testing?
50
+
51
+ if args.start_with?("app create") || args.start_with?("app extension create")
52
+ ctx.warn(ctx.message("core.warning.sunset_create_app"))
53
+ elsif args.start_with?("app")
54
+ ctx.warn(ctx.message("core.warning.sunset_app"))
55
+ elsif args.start_with?("theme")
56
+ ctx.warn(ctx.message("core.warning.sunset_theme"))
57
+ else
58
+ ctx.warn(ctx.message("core.warning.sunset"))
59
+ end
60
+ end
41
61
  end
42
62
  end
43
63
  end
@@ -804,6 +804,22 @@ module ShopifyCLI
804
804
  Already have CLI 3.0 installed? Run it using your node package manager, as explained here:
805
805
  {{underline:https://shopify.dev/apps/tools/cli/cli-2#running-shopify-cli-2-x-and-3-x-in-the-same-environment}}
806
806
  MESSAGE
807
+
808
+ sunset: <<~MESSAGE,
809
+ {{*}} {{yellow:Note that CLI 2.x will be sunset on May 31, 2023.}}
810
+ MESSAGE
811
+
812
+ sunset_create_app: <<~MESSAGE,
813
+ {{*}} {{yellow:Note that this CLI 2.x command will be sunset on April 28, 2023. Check here for instructions on how to migrate over to CLI 3.x: {{underline:https://shopify.dev/apps/tools/cli/migrate}}.}}
814
+ MESSAGE
815
+
816
+ sunset_app: <<~MESSAGE,
817
+ {{*}} {{yellow:Note that CLI 2.x will be sunset on May 31, 2023. Check here for instructions on how to migrate over to CLI 3.x: {{underline:https://shopify.dev/apps/tools/cli/migrate}}.}}
818
+ MESSAGE
819
+
820
+ sunset_theme: <<~MESSAGE,
821
+ {{*}} {{yellow:Note that CLI 2.x will be sunset on May 31, 2023. Check here for instructions on how to migrate over to CLI 3.x: {{underline:https://shopify.dev/themes/tools/cli/migrate}}.}}
822
+ MESSAGE
807
823
  },
808
824
  reporting: {
809
825
  help: <<~HELP,
@@ -26,13 +26,11 @@ module ShopifyCLI
26
26
  :ignore_file?,
27
27
  :overwrite_json?,
28
28
  :bulk_updates_activated?,
29
-
30
29
  # enqueue
31
30
  :enqueue_deletes,
32
31
  :enqueue_get,
33
32
  :enqueue_union_merges,
34
33
  :enqueue_updates,
35
-
36
34
  # checksums
37
35
  :checksums,
38
36
  :update_checksums,
@@ -112,7 +110,7 @@ module ShopifyCLI
112
110
  retries = 0
113
111
  pending_items = files.map { |file| bulk_item(file) }
114
112
 
115
- while pending_items.any? && retries < 4
113
+ while pending_items.any? && retries < 2
116
114
  bulk = Bulk.new(ctx, theme, api_client)
117
115
 
118
116
  files
@@ -183,7 +181,7 @@ module ShopifyCLI
183
181
  [
184
182
  theme["config/settings_schema.json"],
185
183
  theme["config/settings_data.json"],
186
- ]
184
+ ],
187
185
  )
188
186
  end
189
187
 
@@ -217,8 +215,14 @@ module ShopifyCLI
217
215
 
218
216
  # Handler errors
219
217
 
220
- def report(file, _error)
221
- error_message = "The asset #{file.relative_path} could not be uploaded.\n#{e.inspect}"
218
+ def report(file, error)
219
+ file_path = file.relative_path
220
+
221
+ error_message = syncer
222
+ .parse_api_errors(file, error)
223
+ .map { |msg| "#{file_path}: #{msg}" }
224
+ .join("\n")
225
+
222
226
  syncer.report_file_error(file, error_message)
223
227
  end
224
228
  end
@@ -121,6 +121,7 @@ module ShopifyCLI
121
121
 
122
122
  def wait!
123
123
  raise ThreadError, "No syncer threads" if @threads.empty?
124
+
124
125
  total = size
125
126
  last_size = size
126
127
  until empty? || @queue.closed?
@@ -134,7 +135,7 @@ module ShopifyCLI
134
135
 
135
136
  def fetch_checksums!
136
137
  _status, response = api_client.get(
137
- path: "themes/#{@theme.id}/assets.json"
138
+ path: "themes/#{@theme.id}/assets.json",
138
139
  )
139
140
  update_checksums(response)
140
141
  end
@@ -151,6 +152,7 @@ module ShopifyCLI
151
152
  loop do
152
153
  operation = @queue.pop
153
154
  break if operation.nil? # shutdown was called
155
+
154
156
  perform(operation)
155
157
  rescue Exception => e # rubocop:disable Lint/RescueException
156
158
  error_suffix = ": #{e}"
@@ -195,7 +197,7 @@ module ShopifyCLI
195
197
  end
196
198
 
197
199
  def handle_operation_error(operation, error)
198
- error_suffix = ":\n " + parse_api_errors(operation, error).join("\n ")
200
+ error_suffix = ":\n " + parse_api_errors(operation.file, error).join("\n ")
199
201
  report_error(operation, error_suffix)
200
202
  end
201
203
 
@@ -206,6 +208,7 @@ module ShopifyCLI
206
208
  def update_checksums(api_response)
207
209
  api_response.values.flatten.each do |asset|
208
210
  next unless asset["key"]
211
+
209
212
  checksums[asset["key"]] = asset["checksum"]
210
213
  end
211
214
 
@@ -219,6 +222,33 @@ module ShopifyCLI
219
222
  @error_reporter.report(error_message)
220
223
  end
221
224
 
225
+ def parse_api_errors(file, exception)
226
+ parsed_body = {}
227
+
228
+ if exception.respond_to?(:response)
229
+ response = exception.response
230
+
231
+ parsed_body = if response&.is_a?(Hash)
232
+ response&.[](:body)
233
+ else
234
+ JSON.parse(response&.body)
235
+ end
236
+ end
237
+
238
+ errors = parsed_body.dig("errors") # either nil or another type
239
+ errors = errors.dig("asset") if errors&.is_a?(Hash)
240
+
241
+ message = errors || parsed_body["message"] || exception.message
242
+ # Truncate to first lines
243
+ [message].flatten.map { |m| m.split("\n", 2).first }
244
+ rescue JSON::ParserError
245
+ [exception.message]
246
+ rescue StandardError => e
247
+ cause = "(cause: #{e.message})"
248
+ backtrace = e.backtrace.join("\n")
249
+ ["The asset #{file} could not be synced #{cause} #{backtrace}"]
250
+ end
251
+
222
252
  private
223
253
 
224
254
  def report_error(operation, error_suffix = "")
@@ -256,6 +286,7 @@ module ShopifyCLI
256
286
 
257
287
  def perform(operation)
258
288
  return if @queue.closed?
289
+
259
290
  wait_for_backoff!
260
291
  @ctx.debug(operation.to_s)
261
292
 
@@ -263,7 +294,6 @@ module ShopifyCLI
263
294
 
264
295
  report_performed_operation(operation)
265
296
  backoff_if_near_limit!(response)
266
-
267
297
  rescue StandardError => error
268
298
  handle_operation_error(operation, error)
269
299
  ensure
@@ -283,7 +313,7 @@ module ShopifyCLI
283
313
 
284
314
  _status, body, response = api_client.put(
285
315
  path: path,
286
- body: JSON.generate(asset: asset)
316
+ body: JSON.generate(asset: asset),
287
317
  )
288
318
  file.warnings = body.dig("asset", "warnings")
289
319
 
@@ -315,7 +345,7 @@ module ShopifyCLI
315
345
  path: "themes/#{@theme.id}/assets.json",
316
346
  body: JSON.generate(asset: {
317
347
  key: file.relative_path,
318
- })
348
+ }),
319
349
  )
320
350
 
321
351
  response
@@ -342,33 +372,6 @@ module ShopifyCLI
342
372
  response
343
373
  end
344
374
 
345
- def parse_api_errors(operation, exception)
346
- parsed_body = {}
347
-
348
- if exception.respond_to?(:response)
349
- response = exception.response
350
-
351
- parsed_body = if response&.is_a?(Hash)
352
- response&.[](:body)
353
- else
354
- JSON.parse(response&.body)
355
- end
356
- end
357
-
358
- errors = parsed_body.dig("errors") # either nil or another type
359
- errors = errors.dig("asset") if errors&.is_a?(Hash)
360
-
361
- message = errors || parsed_body["message"] || exception.message
362
- # Truncate to first lines
363
- [message].flatten.map { |m| m.split("\n", 2).first }
364
- rescue JSON::ParserError
365
- [exception.message]
366
- rescue StandardError => e
367
- cause = "(cause: #{e.message})"
368
- backtrace = e.backtrace.join("\n")
369
- ["The asset #{operation.file} could not be synced #{cause} #{backtrace}"]
370
- end
371
-
372
375
  def theme_created_at_runtime?
373
376
  @theme.created_at_runtime?
374
377
  end
@@ -61,6 +61,7 @@ module ShopifyCLI
61
61
  if empty_response?(error)
62
62
  return permission_error
63
63
  elsif unauthorized_response?(error)
64
+ @ctx.debug("[#{self.class}] (#{error.class}) cause: #{response_body(error)}")
64
65
  raise ShopifyCLI::Abort, @ctx.message("theme.unauthorized_error", @shop)
65
66
  end
66
67
 
@@ -1,3 +1,3 @@
1
1
  module ShopifyCLI
2
- VERSION = "2.32.0"
2
+ VERSION = "2.32.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopify-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.32.0
4
+ version: 2.32.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-14 00:00:00.000000000 Z
11
+ date: 2022-12-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler