shopify-cli 2.4.0 → 2.6.2

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 (250) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/shopify.yml +0 -2
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +14 -14
  5. data/.rubocop_todo.yml +3 -3
  6. data/CHANGELOG.md +25 -0
  7. data/Dockerfile +1 -3
  8. data/Gemfile.lock +22 -16
  9. data/README.md +1 -1
  10. data/RELEASING.md +1 -1
  11. data/Rakefile +25 -34
  12. data/bin/console +11 -0
  13. data/bin/shopify +17 -4
  14. data/dev.yml +3 -0
  15. data/ext/shopify-cli/extconf.rb +1 -0
  16. data/lib/project_types/extension/cli.rb +5 -3
  17. data/lib/project_types/extension/commands/build.rb +4 -3
  18. data/lib/project_types/extension/commands/check.rb +2 -2
  19. data/lib/project_types/extension/commands/connect.rb +1 -1
  20. data/lib/project_types/extension/commands/create.rb +41 -23
  21. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  22. data/lib/project_types/extension/commands/info.rb +1 -1
  23. data/lib/project_types/extension/commands/push.rb +1 -1
  24. data/lib/project_types/extension/commands/register.rb +2 -2
  25. data/lib/project_types/extension/commands/serve.rb +5 -5
  26. data/lib/project_types/extension/commands/tunnel.rb +6 -6
  27. data/lib/project_types/extension/extension_project.rb +4 -4
  28. data/lib/project_types/extension/features/argo.rb +3 -3
  29. data/lib/project_types/extension/features/argo_config.rb +5 -5
  30. data/lib/project_types/extension/features/argo_serve.rb +21 -6
  31. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  32. data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
  33. data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
  34. data/lib/project_types/extension/forms/connect.rb +2 -2
  35. data/lib/project_types/extension/forms/create.rb +2 -2
  36. data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
  37. data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
  38. data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
  39. data/lib/project_types/extension/forms/questions/ask_template.rb +2 -2
  40. data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
  41. data/lib/project_types/extension/messages/message_loading.rb +2 -2
  42. data/lib/project_types/extension/models/development_server.rb +49 -6
  43. data/lib/project_types/extension/models/development_server_requirements.rb +21 -3
  44. data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
  45. data/lib/project_types/extension/models/specification.rb +1 -1
  46. data/lib/project_types/extension/models/specification_handlers/default.rb +14 -2
  47. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
  48. data/lib/project_types/extension/models/specifications.rb +4 -4
  49. data/lib/project_types/extension/tasks/choose_next_available_port.rb +1 -1
  50. data/lib/project_types/extension/tasks/configure_features.rb +1 -1
  51. data/lib/project_types/extension/tasks/configure_options.rb +1 -1
  52. data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
  53. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +31 -0
  54. data/lib/project_types/extension/tasks/create_extension.rb +2 -2
  55. data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
  56. data/lib/project_types/extension/tasks/find_npm_packages.rb +5 -5
  57. data/lib/project_types/extension/tasks/get_app.rb +2 -2
  58. data/lib/project_types/extension/tasks/get_apps.rb +2 -2
  59. data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
  60. data/lib/project_types/extension/tasks/get_product.rb +2 -2
  61. data/lib/project_types/extension/tasks/load_server_config.rb +23 -0
  62. data/lib/project_types/extension/tasks/run_extension_command.rb +34 -11
  63. data/lib/project_types/extension/tasks/update_draft.rb +2 -2
  64. data/lib/project_types/node/cli.rb +3 -3
  65. data/lib/project_types/node/commands/connect.rb +4 -4
  66. data/lib/project_types/node/commands/create.rb +10 -10
  67. data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
  68. data/lib/project_types/node/commands/deploy.rb +3 -3
  69. data/lib/project_types/node/commands/generate.rb +2 -2
  70. data/lib/project_types/node/commands/open.rb +3 -3
  71. data/lib/project_types/node/commands/serve.rb +15 -7
  72. data/lib/project_types/node/commands/tunnel.rb +6 -6
  73. data/lib/project_types/node/forms/create.rb +3 -3
  74. data/lib/project_types/node/messages/messages.rb +3 -0
  75. data/lib/project_types/php/cli.rb +27 -0
  76. data/lib/project_types/php/commands/connect.rb +19 -0
  77. data/lib/project_types/php/commands/create.rb +143 -0
  78. data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
  79. data/lib/project_types/php/commands/deploy.rb +32 -0
  80. data/lib/project_types/php/commands/open.rb +16 -0
  81. data/lib/project_types/php/commands/serve.rb +51 -0
  82. data/lib/project_types/php/commands/tunnel.rb +37 -0
  83. data/lib/project_types/php/forms/create.rb +45 -0
  84. data/lib/project_types/php/messages/messages.rb +191 -0
  85. data/lib/project_types/rails/cli.rb +3 -3
  86. data/lib/project_types/rails/commands/connect.rb +4 -4
  87. data/lib/project_types/rails/commands/create.rb +12 -12
  88. data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
  89. data/lib/project_types/rails/commands/deploy.rb +3 -3
  90. data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
  91. data/lib/project_types/rails/commands/generate.rb +3 -3
  92. data/lib/project_types/rails/commands/open.rb +3 -3
  93. data/lib/project_types/rails/commands/serve.rb +8 -8
  94. data/lib/project_types/rails/commands/tunnel.rb +6 -6
  95. data/lib/project_types/rails/forms/create.rb +3 -3
  96. data/lib/project_types/rails/gem.rb +1 -1
  97. data/lib/project_types/rails/ruby.rb +1 -1
  98. data/lib/project_types/script/cli.rb +15 -7
  99. data/lib/project_types/script/commands/create.rb +4 -2
  100. data/lib/project_types/script/commands/push.rb +2 -2
  101. data/lib/project_types/script/config/extension_points.yml +30 -29
  102. data/lib/project_types/script/forms/create.rb +1 -1
  103. data/lib/project_types/script/layers/application/create_script.rb +32 -12
  104. data/lib/project_types/script/layers/application/extension_points.rb +4 -4
  105. data/lib/project_types/script/layers/application/push_script.rb +4 -1
  106. data/lib/project_types/script/layers/domain/extension_point.rb +13 -45
  107. data/lib/project_types/script/layers/domain/script_project.rb +2 -2
  108. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +57 -0
  109. data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
  110. data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
  111. data/lib/project_types/script/layers/infrastructure/errors.rb +5 -0
  112. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +10 -90
  113. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +76 -11
  114. data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +1 -1
  115. data/lib/project_types/script/layers/infrastructure/languages/typescript_project_creator.rb +33 -0
  116. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +105 -0
  117. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -1
  118. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +6 -6
  119. data/lib/project_types/script/layers/infrastructure/script_service.rb +4 -8
  120. data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
  121. data/lib/project_types/script/messages/messages.rb +4 -0
  122. data/lib/project_types/script/tasks/ensure_env.rb +6 -6
  123. data/lib/project_types/script/ui/error_handler.rb +83 -75
  124. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  125. data/lib/project_types/theme/cli.rb +3 -3
  126. data/lib/project_types/theme/commands/check.rb +3 -3
  127. data/lib/project_types/theme/commands/delete.rb +7 -7
  128. data/lib/project_types/theme/commands/init.rb +3 -3
  129. data/lib/project_types/theme/commands/language_server.rb +2 -2
  130. data/lib/project_types/theme/commands/package.rb +2 -2
  131. data/lib/project_types/theme/commands/publish.rb +5 -5
  132. data/lib/project_types/theme/commands/pull.rb +9 -9
  133. data/lib/project_types/theme/commands/push.rb +12 -12
  134. data/lib/project_types/theme/commands/serve.rb +4 -4
  135. data/lib/project_types/theme/forms/confirm_store.rb +1 -1
  136. data/lib/project_types/theme/forms/select.rb +2 -2
  137. data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
  138. data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
  139. data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
  140. data/lib/{shopify-cli → shopify_cli}/api.rb +12 -8
  141. data/lib/shopify_cli/command/app_sub_command.rb +16 -0
  142. data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
  143. data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
  144. data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
  145. data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
  146. data/lib/shopify_cli/commands/logout.rb +39 -0
  147. data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
  148. data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
  149. data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
  150. data/lib/shopify_cli/commands/populate.rb +23 -0
  151. data/lib/shopify_cli/commands/store.rb +15 -0
  152. data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
  153. data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
  154. data/lib/shopify_cli/commands/version.rb +15 -0
  155. data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
  156. data/lib/shopify_cli/commands.rb +34 -0
  157. data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
  158. data/lib/shopify_cli/constants.rb +54 -0
  159. data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
  160. data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
  161. data/lib/{shopify-cli → shopify_cli}/core/executor.rb +8 -4
  162. data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
  163. data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
  164. data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
  165. data/lib/shopify_cli/core.rb +8 -0
  166. data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
  167. data/lib/{shopify-cli → shopify_cli}/environment.rb +36 -5
  168. data/lib/shopify_cli/exception_reporter/permission_controller.rb +54 -0
  169. data/lib/shopify_cli/exception_reporter.rb +55 -0
  170. data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
  171. data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
  172. data/lib/{shopify-cli → shopify_cli}/git.rb +36 -6
  173. data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
  174. data/lib/shopify_cli/helpers.rb +5 -0
  175. data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
  176. data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
  177. data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
  178. data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +8 -8
  179. data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
  180. data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
  181. data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
  182. data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +44 -2
  183. data/lib/{shopify-cli → shopify_cli}/method_object.rb +15 -8
  184. data/lib/shopify_cli/migrator/migration.rb +27 -0
  185. data/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +13 -0
  186. data/lib/shopify_cli/migrator.rb +48 -0
  187. data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
  188. data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
  189. data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
  190. data/lib/{shopify-cli → shopify_cli}/partners_api.rb +13 -13
  191. data/lib/shopify_cli/php_deps.rb +102 -0
  192. data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +10 -8
  193. data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
  194. data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
  195. data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
  196. data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
  197. data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
  198. data/lib/shopify_cli/resources.rb +5 -0
  199. data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
  200. data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
  201. data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
  202. data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
  203. data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
  204. data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
  205. data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
  206. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
  207. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
  208. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
  209. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
  210. data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
  211. data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
  212. data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
  213. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
  214. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +1 -1
  215. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
  216. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +1 -1
  217. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
  218. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +2 -2
  219. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
  220. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
  221. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
  222. data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
  223. data/lib/{shopify-cli → shopify_cli}/theme/development_theme.rb +9 -9
  224. data/lib/{shopify-cli → shopify_cli}/theme/file.rb +1 -1
  225. data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +1 -1
  226. data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
  227. data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +6 -6
  228. data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
  229. data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
  230. data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
  231. data/lib/shopify_cli/version.rb +3 -0
  232. data/lib/shopify_cli.rb +61 -52
  233. data/shopify-cli.gemspec +11 -3
  234. data/utilities/docker.rb +47 -0
  235. data/utilities/utilities.rb +5 -0
  236. metadata +133 -95
  237. data/lib/project_types/script/layers/infrastructure/api_clients.rb +0 -89
  238. data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +0 -73
  239. data/lib/project_types/script/layers/infrastructure/languages/rust_task_runner.rb +0 -60
  240. data/lib/shopify-cli/commands/logout.rb +0 -39
  241. data/lib/shopify-cli/commands/populate.rb +0 -23
  242. data/lib/shopify-cli/commands/store.rb +0 -15
  243. data/lib/shopify-cli/commands/version.rb +0 -15
  244. data/lib/shopify-cli/commands.rb +0 -34
  245. data/lib/shopify-cli/constants.rb +0 -26
  246. data/lib/shopify-cli/core.rb +0 -8
  247. data/lib/shopify-cli/helpers.rb +0 -5
  248. data/lib/shopify-cli/resources.rb +0 -5
  249. data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
  250. data/lib/shopify-cli/version.rb +0 -3
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ require "date"
3
+
4
+ module ShopifyCLI
5
+ module Migrator
6
+ class Migration
7
+ attr_reader :name, :path, :date
8
+
9
+ def initialize(name:, path:, date:)
10
+ @name = name
11
+ @path = path
12
+ @date = date
13
+ end
14
+
15
+ def run
16
+ require(path)
17
+ ShopifyCli::Migrator::Migrations.const_get(class_name).run
18
+ rescue StandardError
19
+ # Continue
20
+ end
21
+
22
+ def class_name
23
+ name.split("_").collect(&:capitalize).join
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyCLI
4
+ module Migrator
5
+ module Migrations
6
+ class Base
7
+ def self.run
8
+ # This is a noop migration to be used as a reference
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ require "date"
3
+
4
+ module ShopifyCLI
5
+ module Migrator
6
+ autoload :Migration, "shopify_cli/migrator/migration"
7
+
8
+ def self.migrate(
9
+ migrations_directory: File.expand_path("migrator/migrations", __dir__)
10
+ )
11
+ baseline_date = last_migration_date
12
+ unless baseline_date.nil?
13
+ migrations = migrations(migrations_directory: migrations_directory)
14
+ .select { |m|
15
+ m.date > baseline_date.to_i
16
+ }
17
+ .each { |m| m.run }
18
+ end
19
+
20
+ store_last_migration_date
21
+ end
22
+
23
+ private
24
+
25
+ def self.store_last_migration_date
26
+ ShopifyCLI::DB.set(ShopifyCLI::Constants::StoreKeys::LAST_MIGRATION_DATE => Time.now.to_i)
27
+ end
28
+
29
+ def self.last_migration_date
30
+ ShopifyCLI::DB.get(ShopifyCLI::Constants::StoreKeys::LAST_MIGRATION_DATE)
31
+ end
32
+
33
+ def self.migrations(migrations_directory:)
34
+ Dir.glob(File.join(migrations_directory, "*.rb")).map do |file_path|
35
+ file_name = File.basename(file_path).gsub(".rb", "")
36
+ file_name_components = file_name.split("_")
37
+ date_timestamp = file_name_components[0].to_i
38
+ migration_name = file_name_components[1...].join("_")
39
+
40
+ Migrator::Migration.new(
41
+ name: migration_name,
42
+ date: Time.at(date_timestamp).to_i,
43
+ path: file_path
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
@@ -2,7 +2,7 @@
2
2
  require "shopify_cli"
3
3
  require "optparse"
4
4
 
5
- module ShopifyCli
5
+ module ShopifyCLI
6
6
  class Options
7
7
  include SmartProperties
8
8
 
@@ -1,7 +1,7 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  class Packager
3
- PACKAGING_DIR = File.join(ShopifyCli::ROOT, "packaging")
4
- BUILDS_DIR = File.join(PACKAGING_DIR, "builds", ShopifyCli::VERSION)
3
+ PACKAGING_DIR = File.join(ShopifyCLI::ROOT, "packaging")
4
+ BUILDS_DIR = File.join(PACKAGING_DIR, "builds", ShopifyCLI::VERSION)
5
5
 
6
6
  def initialize
7
7
  FileUtils.mkdir_p(BUILDS_DIR)
@@ -24,7 +24,7 @@ module ShopifyCli
24
24
  file_path = File.join(debian_dir, file)
25
25
 
26
26
  file_contents = File.read(File.join(root_dir, "#{file}.base"))
27
- file_contents = file_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
27
+ file_contents = file_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
28
28
  File.open(file_path, "w", 0775) { |f| f.write(file_contents) }
29
29
  end
30
30
 
@@ -33,7 +33,7 @@ module ShopifyCli
33
33
  raise "Failed to build package" unless system("dpkg-deb", "-b", "shopify-cli")
34
34
 
35
35
  output_path = File.join(root_dir, "shopify-cli.deb")
36
- final_path = File.join(BUILDS_DIR, "shopify-cli-#{ShopifyCli::VERSION}.deb")
36
+ final_path = File.join(BUILDS_DIR, "shopify-cli-#{ShopifyCLI::VERSION}.deb")
37
37
 
38
38
  puts "Moving generated package: \n From: #{output_path}\n To: #{final_path}\n\n"
39
39
  FileUtils.mv(output_path, final_path)
@@ -53,7 +53,7 @@ module ShopifyCli
53
53
  File.delete(spec_path) if File.exist?(spec_path)
54
54
 
55
55
  spec_contents = File.read(File.join(root_dir, "shopify-cli.spec.base"))
56
- spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
56
+ spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
57
57
  File.write(spec_path, spec_contents)
58
58
 
59
59
  puts "Building package…"
@@ -76,12 +76,12 @@ module ShopifyCli
76
76
  File.delete(build_path) if File.exist?(build_path)
77
77
 
78
78
  spec_contents = File.read(File.join(root_dir, "shopify-cli.base.rb"))
79
- spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
79
+ spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
80
80
 
81
81
  puts "Grabbing sha256 checksum from Rubygems.org"
82
82
  require "digest/sha2"
83
83
  require "open-uri"
84
- gem_checksum = open("https://rubygems.org/downloads/shopify-cli-#{ShopifyCli::VERSION}.gem") do |io|
84
+ gem_checksum = open("https://rubygems.org/downloads/shopify-cli-#{ShopifyCLI::VERSION}.gem") do |io|
85
85
  Digest::SHA256.new.hexdigest(io.read)
86
86
  end
87
87
 
@@ -1,4 +1,4 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  class PartnersAPI
3
3
  class Organizations
4
4
  class << self
@@ -1,12 +1,12 @@
1
1
  require "shopify_cli"
2
2
 
3
- module ShopifyCli
3
+ module ShopifyCLI
4
4
  ##
5
- # ShopifyCli::PartnersAPI provides easy access to the partners dashboard CLI
5
+ # ShopifyCLI::PartnersAPI provides easy access to the partners dashboard CLI
6
6
  # schema.
7
7
  #
8
8
  class PartnersAPI < API
9
- autoload :Organizations, "shopify-cli/partners_api/organizations"
9
+ autoload :Organizations, "shopify_cli/partners_api/organizations"
10
10
 
11
11
  class << self
12
12
  ##
@@ -21,10 +21,10 @@ module ShopifyCli
21
21
  #
22
22
  # #### Raises
23
23
  #
24
- # * http 404 will raise a ShopifyCli::API::APIRequestNotFoundError
25
- # * http 400..499 will raise a ShopifyCli::API::APIRequestClientError
26
- # * http 500..599 will raise a ShopifyCli::API::APIRequestServerError
27
- # * All other codes will raise ShopifyCli::API::APIRequestUnexpectedError
24
+ # * http 404 will raise a ShopifyCLI::API::APIRequestNotFoundError
25
+ # * http 400..499 will raise a ShopifyCLI::API::APIRequestClientError
26
+ # * http 500..599 will raise a ShopifyCLI::API::APIRequestServerError
27
+ # * All other codes will raise ShopifyCLI::API::APIRequestUnexpectedError
28
28
  #
29
29
  # #### Returns
30
30
  #
@@ -32,13 +32,13 @@ module ShopifyCli
32
32
  #
33
33
  # #### Example
34
34
  #
35
- # ShopifyCli::PartnersAPI.query(@ctx, 'all_organizations')
35
+ # ShopifyCLI::PartnersAPI.query(@ctx, 'all_organizations')
36
36
  #
37
37
  def query(ctx, query_name, **variables)
38
38
  CLI::Kit::Util.begin do
39
39
  api_client(ctx).query(query_name, variables: variables)
40
40
  end.retry_after(API::APIRequestUnauthorizedError, retries: 1) do
41
- ShopifyCli::IdentityAuth.new(ctx: ctx).reauthenticate
41
+ ShopifyCLI::IdentityAuth.new(ctx: ctx).reauthenticate
42
42
  end
43
43
  rescue API::APIRequestUnauthorizedError => e
44
44
  if (request_info = auth_failure_info(ctx, e))
@@ -46,11 +46,11 @@ module ShopifyCli
46
46
  end
47
47
  ctx.abort(ctx.message("core.api.error.failed_auth"))
48
48
  rescue API::APIRequestNotFoundError
49
- ctx.puts(ctx.message("core.partners_api.error.account_not_found", ShopifyCli::TOOL_NAME))
49
+ ctx.puts(ctx.message("core.partners_api.error.account_not_found", ShopifyCLI::TOOL_NAME))
50
50
  end
51
51
 
52
52
  def partners_url_for(organization_id, api_client_id)
53
- if ShopifyCli::Shopifolk.acting_as_shopify_organization?
53
+ if ShopifyCLI::Shopifolk.acting_as_shopify_organization?
54
54
  organization_id = "internal"
55
55
  end
56
56
  "https://#{Environment.partners_domain}/#{organization_id}/apps/#{api_client_id}"
@@ -67,9 +67,9 @@ module ShopifyCli
67
67
  end
68
68
 
69
69
  def access_token(ctx)
70
- ShopifyCli::DB.get(:partners_exchange_token) do
70
+ ShopifyCLI::DB.get(:partners_exchange_token) do
71
71
  IdentityAuth.new(ctx: ctx).authenticate
72
- ShopifyCli::DB.get(:partners_exchange_token)
72
+ ShopifyCLI::DB.get(:partners_exchange_token)
73
73
  end
74
74
  end
75
75
 
@@ -0,0 +1,102 @@
1
+ require "shopify_cli"
2
+
3
+ module ShopifyCLI
4
+ ##
5
+ # ShopifyCLI::PHPDeps ensures that all PHP dependencies are installed for projects.
6
+ #
7
+ class PHPDeps
8
+ include SmartProperties
9
+
10
+ property! :ctx, accepts: ShopifyCLI::Context
11
+
12
+ ##
13
+ # Proxy to instance method ShopifyCLI::PHPDeps.new.install.
14
+ #
15
+ # #### Parameters
16
+ # - `ctx`: running context from your command
17
+ # - `verbose`: whether to run the installation tools in verbose mode
18
+ #
19
+ # #### Example
20
+ #
21
+ # ShopifyCLI::PHPDeps.install(ctx)
22
+ #
23
+ def self.install(ctx, verbose = false)
24
+ new(ctx: ctx).install(verbose)
25
+ end
26
+
27
+ ##
28
+ # Installs all of a project's PHP dependencies using Composer.
29
+ #
30
+ # #### Parameters
31
+ # - `verbose`: whether to run the installation tools in verbose mode
32
+ #
33
+ # #### Example
34
+ #
35
+ # # context is the running context for the command
36
+ # ShopifyCLI::PHPDeps.new(context).install(true)
37
+ #
38
+ def install(verbose = false)
39
+ title = ctx.message("core.php_deps.installing")
40
+ success = ctx.message("core.php_deps.installed")
41
+ failure = ctx.message("core.php_deps.error.install_error")
42
+
43
+ CLI::UI::Frame.open(title, success_text: success, failure_text: failure) do
44
+ composer(verbose)
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def composer(verbose = false)
51
+ cmd = %w(composer install)
52
+ cmd << "--quiet" unless verbose
53
+
54
+ run_install_command(cmd)
55
+ end
56
+
57
+ def run_install_command(cmd)
58
+ deps = parse_dependencies
59
+ errors = nil
60
+
61
+ spinner_title = ctx.message("core.php_deps.installing")
62
+ success = CLI::UI::Spinner.spin(spinner_title, auto_debrief: false) do |spinner|
63
+ _out, errors, status = CLI::Kit::System.capture3(*cmd, env: @ctx.env, chdir: ctx.root)
64
+ update_spinner_title_and_status(spinner, status, deps)
65
+ end
66
+
67
+ errors.lines.each { |e| ctx.puts e } unless success || errors.nil?
68
+
69
+ ctx.abort(ctx.message("core.php_deps.error.install", "Composer")) unless success
70
+ success
71
+ end
72
+
73
+ def update_spinner_title_and_status(spinner, status, deps)
74
+ if status.success?
75
+ spinner.update_title(ctx.message("core.php_deps.installed_count", deps.size))
76
+ else
77
+ spinner.update_title(ctx.message("core.php_deps.error.install_spinner_error", deps.size))
78
+ CLI::UI::Spinner::TASK_FAILED
79
+ end
80
+ end
81
+
82
+ def parse_dependencies
83
+ composer_json = File.join(ctx.root, "composer.json")
84
+ pkg =
85
+ begin
86
+ JSON.parse(File.read(composer_json))
87
+ rescue Errno::ENOENT, Errno::ENOTDIR
88
+ ctx.abort(ctx.message("core.php_deps.error.missing_package", composer_json))
89
+ end
90
+
91
+ %w(require require-dev).map do |key|
92
+ pkg.fetch(key, []).keys
93
+ end.flatten
94
+ rescue JSON::ParserError
95
+ ctx.puts(
96
+ ctx.message("core.php_deps.error.invalid_package", File.read(File.join(path, "composer.json"))),
97
+ error: true
98
+ )
99
+ raise ShopifyCLI::AbortSilent
100
+ end
101
+ end
102
+ end
@@ -1,6 +1,6 @@
1
1
  require "fileutils"
2
2
 
3
- module ShopifyCli
3
+ module ShopifyCLI
4
4
  ##
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
@@ -19,7 +19,7 @@ module ShopifyCli
19
19
  class << self
20
20
  def run_dir
21
21
  # is the directory where the pid and logfile are kept
22
- File.join(ShopifyCli.cache_dir, "sv")
22
+ File.join(ShopifyCLI.cache_dir, "sv")
23
23
  end
24
24
 
25
25
  ##
@@ -36,7 +36,7 @@ module ShopifyCli
36
36
  # will be nil if the process is not running.
37
37
  #
38
38
  def for_ident(identifier)
39
- pid, time = File.read(File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.pid")).split(":")
39
+ pid, time = File.read(File.join(ShopifyCLI::ProcessSupervision.run_dir, "#{identifier}.pid")).split(":")
40
40
  new(identifier, pid: Integer(pid), time: time)
41
41
  rescue Errno::ENOENT
42
42
  nil
@@ -50,19 +50,21 @@ module ShopifyCli
50
50
  #
51
51
  # * `identifier` - a string or symbol to identify the new process by.
52
52
  # * `args` - a command to run, either a string or array of strings
53
+ # * `force_spawn` - whether we want the child process to be a spawn and not a fork, so it is terminated along with
54
+ # the parent
53
55
  #
54
56
  # #### Returns
55
57
  #
56
58
  # * `process` - ProcessSupervision instance if the process is running, this
57
59
  # will be nil if the process did not start.
58
60
  #
59
- def start(identifier, args)
61
+ def start(identifier, args, force_spawn: false)
60
62
  return for_ident(identifier) if running?(identifier)
61
63
 
62
64
  # Some systems don't support forking process without extra gems, so we resort to spawning a new child process -
63
65
  # that means that it dies along with the original process if it is interrupted. If possible, we fork the process
64
66
  # so that it doesn't have to be restarted on every run.
65
- if Process.respond_to?(:fork)
67
+ if Process.respond_to?(:fork) && !force_spawn
66
68
  fork do
67
69
  pid_file = new(identifier, pid: Process.pid)
68
70
  pid_file.write
@@ -132,9 +134,9 @@ module ShopifyCli
132
134
  @identifier = identifier
133
135
  @pid = pid
134
136
  @time = time
135
- FileUtils.mkdir_p(ShopifyCli::ProcessSupervision.run_dir)
136
- @pid_path = File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.pid")
137
- @log_path = File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.log")
137
+ FileUtils.mkdir_p(ShopifyCLI::ProcessSupervision.run_dir)
138
+ @pid_path = File.join(ShopifyCLI::ProcessSupervision.run_dir, "#{identifier}.pid")
139
+ @log_path = File.join(ShopifyCLI::ProcessSupervision.run_dir, "#{identifier}.log")
138
140
  end
139
141
 
140
142
  ##
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  require "shopify_cli"
3
3
 
4
- module ShopifyCli
4
+ module ShopifyCLI
5
5
  ##
6
- # ShopifyCli::Project captures the current project that the user is working on.
6
+ # ShopifyCLI::Project captures the current project that the user is working on.
7
7
  # This class can be used to fetch and save project environment as well as the
8
8
  # project config `.shopify-cli.yml`.
9
9
  #
@@ -25,13 +25,13 @@ module ShopifyCli
25
25
  #
26
26
  # #### Raises
27
27
  #
28
- # * `ShopifyCli::Abort` - If the cli is not currently in a project directory
28
+ # * `ShopifyCLI::Abort` - If the cli is not currently in a project directory
29
29
  # then this will be raised with a message implying that the user is not in
30
30
  # a project directory.
31
31
  #
32
32
  # #### Example
33
33
  #
34
- # project = ShopifyCli::Project.current
34
+ # project = ShopifyCLI::Project.current
35
35
  #
36
36
  def current(force_reload: false)
37
37
  clear if force_reload
@@ -60,7 +60,7 @@ module ShopifyCli
60
60
  #
61
61
  # #### Example
62
62
  #
63
- # type = ShopifyCli::Project.current_project_type
63
+ # type = ShopifyCLI::Project.current_project_type
64
64
  #
65
65
  def current_project_type
66
66
  return unless has_current?
@@ -81,7 +81,7 @@ module ShopifyCli
81
81
  #
82
82
  # #### Example
83
83
  #
84
- # type = ShopifyCli::Project.current_project_type
84
+ # type = ShopifyCLI::Project.current_project_type
85
85
  #
86
86
  def write(ctx, project_type:, organization_id:, **identifiers)
87
87
  require "yaml" # takes 20ms, so deferred as late as possible.
@@ -113,7 +113,7 @@ module ShopifyCli
113
113
  def at(dir)
114
114
  proj_dir = directory(dir)
115
115
  unless proj_dir
116
- raise(ShopifyCli::Abort, Context.message("core.project.error.not_in_project"))
116
+ raise(ShopifyCLI::Abort, Context.message("core.project.error.not_in_project"))
117
117
  end
118
118
  @at ||= Hash.new { |h, k| h[k] = new(directory: k) }
119
119
  @at[proj_dir]
@@ -136,11 +136,11 @@ module ShopifyCli
136
136
  #
137
137
  # #### Returns
138
138
  #
139
- # * `env` - An instance of a ShopifyCli::Resources::EnvFile
139
+ # * `env` - An instance of a ShopifyCLI::Resources::EnvFile
140
140
  #
141
141
  # #### Example
142
142
  #
143
- # ShopifyCli::Project.current.env
143
+ # ShopifyCLI::Project.current.env
144
144
  #
145
145
  def env
146
146
  @env ||= begin
@@ -159,18 +159,18 @@ module ShopifyCli
159
159
  #
160
160
  # #### Raises
161
161
  #
162
- # * `ShopifyCli::Abort` - If the yml is invalid or poorly formatted
163
- # * `ShopifyCli::Abort` - If the yml file does not exist
162
+ # * `ShopifyCLI::Abort` - If the yml is invalid or poorly formatted
163
+ # * `ShopifyCLI::Abort` - If the yml file does not exist
164
164
  #
165
165
  # #### Example
166
166
  #
167
- # ShopifyCli::Project.current.config
167
+ # ShopifyCLI::Project.current.config
168
168
  #
169
169
  def config
170
170
  @config ||= begin
171
171
  config = load_yaml_file(".shopify-cli.yml")
172
172
  unless config.is_a?(Hash)
173
- raise ShopifyCli::Abort, Context.message("core.yaml.error.not_hash", ".shopify-cli.yml")
173
+ raise ShopifyCLI::Abort, Context.message("core.yaml.error.not_hash", ".shopify-cli.yml")
174
174
  end
175
175
 
176
176
  # The app_type key was deprecated in favour of project_type, so replace it
@@ -191,12 +191,12 @@ module ShopifyCli
191
191
  begin
192
192
  YAML.load_file(f)
193
193
  rescue Psych::SyntaxError => e
194
- raise(ShopifyCli::Abort, Context.message("core.yaml.error.invalid", relative_path, e.message))
194
+ raise(ShopifyCLI::Abort, Context.message("core.yaml.error.invalid", relative_path, e.message))
195
195
  # rescue Errno::EACCES => e
196
196
  # TODO
197
197
  # Dev::Helpers::EaccesHandler.diagnose_and_raise(f, e, mode: :read)
198
198
  rescue Errno::ENOENT
199
- raise ShopifyCli::Abort, Context.message("core.yaml.error.not_found", f)
199
+ raise ShopifyCLI::Abort, Context.message("core.yaml.error.not_found", f)
200
200
  end
201
201
  end
202
202
  end
@@ -1,4 +1,4 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  class ProjectCommands < Command
3
3
  def call(*)
4
4
  @ctx.puts(self.class.help)
@@ -6,9 +6,9 @@ module ShopifyCli
6
6
 
7
7
  def self.help
8
8
  project_type = name.split("::")[0].downcase
9
- ShopifyCli::Context.message(
9
+ ShopifyCLI::Context.message(
10
10
  "#{project_type}.help",
11
- ShopifyCli::TOOL_NAME,
11
+ ShopifyCLI::TOOL_NAME,
12
12
  subcommand_registry.command_names.join(" | ")
13
13
  )
14
14
  end
@@ -1,4 +1,4 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  class ProjectType
3
3
  extend Feature::Set
4
4
 
@@ -20,7 +20,7 @@ module ShopifyCli
20
20
  end
21
21
 
22
22
  def load_type(current_type, shallow = false)
23
- filepath = File.join(ShopifyCli::ROOT, "lib", "project_types", current_type.to_s, "cli.rb")
23
+ filepath = File.join(ShopifyCLI::ROOT, "lib", "project_types", current_type.to_s, "cli.rb")
24
24
  return unless File.exist?(filepath)
25
25
  @shallow_load = shallow
26
26
  @current_type = current_type
@@ -31,7 +31,7 @@ module ShopifyCli
31
31
  end
32
32
 
33
33
  def load_all
34
- Dir.glob(File.join(ShopifyCli::ROOT, "lib", "project_types", "*", "cli.rb")).map do |filepath|
34
+ Dir.glob(File.join(ShopifyCLI::ROOT, "lib", "project_types", "*", "cli.rb")).map do |filepath|
35
35
  load_type(filepath.split(File::Separator)[-2].to_sym, true)
36
36
  end
37
37
  end
@@ -41,7 +41,7 @@ module ShopifyCli
41
41
  end
42
42
 
43
43
  def project_filepath(path)
44
- File.join(ShopifyCli::PROJECT_TYPES_DIR, project_type.to_s, path)
44
+ File.join(ShopifyCLI::PROJECT_TYPES_DIR, project_type.to_s, path)
45
45
  end
46
46
 
47
47
  def title(name)
@@ -50,7 +50,7 @@ module ShopifyCli
50
50
 
51
51
  def register_task(task, name)
52
52
  return if project_load_shallow
53
- ShopifyCli::Tasks.register(task, name)
53
+ ShopifyCLI::Tasks.register(task, name)
54
54
  end
55
55
 
56
56
  def register_messages(messages)
@@ -4,13 +4,13 @@
4
4
  # are resolved relative to `Kernal`, but the top-level namespace is
5
5
  # configurable:
6
6
  #
7
- # ShopifyCli::Resolve.call(:object).value # => Object
8
- # ShopifyCli::Resolve.call('minitest/test').value # => MiniTest::Test
9
- # ShopifyCli::Resolve.call(:test, namespace: MiniTest) # => MiniTest::Test
7
+ # ShopifyCLI::Resolve.call(:object).value # => Object
8
+ # ShopifyCLI::Resolve.call('minitest/test').value # => MiniTest::Test
9
+ # ShopifyCLI::Resolve.call(:test, namespace: MiniTest) # => MiniTest::Test
10
10
  #
11
- module ShopifyCli
11
+ module ShopifyCLI
12
12
  class ResolveConstant
13
- include ShopifyCli::MethodObject
13
+ include ShopifyCLI::MethodObject
14
14
  property! :namespace, accepts: ->(ns) { ns.respond_to?(:const_get) }, default: -> { Kernel }
15
15
 
16
16
  def call(name)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ShopifyCli
3
+ module ShopifyCLI
4
4
  module Resources
5
5
  class EnvFile
6
6
  include SmartProperties
@@ -0,0 +1,5 @@
1
+ module ShopifyCLI
2
+ module Resources
3
+ autoload :EnvFile, "shopify_cli/resources/env_file"
4
+ end
5
+ end
@@ -1,4 +1,4 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  ##
3
3
  # This module defines two containers for wrapping the result of an action. One
4
4
  # for signifying the successful execution of an action and one for signifying
@@ -261,8 +261,8 @@ module ShopifyCli
261
261
  end
262
262
 
263
263
  ##
264
- # raises an `ShopifyCli::Result::UnexpectedError` as a
265
- # `ShopifyCli::Result::Failure` does not carry a success value.
264
+ # raises an `ShopifyCLI::Result::UnexpectedError` as a
265
+ # `ShopifyCLI::Result::Failure` does not carry a success value.
266
266
  #
267
267
  def value
268
268
  raise UnexpectedFailure
@@ -342,7 +342,7 @@ module ShopifyCli
342
342
  end
343
343
 
344
344
  ##
345
- # wraps the given value into a `ShopifyCli::Result::Success` container
345
+ # wraps the given value into a `ShopifyCLI::Result::Success` container
346
346
  #
347
347
  # #### Parameters
348
348
  #
@@ -353,7 +353,7 @@ module ShopifyCli
353
353
  end
354
354
 
355
355
  ##
356
- # wraps the given value into a `ShopifyCli::Result::Failure` container
356
+ # wraps the given value into a `ShopifyCLI::Result::Failure` container
357
357
  #
358
358
  # #### Parameters
359
359
  #
@@ -367,8 +367,8 @@ module ShopifyCli
367
367
  # takes either a value or a block and chooses the appropriate result
368
368
  # container based on the type of the value or the type of the block's return
369
369
  # value. If the type is an exception, it is wrapped in a
370
- # `ShopifyCli::Result::Failure` and otherwise in a
371
- # `ShopifyCli::Result::Success`. If a block was provided instead of value, a
370
+ # `ShopifyCLI::Result::Failure` and otherwise in a
371
+ # `ShopifyCLI::Result::Success`. If a block was provided instead of value, a
372
372
  # `Proc` is returned and the result wrapping doesn't occur until the block
373
373
  # is invoked.
374
374
  #
@@ -384,12 +384,12 @@ module ShopifyCli
384
384
  #
385
385
  # #### Examples
386
386
  #
387
- # Result.wrap(1) # => ShopifyCli::Result::Success
388
- # Result.wrap(RuntimeError.new) # => ShopifyCli::Result::Failure
387
+ # Result.wrap(1) # => ShopifyCLI::Result::Success
388
+ # Result.wrap(RuntimeError.new) # => ShopifyCLI::Result::Failure
389
389
  #
390
390
  # Result.wrap { 1 } # => Proc
391
- # Result.wrap { 1 }.call # => ShopifyCli::Result::Success
392
- # Result.wrap { raise }.call # => ShopifyCli::Result::Failure
391
+ # Result.wrap { 1 }.call # => ShopifyCLI::Result::Success
392
+ # Result.wrap { raise }.call # => ShopifyCLI::Result::Failure
393
393
  #
394
394
  # Result.wrap { |s| s.upcase }.call("hello").tap do |result|
395
395
  # result # => Result::Success