shopify-cli 1.0.4 → 1.0.5

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 (40) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -2
  3. data/CHANGELOG.md +5 -1
  4. data/Gemfile +1 -1
  5. data/Gemfile.lock +13 -13
  6. data/docs/Gemfile.lock +23 -13
  7. data/lib/project_types/extension/models/type.rb +1 -0
  8. data/lib/project_types/extension/tasks/create_extension.rb +1 -1
  9. data/lib/project_types/extension/tasks/get_app.rb +1 -1
  10. data/lib/project_types/extension/tasks/update_draft.rb +1 -1
  11. data/lib/project_types/script/commands/create.rb +1 -5
  12. data/lib/project_types/script/commands/disable.rb +1 -2
  13. data/lib/project_types/script/commands/enable.rb +5 -5
  14. data/lib/project_types/script/commands/push.rb +1 -6
  15. data/lib/project_types/script/config/extension_points.yml +2 -2
  16. data/lib/project_types/script/errors.rb +8 -0
  17. data/lib/project_types/script/layers/domain/errors.rb +2 -0
  18. data/lib/project_types/script/layers/infrastructure/errors.rb +1 -0
  19. data/lib/project_types/script/messages/messages.rb +11 -14
  20. data/lib/project_types/script/ui/error_handler.rb +4 -0
  21. data/lib/shopify-cli/command.rb +12 -6
  22. data/lib/shopify-cli/commands/connect.rb +7 -75
  23. data/lib/shopify-cli/commands/create.rb +1 -1
  24. data/lib/shopify-cli/commands/system.rb +13 -5
  25. data/lib/shopify-cli/core/entry_point.rb +1 -1
  26. data/lib/shopify-cli/core/executor.rb +3 -5
  27. data/lib/shopify-cli/core/monorail.rb +1 -1
  28. data/lib/shopify-cli/db.rb +1 -1
  29. data/lib/shopify-cli/heroku.rb +4 -4
  30. data/lib/shopify-cli/messages/messages.rb +15 -19
  31. data/lib/shopify-cli/process_supervision.rb +8 -6
  32. data/lib/shopify-cli/project_type.rb +3 -2
  33. data/lib/shopify-cli/sub_command.rb +1 -0
  34. data/lib/shopify-cli/task.rb +2 -2
  35. data/lib/shopify-cli/tasks.rb +11 -4
  36. data/lib/shopify-cli/tasks/ensure_env.rb +74 -17
  37. data/lib/shopify-cli/tunnel.rb +6 -6
  38. data/lib/shopify-cli/version.rb +1 -1
  39. data/lib/shopify_cli.rb +31 -9
  40. metadata +2 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d17f3e09b5ecfa047387eb3786b187bbb4e03068a28b71815c62a338e4d3b3a0
4
- data.tar.gz: e7ae1f805df2f928ae5b1c043d9b864fc8151750f1869d4d23d8a73757ecbba0
3
+ metadata.gz: b05da9533ccffc11607217b455d2a23590668a445a0af58c67c168fe5a5dfe96
4
+ data.tar.gz: e10408bf78ac963dd50953edbf438bc4dbf247d0001db8a1b1013b0f981189f1
5
5
  SHA512:
6
- metadata.gz: 609ad36002ecb5b13d41cb4c6a0cfb397e18087878372acc59e3f3520fad32eb59d661f122307ac95b0d456c216327da317f9c30a26bfdd360370cc5f0aede1d
7
- data.tar.gz: '094c183b361bd503a15d87e89b37c065361b78b3cfa69902a8176644c4f1d67c3890902889a069dc4049bd5a22ec4e6b9af258f19e12a0fc9a4e10aa72bab7e3'
6
+ metadata.gz: 7626a67bc6ba0fe13b6223b4239927e4f4e39c74a2536e7fe0a38b4403d9c115771a913c4921d28a81175de84c1cc9e7fc9b84e046042a5957ba9f3aa1d56d7d
7
+ data.tar.gz: 630008b941f6c034f51fcdb370f6dd09dba5bcb18a44b5bd1035367443bdc28d679adf69ee9e0f3a9417ddfcbef473411d99934a9a14fc777310edf67677711c
@@ -1,7 +1,8 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.4.7
4
- - 2.5.1
3
+ - 2.5.8
4
+ - 2.6.6
5
+ - 2.7.1
5
6
  before_install:
6
7
  - gem install bundler -v '1.17.3'
7
8
  cache:
@@ -1,6 +1,10 @@
1
+ Version 1.0.5
2
+ ------
3
+ * Fix a bug in out opt-in metrics
4
+
1
5
  Version 1.0.4
2
6
  ------
3
- * Fix a bug when running the `connect` command with an account with multiple organizations
7
+ * Fix a bug when running the `connect` command with an account with multiple organizations
4
8
 
5
9
  Version 1.0.3
6
10
  ------
data/Gemfile CHANGED
@@ -16,7 +16,7 @@ group :test do
16
16
  gem 'mocha', require: false
17
17
  gem 'minitest', '>= 5.0.0', require: false
18
18
  gem 'minitest-reporters', require: false
19
- gem 'fakefs', require: false
19
+ gem 'fakefs', '>= 1.0', require: false
20
20
  gem 'webmock', require: false
21
21
  gem 'timecop', require: false
22
22
  end
@@ -4,13 +4,13 @@ GEM
4
4
  addressable (2.5.2)
5
5
  public_suffix (>= 2.0.2, < 4.0)
6
6
  ansi (1.5.0)
7
- ast (2.4.0)
7
+ ast (2.4.1)
8
8
  builder (3.2.3)
9
- byebug (8.2.2)
9
+ byebug (8.2.5)
10
10
  coderay (1.1.2)
11
11
  crack (0.4.3)
12
12
  safe_yaml (~> 1.0.0)
13
- fakefs (0.20.0)
13
+ fakefs (1.2.2)
14
14
  hashdiff (0.3.2)
15
15
  metaclass (0.0.4)
16
16
  method_source (0.9.2)
@@ -22,9 +22,9 @@ GEM
22
22
  ruby-progressbar
23
23
  mocha (1.7.0)
24
24
  metaclass (~> 0.0.1)
25
- parallel (1.19.1)
26
- parser (2.7.1.3)
27
- ast (~> 2.4.0)
25
+ parallel (1.19.2)
26
+ parser (2.7.1.4)
27
+ ast (~> 2.4.1)
28
28
  pry (0.12.2)
29
29
  coderay (~> 1.1.0)
30
30
  method_source (~> 0.9.0)
@@ -34,19 +34,19 @@ GEM
34
34
  public_suffix (3.0.3)
35
35
  rainbow (3.0.0)
36
36
  rake (13.0.1)
37
- regexp_parser (1.7.0)
37
+ regexp_parser (1.7.1)
38
38
  rexml (3.2.4)
39
- rubocop (0.85.0)
39
+ rubocop (0.89.1)
40
40
  parallel (~> 1.10)
41
- parser (>= 2.7.0.1)
41
+ parser (>= 2.7.1.1)
42
42
  rainbow (>= 2.2.2, < 4.0)
43
43
  regexp_parser (>= 1.7)
44
44
  rexml
45
- rubocop-ast (>= 0.0.3)
45
+ rubocop-ast (>= 0.3.0, < 1.0)
46
46
  ruby-progressbar (~> 1.7)
47
47
  unicode-display_width (>= 1.4.0, < 2.0)
48
- rubocop-ast (0.0.3)
49
- parser (>= 2.7.0.1)
48
+ rubocop-ast (0.3.0)
49
+ parser (>= 2.7.1.4)
50
50
  ruby-progressbar (1.10.1)
51
51
  safe_yaml (1.0.4)
52
52
  session (3.2.0)
@@ -62,7 +62,7 @@ PLATFORMS
62
62
 
63
63
  DEPENDENCIES
64
64
  byebug
65
- fakefs
65
+ fakefs (>= 1.0)
66
66
  minitest (>= 5.0.0)
67
67
  minitest-reporters
68
68
  mocha
@@ -1,7 +1,7 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
- activesupport (6.0.3.1)
4
+ activesupport (6.0.3.2)
5
5
  concurrent-ruby (~> 1.0, >= 1.0.2)
6
6
  i18n (>= 0.7, < 2)
7
7
  minitest (~> 5.1)
@@ -16,9 +16,9 @@ GEM
16
16
  colorator (1.1.0)
17
17
  commonmarker (0.17.13)
18
18
  ruby-enum (~> 0.5)
19
- concurrent-ruby (1.1.6)
20
- dnsruby (1.61.3)
21
- addressable (~> 2.5)
19
+ concurrent-ruby (1.1.7)
20
+ dnsruby (1.61.4)
21
+ simpleidn (~> 0.1)
22
22
  em-websocket (0.5.1)
23
23
  eventmachine (>= 0.12.9)
24
24
  http_parser.rb (~> 0.6.0)
@@ -28,12 +28,12 @@ GEM
28
28
  execjs (2.7.0)
29
29
  faraday (1.0.1)
30
30
  multipart-post (>= 1.2, < 3)
31
- ffi (1.13.0)
31
+ ffi (1.13.1)
32
32
  forwardable-extended (2.6.0)
33
33
  gemoji (3.0.1)
34
- github-pages (206)
34
+ github-pages (207)
35
35
  github-pages-health-check (= 1.16.1)
36
- jekyll (= 3.8.7)
36
+ jekyll (= 3.9.0)
37
37
  jekyll-avatar (= 0.7.0)
38
38
  jekyll-coffeescript (= 1.1.1)
39
39
  jekyll-commonmark-ghpages (= 0.1.6)
@@ -67,7 +67,8 @@ GEM
67
67
  jekyll-theme-time-machine (= 0.1.1)
68
68
  jekyll-titles-from-headings (= 0.5.3)
69
69
  jemoji (= 0.11.1)
70
- kramdown (= 1.17.0)
70
+ kramdown (= 2.3.0)
71
+ kramdown-parser-gfm (= 1.1.0)
71
72
  liquid (= 4.0.3)
72
73
  mercenary (~> 0.3)
73
74
  minima (= 2.5.1)
@@ -86,14 +87,14 @@ GEM
86
87
  http_parser.rb (0.6.0)
87
88
  i18n (0.9.5)
88
89
  concurrent-ruby (~> 1.0)
89
- jekyll (3.8.7)
90
+ jekyll (3.9.0)
90
91
  addressable (~> 2.4)
91
92
  colorator (~> 1.0)
92
93
  em-websocket (~> 0.5)
93
94
  i18n (~> 0.7)
94
95
  jekyll-sass-converter (~> 1.0)
95
96
  jekyll-watch (~> 2.0)
96
- kramdown (~> 1.14)
97
+ kramdown (>= 1.17, < 3)
97
98
  liquid (~> 4.0)
98
99
  mercenary (~> 0.3.3)
99
100
  pathutil (~> 0.9)
@@ -191,7 +192,10 @@ GEM
191
192
  gemoji (~> 3.0)
192
193
  html-pipeline (~> 2.2)
193
194
  jekyll (>= 3.0, < 5.0)
194
- kramdown (1.17.0)
195
+ kramdown (2.3.0)
196
+ rexml
197
+ kramdown-parser-gfm (1.1.0)
198
+ kramdown (~> 2.0)
195
199
  liquid (4.0.3)
196
200
  listen (3.2.1)
197
201
  rb-fsevent (~> 0.10, >= 0.10.3)
@@ -204,7 +208,7 @@ GEM
204
208
  jekyll-seo-tag (~> 2.1)
205
209
  minitest (5.14.1)
206
210
  multipart-post (2.1.1)
207
- nokogiri (1.10.9)
211
+ nokogiri (1.10.10)
208
212
  mini_portile2 (~> 2.4.0)
209
213
  octokit (4.18.0)
210
214
  faraday (>= 0.9)
@@ -215,6 +219,7 @@ GEM
215
219
  rb-fsevent (0.10.4)
216
220
  rb-inotify (0.10.1)
217
221
  ffi (~> 1.0)
222
+ rexml (3.2.4)
218
223
  rouge (3.19.0)
219
224
  ruby-enum (0.8.0)
220
225
  i18n
@@ -228,6 +233,8 @@ GEM
228
233
  sawyer (0.8.2)
229
234
  addressable (>= 2.3.5)
230
235
  faraday (> 0.8, < 2.0)
236
+ simpleidn (0.1.1)
237
+ unf (~> 0.1.4)
231
238
  terminal-table (1.8.0)
232
239
  unicode-display_width (~> 1.1, >= 1.1.1)
233
240
  thread_safe (0.3.6)
@@ -235,8 +242,11 @@ GEM
235
242
  ethon (>= 0.9.0)
236
243
  tzinfo (1.2.7)
237
244
  thread_safe (~> 0.1)
245
+ unf (0.1.4)
246
+ unf_ext
247
+ unf_ext (0.0.7.7)
238
248
  unicode-display_width (1.7.0)
239
- zeitwerk (2.3.0)
249
+ zeitwerk (2.4.0)
240
250
 
241
251
  PLATFORMS
242
252
  ruby
@@ -12,6 +12,7 @@ module Extension
12
12
  end
13
13
 
14
14
  def inherited(klass)
15
+ super
15
16
  @all_extension_types ||= []
16
17
  @all_extension_types << klass
17
18
  end
@@ -20,7 +20,7 @@ module Extension
20
20
  extension_context: extension_context,
21
21
  }
22
22
 
23
- response = ShopifyCli::PartnersAPI.query(context, GRAPHQL_FILE, input).dig(*RESPONSE_FIELD)
23
+ response = ShopifyCli::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
24
24
  context.abort(context.message('tasks.errors.parse_error')) if response.nil?
25
25
 
26
26
  abort_if_user_errors(context, response)
@@ -12,7 +12,7 @@ module Extension
12
12
  def call(context:, api_key:)
13
13
  input = { api_key: api_key }
14
14
 
15
- response = ShopifyCli::PartnersAPI.query(context, GRAPHQL_FILE, input).dig(*RESPONSE_FIELD)
15
+ response = ShopifyCli::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
16
16
  context.abort(context.message('tasks.errors.parse_error')) if response.nil?
17
17
 
18
18
  Converters::AppConverter.from_hash(response.dig(APP_FIELD))
@@ -18,7 +18,7 @@ module Extension
18
18
  config: JSON.generate(config),
19
19
  extension_context: extension_context,
20
20
  }
21
- response = ShopifyCli::PartnersAPI.query(context, GRAPHQL_FILE, input).dig(*RESPONSE_FIELD)
21
+ response = ShopifyCli::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
22
22
  context.abort(context.message('tasks.errors.parse_error')) if response.nil?
23
23
 
24
24
  abort_if_user_errors(context, response)
@@ -34,12 +34,8 @@ module Script
34
34
  end
35
35
 
36
36
  def self.help
37
- ShopifyCli::Context.message('script.create.help', ShopifyCli::TOOL_NAME)
38
- end
39
-
40
- def self.extended_help
41
37
  allowed_values = Script::Layers::Application::ExtensionPoints.types.map { |type| "{{cyan:#{type}}}" }
42
- ShopifyCli::Context.message('script.create.extended_help', ShopifyCli::TOOL_NAME, allowed_values.join(', '))
38
+ ShopifyCli::Context.message('script.create.help', ShopifyCli::TOOL_NAME, allowed_values.join(', '))
43
39
  end
44
40
  end
45
41
  end
@@ -3,9 +3,8 @@
3
3
  module Script
4
4
  module Commands
5
5
  class Disable < ShopifyCli::Command
6
- prerequisite_task :ensure_env
7
-
8
6
  def call(_args, _name)
7
+ ShopifyCli::Tasks::EnsureEnv.call(@ctx, required: [:api_key, :secret, :shop])
9
8
  project = ScriptProject.current
10
9
  Layers::Application::DisableScript.call(
11
10
  ctx: @ctx,
@@ -3,7 +3,6 @@
3
3
  module Script
4
4
  module Commands
5
5
  class Enable < ShopifyCli::Command
6
- prerequisite_task :ensure_env
7
6
  options do |parser, flags|
8
7
  parser.on('--config_props=KEYVALUEPAIRS', Array) do |t|
9
8
  flags[:config_props] = Hash[t.map { |s| s.split(':') }]
@@ -12,6 +11,7 @@ module Script
12
11
  end
13
12
 
14
13
  def call(_args, _name)
14
+ ShopifyCli::Tasks::EnsureEnv.call(@ctx, required: [:api_key, :secret, :shop])
15
15
  project = ScriptProject.current
16
16
  api_key = project.env[:api_key]
17
17
  shop_domain = project.env[:shop]
@@ -32,6 +32,8 @@ module Script
32
32
  title: project.script_name
33
33
  ))
34
34
  @ctx.puts(@ctx.message('script.enable.info'))
35
+ rescue Errors::InvalidConfigYAMLError => e
36
+ UI::ErrorHandler.pretty_print_and_raise(e)
35
37
  rescue StandardError => e
36
38
  UI::ErrorHandler.pretty_print_and_raise(e, failed_op: @ctx.message('script.enable.error.operation_failed'))
37
39
  end
@@ -40,10 +42,6 @@ module Script
40
42
  ShopifyCli::Context.message('script.enable.help', ShopifyCli::TOOL_NAME)
41
43
  end
42
44
 
43
- def self.extended_help
44
- ShopifyCli::Context.message('script.enable.extended_help', ShopifyCli::TOOL_NAME)
45
- end
46
-
47
45
  private
48
46
 
49
47
  def acquire_configuration(config_file: nil, config_props: nil)
@@ -59,6 +57,8 @@ module Script
59
57
  })
60
58
  end
61
59
  configuration
60
+ rescue Errno::ENOENT, Psych::SyntaxError
61
+ raise Errors::InvalidConfigYAMLError, options.flags[:config_file]
62
62
  end
63
63
 
64
64
  # No slice pre Ruby 2.5 so roll our own
@@ -3,13 +3,12 @@
3
3
  module Script
4
4
  module Commands
5
5
  class Push < ShopifyCli::Command
6
- prerequisite_task :ensure_env
7
-
8
6
  options do |parser, flags|
9
7
  parser.on('--force') { |t| flags[:force] = t }
10
8
  end
11
9
 
12
10
  def call(_args, _name)
11
+ ShopifyCli::Tasks::EnsureEnv.call(@ctx, required: [:api_key, :secret, :shop])
13
12
  project = ScriptProject.current
14
13
  api_key = project.env[:api_key]
15
14
  return @ctx.puts(self.class.help) unless api_key &&
@@ -31,10 +30,6 @@ module Script
31
30
  def self.help
32
31
  ShopifyCli::Context.message('script.push.help', ShopifyCli::TOOL_NAME)
33
32
  end
34
-
35
- def self.extended_help
36
- ShopifyCli::Context.message('script.push.extended_help', ShopifyCli::TOOL_NAME)
37
- end
38
33
  end
39
34
  end
40
35
  end
@@ -7,13 +7,13 @@ discount:
7
7
  unit_limit_per_order:
8
8
  assemblyscript:
9
9
  package: "@shopify/extension-point-as-unit-limit-per-order"
10
- version: "^0.1.6"
10
+ version: "^0.1.8"
11
11
  sdk-version: "^6.0.0"
12
12
  toolchain-version: "^1.1.0"
13
13
  payment_filter:
14
14
  assemblyscript:
15
15
  package: "@shopify/extension-point-as-payment-filter"
16
- version: "^0.2.2"
16
+ version: "^0.2.3"
17
17
  sdk-version: "^6.0.0"
18
18
  toolchain-version: "^1.1.0"
19
19
  shipping_filter:
@@ -9,9 +9,17 @@ module Script
9
9
  class NoExistingStoresError < ScriptProjectError
10
10
  attr_reader :organization_id
11
11
  def initialize(organization_id)
12
+ super()
12
13
  @organization_id = organization_id
13
14
  end
14
15
  end
15
16
  class ScriptProjectAlreadyExistsError < ScriptProjectError; end
17
+ class InvalidConfigYAMLError < ScriptProjectError
18
+ attr_reader :config_file
19
+ def initialize(config_file)
20
+ super()
21
+ @config_file = config_file
22
+ end
23
+ end
16
24
  end
17
25
  end
@@ -8,12 +8,14 @@ module Script
8
8
  class InvalidExtensionPointError < ScriptProjectError
9
9
  attr_reader :type
10
10
  def initialize(type)
11
+ super()
11
12
  @type = type
12
13
  end
13
14
  end
14
15
  class ScriptNotFoundError < ScriptProjectError
15
16
  attr_reader :script_name, :extension_point_type
16
17
  def initialize(extension_point_type, script_name)
18
+ super()
17
19
  @script_name = script_name
18
20
  @extension_point_type = extension_point_type
19
21
  end
@@ -21,6 +21,7 @@ module Script
21
21
  class ScriptRepushError < ScriptProjectError
22
22
  attr_reader :api_key
23
23
  def initialize(api_key)
24
+ super()
24
25
  @api_key = api_key
25
26
  end
26
27
  end
@@ -38,6 +38,9 @@ module Script
38
38
  invalid_extension_cause: "Invalid extension point %s",
39
39
  invalid_extension_help: "Allowed values: %s.",
40
40
 
41
+ invalid_config: "Can't change the configuration values because %1$s is missing or "\
42
+ "it is not formatted properly.",
43
+
41
44
  script_not_found_cause: "Couldn't find script %s for extension point %s",
42
45
 
43
46
  app_not_installed_cause: "App not installed on development store.",
@@ -74,11 +77,9 @@ module Script
74
77
  help: <<~HELP,
75
78
  {{command:%1$s create script}}: Creates a script project.
76
79
  Usage: {{command:%1$s create script}}
77
- HELP
78
- extended_help: <<~HELP,
79
- \s\sOptions:
80
- \s\s{{command:--name=NAME}} Script project name. Use any string.
81
- \s\s{{command:--extension_point=TYPE}} Extension point name. Allowed values: %2$s.
80
+ Options:
81
+ {{command:--name=NAME}} Script project name. Use any string.
82
+ {{command:--extension_point=TYPE}} Extension point name. Allowed values: %2$s.
82
83
  HELP
83
84
 
84
85
  error: {
@@ -94,10 +95,8 @@ module Script
94
95
  help: <<~HELP,
95
96
  Build the script and put it into production. If you've already pushed a script with the same extension point, use --force to replace the current script with the newest one.
96
97
  Usage: {{command:%s push}}
97
- HELP
98
- extended_help: <<~HELP,
99
- \s\sOptions:
100
- \s\s{{command:[--force]}} Forces the script to be overwritten if an instance of it already exists.
98
+ Options:
99
+ {{command:[--force]}} Forces the script to be overwritten if an instance of it already exists.
101
100
  HELP
102
101
 
103
102
  error: {
@@ -125,11 +124,9 @@ module Script
125
124
  help: <<~HELP,
126
125
  Turn on script in development store.
127
126
  Usage: {{command:%s enable}}
128
- HELP
129
- extended_help: <<~HELP,
130
- \s\sOptions:
131
- \s\s{{command:--config_props='name1:value1, name2:value2'}} Optional. Define the configuration of your script by passing individual name and value pairs. If used with --config_file, then matching values in --config_props will override those set in the file.
132
- \s\s{{command:--config_file=<path/to/YAMLFilename>}} Optional. Define the configuration of your script using a YAML formatted file. --config_props values override properties in this file.
127
+ Options:
128
+ {{command:--config_props='name1:value1, name2:value2'}} Optional. Define the configuration of your script by passing individual name and value pairs. If used with --config_file, then matching values in --config_props will override those set in the file.
129
+ {{command:--config_file=<path/to/YAMLFilename>}} Optional. Define the configuration of your script using a YAML formatted file. --config_props values override properties in this file.
133
130
  HELP
134
131
 
135
132
  info: "{{*}} A script always remains enabled until you disable it - even after pushing "\
@@ -44,6 +44,10 @@ module Script
44
44
  cause_of_error: ShopifyCli::Context.message('script.error.invalid_context_cause'),
45
45
  help_suggestion: ShopifyCli::Context.message('script.error.invalid_context_help'),
46
46
  }
47
+ when Errors::InvalidConfigYAMLError
48
+ {
49
+ cause_of_error: ShopifyCli::Context.message('script.error.invalid_config', e.config_file),
50
+ }
47
51
  when Errors::InvalidScriptNameError
48
52
  {
49
53
  cause_of_error: ShopifyCli::Context.message('script.error.invalid_script_name_cause'),
@@ -9,17 +9,19 @@ module ShopifyCli
9
9
  attr_accessor :options
10
10
 
11
11
  class << self
12
- attr_writer :ctx
12
+ attr_writer :ctx, :task_registry
13
13
 
14
14
  def call(args, command_name)
15
15
  subcommand, resolved_name = subcommand_registry.lookup_command(args.first)
16
16
  if subcommand
17
17
  subcommand.ctx = @ctx
18
+ subcommand.task_registry = @task_registry
18
19
  subcommand.call(args, resolved_name, command_name)
19
20
  else
20
21
  cmd = new(@ctx)
21
22
  cmd.options.parse(@_options, args)
22
23
  return call_help(command_name) if cmd.options.help
24
+ run_prerequisites
23
25
  cmd.call(args, command_name)
24
26
  end
25
27
  end
@@ -41,13 +43,16 @@ module ShopifyCli
41
43
  end
42
44
 
43
45
  def prerequisite_task(*tasks)
44
- tasks.each do |task|
45
- prerequisite_tasks[task] = ShopifyCli::Tasks::Registry[task]
46
- end
46
+ @prerequisite_tasks ||= []
47
+ @prerequisite_tasks += tasks
48
+ end
49
+
50
+ def run_prerequisites
51
+ (@prerequisite_tasks || []).each { |task| task_registry[task]&.call(@ctx) }
47
52
  end
48
53
 
49
- def prerequisite_tasks
50
- @prerequisite_tasks ||= {}
54
+ def task_registry
55
+ @task_registry || ShopifyCli::Tasks::Registry
51
56
  end
52
57
 
53
58
  def call_help(*cmds)
@@ -57,6 +62,7 @@ module ShopifyCli
57
62
  end
58
63
 
59
64
  def initialize(ctx = nil)
65
+ super()
60
66
  @ctx = ctx || ShopifyCli::Context.new
61
67
  self.options = Options.new
62
68
  end
@@ -12,21 +12,14 @@ module ShopifyCli
12
12
  @ctx.puts prod_warning if [:rails, :node].include?(Project.current_project_type)
13
13
  end
14
14
 
15
- env_data = begin
16
- Resources::EnvFile.parse_external_env
17
- rescue Errno::ENOENT
18
- {}
19
- end
20
-
21
- org = fetch_org
22
- id = org['id']
23
- app = get_app(id, org['apps'])
24
- shop = get_shop(org['stores'], id)
25
-
26
- write_env(app, shop, env_data[:scopes], env_data[:extra])
27
- write_cli_yml(project_type, id) unless Project.has_current?
15
+ org = ShopifyCli::Tasks::EnsureEnv.call(@ctx, regenerate: true)
16
+ api_key = Project.current.env['api_key']
17
+ write_cli_yml(project_type, org['id']) unless Project.has_current?
18
+ @ctx.puts(@ctx.message('core.connect.connected', get_app(org['apps'], api_key).first["title"]))
19
+ end
28
20
 
29
- @ctx.puts(@ctx.message('core.connect.connected', app['title']))
21
+ def get_app(apps, api_key)
22
+ apps.select { |app| app["apiKey"] == api_key }
30
23
  end
31
24
 
32
25
  def ask_project_type
@@ -37,67 +30,6 @@ module ShopifyCli
37
30
  end
38
31
  end
39
32
 
40
- def fetch_org
41
- orgs = PartnersAPI::Organizations.fetch_with_app(@ctx)
42
- org_id = if orgs.count == 1
43
- orgs.first["id"]
44
- else
45
- CLI::UI::Prompt.ask(@ctx.message('core.connect.organization_select')) do |handler|
46
- orgs.each do |org|
47
- handler.option(
48
- @ctx.message('core.partners_api.org_name_and_id', org['businessName'], org['id'])
49
- ) { org["id"] }
50
- end
51
- end
52
- end
53
- org = orgs.find { |o| o["id"] == org_id }
54
- org
55
- end
56
-
57
- def get_app(org_id, apps)
58
- if apps.count == 1
59
- apps.first
60
- elsif apps.count == 0
61
- @ctx.puts(@ctx.message('core.connect.no_apps'))
62
- title = CLI::UI::Prompt.ask(@ctx.message('core.connect.app_name'))
63
- type = CLI::UI::Prompt.ask(@ctx.message('core.connect.app_type.select')) do |handler|
64
- handler.option(@ctx.message('core.connect.app_type.select_public')) { 'public' }
65
- handler.option(@ctx.message('core.connect.app_type.select_custom')) { 'custom' }
66
- end
67
- ShopifyCli::Tasks::CreateApiClient.call(@ctx, org_id: org_id, title: title, type: type)
68
- else
69
- CLI::UI::Prompt.ask(@ctx.message('core.connect.app_select')) do |handler|
70
- apps.each { |app| handler.option(app["title"]) { app } }
71
- end
72
- end
73
- end
74
-
75
- def get_shop(shops, id)
76
- if shops.count == 1
77
- shop = shops.first["shopDomain"]
78
- elsif shops.count == 0
79
- @ctx.puts(@ctx.message('core.connect.no_development_stores', id))
80
- else
81
- shop = CLI::UI::Prompt.ask(@ctx.message('core.connect.development_store_select')) do |handler|
82
- shops.each { |s| handler.option(s["shopName"]) { s["shopDomain"] } }
83
- end
84
- end
85
- shop
86
- end
87
-
88
- def write_env(app, shop, scopes, extra)
89
- scopes = 'write_products,write_customers,write_draft_orders' if scopes.nil?
90
- extra = {} if extra.nil?
91
-
92
- Resources::EnvFile.new(
93
- api_key: app["apiKey"],
94
- secret: app["apiSecretKeys"].first["secret"],
95
- shop: shop,
96
- scopes: scopes,
97
- extra: extra,
98
- ).write(@ctx)
99
- end
100
-
101
33
  def write_cli_yml(project_type, org_id)
102
34
  ShopifyCli::Project.write(
103
35
  @ctx,
@@ -32,7 +32,7 @@ module ShopifyCli
32
32
  end
33
33
 
34
34
  def self.help
35
- project_types = all_visible_type.map(&:project_type).join(" | ")
35
+ project_types = all_visible_type.map(&:project_type).sort.join(" | ")
36
36
  ShopifyCli::Context.message('core.create.help', ShopifyCli::TOOL_NAME, project_types)
37
37
  end
38
38
 
@@ -36,11 +36,13 @@ module ShopifyCli
36
36
  cli_constants_extra = %w(
37
37
  PROJECT_TYPES_DIR
38
38
  TEMP_DIR
39
- CACHE_DIR
40
- TOOL_CONFIG_PATH
41
- LOG_FILE
42
- DEBUG_LOG_FILE
43
39
  )
40
+ cli_path_methods = [
41
+ :cache_dir,
42
+ :tool_config_path,
43
+ :log_file,
44
+ :debug_log_file,
45
+ ]
44
46
 
45
47
  cli_constants += cli_constants_extra if show_all_details
46
48
 
@@ -48,6 +50,12 @@ module ShopifyCli
48
50
  cli_constants.each do |s|
49
51
  @ctx.puts(" " + @ctx.message('core.system.const', s, ShopifyCli.const_get(s.to_sym)) + "\n")
50
52
  end
53
+
54
+ if show_all_details
55
+ cli_path_methods.each do |m|
56
+ @ctx.puts(" " + @ctx.message('core.system.const', m.upcase, ShopifyCli.send(m)) + "\n")
57
+ end
58
+ end
51
59
  end
52
60
 
53
61
  def display_cli_ruby(_show_all_details)
@@ -74,7 +82,7 @@ module ShopifyCli
74
82
  end
75
83
 
76
84
  def display_ngrok
77
- ngrok_location = File.join(ShopifyCli::CACHE_DIR, 'ngrok')
85
+ ngrok_location = File.join(ShopifyCli.cache_dir, 'ngrok')
78
86
  if File.exist?(ngrok_location)
79
87
  @ctx.puts(" " + @ctx.message('core.system.ngrok_available', ngrok_location))
80
88
  else
@@ -35,7 +35,7 @@ module ShopifyCli
35
35
  task_registry = ShopifyCli::Tasks::Registry
36
36
 
37
37
  command, command_name, args = ShopifyCli::Resolver.call(args)
38
- executor = ShopifyCli::Core::Executor.new(ctx, task_registry, log_file: ShopifyCli::LOG_FILE)
38
+ executor = ShopifyCli::Core::Executor.new(ctx, task_registry, log_file: ShopifyCli.log_file)
39
39
  ShopifyCli::Core::Monorail.log(command_name, args) do
40
40
  executor.call(command, command_name, args)
41
41
  end
@@ -3,16 +3,14 @@ require 'shopify_cli'
3
3
  module ShopifyCli
4
4
  module Core
5
5
  class Executor < CLI::Kit::Executor
6
- def initialize(ctx, task_registry, *args)
6
+ def initialize(ctx, task_registry, *args, **kwargs)
7
7
  @ctx = ctx || ShopifyCli::Context.new
8
8
  @task_registry = task_registry || ShopifyCli::Tasks::TaskRegistry.new
9
- super(*args)
9
+ super(*args, **kwargs)
10
10
  end
11
11
 
12
12
  def call(command, command_name, args)
13
- command.prerequisite_tasks.each do |task, _|
14
- @task_registry[task]&.call(@ctx)
15
- end
13
+ command.task_registry = @task_registry
16
14
  command.ctx = @ctx
17
15
  super
18
16
  end
@@ -99,7 +99,7 @@ module ShopifyCli
99
99
  success: err.nil?,
100
100
  error_message: err,
101
101
  uname: RbConfig::CONFIG["host"],
102
- cli_version: ShopifyCli::Git.sha(dir: ShopifyCli::ROOT),
102
+ cli_version: ShopifyCli::VERSION,
103
103
  ruby_version: RUBY_VERSION,
104
104
  }.tap do |payload|
105
105
  payload[:metadata] = JSON.dump(metadata) unless metadata.empty?
@@ -14,7 +14,7 @@ module ShopifyCli
14
14
 
15
15
  attr_reader :db # :nodoc:
16
16
 
17
- def initialize(path: File.join(ShopifyCli::CACHE_DIR, ".db.pstore")) # :nodoc:
17
+ def initialize(path: File.join(ShopifyCli.cache_dir, ".db.pstore")) # :nodoc:
18
18
  @db = PStore.new(path)
19
19
  end
20
20
 
@@ -36,7 +36,7 @@ module ShopifyCli
36
36
  def download
37
37
  return if installed?
38
38
 
39
- result = @ctx.system('curl', '-o', download_path, DOWNLOAD_URLS[@ctx.os], chdir: ShopifyCli::CACHE_DIR)
39
+ result = @ctx.system('curl', '-o', download_path, DOWNLOAD_URLS[@ctx.os], chdir: ShopifyCli.cache_dir)
40
40
  @ctx.abort(@ctx.message('core.heroku.error.download')) unless result.success?
41
41
  @ctx.abort(@ctx.message('core.heroku.error.download')) unless File.exist?(download_path)
42
42
  end
@@ -44,7 +44,7 @@ module ShopifyCli
44
44
  def install
45
45
  return if installed?
46
46
 
47
- result = @ctx.system('tar', '-xf', download_path, chdir: ShopifyCli::CACHE_DIR)
47
+ result = @ctx.system('tar', '-xf', download_path, chdir: ShopifyCli.cache_dir)
48
48
  @ctx.abort(@ctx.message('core.heroku.error.install')) unless result.success?
49
49
 
50
50
  @ctx.rm(download_path)
@@ -70,7 +70,7 @@ module ShopifyCli
70
70
  end
71
71
 
72
72
  def download_path
73
- File.join(ShopifyCli::CACHE_DIR, download_filename)
73
+ File.join(ShopifyCli.cache_dir, download_filename)
74
74
  end
75
75
 
76
76
  def git_remote
@@ -79,7 +79,7 @@ module ShopifyCli
79
79
  end
80
80
 
81
81
  def heroku_command
82
- local_path = File.join(ShopifyCli::CACHE_DIR, 'heroku', 'bin', 'heroku').to_s
82
+ local_path = File.join(ShopifyCli.cache_dir, 'heroku', 'bin', 'heroku').to_s
83
83
  if File.exist?(local_path)
84
84
  local_path
85
85
  else
@@ -16,23 +16,7 @@ module ShopifyCli
16
16
  already_connected_warning: "{{yellow:! This app appears to be already connected}}",
17
17
  connected: "{{v}} Project now connected to {{green:%s}}",
18
18
  project_type_select: "What type of project would you like to connect?",
19
- organization_select: "To which partner organization does this project belong?",
20
- app_select: "To which app does this project belong?",
21
- no_development_stores: <<~MESSAGE,
22
- No development stores available.
23
- Visit {{underline:https://partners.shopify.com/%d/stores}} to create one
24
- MESSAGE
25
- development_store_select: "Which development store would you like to use?",
26
19
  cli_yml_saved: ".shopify-cli.yml saved to project root",
27
-
28
- no_apps: 'You have no apps to connect to, creating a new app.',
29
- app_name: "App name",
30
- app_type: {
31
- select: "What type of app are you building?",
32
- select_public: "Public: An app built for a wide merchant audience.",
33
- select_custom: "Custom: An app custom built for a single client.",
34
- selected: "App type {{green:%s}}",
35
- },
36
20
  },
37
21
 
38
22
  context: {
@@ -254,9 +238,21 @@ module ShopifyCli
254
238
 
255
239
  tasks: {
256
240
  ensure_env: {
257
- api_key_question: "What is your Shopify API key?",
258
- api_secret_key_question: "What is your Shopify API secret key?",
259
- development_store_question: "What is your development store URL? (Example: my-dev-store.myshopify.com)",
241
+ organization_select: "To which partner organization does this project belong?",
242
+ no_development_stores: <<~MESSAGE,
243
+ No development stores available.
244
+ Visit {{underline:https://partners.shopify.com/%d/stores}} to create one
245
+ MESSAGE
246
+ development_store_select: "Which development store would you like to use?",
247
+ app_select: "To which app does this project belong?",
248
+ no_apps: 'You have no apps to connect to, creating a new app.',
249
+ app_name: "App name",
250
+ app_type: {
251
+ select: "What type of app are you building?",
252
+ select_public: "Public: An app built for a wide merchant audience.",
253
+ select_custom: "Custom: An app custom built for a single client.",
254
+ selected: "App type {{green:%s}}",
255
+ },
260
256
  },
261
257
  ensure_dev_store: {
262
258
  could_not_verify_store: "Couldn't verify your store %s",
@@ -5,9 +5,6 @@ module ShopifyCli
5
5
  # ProcessSupervision wraps a running process spawned by `exec` and keeps track
6
6
  # if its `pid` and keeps a log file for it as well
7
7
  class ProcessSupervision
8
- # is the directory where the pid and logfile are kept
9
- RUN_DIR = File.join(ShopifyCli::CACHE_DIR, 'sv')
10
-
11
8
  # a string or a symbol to identify this process by
12
9
  attr_reader :identifier
13
10
  # process ID for the running process
@@ -20,6 +17,11 @@ module ShopifyCli
20
17
  attr_reader :log_path
21
18
 
22
19
  class << self
20
+ def run_dir
21
+ # is the directory where the pid and logfile are kept
22
+ File.join(ShopifyCli.cache_dir, 'sv')
23
+ end
24
+
23
25
  ##
24
26
  # Will find and create a new instance of ProcessSupervision for a running process
25
27
  # if it is currently running. It will return nil if the process is not running.
@@ -34,7 +36,7 @@ module ShopifyCli
34
36
  # will be nil if the process is not running.
35
37
  #
36
38
  def for_ident(identifier)
37
- pid, time = File.read(File.join(RUN_DIR, "#{identifier}.pid")).split(':')
39
+ pid, time = File.read(File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.pid")).split(':')
38
40
  new(identifier, pid: Integer(pid), time: time)
39
41
  rescue Errno::ENOENT
40
42
  nil
@@ -108,8 +110,8 @@ module ShopifyCli
108
110
  @identifier = identifier
109
111
  @pid = pid
110
112
  @time = time
111
- @pid_path = File.join(RUN_DIR, "#{identifier}.pid")
112
- @log_path = File.join(RUN_DIR, "#{identifier}.log")
113
+ @pid_path = File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.pid")
114
+ @log_path = File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.log")
113
115
  end
114
116
 
115
117
  ##
@@ -14,6 +14,7 @@ module ShopifyCli
14
14
  alias_method :all_loaded, :repository
15
15
 
16
16
  def inherited(klass)
17
+ super
17
18
  repository << klass
18
19
  klass.project_type = @current_type
19
20
  klass.project_load_shallow = @shallow_load
@@ -32,7 +33,7 @@ module ShopifyCli
32
33
 
33
34
  def load_all
34
35
  Dir.glob(File.join(ShopifyCli::ROOT, 'lib', 'project_types', '*', 'cli.rb')).map do |filepath|
35
- load_type(filepath.split(File::Separator)[-2], true)
36
+ load_type(filepath.split(File::Separator)[-2].to_sym, true)
36
37
  end
37
38
  end
38
39
 
@@ -64,7 +65,7 @@ module ShopifyCli
64
65
 
65
66
  def register_task(task, name)
66
67
  return if project_load_shallow
67
- Task::Registry.add(const_get(task), name)
68
+ ShopifyCli::Task.register(task, name)
68
69
  end
69
70
 
70
71
  def register_messages(messages)
@@ -8,6 +8,7 @@ module ShopifyCli
8
8
  cmd = new(@ctx)
9
9
  args = cmd.options.parse(@_options, args[1..-1] || [])
10
10
  return call_help(parent_command, command_name) if cmd.options.help
11
+ run_prerequisites
11
12
  cmd.call(args, command_name)
12
13
  end
13
14
  end
@@ -2,9 +2,9 @@ require 'shopify_cli'
2
2
 
3
3
  module ShopifyCli
4
4
  class Task
5
- def self.call(*args)
5
+ def self.call(*args, **kwargs)
6
6
  task = new
7
- task.call(*args)
7
+ task.call(*args, **kwargs)
8
8
  end
9
9
  end
10
10
  end
@@ -12,15 +12,22 @@ module ShopifyCli
12
12
  end
13
13
 
14
14
  def [](name)
15
- @tasks[name]
15
+ class_or_proc = @tasks[name]
16
+ if class_or_proc.is_a?(Class)
17
+ class_or_proc
18
+ elsif class_or_proc.respond_to?(:call)
19
+ class_or_proc.call
20
+ else
21
+ class_or_proc
22
+ end
16
23
  end
17
24
  end
18
25
 
19
26
  Registry = TaskRegistry.new
20
27
 
21
- def self.register(task, name, path)
22
- autoload(task, path)
23
- Registry.add(const_get(task), name)
28
+ def self.register(task, name, path = nil)
29
+ autoload(task, path) if path
30
+ Registry.add(-> () { const_get(task) }, name)
24
31
  end
25
32
 
26
33
  register :CreateApiClient, :create_api_client, 'shopify-cli/tasks/create_api_client'
@@ -3,27 +3,84 @@ require 'shopify_cli'
3
3
  module ShopifyCli
4
4
  module Tasks
5
5
  class EnsureEnv < ShopifyCli::Task
6
- def call(ctx)
6
+ def call(ctx, regenerate: false, required: [:api_key, :secret])
7
7
  @ctx = ctx
8
- Resources::EnvFile.read(ctx.root)
9
- rescue Errno::ENOENT
10
- ask
8
+ env_data =
9
+ begin
10
+ Resources::EnvFile.parse_external_env
11
+ rescue Errno::ENOENT
12
+ {}
13
+ end
14
+
15
+ return {} if !regenerate && required.all? { |property| env_data[property] }
16
+
17
+ org = fetch_org
18
+ write_env(env_data, org)
19
+ org
20
+ end
21
+
22
+ private
23
+
24
+ def fetch_org
25
+ orgs = PartnersAPI::Organizations.fetch_with_app(@ctx)
26
+ org_id = if orgs.count == 1
27
+ orgs.first["id"]
28
+ else
29
+ CLI::UI::Prompt.ask(@ctx.message('core.tasks.ensure_env.organization_select')) do |handler|
30
+ orgs.each do |org|
31
+ handler.option(
32
+ @ctx.message('core.partners_api.org_name_and_id', org['businessName'], org['id'])
33
+ ) { org["id"] }
34
+ end
35
+ end
36
+ end
37
+ orgs.find { |o| o["id"] == org_id }
11
38
  end
12
39
 
13
- def ask
14
- api_key = CLI::UI.ask(@ctx.message('core.tasks.ensure_env.api_key_question'))
15
- api_secret = CLI::UI.ask(@ctx.message('core.tasks.ensure_env.api_secret_key_question'))
16
- shop = CLI::UI.ask(@ctx.message('core.tasks.ensure_env.development_store_question'))
17
- shop.gsub!(/https?\:\/\//, '')
18
-
19
- env = Resources::EnvFile.new(
20
- api_key: api_key,
21
- secret: api_secret,
22
- shop: shop,
23
- host: ShopifyCli::Tunnel.start(@ctx),
24
- scopes: 'write_products,write_customers,write_draft_orders',
40
+ def get_app(org_id, apps)
41
+ if apps.count == 1
42
+ apps.first
43
+ elsif apps.count == 0
44
+ @ctx.puts(@ctx.message('core.tasks.ensure_env.no_apps'))
45
+ title = CLI::UI::Prompt.ask(@ctx.message('core.tasks.ensure_env.app_name'))
46
+ type = CLI::UI::Prompt.ask(@ctx.message('core.tasks.ensure_env.app_type.select')) do |handler|
47
+ handler.option(@ctx.message('core.tasks.ensure_env.app_type.select_public')) { 'public' }
48
+ handler.option(@ctx.message('core.tasks.ensure_env.app_type.select_custom')) { 'custom' }
49
+ end
50
+ ShopifyCli::Tasks::CreateApiClient.call(@ctx, org_id: org_id, title: title, type: type)
51
+ else
52
+ CLI::UI::Prompt.ask(@ctx.message('core.tasks.ensure_env.app_select')) do |handler|
53
+ apps.each { |app| handler.option(app["title"]) { app } }
54
+ end
55
+ end
56
+ end
57
+
58
+ def get_shop(shops, id)
59
+ if shops.count == 1
60
+ shop = shops.first["shopDomain"]
61
+ elsif shops.count == 0
62
+ @ctx.puts(@ctx.message('core.tasks.ensure_env.no_development_stores', id))
63
+ else
64
+ shop = CLI::UI::Prompt.ask(@ctx.message('core.tasks.ensure_env.development_store_select')) do |handler|
65
+ shops.each { |s| handler.option(s["shopName"]) { s["shopDomain"] } }
66
+ end
67
+ end
68
+ shop
69
+ end
70
+
71
+ def write_env(env_data, org)
72
+ id = org['id']
73
+ app = get_app(id, org['apps'])
74
+
75
+ env_data[:shop] = get_shop(org['stores'], id)
76
+ env_data[:api_key] = app["apiKey"]
77
+ env_data[:secret] = app["apiSecretKeys"].first["secret"]
78
+ env_data[:scopes] = 'write_products,write_customers,write_draft_orders' if env_data[:scopes].nil?
79
+ env_data[:extra] = {} if env_data[:extra].nil?
80
+
81
+ Resources::EnvFile.new(
82
+ env_data
25
83
  ).write(@ctx)
26
- env
27
84
  end
28
85
  end
29
86
  end
@@ -88,7 +88,7 @@ module ShopifyCli
88
88
  #
89
89
  def auth(ctx, token)
90
90
  install(ctx)
91
- ctx.system(File.join(ShopifyCli::CACHE_DIR, 'ngrok'), 'authtoken', token)
91
+ ctx.system(File.join(ShopifyCli.cache_dir, 'ngrok'), 'authtoken', token)
92
92
  end
93
93
 
94
94
  ##
@@ -122,14 +122,14 @@ module ShopifyCli
122
122
  private
123
123
 
124
124
  def install(ctx)
125
- return if File.exist?(File.join(ShopifyCli::CACHE_DIR, 'ngrok'))
125
+ return if File.exist?(File.join(ShopifyCli.cache_dir, 'ngrok'))
126
126
  spinner = CLI::UI::SpinGroup.new
127
127
  spinner.add('Installing ngrok...') do
128
- zip_dest = File.join(ShopifyCli::CACHE_DIR, 'ngrok.zip')
128
+ zip_dest = File.join(ShopifyCli.cache_dir, 'ngrok.zip')
129
129
  unless File.exist?(zip_dest)
130
- ctx.system('curl', '-o', zip_dest, DOWNLOAD_URLS[ctx.os], chdir: ShopifyCli::CACHE_DIR)
130
+ ctx.system('curl', '-o', zip_dest, DOWNLOAD_URLS[ctx.os], chdir: ShopifyCli.cache_dir)
131
131
  end
132
- ctx.system('unzip', '-u', zip_dest, chdir: ShopifyCli::CACHE_DIR)
132
+ ctx.system('unzip', '-u', zip_dest, chdir: ShopifyCli.cache_dir)
133
133
  ctx.rm(zip_dest)
134
134
  end
135
135
  spinner.wait
@@ -143,7 +143,7 @@ module ShopifyCli
143
143
  end
144
144
 
145
145
  def ngrok_command(port)
146
- "exec #{File.join(ShopifyCli::CACHE_DIR, 'ngrok')} http -inspect=false -log=stdout -log-level=debug #{port}"
146
+ "exec #{File.join(ShopifyCli.cache_dir, 'ngrok')} http -inspect=false -log=stdout -log-level=debug #{port}"
147
147
  end
148
148
 
149
149
  def seconds_to_hm(seconds)
@@ -1,3 +1,3 @@
1
1
  module ShopifyCli
2
- VERSION = '1.0.4'
2
+ VERSION = '1.0.5'
3
3
  end
@@ -44,10 +44,6 @@ module ShopifyCli
44
44
  ROOT = File.expand_path('../..', __FILE__)
45
45
  PROJECT_TYPES_DIR = File.join(ROOT, 'lib', 'project_types')
46
46
  TEMP_DIR = File.join(ROOT, '.tmp')
47
- CACHE_DIR = File.join(File.expand_path(ENV.fetch('XDG_CACHE_HOME', '~/.cache')), TOOL_NAME)
48
- TOOL_CONFIG_PATH = File.join(File.expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config')), TOOL_NAME)
49
- LOG_FILE = File.join(TOOL_CONFIG_PATH, 'logs', 'log.log')
50
- DEBUG_LOG_FILE = File.join(TOOL_CONFIG_PATH, 'logs', 'debug.log')
51
47
 
52
48
  # programmer emoji if default install location, else wrench emoji
53
49
  EMOJI = ROOT == '/opt/shopify' ? "\u{1f469}\u{200d}\u{1f4bb}" : "\u{1f527}"
@@ -82,7 +78,7 @@ module ShopifyCli
82
78
  # ShopifyCli::Config
83
79
  autocall(:Config) { CLI::Kit::Config.new(tool_name: TOOL_NAME) }
84
80
  # ShopifyCli::Logger
85
- autocall(:Logger) { CLI::Kit::Logger.new(debug_log_file: DEBUG_LOG_FILE) }
81
+ autocall(:Logger) { CLI::Kit::Logger.new(debug_log_file: ShopifyCli.debug_log_file) }
86
82
  # ShopifyCli::Resolver
87
83
  autocall(:Resolver) do
88
84
  ShopifyCli::Core::HelpResolver.new(
@@ -93,7 +89,7 @@ module ShopifyCli
93
89
  # ShopifyCli::ErrorHandler
94
90
  autocall(:ErrorHandler) do
95
91
  CLI::Kit::ErrorHandler.new(
96
- log_file: ShopifyCli::LOG_FILE,
92
+ log_file: ShopifyCli.log_file,
97
93
  exception_reporter: nil,
98
94
  )
99
95
  end
@@ -127,7 +123,33 @@ module ShopifyCli
127
123
 
128
124
  require 'shopify-cli/messages/messages'
129
125
  Context.load_messages(ShopifyCli::Messages::MESSAGES)
130
- end
131
126
 
132
- # Make sure the cache dir always exists
133
- FileUtils.mkdir_p(ShopifyCli::CACHE_DIR)
127
+ def self.cache_dir
128
+ cache_dir = if ENV.key?('RUNNING_SHOPIFY_CLI_TESTS')
129
+ TEMP_DIR
130
+ else
131
+ File.join(File.expand_path(ENV.fetch('XDG_CACHE_HOME', '~/.cache')), TOOL_NAME)
132
+ end
133
+
134
+ # Make sure the cache dir always exists
135
+ @cache_dir_exists ||= FileUtils.mkdir_p(cache_dir)
136
+
137
+ cache_dir
138
+ end
139
+
140
+ def self.tool_config_path
141
+ if ENV.key?('RUNNING_SHOPIFY_CLI_TESTS')
142
+ TEMP_DIR
143
+ else
144
+ File.join(File.expand_path(ENV.fetch('XDG_CONFIG_HOME', '~/.config')), TOOL_NAME)
145
+ end
146
+ end
147
+
148
+ def self.log_file
149
+ File.join(tool_config_path, 'logs', 'log.log')
150
+ end
151
+
152
+ def self.debug_log_file
153
+ File.join(tool_config_path, 'logs', 'debug.log')
154
+ end
155
+ 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: 1.0.4
4
+ version: 1.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-04 00:00:00.000000000 Z
11
+ date: 2020-08-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler