shopify-cli 1.0.4 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
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