disco_app 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (346) hide show
  1. checksums.yaml +7 -0
  2. data/Rakefile +37 -0
  3. data/app/assets/components/disco_app/buttons/model-destroy-button.es6.jsx +31 -0
  4. data/app/assets/components/disco_app/forms/model-form.es6.jsx +64 -0
  5. data/app/assets/components/embedded_app/bar.es6.jsx +31 -0
  6. data/app/assets/components/shopify/buttons/_buttons.scss +546 -0
  7. data/app/assets/components/shopify/buttons/button.es6.jsx +15 -0
  8. data/app/assets/components/shopify/card/_card.scss +342 -0
  9. data/app/assets/components/shopify/card/card-header.es6.jsx +34 -0
  10. data/app/assets/components/shopify/card/card-section.es6.jsx +26 -0
  11. data/app/assets/components/shopify/card/card.es6.jsx +16 -0
  12. data/app/assets/components/shopify/image/_image.scss +82 -0
  13. data/app/assets/components/shopify/table/_table.scss +18 -0
  14. data/app/assets/components/shopify/typography/_typography.scss +23 -0
  15. data/app/assets/components/shopify/typography/ui-heading.es6.jsx +16 -0
  16. data/app/assets/components/shopify/ui-layout/_ui-layout.scss +157 -0
  17. data/app/assets/components/shopify/ui-layout/ui-annotated-section.es6.jsx +29 -0
  18. data/app/assets/components/shopify/ui-layout/ui-empty-state.es6.jsx +35 -0
  19. data/app/assets/components/shopify/ui-layout/ui-footer-help.es6.jsx +13 -0
  20. data/app/assets/components/shopify/ui-layout/ui-layout-item.es6.jsx +11 -0
  21. data/app/assets/components/shopify/ui-layout/ui-layout-section.es6.jsx +19 -0
  22. data/app/assets/components/shopify/ui-layout/ui-layout-sections.es6.jsx +11 -0
  23. data/app/assets/components/shopify/ui-layout/ui-layout.es6.jsx +11 -0
  24. data/app/assets/components/shopify/ui-layout/ui-page-actions.es6.jsx +13 -0
  25. data/app/assets/components/shopify/ui-layout/ui-page-actions__buttons.es6.jsx +27 -0
  26. data/app/assets/components/shopify/ui-stack/_ui-stack.scss +39 -0
  27. data/app/assets/components/shopify/ui-stack/ui-stack-item.es6.jsx +21 -0
  28. data/app/assets/components/shopify/ui-stack/ui-stack.es6.jsx +24 -0
  29. data/app/assets/images/disco_app/icon.svg +1 -0
  30. data/app/assets/images/disco_app/icons.svg +0 -0
  31. data/app/assets/javascripts/disco_app/components/custom/filterable_shop_list.js.jsx +61 -0
  32. data/app/assets/javascripts/disco_app/components/custom/inline-radio-options.es6.jsx +59 -0
  33. data/app/assets/javascripts/disco_app/components/custom/rules-editor.es6.jsx +432 -0
  34. data/app/assets/javascripts/disco_app/components/custom/shop_filter_query.js.jsx +13 -0
  35. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tab.js.jsx +34 -0
  36. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tabs.js.jsx +21 -0
  37. data/app/assets/javascripts/disco_app/components/custom/shop_list.js.jsx +142 -0
  38. data/app/assets/javascripts/disco_app/components/custom/shop_row.js.jsx +43 -0
  39. data/app/assets/javascripts/disco_app/components/custom/shopify_admin_link.js.jsx +29 -0
  40. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_form.es6.jsx +72 -0
  41. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_input.es6.jsx +20 -0
  42. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-checkbox.es6.jsx +30 -0
  43. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-radio.es6.jsx +30 -0
  44. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-select.es6.jsx +45 -0
  45. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +69 -0
  46. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-textarea.es6.jsx +48 -0
  47. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-time.es6.jsx +7 -0
  48. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__element.es6.jsx +17 -0
  49. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__group.es6.jsx +11 -0
  50. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__section.es6.jsx +11 -0
  51. data/app/assets/javascripts/disco_app/components/ui-kit/icons/icon-chevron.es6.jsx +33 -0
  52. data/app/assets/javascripts/disco_app/components/ui-kit/icons/next-icon.es6.jsx +19 -0
  53. data/app/assets/javascripts/disco_app/components/ui-kit/input_select.es6.jsx +21 -0
  54. data/app/assets/javascripts/disco_app/components/ui-kit/tables/table.es6.jsx +27 -0
  55. data/app/assets/javascripts/disco_app/components.js +3 -0
  56. data/app/assets/javascripts/disco_app/disco_app.js +9 -0
  57. data/app/assets/javascripts/disco_app/frame.js +152 -0
  58. data/app/assets/javascripts/disco_app/shopify-turbolinks.js +7 -0
  59. data/app/assets/javascripts/disco_app/ui-kit.js +1 -0
  60. data/app/assets/stylesheets/disco_app/admin/_header.scss +75 -0
  61. data/app/assets/stylesheets/disco_app/admin/_layout.scss +32 -0
  62. data/app/assets/stylesheets/disco_app/admin/_nav.scss +184 -0
  63. data/app/assets/stylesheets/disco_app/admin.scss +11 -0
  64. data/app/assets/stylesheets/disco_app/disco_app.scss +26 -0
  65. data/app/assets/stylesheets/disco_app/frame/_buttons.scss +54 -0
  66. data/app/assets/stylesheets/disco_app/frame/_forms.scss +26 -0
  67. data/app/assets/stylesheets/disco_app/frame/_layout.scss +77 -0
  68. data/app/assets/stylesheets/disco_app/frame/_type.scss +25 -0
  69. data/app/assets/stylesheets/disco_app/frame.scss +10 -0
  70. data/app/assets/stylesheets/disco_app/mixins/_flexbox.scss +400 -0
  71. data/app/assets/stylesheets/disco_app/ui-kit/_ui-forms.scss +69 -0
  72. data/app/assets/stylesheets/disco_app/ui-kit/_ui-icons.scss +28 -0
  73. data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +5121 -0
  74. data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +15 -0
  75. data/app/assets/stylesheets/disco_app/ui-kit/_ui-tabs.scss +75 -0
  76. data/app/assets/stylesheets/disco_app/ui-kit/_ui-type.scss +13 -0
  77. data/app/controllers/disco_app/admin/app_settings_controller.rb +3 -0
  78. data/app/controllers/disco_app/admin/application_controller.rb +3 -0
  79. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +24 -0
  80. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +20 -0
  81. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +54 -0
  82. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +7 -0
  83. data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +29 -0
  84. data/app/controllers/disco_app/admin/plans_controller.rb +3 -0
  85. data/app/controllers/disco_app/admin/resources/shops_controller.rb +3 -0
  86. data/app/controllers/disco_app/admin/shops_controller.rb +3 -0
  87. data/app/controllers/disco_app/admin/subscriptions_controller.rb +3 -0
  88. data/app/controllers/disco_app/charges_controller.rb +47 -0
  89. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +40 -0
  90. data/app/controllers/disco_app/concerns/authenticated_controller.rb +56 -0
  91. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +35 -0
  92. data/app/controllers/disco_app/frame_controller.rb +9 -0
  93. data/app/controllers/disco_app/install_controller.rb +27 -0
  94. data/app/controllers/disco_app/subscriptions_controller.rb +32 -0
  95. data/app/controllers/disco_app/webhooks_controller.rb +46 -0
  96. data/app/controllers/sessions_controller.rb +28 -0
  97. data/app/helpers/disco_app/application_helper.rb +68 -0
  98. data/app/jobs/disco_app/app_installed_job.rb +3 -0
  99. data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
  100. data/app/jobs/disco_app/concerns/app_installed_job.rb +39 -0
  101. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +20 -0
  102. data/app/jobs/disco_app/concerns/render_asset_group_job.rb +8 -0
  103. data/app/jobs/disco_app/concerns/shop_update_job.rb +13 -0
  104. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +7 -0
  105. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +55 -0
  106. data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +12 -0
  107. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +52 -0
  108. data/app/jobs/disco_app/render_asset_group_job.rb +3 -0
  109. data/app/jobs/disco_app/shop_job.rb +27 -0
  110. data/app/jobs/disco_app/shop_update_job.rb +3 -0
  111. data/app/jobs/disco_app/subscription_changed_job.rb +3 -0
  112. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +3 -0
  113. data/app/jobs/disco_app/synchronise_resources_job.rb +3 -0
  114. data/app/jobs/disco_app/synchronise_webhooks_job.rb +3 -0
  115. data/app/models/disco_app/app_settings.rb +3 -0
  116. data/app/models/disco_app/application_charge.rb +18 -0
  117. data/app/models/disco_app/concerns/app_settings.rb +7 -0
  118. data/app/models/disco_app/concerns/can_be_liquified.rb +45 -0
  119. data/app/models/disco_app/concerns/has_metafields.rb +48 -0
  120. data/app/models/disco_app/concerns/plan.rb +26 -0
  121. data/app/models/disco_app/concerns/plan_code.rb +15 -0
  122. data/app/models/disco_app/concerns/renders_assets.rb +166 -0
  123. data/app/models/disco_app/concerns/shop.rb +86 -0
  124. data/app/models/disco_app/concerns/subscription.rb +60 -0
  125. data/app/models/disco_app/concerns/synchronises.rb +58 -0
  126. data/app/models/disco_app/concerns/taggable.rb +16 -0
  127. data/app/models/disco_app/plan.rb +3 -0
  128. data/app/models/disco_app/plan_code.rb +3 -0
  129. data/app/models/disco_app/recurring_application_charge.rb +18 -0
  130. data/app/models/disco_app/session_storage.rb +18 -0
  131. data/app/models/disco_app/shop.rb +3 -0
  132. data/app/models/disco_app/subscription.rb +3 -0
  133. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +100 -0
  134. data/app/resources/disco_app/admin/resources/shop_resource.rb +4 -0
  135. data/app/services/disco_app/carrier_request_service.rb +15 -0
  136. data/app/services/disco_app/charges_service.rb +81 -0
  137. data/app/services/disco_app/proxy_service.rb +17 -0
  138. data/app/services/disco_app/subscription_service.rb +46 -0
  139. data/app/services/disco_app/webhook_service.rb +30 -0
  140. data/app/views/disco_app/admin/app_settings/edit.html.erb +5 -0
  141. data/app/views/disco_app/admin/plans/_form.html.erb +72 -0
  142. data/app/views/disco_app/admin/plans/_plan_code_fields.html.erb +15 -0
  143. data/app/views/disco_app/admin/plans/edit.html.erb +7 -0
  144. data/app/views/disco_app/admin/plans/index.html.erb +43 -0
  145. data/app/views/disco_app/admin/plans/new.html.erb +7 -0
  146. data/app/views/disco_app/admin/shops/index.html.erb +13 -0
  147. data/app/views/disco_app/admin/subscriptions/edit.html.erb +33 -0
  148. data/app/views/disco_app/charges/activate.html.erb +1 -0
  149. data/app/views/disco_app/charges/create.html.erb +1 -0
  150. data/app/views/disco_app/charges/new.html.erb +23 -0
  151. data/app/views/disco_app/frame/frame.html.erb +36 -0
  152. data/app/views/disco_app/install/installing.html.erb +22 -0
  153. data/app/views/disco_app/install/uninstalling.html.erb +1 -0
  154. data/app/views/disco_app/proxy_errors/404.html.erb +1 -0
  155. data/app/views/disco_app/shared/_card.html.erb +14 -0
  156. data/app/views/disco_app/shared/_icons.html.erb +1 -0
  157. data/app/views/disco_app/shared/_section.html.erb +17 -0
  158. data/app/views/disco_app/subscriptions/new.html.erb +25 -0
  159. data/app/views/layouts/admin/_nav_items.erb +20 -0
  160. data/app/views/layouts/admin.html.erb +67 -0
  161. data/app/views/layouts/application.html.erb +18 -0
  162. data/app/views/layouts/embedded_app.html.erb +50 -0
  163. data/app/views/layouts/embedded_app_modal.html.erb +28 -0
  164. data/app/views/sessions/new.html.erb +28 -0
  165. data/config/routes.rb +63 -0
  166. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +110 -0
  167. data/lib/disco_app/configuration.rb +45 -0
  168. data/lib/disco_app/constants.rb +4 -0
  169. data/lib/disco_app/engine.rb +26 -0
  170. data/lib/disco_app/session.rb +14 -0
  171. data/lib/disco_app/support/file_fixtures.rb +23 -0
  172. data/lib/disco_app/test_help.rb +11 -0
  173. data/lib/disco_app/version.rb +3 -0
  174. data/lib/disco_app.rb +7 -0
  175. data/lib/generators/disco_app/USAGE +5 -0
  176. data/lib/generators/disco_app/disco_app_generator.rb +236 -0
  177. data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
  178. data/lib/generators/disco_app/templates/assets/javascripts/components.js +3 -0
  179. data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -0
  180. data/lib/generators/disco_app/templates/config/database.yml.tt +20 -0
  181. data/lib/generators/disco_app/templates/config/newrelic.yml +26 -0
  182. data/lib/generators/disco_app/templates/config/puma.rb +15 -0
  183. data/lib/generators/disco_app/templates/controllers/home_controller.rb +7 -0
  184. data/lib/generators/disco_app/templates/initializers/disco_app.rb +28 -0
  185. data/lib/generators/disco_app/templates/initializers/rollbar.rb +19 -0
  186. data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
  187. data/lib/generators/disco_app/templates/initializers/shopify_app.rb +7 -0
  188. data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +7 -0
  189. data/lib/generators/disco_app/templates/root/CHECKS +4 -0
  190. data/lib/generators/disco_app/templates/root/Procfile +2 -0
  191. data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
  192. data/lib/tasks/carrier_service.rake +10 -0
  193. data/lib/tasks/database.rake +8 -0
  194. data/lib/tasks/sessions.rake +9 -0
  195. data/lib/tasks/shops.rake +10 -0
  196. data/lib/tasks/start.rake +3 -0
  197. data/lib/tasks/webhooks.rake +10 -0
  198. data/test/controllers/disco_app/admin/shops_controller_test.rb +54 -0
  199. data/test/controllers/disco_app/charges_controller_test.rb +99 -0
  200. data/test/controllers/disco_app/install_controller_test.rb +50 -0
  201. data/test/controllers/disco_app/subscriptions_controller_test.rb +68 -0
  202. data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
  203. data/test/controllers/home_controller_test.rb +92 -0
  204. data/test/controllers/proxy_controller_test.rb +42 -0
  205. data/test/disco_app_test.rb +7 -0
  206. data/test/dummy/Rakefile +6 -0
  207. data/test/dummy/app/assets/javascripts/application.js +17 -0
  208. data/test/dummy/app/assets/stylesheets/application.scss +5 -0
  209. data/test/dummy/app/controllers/application_controller.rb +6 -0
  210. data/test/dummy/app/controllers/carrier_request_controller.rb +10 -0
  211. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +8 -0
  212. data/test/dummy/app/controllers/home_controller.rb +7 -0
  213. data/test/dummy/app/controllers/proxy_controller.rb +8 -0
  214. data/test/dummy/app/helpers/application_helper.rb +2 -0
  215. data/test/dummy/app/jobs/carts_update_job.rb +7 -0
  216. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +16 -0
  217. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
  218. data/test/dummy/app/jobs/products_create_job.rb +7 -0
  219. data/test/dummy/app/jobs/products_delete_job.rb +7 -0
  220. data/test/dummy/app/jobs/products_update_job.rb +7 -0
  221. data/test/dummy/app/models/cart.rb +24 -0
  222. data/test/dummy/app/models/disco_app/shop.rb +20 -0
  223. data/test/dummy/app/models/js_configuration.rb +8 -0
  224. data/test/dummy/app/models/product.rb +9 -0
  225. data/test/dummy/app/models/widget_configuration.rb +10 -0
  226. data/test/dummy/app/views/assets/script_tag.js.erb +1 -0
  227. data/test/dummy/app/views/assets/test.js.erb +1 -0
  228. data/test/dummy/app/views/assets/widget.js.erb +2 -0
  229. data/test/dummy/app/views/assets/widget.scss.erb +3 -0
  230. data/test/dummy/app/views/home/index.html.erb +2 -0
  231. data/test/dummy/app/views/snippets/widget.liquid.erb +1 -0
  232. data/test/dummy/bin/bundle +3 -0
  233. data/test/dummy/bin/rails +4 -0
  234. data/test/dummy/bin/rake +4 -0
  235. data/test/dummy/bin/setup +29 -0
  236. data/test/dummy/config/application.rb +38 -0
  237. data/test/dummy/config/boot.rb +5 -0
  238. data/test/dummy/config/database.codeship.yml +23 -0
  239. data/test/dummy/config/database.gitlab-ci.yml +24 -0
  240. data/test/dummy/config/database.yml +20 -0
  241. data/test/dummy/config/environment.rb +5 -0
  242. data/test/dummy/config/environments/development.rb +41 -0
  243. data/test/dummy/config/environments/production.rb +85 -0
  244. data/test/dummy/config/environments/test.rb +42 -0
  245. data/test/dummy/config/initializers/assets.rb +11 -0
  246. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  247. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  248. data/test/dummy/config/initializers/disco_app.rb +28 -0
  249. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  250. data/test/dummy/config/initializers/inflections.rb +16 -0
  251. data/test/dummy/config/initializers/mime_types.rb +4 -0
  252. data/test/dummy/config/initializers/omniauth.rb +9 -0
  253. data/test/dummy/config/initializers/session_store.rb +2 -0
  254. data/test/dummy/config/initializers/shopify_app.rb +7 -0
  255. data/test/dummy/config/initializers/shopify_session_repository.rb +7 -0
  256. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  257. data/test/dummy/config/locales/en.yml +23 -0
  258. data/test/dummy/config/routes.rb +11 -0
  259. data/test/dummy/config/secrets.yml +22 -0
  260. data/test/dummy/config.ru +4 -0
  261. data/test/dummy/db/migrate/20160307182229_create_products.rb +11 -0
  262. data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +19 -0
  263. data/test/dummy/db/migrate/20161105054746_create_carts.rb +13 -0
  264. data/test/dummy/db/schema.rb +152 -0
  265. data/test/dummy/public/404.html +67 -0
  266. data/test/dummy/public/422.html +67 -0
  267. data/test/dummy/public/500.html +66 -0
  268. data/test/dummy/public/favicon.ico +0 -0
  269. data/test/fixtures/api/widget_store/assets/create_script_tag_js_request.json +6 -0
  270. data/test/fixtures/api/widget_store/assets/create_script_tag_js_response.json +12 -0
  271. data/test/fixtures/api/widget_store/assets/create_script_tag_request.json +6 -0
  272. data/test/fixtures/api/widget_store/assets/create_script_tag_response.json +10 -0
  273. data/test/fixtures/api/widget_store/assets/create_test_js_request.json +6 -0
  274. data/test/fixtures/api/widget_store/assets/create_test_js_response.json +12 -0
  275. data/test/fixtures/api/widget_store/assets/create_widget_js_request.json +6 -0
  276. data/test/fixtures/api/widget_store/assets/create_widget_js_response.json +12 -0
  277. data/test/fixtures/api/widget_store/assets/create_widget_liquid_request.json +6 -0
  278. data/test/fixtures/api/widget_store/assets/create_widget_liquid_response.json +12 -0
  279. data/test/fixtures/api/widget_store/assets/create_widget_scss_request.json +6 -0
  280. data/test/fixtures/api/widget_store/assets/create_widget_scss_response.json +12 -0
  281. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_request.json +1 -0
  282. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_response.json +1 -0
  283. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_request.json +1 -0
  284. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_response.json +12 -0
  285. data/test/fixtures/api/widget_store/assets/update_script_tag_request.json +10 -0
  286. data/test/fixtures/api/widget_store/assets/update_script_tag_response.json +10 -0
  287. data/test/fixtures/api/widget_store/carrier_services.json +1 -0
  288. data/test/fixtures/api/widget_store/carrier_services_create.json +8 -0
  289. data/test/fixtures/api/widget_store/charges/activate_application_charge_request.json +16 -0
  290. data/test/fixtures/api/widget_store/charges/activate_application_charge_response.json +1 -0
  291. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_request.json +20 -0
  292. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_response.json +1 -0
  293. data/test/fixtures/api/widget_store/charges/create_application_charge_request.json +9 -0
  294. data/test/fixtures/api/widget_store/charges/create_application_charge_response.json +16 -0
  295. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +9 -0
  296. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_response.json +20 -0
  297. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +9 -0
  298. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json +20 -0
  299. data/test/fixtures/api/widget_store/charges/get_accepted_application_charge_response.json +16 -0
  300. data/test/fixtures/api/widget_store/charges/get_accepted_recurring_application_charge_response.json +20 -0
  301. data/test/fixtures/api/widget_store/charges/get_declined_application_charge_response.json +16 -0
  302. data/test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json +20 -0
  303. data/test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json +16 -0
  304. data/test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json +20 -0
  305. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json +31 -0
  306. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json +1 -0
  307. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json +19 -0
  308. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json +1 -0
  309. data/test/fixtures/api/widget_store/shop.json +46 -0
  310. data/test/fixtures/api/widget_store/webhooks.json +1 -0
  311. data/test/fixtures/assets/test.js +1 -0
  312. data/test/fixtures/assets/test.min.js +1 -0
  313. data/test/fixtures/carts.yml +5 -0
  314. data/test/fixtures/disco_app/application_charges.yml +11 -0
  315. data/test/fixtures/disco_app/plan_codes.yml +13 -0
  316. data/test/fixtures/disco_app/plans.yml +37 -0
  317. data/test/fixtures/disco_app/recurring_application_charges.yml +11 -0
  318. data/test/fixtures/disco_app/shops.yml +10 -0
  319. data/test/fixtures/disco_app/subscriptions.yml +22 -0
  320. data/test/fixtures/js_configurations.yml +3 -0
  321. data/test/fixtures/liquid/model.liquid +8 -0
  322. data/test/fixtures/products.yml +4 -0
  323. data/test/fixtures/webhooks/app_uninstalled.json +46 -0
  324. data/test/fixtures/webhooks/cart_updated.json +28 -0
  325. data/test/fixtures/webhooks/product_created.json +167 -0
  326. data/test/fixtures/webhooks/product_deleted.json +3 -0
  327. data/test/fixtures/webhooks/product_updated.json +167 -0
  328. data/test/fixtures/widget_configurations.yml +4 -0
  329. data/test/integration/synchronises_test.rb +62 -0
  330. data/test/jobs/disco_app/app_installed_job_test.rb +57 -0
  331. data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
  332. data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +25 -0
  333. data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +30 -0
  334. data/test/models/disco_app/can_be_liquified_test.rb +55 -0
  335. data/test/models/disco_app/has_metafields_test.rb +40 -0
  336. data/test/models/disco_app/plan_test.rb +5 -0
  337. data/test/models/disco_app/renders_assets_test.rb +109 -0
  338. data/test/models/disco_app/session_test.rb +31 -0
  339. data/test/models/disco_app/shop_test.rb +43 -0
  340. data/test/models/disco_app/subscription_test.rb +19 -0
  341. data/test/services/disco_app/charges_service_test.rb +112 -0
  342. data/test/services/disco_app/subscription_service_test.rb +60 -0
  343. data/test/support/test_file_fixtures.rb +29 -0
  344. data/test/support/test_shopify_api.rb +16 -0
  345. data/test/test_helper.rb +57 -0
  346. metadata +970 -0
@@ -0,0 +1,110 @@
1
+ ##
2
+ # While this migration file is called "create shops if not existent", it's actually a reset of all `disco_app`
3
+ # migrations up until 23 January 2017. It's kept its name like this to ensure compatibility across upgraded apps.
4
+ class CreateShopsIfNotExistent < ActiveRecord::Migration
5
+
6
+ def change
7
+ return if table_exists? :disco_app_shops
8
+
9
+ create_table "disco_app_app_settings", force: :cascade do |t|
10
+ t.datetime "created_at", null: false
11
+ t.datetime "updated_at", null: false
12
+ end
13
+
14
+ create_table "disco_app_application_charges", force: :cascade do |t|
15
+ t.integer "shop_id", limit: 8
16
+ t.integer "subscription_id", limit: 8
17
+ t.integer "status", default: 0
18
+ t.datetime "created_at", null: false
19
+ t.datetime "updated_at", null: false
20
+ t.integer "shopify_id", limit: 8
21
+ t.string "confirmation_url"
22
+ end
23
+
24
+ create_table "disco_app_plan_codes", force: :cascade do |t|
25
+ t.integer "plan_id", limit: 8
26
+ t.string "code"
27
+ t.integer "trial_period_days"
28
+ t.integer "amount"
29
+ t.datetime "created_at", null: false
30
+ t.datetime "updated_at", null: false
31
+ t.integer "status", default: 0
32
+ end
33
+
34
+ create_table "disco_app_plans", force: :cascade do |t|
35
+ t.integer "status", default: 0
36
+ t.string "name"
37
+ t.integer "plan_type", default: 0
38
+ t.integer "trial_period_days"
39
+ t.datetime "created_at", null: false
40
+ t.datetime "updated_at", null: false
41
+ t.integer "amount", default: 0
42
+ t.string "currency", default: "USD"
43
+ t.integer "interval", default: 0
44
+ t.integer "interval_count", default: 1
45
+ end
46
+
47
+ create_table "disco_app_recurring_application_charges", force: :cascade do |t|
48
+ t.integer "shop_id", limit: 8
49
+ t.integer "subscription_id", limit: 8
50
+ t.integer "status", default: 0
51
+ t.datetime "created_at", null: false
52
+ t.datetime "updated_at", null: false
53
+ t.integer "shopify_id", limit: 8
54
+ t.string "confirmation_url"
55
+ end
56
+
57
+ create_table "disco_app_sessions", force: :cascade do |t|
58
+ t.string "session_id", null: false
59
+ t.text "data"
60
+ t.datetime "created_at", null: false
61
+ t.datetime "updated_at", null: false
62
+ t.integer "shop_id"
63
+ end
64
+
65
+ add_index "disco_app_sessions", ["session_id"], name: "index_disco_app_sessions_on_session_id", unique: true, using: :btree
66
+ add_index "disco_app_sessions", ["updated_at"], name: "index_disco_app_sessions_on_updated_at", using: :btree
67
+
68
+ create_table "disco_app_shops", force: :cascade do |t|
69
+ t.string "shopify_domain", null: false
70
+ t.string "shopify_token", null: false
71
+ t.datetime "created_at", null: false
72
+ t.datetime "updated_at", null: false
73
+ t.integer "status", default: 0
74
+ t.string "domain"
75
+ t.string "plan_name"
76
+ t.string "name"
77
+ t.jsonb "data", default: {}
78
+ end
79
+
80
+ add_index "disco_app_shops", ["shopify_domain"], name: "index_disco_app_shops_on_shopify_domain", unique: true, using: :btree
81
+
82
+ create_table "disco_app_subscriptions", force: :cascade do |t|
83
+ t.integer "shop_id"
84
+ t.integer "plan_id"
85
+ t.integer "status"
86
+ t.integer "subscription_type"
87
+ t.datetime "created_at", null: false
88
+ t.datetime "updated_at", null: false
89
+ t.datetime "trial_start_at"
90
+ t.datetime "trial_end_at"
91
+ t.datetime "cancelled_at"
92
+ t.integer "amount", default: 0
93
+ t.integer "plan_code_id", limit: 8
94
+ t.string "source"
95
+ t.integer "trial_period_days"
96
+ end
97
+
98
+ add_index "disco_app_subscriptions", ["plan_id"], name: "index_disco_app_subscriptions_on_plan_id", using: :btree
99
+ add_index "disco_app_subscriptions", ["shop_id"], name: "index_disco_app_subscriptions_on_shop_id", using: :btree
100
+
101
+ add_foreign_key "disco_app_application_charges", "disco_app_shops", column: "shop_id"
102
+ add_foreign_key "disco_app_application_charges", "disco_app_subscriptions", column: "subscription_id"
103
+ add_foreign_key "disco_app_plan_codes", "disco_app_plans", column: "plan_id"
104
+ add_foreign_key "disco_app_recurring_application_charges", "disco_app_shops", column: "shop_id"
105
+ add_foreign_key "disco_app_recurring_application_charges", "disco_app_subscriptions", column: "subscription_id"
106
+ add_foreign_key "disco_app_sessions", "disco_app_shops", column: "shop_id", on_delete: :cascade
107
+ add_foreign_key "disco_app_subscriptions", "disco_app_plan_codes", column: "plan_code_id"
108
+ end
109
+
110
+ 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.12.1'
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,236 @@
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_gemfile
26
+ # Remove sqlite.
27
+ gsub_file 'Gemfile', /^# Use sqlite3 as the database for Active Record\ngem 'sqlite3'/m, ''
28
+
29
+ # Add gem requirements.
30
+ gem 'shopify_app'
31
+ gem 'pg'
32
+ gem 'sidekiq'
33
+ gem 'rollbar'
34
+ gem 'newrelic_rpm'
35
+ gem 'react-rails'
36
+ gem 'classnames-rails'
37
+ gem 'premailer-rails'
38
+ gem 'rails-bigint-pk'
39
+ gem 'acts_as_singleton'
40
+ gem 'active_link_to'
41
+ gem 'nokogiri'
42
+ gem 'oj'
43
+ gem 'render_anywhere'
44
+
45
+ # Specify the threadsafe version of ActiveResource.
46
+ gem 'activeresource', git: 'https://github.com/shopify/activeresource.git', tag: '4.2-threadsafe'
47
+
48
+ # Indicate which gems should only be used in production.
49
+ gem_group :production do
50
+ gem 'rails_12factor'
51
+ gem 'mailgun_rails'
52
+ end
53
+
54
+ # Indicate which gems should only be used in development and test.
55
+ gem_group :development, :test do
56
+ gem 'dotenv-rails'
57
+ gem 'minitest-reporters'
58
+ gem 'webmock'
59
+ end
60
+ end
61
+
62
+ # copy template for pg configuration
63
+ def update_database_config
64
+ template 'config/database.yml.tt'
65
+ end
66
+
67
+ # Run bundle install to add our new gems before running tasks.
68
+ def bundle_install
69
+ Bundler.with_clean_env do
70
+ run 'bundle install'
71
+ end
72
+ end
73
+
74
+ # Make any required adjustments to the application configuration.
75
+ def configure_application
76
+ # The force_ssl flag is commented by default for production.
77
+ # Uncomment to ensure config.force_ssl = true in production.
78
+ uncomment_lines 'config/environments/production.rb', /force_ssl/
79
+
80
+ # Set time zone to UTC
81
+ application "config.time_zone = 'UTC'"
82
+ application "# Ensure UTC is the default timezone"
83
+
84
+ # Set server side rendereing for components.js
85
+ application "config.react.server_renderer_options = {\nfiles: ['components.js'], # files to load for prerendering\n}"
86
+ application "# Enable server side react rendering"
87
+
88
+ # Set defaults for various charge attributes.
89
+ application "config.x.shopify_charges_default_trial_days = 14\n"
90
+ application "config.x.shopify_charges_default_price = 10.00"
91
+ application "config.x.shopify_charges_default_type = :recurring"
92
+ application "# Set defaults for charges created by the application"
93
+
94
+ # Set the "real charges" config variable to false explicitly by default.
95
+ # Only in production do we read from the environment variable and
96
+ # potentially have it become true.
97
+ application "config.x.shopify_charges_real = false\n"
98
+ application "# Explicitly prevent real charges being created by default"
99
+ application "config.x.shopify_charges_real = ENV['SHOPIFY_CHARGES_REAL'] == 'true'\n", env: :production
100
+ application "# Allow real charges in production with an ENV variable", env: :production
101
+
102
+ # Configure session storage.
103
+ application "ActiveRecord::SessionStore::Session.table_name = 'disco_app_sessions'"
104
+ application "ActionDispatch::Session::ActiveRecordStore.session_class = DiscoApp::Session"
105
+ application "# Configure custom session storage"
106
+
107
+ # Set Sidekiq as the queue adapter in production.
108
+ application "config.active_job.queue_adapter = :sidekiq\n", env: :production
109
+ application "# Use Sidekiq as the active job backend", env: :production
110
+
111
+ # Ensure the application configuration uses the DEFAULT_HOST environment
112
+ # variable to set up support for reverse routing absolute URLS (needed when
113
+ # generating Webhook URLs for example).
114
+ application "routes.default_url_options[:host] = ENV['DEFAULT_HOST']\n"
115
+ application "# Set the default host for absolute URL routing purposes"
116
+
117
+ # Configure React in development and production.
118
+ application "config.react.variant = :development", env: :development
119
+ application "# Use development variant of React in development.", env: :development
120
+ application "config.react.variant = :production", env: :production
121
+ application "# Use production variant of React in production.", env: :production
122
+
123
+ # Copy over the default puma configuration.
124
+ copy_file 'config/puma.rb', 'config/puma.rb'
125
+
126
+ # Mail configuration
127
+ configuration = <<-CONFIG.strip_heredoc
128
+
129
+ # Configure ActionMailer to use MailGun
130
+ if ENV['MAILGUN_API_KEY']
131
+ config.action_mailer.delivery_method = :mailgun
132
+ config.action_mailer.mailgun_settings = {
133
+ api_key: ENV['MAILGUN_API_KEY'],
134
+ domain: ENV['MAILGUN_API_DOMAIN']
135
+ }
136
+ end
137
+ CONFIG
138
+ application configuration, env: :production
139
+
140
+ # Monitoring configuration
141
+ copy_file 'initializers/rollbar.rb', 'config/initializers/rollbar.rb'
142
+ copy_file 'config/newrelic.yml', 'config/newrelic.yml'
143
+ end
144
+
145
+
146
+ # Add entries to .env and .env.local
147
+ def add_env_variables
148
+ configuration = <<-CONFIG.strip_heredoc
149
+
150
+ MAILGUN_API_KEY=
151
+ MAILGUN_API_DOMAIN=
152
+ CONFIG
153
+ append_to_file '.env', configuration
154
+ append_to_file '.env.local', configuration
155
+ end
156
+
157
+ # Set up routes.
158
+ def setup_routes
159
+ route "mount DiscoApp::Engine, at: '/'"
160
+ end
161
+
162
+ # Run generators.
163
+ def run_generators
164
+ generate 'shopify_app:install'
165
+ generate 'shopify_app:home_controller'
166
+ generate 'bigint_pk:install'
167
+ generate 'react:install'
168
+ end
169
+
170
+ # Copy template files to the appropriate location. In some cases, we'll be
171
+ # overwriting or removing existing files or those created by ShopifyApp.
172
+ def copy_and_remove_files
173
+ # Copy initializers
174
+ copy_file 'initializers/shopify_app.rb', 'config/initializers/shopify_app.rb'
175
+ copy_file 'initializers/disco_app.rb', 'config/initializers/disco_app.rb'
176
+ copy_file 'initializers/shopify_session_repository.rb', 'config/initializers/shopify_session_repository.rb'
177
+ copy_file 'initializers/session_store.rb', 'config/initializers/session_store.rb'
178
+
179
+ # Copy default home controller and view
180
+ copy_file 'controllers/home_controller.rb', 'app/controllers/home_controller.rb'
181
+ copy_file 'views/home/index.html.erb', 'app/views/home/index.html.erb'
182
+
183
+ # Copy assets
184
+ copy_file 'assets/javascripts/application.js', 'app/assets/javascripts/application.js'
185
+ copy_file 'assets/javascripts/components.js', 'app/assets/javascripts/components.js'
186
+ copy_file 'assets/stylesheets/application.scss', 'app/assets/stylesheets/application.scss'
187
+
188
+ # Remove application.css
189
+ remove_file 'app/assets/stylesheets/application.css'
190
+
191
+ # Remove the layout files created by ShopifyApp
192
+ remove_file 'app/views/layouts/application.html.erb'
193
+ remove_file 'app/views/layouts/embedded_app.html.erb'
194
+ end
195
+
196
+ # Add the Disco App test helper to test/test_helper.rb
197
+ def add_test_helper
198
+ inject_into_file 'test/test_helper.rb', "require 'disco_app/test_help'\n", { after: "require 'rails/test_help'\n" }
199
+ end
200
+
201
+ # Copy engine migrations over.
202
+ def install_migrations
203
+ rake 'disco_app:install:migrations'
204
+ end
205
+
206
+ # Create PG database
207
+ def create_database
208
+ rake 'db:create'
209
+ end
210
+
211
+ # Run migrations.
212
+ def migrate
213
+ rake 'db:migrate'
214
+ end
215
+
216
+ # Lock down the application to a specific Ruby version:
217
+ #
218
+ # - Via .ruby-version file for rbenv in development;
219
+ # - Via a Gemfile line in production.
220
+ #
221
+ # This should be the last operation, to allow all other operations to run in the initial Ruby version.
222
+ def set_ruby_version
223
+ copy_file 'root/.ruby-version', '.ruby-version'
224
+ prepend_to_file 'Gemfile', "ruby '2.3.3'\n"
225
+ end
226
+
227
+ private
228
+
229
+ # This method of finding the component.js manifest taken from the
230
+ # install generator in react-rails.
231
+ # See https://github.com/reactjs/react-rails/blob/3f0af13fa755d6e95969c17728d0354c234f3a37/lib/generators/react/install_generator.rb#L53-L55
232
+ def components
233
+ Pathname.new(destination_root).join('app/assets/javascripts', 'components.js')
234
+ end
235
+
236
+ end
@@ -0,0 +1,17 @@
1
+ // This is a manifest file that'll be compiled into application.js, which will include all the files
2
+ // listed below.
3
+ //
4
+ // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
5
+ // or any plugin's vendor/assets/javascripts directory can be referenced here using a relative path.
6
+ //
7
+ // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
8
+ // compiled file.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require jquery
14
+ //= require jquery_ujs
15
+ //= require turbolinks
16
+ //= require disco_app/disco_app
17
+ //= require_tree .
@@ -0,0 +1,3 @@
1
+ //= require react-server
2
+ //= require disco_app/components
3
+ //= require_tree ./components
@@ -0,0 +1,5 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will include all the files
3
+ * listed below.
4
+ */
5
+ @import "disco_app/disco_app";
@@ -0,0 +1,20 @@
1
+ default: &default
2
+ adapter: postgresql
3
+ encoding: unicode
4
+ pool: 5
5
+ timeout: 5000
6
+
7
+ development:
8
+ <<: *default
9
+ host: localhost
10
+ port: 5432
11
+ database: <%= Rails.application.class.parent_name.downcase %>
12
+
13
+ test:
14
+ <<: *default
15
+ host: localhost
16
+ port: 5432
17
+ database: <%= Rails.application.class.parent_name.downcase %>_test
18
+
19
+ production:
20
+ <<: *default
@@ -0,0 +1,26 @@
1
+ # This file configures the New Relic Agent.
2
+ #
3
+ # For full documentation of agent configuration options, please refer to
4
+ # https://docs.newrelic.com/docs/agents/ruby-agent/installation-configuration/ruby-agent-configuration
5
+
6
+ common: &default_settings
7
+ license_key: <%= ENV['NEW_RELIC_LICENSE_KEY'] %>
8
+ app_name: <%= ENV['SHOPIFY_APP_NAME'] || 'Unknown App' %>
9
+
10
+ # To disable the agent regardless of other settings, uncomment the following:
11
+ # agent_enabled: false
12
+
13
+ # Logging level for log/newrelic_agent.log
14
+ log_level: info
15
+
16
+ development:
17
+ <<: *default_settings
18
+ app_name: <%= ENV['SHOPIFY_APP_NAME'] || 'Unknown App' %> (Development)
19
+ developer_mode: true
20
+
21
+ test:
22
+ <<: *default_settings
23
+ monitor_mode: false
24
+
25
+ production:
26
+ <<: *default_settings
@@ -0,0 +1,15 @@
1
+ workers Integer(ENV['WEB_CONCURRENCY'] || 2)
2
+ threads_count = Integer(ENV['MAX_THREADS'] || 5)
3
+ threads threads_count, threads_count
4
+
5
+ preload_app!
6
+
7
+ rackup DefaultRackup
8
+ port ENV['PORT'] || 3000
9
+ environment ENV['RACK_ENV'] || 'development'
10
+
11
+ on_worker_boot do
12
+ # Worker specific setup for Rails 4.1+
13
+ # See: https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server#on-worker-boot
14
+ ActiveRecord::Base.establish_connection
15
+ end
@@ -0,0 +1,7 @@
1
+ class HomeController < ApplicationController
2
+ include DiscoApp::Concerns::AuthenticatedController
3
+
4
+ def index
5
+ end
6
+
7
+ end
@@ -0,0 +1,28 @@
1
+ DiscoApp::Engine.routes.default_url_options[:host] = ENV['DEFAULT_HOST']
2
+
3
+ DiscoApp.configure do |config|
4
+ # Required configuration.
5
+ config.app_name = ENV['SHOPIFY_APP_NAME']
6
+
7
+ # Set a list of webhook topics to listen for.
8
+ # See https://help.shopify.com/api/reference/webhook.
9
+ config.webhook_topics = []
10
+
11
+ # Set the below if using an application proxy.
12
+ config.app_proxy_prefix = ENV['SHOPIFY_APP_PROXY_PREFIX']
13
+
14
+ # Set the below if providing a carrier service endpoint.
15
+ # Note that if using a URL helper to set the endpoint, we use a lambda
16
+ # function to ensure that the URL helper is only evaluated when we need it.
17
+ # config.carrier_service_callback_url = -> { Rails.application.routes.url_helpers.carrier_service_callback_url }
18
+
19
+ # Set the below to create real Shopify charges.
20
+ config.real_charges = ENV['SHOPIFY_REAL_CHARGES'] === 'true'
21
+
22
+ # Optional configuration. These flags are only respected in the development
23
+ # environment and will have no effect in production.
24
+ config.skip_proxy_verification = ENV['SKIP_PROXY_VERIFICATION'] == 'true'
25
+ config.skip_webhook_verification = ENV['SKIP_WEBHOOK_VERIFICATION'] == 'true'
26
+ config.skip_carrier_request_verification = ENV['SKIP_CARRIER_REQUEST_VERIFICATION'] == 'true'
27
+ config.skip_oauth = ENV['SKIP_OAUTH'] == 'true'
28
+ end
@@ -0,0 +1,19 @@
1
+ Rollbar.configure do |config|
2
+ # Fetch the access token from the environment.
3
+ config.access_token = ENV['ROLLBAR_ACCESS_TOKEN']
4
+
5
+ # Only use Rollbar in production when there's a token configured.
6
+ unless config.access_token and Rails.env.production?
7
+ config.enabled = false
8
+ end
9
+
10
+ # Enable delayed reporting (using Sidekiq)
11
+ config.use_sidekiq
12
+
13
+ # Add custom handlers.
14
+ config.before_process << proc do |options|
15
+ if options[:exception].is_a?(ActiveResource::ClientError) and options[:exception].message.include?('Too Many Requests')
16
+ raise Rollbar::Ignore
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,2 @@
1
+ # Use an ActiveRecord-based session store.
2
+ Rails.application.config.session_store :active_record_store, :key => '_disco_app_session'
@@ -0,0 +1,7 @@
1
+ ShopifyApp.configure do |config|
2
+ config.api_key = ENV['SHOPIFY_APP_API_KEY']
3
+ config.secret = ENV['SHOPIFY_APP_SECRET']
4
+ config.redirect_uri = ENV['SHOPIFY_APP_REDIRECT_URI']
5
+ config.scope = ENV['SHOPIFY_APP_SCOPE']
6
+ config.embedded_app = true
7
+ end
@@ -0,0 +1,7 @@
1
+ if Rails.configuration.cache_classes
2
+ ShopifyApp::SessionRepository.storage = DiscoApp::SessionStorage
3
+ else
4
+ ActionDispatch::Reloader.to_prepare do
5
+ ShopifyApp::SessionRepository.storage = DiscoApp::SessionStorage
6
+ end
7
+ end