disco_app 0.10.4

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 (357) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +37 -0
  3. data/app/assets/images/disco_app/icon.svg +1 -0
  4. data/app/assets/images/disco_app/icons.svg +0 -0
  5. data/app/assets/javascripts/disco_app/components/custom/filterable_shop_list.js.jsx +61 -0
  6. data/app/assets/javascripts/disco_app/components/custom/inline-radio-options.es6.jsx +59 -0
  7. data/app/assets/javascripts/disco_app/components/custom/rules-editor.es6.jsx +432 -0
  8. data/app/assets/javascripts/disco_app/components/custom/shop_filter_query.js.jsx +13 -0
  9. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tab.js.jsx +34 -0
  10. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tabs.js.jsx +21 -0
  11. data/app/assets/javascripts/disco_app/components/custom/shop_list.js.jsx +142 -0
  12. data/app/assets/javascripts/disco_app/components/custom/shop_row.js.jsx +43 -0
  13. data/app/assets/javascripts/disco_app/components/custom/shopify_admin_link.js.jsx +29 -0
  14. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-footer.es6.jsx +11 -0
  15. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-header.es6.jsx +11 -0
  16. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card-section.es6.jsx +30 -0
  17. data/app/assets/javascripts/disco_app/components/ui-kit/cards/card.es6.jsx +16 -0
  18. data/app/assets/javascripts/disco_app/components/ui-kit/cards/cart-section-title.es6.jsx +17 -0
  19. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_form.es6.jsx +72 -0
  20. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_input.es6.jsx +20 -0
  21. data/app/assets/javascripts/disco_app/components/ui-kit/forms/button.es6.jsx +15 -0
  22. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-checkbox.es6.jsx +30 -0
  23. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-radio.es6.jsx +30 -0
  24. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-select.es6.jsx +45 -0
  25. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +69 -0
  26. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-textarea.es6.jsx +48 -0
  27. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-time.es6.jsx +7 -0
  28. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__element.es6.jsx +17 -0
  29. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__group.es6.jsx +11 -0
  30. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__section.es6.jsx +11 -0
  31. data/app/assets/javascripts/disco_app/components/ui-kit/icons/icon-chevron.es6.jsx +33 -0
  32. data/app/assets/javascripts/disco_app/components/ui-kit/icons/next-icon.es6.jsx +18 -0
  33. data/app/assets/javascripts/disco_app/components/ui-kit/input_select.es6.jsx +21 -0
  34. data/app/assets/javascripts/disco_app/components/ui-kit/tables/table.es6.jsx +22 -0
  35. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-annotated-section.es6.jsx +29 -0
  36. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-empty-state.es6.jsx +35 -0
  37. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-footer-help.es6.jsx +13 -0
  38. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout-item.es6.jsx +11 -0
  39. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout-section.es6.jsx +19 -0
  40. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout-sections.es6.jsx +11 -0
  41. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-layout.es6.jsx +11 -0
  42. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions.es6.jsx +13 -0
  43. data/app/assets/javascripts/disco_app/components/ui-kit/ui-layout/ui-page-actions__buttons.es6.jsx +27 -0
  44. data/app/assets/javascripts/disco_app/components.js +2 -0
  45. data/app/assets/javascripts/disco_app/disco_app.js +9 -0
  46. data/app/assets/javascripts/disco_app/frame.js +152 -0
  47. data/app/assets/javascripts/disco_app/shopify-turbolinks.js +7 -0
  48. data/app/assets/javascripts/disco_app/ui-kit.js +1 -0
  49. data/app/assets/stylesheets/disco_app/admin/_header.scss +75 -0
  50. data/app/assets/stylesheets/disco_app/admin/_layout.scss +32 -0
  51. data/app/assets/stylesheets/disco_app/admin/_nav.scss +184 -0
  52. data/app/assets/stylesheets/disco_app/admin.scss +11 -0
  53. data/app/assets/stylesheets/disco_app/disco_app.scss +21 -0
  54. data/app/assets/stylesheets/disco_app/frame/_buttons.scss +54 -0
  55. data/app/assets/stylesheets/disco_app/frame/_forms.scss +26 -0
  56. data/app/assets/stylesheets/disco_app/frame/_layout.scss +77 -0
  57. data/app/assets/stylesheets/disco_app/frame/_type.scss +25 -0
  58. data/app/assets/stylesheets/disco_app/frame.scss +10 -0
  59. data/app/assets/stylesheets/disco_app/mixins/_flexbox.scss +400 -0
  60. data/app/assets/stylesheets/disco_app/ui-kit/_ui-empty-state.scss +121 -0
  61. data/app/assets/stylesheets/disco_app/ui-kit/_ui-footer-help.scss +28 -0
  62. data/app/assets/stylesheets/disco_app/ui-kit/_ui-forms.scss +69 -0
  63. data/app/assets/stylesheets/disco_app/ui-kit/_ui-icons.scss +28 -0
  64. data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +5116 -0
  65. data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +15 -0
  66. data/app/assets/stylesheets/disco_app/ui-kit/_ui-page-actions.scss +23 -0
  67. data/app/assets/stylesheets/disco_app/ui-kit/_ui-stack.scss +39 -0
  68. data/app/assets/stylesheets/disco_app/ui-kit/_ui-tabs.scss +75 -0
  69. data/app/assets/stylesheets/disco_app/ui-kit/_ui-type.scss +13 -0
  70. data/app/controllers/disco_app/admin/app_settings_controller.rb +3 -0
  71. data/app/controllers/disco_app/admin/application_controller.rb +3 -0
  72. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +24 -0
  73. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +20 -0
  74. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +54 -0
  75. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +7 -0
  76. data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +29 -0
  77. data/app/controllers/disco_app/admin/plans_controller.rb +3 -0
  78. data/app/controllers/disco_app/admin/resources/shops_controller.rb +3 -0
  79. data/app/controllers/disco_app/admin/shops_controller.rb +3 -0
  80. data/app/controllers/disco_app/admin/subscriptions_controller.rb +3 -0
  81. data/app/controllers/disco_app/charges_controller.rb +47 -0
  82. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +40 -0
  83. data/app/controllers/disco_app/concerns/authenticated_controller.rb +56 -0
  84. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +35 -0
  85. data/app/controllers/disco_app/frame_controller.rb +9 -0
  86. data/app/controllers/disco_app/install_controller.rb +27 -0
  87. data/app/controllers/disco_app/subscriptions_controller.rb +32 -0
  88. data/app/controllers/disco_app/webhooks_controller.rb +46 -0
  89. data/app/controllers/sessions_controller.rb +28 -0
  90. data/app/helpers/disco_app/application_helper.rb +50 -0
  91. data/app/jobs/disco_app/app_installed_job.rb +3 -0
  92. data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
  93. data/app/jobs/disco_app/concerns/app_installed_job.rb +39 -0
  94. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +20 -0
  95. data/app/jobs/disco_app/concerns/render_asset_group_job.rb +8 -0
  96. data/app/jobs/disco_app/concerns/shop_update_job.rb +13 -0
  97. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +7 -0
  98. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +55 -0
  99. data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +12 -0
  100. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +52 -0
  101. data/app/jobs/disco_app/render_asset_group_job.rb +3 -0
  102. data/app/jobs/disco_app/shop_job.rb +27 -0
  103. data/app/jobs/disco_app/shop_update_job.rb +3 -0
  104. data/app/jobs/disco_app/subscription_changed_job.rb +3 -0
  105. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +3 -0
  106. data/app/jobs/disco_app/synchronise_resources_job.rb +3 -0
  107. data/app/jobs/disco_app/synchronise_webhooks_job.rb +3 -0
  108. data/app/models/disco_app/app_settings.rb +3 -0
  109. data/app/models/disco_app/application_charge.rb +18 -0
  110. data/app/models/disco_app/concerns/app_settings.rb +7 -0
  111. data/app/models/disco_app/concerns/can_be_liquified.rb +45 -0
  112. data/app/models/disco_app/concerns/has_metafields.rb +48 -0
  113. data/app/models/disco_app/concerns/plan.rb +26 -0
  114. data/app/models/disco_app/concerns/plan_code.rb +15 -0
  115. data/app/models/disco_app/concerns/renders_assets.rb +166 -0
  116. data/app/models/disco_app/concerns/shop.rb +78 -0
  117. data/app/models/disco_app/concerns/subscription.rb +60 -0
  118. data/app/models/disco_app/concerns/synchronises.rb +54 -0
  119. data/app/models/disco_app/concerns/taggable.rb +16 -0
  120. data/app/models/disco_app/plan.rb +3 -0
  121. data/app/models/disco_app/plan_code.rb +3 -0
  122. data/app/models/disco_app/recurring_application_charge.rb +18 -0
  123. data/app/models/disco_app/session_storage.rb +18 -0
  124. data/app/models/disco_app/shop.rb +3 -0
  125. data/app/models/disco_app/subscription.rb +3 -0
  126. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +100 -0
  127. data/app/resources/disco_app/admin/resources/shop_resource.rb +4 -0
  128. data/app/services/disco_app/carrier_request_service.rb +15 -0
  129. data/app/services/disco_app/charges_service.rb +81 -0
  130. data/app/services/disco_app/proxy_service.rb +17 -0
  131. data/app/services/disco_app/subscription_service.rb +46 -0
  132. data/app/services/disco_app/webhook_service.rb +30 -0
  133. data/app/views/disco_app/admin/app_settings/edit.html.erb +5 -0
  134. data/app/views/disco_app/admin/plans/_form.html.erb +72 -0
  135. data/app/views/disco_app/admin/plans/_plan_code_fields.html.erb +15 -0
  136. data/app/views/disco_app/admin/plans/edit.html.erb +7 -0
  137. data/app/views/disco_app/admin/plans/index.html.erb +43 -0
  138. data/app/views/disco_app/admin/plans/new.html.erb +7 -0
  139. data/app/views/disco_app/admin/shops/index.html.erb +13 -0
  140. data/app/views/disco_app/admin/subscriptions/edit.html.erb +33 -0
  141. data/app/views/disco_app/charges/activate.html.erb +1 -0
  142. data/app/views/disco_app/charges/create.html.erb +1 -0
  143. data/app/views/disco_app/charges/new.html.erb +23 -0
  144. data/app/views/disco_app/frame/frame.html.erb +36 -0
  145. data/app/views/disco_app/install/installing.html.erb +7 -0
  146. data/app/views/disco_app/install/uninstalling.html.erb +1 -0
  147. data/app/views/disco_app/proxy_errors/404.html.erb +1 -0
  148. data/app/views/disco_app/shared/_card.html.erb +14 -0
  149. data/app/views/disco_app/shared/_icons.html.erb +1 -0
  150. data/app/views/disco_app/shared/_section.html.erb +17 -0
  151. data/app/views/disco_app/subscriptions/new.html.erb +25 -0
  152. data/app/views/layouts/admin/_nav_items.erb +20 -0
  153. data/app/views/layouts/admin.html.erb +67 -0
  154. data/app/views/layouts/application.html.erb +18 -0
  155. data/app/views/layouts/embedded_app.html.erb +44 -0
  156. data/app/views/layouts/embedded_app_modal.html.erb +28 -0
  157. data/app/views/sessions/new.html.erb +28 -0
  158. data/config/routes.rb +63 -0
  159. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +15 -0
  160. data/db/migrate/20150525162112_add_status_to_shops.rb +5 -0
  161. data/db/migrate/20150525171422_add_meta_to_shops.rb +11 -0
  162. data/db/migrate/20150629210346_add_charge_status_to_shop.rb +5 -0
  163. data/db/migrate/20150814214025_add_more_meta_to_shops.rb +15 -0
  164. data/db/migrate/20151017231302_create_disco_app_plans.rb +13 -0
  165. data/db/migrate/20151017232027_create_disco_app_subscriptions.rb +15 -0
  166. data/db/migrate/20151017234409_move_shop_to_disco_app_engine.rb +5 -0
  167. data/db/migrate/20160112233706_create_disco_app_sessions.rb +12 -0
  168. data/db/migrate/20160113194418_add_shop_id_to_disco_app_sessions.rb +6 -0
  169. data/db/migrate/20160223111044_create_disco_app_settings.rb +8 -0
  170. data/db/migrate/20160301223215_update_plans.rb +22 -0
  171. data/db/migrate/20160301224558_update_subscriptions.rb +13 -0
  172. data/db/migrate/20160302104816_create_disco_app_recurring_application_charges.rb +14 -0
  173. data/db/migrate/20160302105259_create_disco_app_application_charges.rb +14 -0
  174. data/db/migrate/20160302134728_drop_charge_status_from_shops.rb +5 -0
  175. data/db/migrate/20160302142941_add_shopify_attributes_to_charges.rb +8 -0
  176. data/db/migrate/20160331093148_create_disco_app_plan_codes.rb +14 -0
  177. data/db/migrate/20160401044420_add_status_to_plan_codes.rb +5 -0
  178. data/db/migrate/20160401045551_add_amount_and_plan_code_to_disco_app_subscriptions.rb +7 -0
  179. data/db/migrate/20160425205211_add_source_to_disco_app_subscriptions.rb +5 -0
  180. data/db/migrate/20160426033520_add_trial_period_days_to_disco_app_subscriptions.rb +5 -0
  181. data/db/migrate/20160513140727_add_name_to_disco_app_shops.rb +5 -0
  182. data/db/migrate/20160521135510_move_shop_to_synchronises.rb +61 -0
  183. data/lib/disco_app/configuration.rb +45 -0
  184. data/lib/disco_app/constants.rb +4 -0
  185. data/lib/disco_app/engine.rb +26 -0
  186. data/lib/disco_app/session.rb +14 -0
  187. data/lib/disco_app/support/file_fixtures.rb +23 -0
  188. data/lib/disco_app/test_help.rb +11 -0
  189. data/lib/disco_app/version.rb +3 -0
  190. data/lib/disco_app.rb +7 -0
  191. data/lib/generators/disco_app/USAGE +5 -0
  192. data/lib/generators/disco_app/disco_app_generator.rb +239 -0
  193. data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
  194. data/lib/generators/disco_app/templates/assets/javascripts/components.js +3 -0
  195. data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -0
  196. data/lib/generators/disco_app/templates/config/database.yml.tt +20 -0
  197. data/lib/generators/disco_app/templates/config/newrelic.yml +26 -0
  198. data/lib/generators/disco_app/templates/config/puma.rb +15 -0
  199. data/lib/generators/disco_app/templates/controllers/home_controller.rb +7 -0
  200. data/lib/generators/disco_app/templates/initializers/disco_app.rb +28 -0
  201. data/lib/generators/disco_app/templates/initializers/rollbar.rb +19 -0
  202. data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
  203. data/lib/generators/disco_app/templates/initializers/shopify_app.rb +7 -0
  204. data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +7 -0
  205. data/lib/generators/disco_app/templates/root/CHECKS +4 -0
  206. data/lib/generators/disco_app/templates/root/Procfile +2 -0
  207. data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
  208. data/lib/tasks/carrier_service.rake +10 -0
  209. data/lib/tasks/database.rake +8 -0
  210. data/lib/tasks/sessions.rake +9 -0
  211. data/lib/tasks/shops.rake +10 -0
  212. data/lib/tasks/start.rake +3 -0
  213. data/lib/tasks/webhooks.rake +10 -0
  214. data/test/controllers/disco_app/admin/shops_controller_test.rb +54 -0
  215. data/test/controllers/disco_app/charges_controller_test.rb +99 -0
  216. data/test/controllers/disco_app/install_controller_test.rb +50 -0
  217. data/test/controllers/disco_app/subscriptions_controller_test.rb +68 -0
  218. data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
  219. data/test/controllers/home_controller_test.rb +92 -0
  220. data/test/controllers/proxy_controller_test.rb +42 -0
  221. data/test/disco_app_test.rb +7 -0
  222. data/test/dummy/Rakefile +6 -0
  223. data/test/dummy/app/assets/javascripts/application.js +17 -0
  224. data/test/dummy/app/assets/stylesheets/application.scss +5 -0
  225. data/test/dummy/app/controllers/application_controller.rb +6 -0
  226. data/test/dummy/app/controllers/carrier_request_controller.rb +10 -0
  227. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +8 -0
  228. data/test/dummy/app/controllers/home_controller.rb +7 -0
  229. data/test/dummy/app/controllers/proxy_controller.rb +8 -0
  230. data/test/dummy/app/helpers/application_helper.rb +2 -0
  231. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +16 -0
  232. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
  233. data/test/dummy/app/jobs/products_create_job.rb +7 -0
  234. data/test/dummy/app/jobs/products_delete_job.rb +7 -0
  235. data/test/dummy/app/jobs/products_update_job.rb +7 -0
  236. data/test/dummy/app/models/disco_app/shop.rb +15 -0
  237. data/test/dummy/app/models/js_configuration.rb +8 -0
  238. data/test/dummy/app/models/product.rb +9 -0
  239. data/test/dummy/app/models/widget_configuration.rb +10 -0
  240. data/test/dummy/app/views/assets/script_tag.js.erb +1 -0
  241. data/test/dummy/app/views/assets/test.js.erb +1 -0
  242. data/test/dummy/app/views/assets/widget.js.erb +2 -0
  243. data/test/dummy/app/views/assets/widget.scss.erb +3 -0
  244. data/test/dummy/app/views/home/index.html.erb +2 -0
  245. data/test/dummy/app/views/snippets/widget.liquid.erb +1 -0
  246. data/test/dummy/bin/bundle +3 -0
  247. data/test/dummy/bin/rails +4 -0
  248. data/test/dummy/bin/rake +4 -0
  249. data/test/dummy/bin/setup +29 -0
  250. data/test/dummy/config/application.rb +38 -0
  251. data/test/dummy/config/boot.rb +5 -0
  252. data/test/dummy/config/database.codeship.yml +23 -0
  253. data/test/dummy/config/database.gitlab-ci.yml +24 -0
  254. data/test/dummy/config/database.yml +20 -0
  255. data/test/dummy/config/environment.rb +5 -0
  256. data/test/dummy/config/environments/development.rb +41 -0
  257. data/test/dummy/config/environments/production.rb +85 -0
  258. data/test/dummy/config/environments/test.rb +42 -0
  259. data/test/dummy/config/initializers/assets.rb +11 -0
  260. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  261. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  262. data/test/dummy/config/initializers/disco_app.rb +28 -0
  263. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  264. data/test/dummy/config/initializers/inflections.rb +16 -0
  265. data/test/dummy/config/initializers/mime_types.rb +4 -0
  266. data/test/dummy/config/initializers/omniauth.rb +9 -0
  267. data/test/dummy/config/initializers/session_store.rb +2 -0
  268. data/test/dummy/config/initializers/shopify_app.rb +7 -0
  269. data/test/dummy/config/initializers/shopify_session_repository.rb +7 -0
  270. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  271. data/test/dummy/config/locales/en.yml +23 -0
  272. data/test/dummy/config/routes.rb +11 -0
  273. data/test/dummy/config/secrets.yml +22 -0
  274. data/test/dummy/config.ru +4 -0
  275. data/test/dummy/db/migrate/20160307182229_create_products.rb +11 -0
  276. data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +19 -0
  277. data/test/dummy/db/schema.rb +141 -0
  278. data/test/dummy/public/404.html +67 -0
  279. data/test/dummy/public/422.html +67 -0
  280. data/test/dummy/public/500.html +66 -0
  281. data/test/dummy/public/favicon.ico +0 -0
  282. data/test/fixtures/api/widget_store/assets/create_script_tag_js_request.json +6 -0
  283. data/test/fixtures/api/widget_store/assets/create_script_tag_js_response.json +12 -0
  284. data/test/fixtures/api/widget_store/assets/create_script_tag_request.json +6 -0
  285. data/test/fixtures/api/widget_store/assets/create_script_tag_response.json +10 -0
  286. data/test/fixtures/api/widget_store/assets/create_test_js_request.json +6 -0
  287. data/test/fixtures/api/widget_store/assets/create_test_js_response.json +12 -0
  288. data/test/fixtures/api/widget_store/assets/create_widget_js_request.json +6 -0
  289. data/test/fixtures/api/widget_store/assets/create_widget_js_response.json +12 -0
  290. data/test/fixtures/api/widget_store/assets/create_widget_liquid_request.json +6 -0
  291. data/test/fixtures/api/widget_store/assets/create_widget_liquid_response.json +12 -0
  292. data/test/fixtures/api/widget_store/assets/create_widget_scss_request.json +6 -0
  293. data/test/fixtures/api/widget_store/assets/create_widget_scss_response.json +12 -0
  294. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_request.json +1 -0
  295. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_response.json +1 -0
  296. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_request.json +1 -0
  297. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_response.json +12 -0
  298. data/test/fixtures/api/widget_store/assets/update_script_tag_request.json +10 -0
  299. data/test/fixtures/api/widget_store/assets/update_script_tag_response.json +10 -0
  300. data/test/fixtures/api/widget_store/carrier_services.json +1 -0
  301. data/test/fixtures/api/widget_store/carrier_services_create.json +8 -0
  302. data/test/fixtures/api/widget_store/charges/activate_application_charge_request.json +16 -0
  303. data/test/fixtures/api/widget_store/charges/activate_application_charge_response.json +1 -0
  304. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_request.json +20 -0
  305. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_response.json +1 -0
  306. data/test/fixtures/api/widget_store/charges/create_application_charge_request.json +9 -0
  307. data/test/fixtures/api/widget_store/charges/create_application_charge_response.json +16 -0
  308. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +9 -0
  309. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_response.json +20 -0
  310. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +9 -0
  311. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json +20 -0
  312. data/test/fixtures/api/widget_store/charges/get_accepted_application_charge_response.json +16 -0
  313. data/test/fixtures/api/widget_store/charges/get_accepted_recurring_application_charge_response.json +20 -0
  314. data/test/fixtures/api/widget_store/charges/get_declined_application_charge_response.json +16 -0
  315. data/test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json +20 -0
  316. data/test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json +16 -0
  317. data/test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json +20 -0
  318. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json +31 -0
  319. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json +1 -0
  320. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json +19 -0
  321. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json +1 -0
  322. data/test/fixtures/api/widget_store/shop.json +46 -0
  323. data/test/fixtures/api/widget_store/webhooks.json +1 -0
  324. data/test/fixtures/assets/test.js +1 -0
  325. data/test/fixtures/assets/test.min.js +1 -0
  326. data/test/fixtures/disco_app/application_charges.yml +11 -0
  327. data/test/fixtures/disco_app/plan_codes.yml +13 -0
  328. data/test/fixtures/disco_app/plans.yml +37 -0
  329. data/test/fixtures/disco_app/recurring_application_charges.yml +11 -0
  330. data/test/fixtures/disco_app/shops.yml +10 -0
  331. data/test/fixtures/disco_app/subscriptions.yml +22 -0
  332. data/test/fixtures/js_configurations.yml +3 -0
  333. data/test/fixtures/liquid/model.liquid +8 -0
  334. data/test/fixtures/products.yml +4 -0
  335. data/test/fixtures/webhooks/app_uninstalled.json +46 -0
  336. data/test/fixtures/webhooks/product_created.json +167 -0
  337. data/test/fixtures/webhooks/product_deleted.json +3 -0
  338. data/test/fixtures/webhooks/product_updated.json +167 -0
  339. data/test/fixtures/widget_configurations.yml +4 -0
  340. data/test/integration/synchronises_test.rb +55 -0
  341. data/test/jobs/disco_app/app_installed_job_test.rb +57 -0
  342. data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
  343. data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +25 -0
  344. data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +30 -0
  345. data/test/models/disco_app/can_be_liquified_test.rb +55 -0
  346. data/test/models/disco_app/has_metafields_test.rb +40 -0
  347. data/test/models/disco_app/plan_test.rb +5 -0
  348. data/test/models/disco_app/renders_assets_test.rb +109 -0
  349. data/test/models/disco_app/session_test.rb +31 -0
  350. data/test/models/disco_app/shop_test.rb +35 -0
  351. data/test/models/disco_app/subscription_test.rb +19 -0
  352. data/test/services/disco_app/charges_service_test.rb +112 -0
  353. data/test/services/disco_app/subscription_service_test.rb +60 -0
  354. data/test/support/test_file_fixtures.rb +29 -0
  355. data/test/support/test_shopify_api.rb +16 -0
  356. data/test/test_helper.rb +55 -0
  357. metadata +878 -0
@@ -0,0 +1,13 @@
1
+ class CreateDiscoAppPlans < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_plans do |t|
4
+ t.integer :status
5
+ t.string :name
6
+ t.integer :charge_type
7
+ t.decimal :default_price
8
+ t.integer :default_trial_days
9
+
10
+ t.timestamps null: false
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,15 @@
1
+ class CreateDiscoAppSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_subscriptions do |t|
4
+ t.belongs_to :shop, index: true
5
+ t.belongs_to :plan, index: true
6
+ t.integer :status
7
+ t.string :name
8
+ t.integer :charge_type
9
+ t.decimal :price
10
+ t.integer :trial_days
11
+
12
+ t.timestamps null: false
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,5 @@
1
+ class MoveShopToDiscoAppEngine < ActiveRecord::Migration
2
+ def change
3
+ rename_table :shops, :disco_app_shops
4
+ end
5
+ end
@@ -0,0 +1,12 @@
1
+ class CreateDiscoAppSessions < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_sessions do |t|
4
+ t.string :session_id, null: false
5
+ t.text :data
6
+ t.timestamps null: false
7
+ end
8
+
9
+ add_index :disco_app_sessions, :session_id, :unique => true
10
+ add_index :disco_app_sessions, :updated_at
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ class AddShopIdToDiscoAppSessions < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_sessions, :shop_id, :integer, null: true
4
+ add_foreign_key :disco_app_sessions, :disco_app_shops, column: :shop_id, on_delete: :cascade
5
+ end
6
+ end
@@ -0,0 +1,8 @@
1
+ class CreateDiscoAppSettings < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_app_settings do |t|
4
+
5
+ t.timestamps null: false
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,22 @@
1
+ class UpdatePlans < ActiveRecord::Migration
2
+ def change
3
+ remove_column :disco_app_plans, :default_price, :decimal
4
+ rename_column :disco_app_plans, :default_trial_days, :trial_period_days
5
+ rename_column :disco_app_plans, :charge_type, :plan_type
6
+ add_column :disco_app_plans, :amount, :integer, default: 0
7
+ add_column :disco_app_plans, :currency, :string, default: 'USD'
8
+ add_column :disco_app_plans, :interval, :integer, default: 0
9
+ add_column :disco_app_plans, :interval_count, :integer, default: 1
10
+
11
+ reversible do |direction|
12
+ direction.up do
13
+ change_column :disco_app_plans, :plan_type, :integer, default: 0
14
+ change_column :disco_app_plans, :status, :integer, default: 0
15
+ end
16
+ direction.down do
17
+ change_column :disco_app_plans, :plan_type, :integer
18
+ change_column :disco_app_plans, :status, :integer
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,13 @@
1
+ class UpdateSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ remove_column :disco_app_subscriptions, :name, :string
4
+ remove_column :disco_app_subscriptions, :price, :decimal
5
+ remove_column :disco_app_subscriptions, :trial_days, :integer
6
+
7
+ rename_column :disco_app_subscriptions, :charge_type, :subscription_type
8
+
9
+ add_column :disco_app_subscriptions, :trial_start_at, :datetime, null: true
10
+ add_column :disco_app_subscriptions, :trial_end_at, :datetime, null: true
11
+ add_column :disco_app_subscriptions, :cancelled_at, :datetime, null: true
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ class CreateDiscoAppRecurringApplicationCharges < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_recurring_application_charges do |t|
4
+ t.integer :shop_id, limit: 8
5
+ t.integer :subscription_id, limit: 8
6
+ t.integer :status, default: 0
7
+
8
+ t.timestamps null: false
9
+ end
10
+
11
+ add_foreign_key :disco_app_recurring_application_charges, :disco_app_shops, column: :shop_id
12
+ add_foreign_key :disco_app_recurring_application_charges, :disco_app_subscriptions, column: :subscription_id
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ class CreateDiscoAppApplicationCharges < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_application_charges do |t|
4
+ t.integer :shop_id, limit: 8
5
+ t.integer :subscription_id, limit: 8
6
+ t.integer :status, default: 0
7
+
8
+ t.timestamps null: false
9
+ end
10
+
11
+ add_foreign_key :disco_app_application_charges, :disco_app_shops, column: :shop_id
12
+ add_foreign_key :disco_app_application_charges, :disco_app_subscriptions, column: :subscription_id
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ class DropChargeStatusFromShops < ActiveRecord::Migration
2
+ def change
3
+ remove_column :disco_app_shops, :charge_status, :integer, default: 0
4
+ end
5
+ end
@@ -0,0 +1,8 @@
1
+ class AddShopifyAttributesToCharges < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_application_charges, :shopify_id, :integer, limit: 8, null: true
4
+ add_column :disco_app_recurring_application_charges, :shopify_id, :integer, limit: 8, null: true
5
+ add_column :disco_app_application_charges, :confirmation_url, :string, null: true
6
+ add_column :disco_app_recurring_application_charges, :confirmation_url, :string, null: true
7
+ end
8
+ end
@@ -0,0 +1,14 @@
1
+ class CreateDiscoAppPlanCodes < ActiveRecord::Migration
2
+ def change
3
+ create_table :disco_app_plan_codes do |t|
4
+ t.integer :plan_id, limit: 8
5
+ t.string :code
6
+ t.integer :trial_period_days
7
+ t.integer :amount
8
+
9
+ t.timestamps null: false
10
+ end
11
+
12
+ add_foreign_key :disco_app_plan_codes, :disco_app_plans, column: :plan_id
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ class AddStatusToPlanCodes < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_plan_codes, :status, :integer, default: 0
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ class AddAmountAndPlanCodeToDiscoAppSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_subscriptions, :amount, :integer, default: 0
4
+ add_column :disco_app_subscriptions, :plan_code_id, :integer, limit: 8
5
+ add_foreign_key :disco_app_subscriptions, :disco_app_plan_codes, column: :plan_code_id
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ class AddSourceToDiscoAppSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_subscriptions, :source, :string
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddTrialPeriodDaysToDiscoAppSubscriptions < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_subscriptions, :trial_period_days, :integer
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddNameToDiscoAppShops < ActiveRecord::Migration
2
+ def change
3
+ add_column :disco_app_shops, :name, :string
4
+ end
5
+ end
@@ -0,0 +1,61 @@
1
+ class MoveShopToSynchronises < ActiveRecord::Migration
2
+
3
+ class DiscoApp::Shop < ActiveRecord::Base
4
+ end
5
+
6
+ ATTRIBUTES_TO_MIGRATE = [
7
+ :email, :country_name, :currency, :money_format,
8
+ :money_with_currency_format, :plan_display_name,
9
+ :latitude, :longitude, :customer_email, :password_enabled, :phone,
10
+ :primary_locale, :ships_to_countries, :timezone, :iana_timezone,
11
+ :has_storefront
12
+ ]
13
+
14
+ def up
15
+ add_column :disco_app_shops, :data, :jsonb, default: {}
16
+
17
+ DiscoApp::Shop.find_each do |shop|
18
+ data = shop.data
19
+ ATTRIBUTES_TO_MIGRATE.each do |attribute|
20
+ data[attribute.to_s] = shop.send(attribute)
21
+ end
22
+ shop.update(data: data)
23
+ end
24
+
25
+ ATTRIBUTES_TO_MIGRATE.each do |attribute|
26
+ remove_column :disco_app_shops, attribute
27
+ end
28
+ end
29
+
30
+ def down
31
+ ATTRIBUTES_TO_MIGRATE.each do |attribute|
32
+ add_column :disco_app_shops, attribute, attribute_column_type(attribute)
33
+ end
34
+
35
+ DiscoApp::Shop.find_each do |shop|
36
+ shop.update(Hash[ATTRIBUTES_TO_MIGRATE.map do |attribute|
37
+ [attribute, shop.data[attribute.to_s]]
38
+ end])
39
+ end
40
+
41
+ remove_column :disco_app_shops, :data
42
+ end
43
+
44
+ private
45
+
46
+ def attribute_column_type(attribute)
47
+ case attribute
48
+ when :password_enabled
49
+ :boolean
50
+ when :has_storefront
51
+ :boolean
52
+ when :latitude
53
+ :decimal
54
+ when :longitude
55
+ :decimal
56
+ else
57
+ :string
58
+ end
59
+ end
60
+
61
+ end
@@ -0,0 +1,45 @@
1
+ module DiscoApp
2
+
3
+ class Configuration
4
+
5
+ # Required configuration.
6
+ attr_accessor :app_name
7
+
8
+ # Set the list of Shopify webhook topics to register.
9
+ attr_accessor :webhook_topics
10
+
11
+ # Set the below if using an application proxy.
12
+ attr_accessor :app_proxy_prefix
13
+
14
+ # Set the below if providing a carrier service endpoint.
15
+ attr_accessor :carrier_service_callback_url
16
+
17
+ # Set the below to create real Shopify charges.
18
+ attr_accessor :real_charges
19
+ alias_method :real_charges?, :real_charges
20
+
21
+ # Optional configuration, usually useful for development environments.
22
+ attr_accessor :skip_proxy_verification
23
+ alias_method :skip_proxy_verification?, :skip_proxy_verification
24
+ attr_accessor :skip_webhook_verification
25
+ alias_method :skip_webhook_verification?, :skip_webhook_verification
26
+ attr_accessor :skip_carrier_request_verification
27
+ alias_method :skip_carrier_request_verification?, :skip_carrier_request_verification
28
+ attr_accessor :skip_oauth
29
+ alias_method :skip_oauth?, :skip_oauth
30
+
31
+ end
32
+
33
+ def self.configuration
34
+ @configuration ||= Configuration.new
35
+ end
36
+
37
+ def self.configuration=(config)
38
+ @configuration = config
39
+ end
40
+
41
+ def self.configure
42
+ yield configuration
43
+ end
44
+
45
+ end
@@ -0,0 +1,4 @@
1
+ module DiscoApp
2
+ SOURCE_COOKIE_KEY = '_disco_app_source'
3
+ CODE_COOKIE_KEY = '_disco_app_code'
4
+ end
@@ -0,0 +1,26 @@
1
+ require 'shopify_app'
2
+ require 'jquery-rails'
3
+ require 'turbolinks'
4
+ require 'activerecord/session_store'
5
+ require 'disco_app/session'
6
+ require 'jsonapi-resources'
7
+ require 'react-rails'
8
+
9
+ module DiscoApp
10
+ class Engine < ::Rails::Engine
11
+
12
+ isolate_namespace DiscoApp
13
+ engine_name 'disco_app'
14
+
15
+ # Ensure DiscoApp helpers are available throughout application.
16
+ config.to_prepare do
17
+ ApplicationController.helper(DiscoApp::ApplicationHelper)
18
+ end
19
+
20
+ # Ensure our frame assets are included for precompilation.
21
+ initializer 'disco_app.assets.precompile' do |app|
22
+ app.config.assets.precompile += %w(disco_app/icon.svg disco_app/admin.css disco_app/frame.css disco_app/frame.js)
23
+ end
24
+
25
+ end
26
+ end
@@ -0,0 +1,14 @@
1
+ module DiscoApp
2
+ class Session < ActiveRecord::SessionStore::Session
3
+
4
+ before_save :set_shop_id!
5
+
6
+ private
7
+
8
+ def set_shop_id!
9
+ return false unless loaded?
10
+ write_attribute(:shop_id, data[:shopify] || data['shopify'])
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,23 @@
1
+ module DiscoApp::Test
2
+ module FileFixtures
3
+
4
+ # Return an XML fixture as an XML string.
5
+ def xml_fixture(path)
6
+ filename = Rails.root.join('test', 'fixtures', 'xml', "#{path}.xml")
7
+ File.read(filename)
8
+ end
9
+
10
+ # Return a JSON fixture as an indifferent hash.
11
+ def json_fixture(path, dir: 'json', parse: true)
12
+ filename = Rails.root.join('test', 'fixtures', dir, "#{path}.json")
13
+ return File.read(filename) unless parse
14
+ HashWithIndifferentAccess.new(ActiveSupport::JSON.decode(File.read(filename)))
15
+ end
16
+
17
+ # Webhook fixtures are special-case JSON fixtures.
18
+ def webhook_fixture(path, parse: true)
19
+ json_fixture(path, dir: 'webhooks', parse: parse)
20
+ end
21
+
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ require 'disco_app/support/file_fixtures'
2
+
3
+ # Make our helper modules available inside fixtures.
4
+ ActiveRecord::FixtureSet.context_class.send :include, DiscoApp::Test::FileFixtures
5
+
6
+ # Include FileFixture helpers in base TestCase class.
7
+ class ActiveSupport::TestCase
8
+
9
+ include DiscoApp::Test::FileFixtures
10
+
11
+ end
@@ -0,0 +1,3 @@
1
+ module DiscoApp
2
+ VERSION = '0.10.4'
3
+ end
data/lib/disco_app.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'disco_app/version'
2
+ require 'disco_app/constants'
3
+ require 'disco_app/configuration'
4
+ require 'disco_app/engine'
5
+
6
+ module DiscoApp
7
+ end
@@ -0,0 +1,5 @@
1
+ Description:
2
+ Generate a new Shopify application.
3
+
4
+ Example:
5
+ rails generate disco_app
@@ -0,0 +1,239 @@
1
+ class DiscoAppGenerator < Rails::Generators::Base
2
+
3
+ source_root File.expand_path('../templates', __FILE__)
4
+
5
+ # Copy a number of template files to the top-level directory of our application:
6
+ #
7
+ # - .env and .env.local for settings environment variables in development with dotenv-rails;
8
+ # - Slightly customised version of the default Rails .gitignore;
9
+ # - Default simple Procfile for Heroku.
10
+ #
11
+ def copy_root_files
12
+ %w(.env .env.local .gitignore Procfile CHECKS).each do |file|
13
+ copy_file "root/#{file}", file
14
+ end
15
+ end
16
+
17
+ # Remove a number of root files.
18
+ def remove_root_files
19
+ %w(README.rdoc).each do |file|
20
+ remove_file file
21
+ end
22
+ end
23
+
24
+ # Configure the application's Gemfile.
25
+ def configure_gems
26
+ # Remove sqlite from the general Gemfile.
27
+ gsub_file 'Gemfile', /^# Use sqlite3 as the database for Active Record\ngem 'sqlite3'/m, ''
28
+
29
+ # Add gems common to all environments.
30
+ gem 'shopify_app', '~> 6.4.1'
31
+ gem 'sidekiq', '~> 4.0.2'
32
+ gem 'puma', '~> 2.14.0'
33
+ gem 'activerecord-session_store', '~> 1.0.0'
34
+ gem 'activeresource', github: 'shopify/activeresource', tag: '4.2-threadsafe'
35
+ gem 'rails-bigint-pk', '~> 1.2.0'
36
+ gem 'acts_as_singleton', '~> 0.0.8'
37
+ gem 'pg', '~> 0.18.3'
38
+ gem 'react-rails', '~> 1.6.0'
39
+ gem 'classnames-rails', '~> 2.1.5'
40
+ gem 'active_link_to', '~> 1.0.2'
41
+ gem 'premailer-rails', '~> 1.8.2'
42
+ gem 'nokogiri', '~> 1.6.8'
43
+ gem 'render_anywhere', '~> 0.0.12', require: false
44
+
45
+ # Add gems for development and testing only.
46
+ gem_group :development, :test do
47
+ gem 'dotenv-rails', '~> 2.0.2'
48
+ gem 'minitest-reporters', '~> 1.0.19'
49
+ gem 'guard', '~> 2.13.0'
50
+ gem 'guard-minitest', '~> 2.4.4'
51
+ end
52
+
53
+ # Add gems for production only.
54
+ gem_group :production do
55
+ gem 'rails_12factor', '~> 0.0.3'
56
+ gem 'mailgun_rails', '~> 0.7.0'
57
+ end
58
+
59
+ # Add monitoring gems to Gemfile
60
+ gem 'rollbar', '~> 2.8.0'
61
+ gem 'oj', '~> 2.14.5'
62
+ gem 'newrelic_rpm', '~> 3.15.2.317'
63
+ end
64
+
65
+ # copy template for pg configuration
66
+ def update_database_config
67
+ template 'config/database.yml.tt'
68
+ end
69
+
70
+ # Run bundle install to add our new gems before running tasks.
71
+ def bundle_install
72
+ Bundler.with_clean_env do
73
+ run 'bundle install'
74
+ end
75
+ end
76
+
77
+ # Make any required adjustments to the application configuration.
78
+ def configure_application
79
+ # The force_ssl flag is commented by default for production.
80
+ # Uncomment to ensure config.force_ssl = true in production.
81
+ uncomment_lines 'config/environments/production.rb', /force_ssl/
82
+
83
+ # Set time zone to UTC
84
+ application "config.time_zone = 'UTC'"
85
+ application "# Ensure UTC is the default timezone"
86
+
87
+ # Set server side rendereing for components.js
88
+ application "config.react.server_renderer_options = {\nfiles: ['components.js'], # files to load for prerendering\n}"
89
+ application "# Enable server side react rendering"
90
+
91
+ # Set defaults for various charge attributes.
92
+ application "config.x.shopify_charges_default_trial_days = 14\n"
93
+ application "config.x.shopify_charges_default_price = 10.00"
94
+ application "config.x.shopify_charges_default_type = :recurring"
95
+ application "# Set defaults for charges created by the application"
96
+
97
+ # Set the "real charges" config variable to false explicitly by default.
98
+ # Only in production do we read from the environment variable and
99
+ # potentially have it become true.
100
+ application "config.x.shopify_charges_real = false\n"
101
+ application "# Explicitly prevent real charges being created by default"
102
+ application "config.x.shopify_charges_real = ENV['SHOPIFY_CHARGES_REAL'] == 'true'\n", env: :production
103
+ application "# Allow real charges in production with an ENV variable", env: :production
104
+
105
+ # Configure session storage.
106
+ application "ActiveRecord::SessionStore::Session.table_name = 'disco_app_sessions'"
107
+ application "ActionDispatch::Session::ActiveRecordStore.session_class = DiscoApp::Session"
108
+ application "# Configure custom session storage"
109
+
110
+ # Set Sidekiq as the queue adapter in production.
111
+ application "config.active_job.queue_adapter = :sidekiq\n", env: :production
112
+ application "# Use Sidekiq as the active job backend", env: :production
113
+
114
+ # Ensure the application configuration uses the DEFAULT_HOST environment
115
+ # variable to set up support for reverse routing absolute URLS (needed when
116
+ # generating Webhook URLs for example).
117
+ application "routes.default_url_options[:host] = ENV['DEFAULT_HOST']\n"
118
+ application "# Set the default host for absolute URL routing purposes"
119
+
120
+ # Configure React in development and production.
121
+ application "config.react.variant = :development", env: :development
122
+ application "# Use development variant of React in development.", env: :development
123
+ application "config.react.variant = :production", env: :production
124
+ application "# Use production variant of React in production.", env: :production
125
+
126
+ # Copy over the default puma configuration.
127
+ copy_file 'config/puma.rb', 'config/puma.rb'
128
+
129
+ # Mail configuration
130
+ configuration = <<-CONFIG.strip_heredoc
131
+
132
+ # Configure ActionMailer to use MailGun
133
+ if ENV['MAILGUN_API_KEY']
134
+ config.action_mailer.delivery_method = :mailgun
135
+ config.action_mailer.mailgun_settings = {
136
+ api_key: ENV['MAILGUN_API_KEY'],
137
+ domain: ENV['MAILGUN_API_DOMAIN']
138
+ }
139
+ end
140
+ CONFIG
141
+ application configuration, env: :production
142
+
143
+ # Monitoring configuration
144
+ copy_file 'initializers/rollbar.rb', 'config/initializers/rollbar.rb'
145
+ copy_file 'config/newrelic.yml', 'config/newrelic.yml'
146
+ end
147
+
148
+
149
+ # Add entries to .env and .env.local
150
+ def add_env_variables
151
+ configuration = <<-CONFIG.strip_heredoc
152
+
153
+ MAILGUN_API_KEY=
154
+ MAILGUN_API_DOMAIN=
155
+ CONFIG
156
+ append_to_file '.env', configuration
157
+ append_to_file '.env.local', configuration
158
+ end
159
+
160
+ # Set up routes.
161
+ def setup_routes
162
+ route "mount DiscoApp::Engine, at: '/'"
163
+ end
164
+
165
+ # Run generators.
166
+ def run_generators
167
+ generate 'shopify_app:install'
168
+ generate 'shopify_app:home_controller'
169
+ generate 'bigint_pk:install'
170
+ generate 'react:install'
171
+ end
172
+
173
+ # Copy template files to the appropriate location. In some cases, we'll be
174
+ # overwriting or removing existing files or those created by ShopifyApp.
175
+ def copy_and_remove_files
176
+ # Copy initializers
177
+ copy_file 'initializers/shopify_app.rb', 'config/initializers/shopify_app.rb'
178
+ copy_file 'initializers/disco_app.rb', 'config/initializers/disco_app.rb'
179
+ copy_file 'initializers/shopify_session_repository.rb', 'config/initializers/shopify_session_repository.rb'
180
+ copy_file 'initializers/session_store.rb', 'config/initializers/session_store.rb'
181
+
182
+ # Copy default home controller and view
183
+ copy_file 'controllers/home_controller.rb', 'app/controllers/home_controller.rb'
184
+ copy_file 'views/home/index.html.erb', 'app/views/home/index.html.erb'
185
+
186
+ # Copy assets
187
+ copy_file 'assets/javascripts/application.js', 'app/assets/javascripts/application.js'
188
+ copy_file 'assets/javascripts/components.js', 'app/assets/javascripts/components.js'
189
+ copy_file 'assets/stylesheets/application.scss', 'app/assets/stylesheets/application.scss'
190
+
191
+ # Remove application.css
192
+ remove_file 'app/assets/stylesheets/application.css'
193
+
194
+ # Remove the layout files created by ShopifyApp
195
+ remove_file 'app/views/layouts/application.html.erb'
196
+ remove_file 'app/views/layouts/embedded_app.html.erb'
197
+ end
198
+
199
+ # Add the Disco App test helper to test/test_helper.rb
200
+ def add_test_helper
201
+ inject_into_file 'test/test_helper.rb', "require 'disco_app/test_help'\n", { after: "require 'rails/test_help'\n" }
202
+ end
203
+
204
+ # Copy engine migrations over.
205
+ def install_migrations
206
+ rake 'disco_app:install:migrations'
207
+ end
208
+
209
+ # Create PG database
210
+ def create_database
211
+ rake 'db:create'
212
+ end
213
+
214
+ # Run migrations.
215
+ def migrate
216
+ rake 'db:migrate'
217
+ end
218
+
219
+ # Lock down the application to a specific Ruby version:
220
+ #
221
+ # - Via .ruby-version file for rbenv in development;
222
+ # - Via a Gemfile line in production.
223
+ #
224
+ # This should be the last operation, to allow all other operations to run in the initial Ruby version.
225
+ def set_ruby_version
226
+ copy_file 'root/.ruby-version', '.ruby-version'
227
+ prepend_to_file 'Gemfile', "ruby '2.3.1'\n"
228
+ end
229
+
230
+ private
231
+
232
+ # This method of finding the component.js manifest taken from the
233
+ # install generator in react-rails.
234
+ # See https://github.com/reactjs/react-rails/blob/3f0af13fa755d6e95969c17728d0354c234f3a37/lib/generators/react/install_generator.rb#L53-L55
235
+ def components
236
+ Pathname.new(destination_root).join('app/assets/javascripts', 'components.js')
237
+ end
238
+
239
+ end