disco_app 0.11.0

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 (367) 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/typography/_typography.scss +23 -0
  13. data/app/assets/components/shopify/typography/ui-heading.es6.jsx +16 -0
  14. data/app/assets/components/shopify/ui-layout/_ui-layout.scss +157 -0
  15. data/app/assets/components/shopify/ui-layout/ui-annotated-section.es6.jsx +29 -0
  16. data/app/assets/components/shopify/ui-layout/ui-empty-state.es6.jsx +35 -0
  17. data/app/assets/components/shopify/ui-layout/ui-footer-help.es6.jsx +13 -0
  18. data/app/assets/components/shopify/ui-layout/ui-layout-item.es6.jsx +11 -0
  19. data/app/assets/components/shopify/ui-layout/ui-layout-section.es6.jsx +19 -0
  20. data/app/assets/components/shopify/ui-layout/ui-layout-sections.es6.jsx +11 -0
  21. data/app/assets/components/shopify/ui-layout/ui-layout.es6.jsx +11 -0
  22. data/app/assets/components/shopify/ui-layout/ui-page-actions.es6.jsx +13 -0
  23. data/app/assets/components/shopify/ui-layout/ui-page-actions__buttons.es6.jsx +27 -0
  24. data/app/assets/components/shopify/ui-stack/_ui-stack.scss +39 -0
  25. data/app/assets/components/shopify/ui-stack/ui-stack-item.es6.jsx +21 -0
  26. data/app/assets/components/shopify/ui-stack/ui-stack.es6.jsx +24 -0
  27. data/app/assets/images/disco_app/icon.svg +1 -0
  28. data/app/assets/images/disco_app/icons.svg +0 -0
  29. data/app/assets/javascripts/disco_app/components/custom/filterable_shop_list.js.jsx +61 -0
  30. data/app/assets/javascripts/disco_app/components/custom/inline-radio-options.es6.jsx +59 -0
  31. data/app/assets/javascripts/disco_app/components/custom/rules-editor.es6.jsx +432 -0
  32. data/app/assets/javascripts/disco_app/components/custom/shop_filter_query.js.jsx +13 -0
  33. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tab.js.jsx +34 -0
  34. data/app/assets/javascripts/disco_app/components/custom/shop_filter_tabs.js.jsx +21 -0
  35. data/app/assets/javascripts/disco_app/components/custom/shop_list.js.jsx +142 -0
  36. data/app/assets/javascripts/disco_app/components/custom/shop_row.js.jsx +43 -0
  37. data/app/assets/javascripts/disco_app/components/custom/shopify_admin_link.js.jsx +29 -0
  38. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_form.es6.jsx +72 -0
  39. data/app/assets/javascripts/disco_app/components/ui-kit/forms/base_input.es6.jsx +20 -0
  40. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-checkbox.es6.jsx +30 -0
  41. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-radio.es6.jsx +30 -0
  42. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-select.es6.jsx +45 -0
  43. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-text.es6.jsx +69 -0
  44. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-textarea.es6.jsx +48 -0
  45. data/app/assets/javascripts/disco_app/components/ui-kit/forms/input-time.es6.jsx +7 -0
  46. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__element.es6.jsx +17 -0
  47. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__group.es6.jsx +11 -0
  48. data/app/assets/javascripts/disco_app/components/ui-kit/forms/ui-form__section.es6.jsx +11 -0
  49. data/app/assets/javascripts/disco_app/components/ui-kit/icons/icon-chevron.es6.jsx +33 -0
  50. data/app/assets/javascripts/disco_app/components/ui-kit/icons/next-icon.es6.jsx +18 -0
  51. data/app/assets/javascripts/disco_app/components/ui-kit/input_select.es6.jsx +21 -0
  52. data/app/assets/javascripts/disco_app/components/ui-kit/tables/table.es6.jsx +27 -0
  53. data/app/assets/javascripts/disco_app/components.js +3 -0
  54. data/app/assets/javascripts/disco_app/disco_app.js +9 -0
  55. data/app/assets/javascripts/disco_app/frame.js +152 -0
  56. data/app/assets/javascripts/disco_app/shopify-turbolinks.js +7 -0
  57. data/app/assets/javascripts/disco_app/ui-kit.js +1 -0
  58. data/app/assets/stylesheets/disco_app/admin/_header.scss +75 -0
  59. data/app/assets/stylesheets/disco_app/admin/_layout.scss +32 -0
  60. data/app/assets/stylesheets/disco_app/admin/_nav.scss +184 -0
  61. data/app/assets/stylesheets/disco_app/admin.scss +11 -0
  62. data/app/assets/stylesheets/disco_app/disco_app.scss +24 -0
  63. data/app/assets/stylesheets/disco_app/frame/_buttons.scss +54 -0
  64. data/app/assets/stylesheets/disco_app/frame/_forms.scss +26 -0
  65. data/app/assets/stylesheets/disco_app/frame/_layout.scss +77 -0
  66. data/app/assets/stylesheets/disco_app/frame/_type.scss +25 -0
  67. data/app/assets/stylesheets/disco_app/frame.scss +10 -0
  68. data/app/assets/stylesheets/disco_app/mixins/_flexbox.scss +400 -0
  69. data/app/assets/stylesheets/disco_app/ui-kit/_ui-forms.scss +69 -0
  70. data/app/assets/stylesheets/disco_app/ui-kit/_ui-icons.scss +28 -0
  71. data/app/assets/stylesheets/disco_app/ui-kit/_ui-kit.scss +5116 -0
  72. data/app/assets/stylesheets/disco_app/ui-kit/_ui-layout.scss +15 -0
  73. data/app/assets/stylesheets/disco_app/ui-kit/_ui-tabs.scss +75 -0
  74. data/app/assets/stylesheets/disco_app/ui-kit/_ui-type.scss +13 -0
  75. data/app/controllers/disco_app/admin/app_settings_controller.rb +3 -0
  76. data/app/controllers/disco_app/admin/application_controller.rb +3 -0
  77. data/app/controllers/disco_app/admin/concerns/app_settings_controller.rb +24 -0
  78. data/app/controllers/disco_app/admin/concerns/authenticated_controller.rb +20 -0
  79. data/app/controllers/disco_app/admin/concerns/plans_controller.rb +54 -0
  80. data/app/controllers/disco_app/admin/concerns/shops_controller.rb +7 -0
  81. data/app/controllers/disco_app/admin/concerns/subscriptions_controller.rb +29 -0
  82. data/app/controllers/disco_app/admin/plans_controller.rb +3 -0
  83. data/app/controllers/disco_app/admin/resources/shops_controller.rb +3 -0
  84. data/app/controllers/disco_app/admin/shops_controller.rb +3 -0
  85. data/app/controllers/disco_app/admin/subscriptions_controller.rb +3 -0
  86. data/app/controllers/disco_app/charges_controller.rb +47 -0
  87. data/app/controllers/disco_app/concerns/app_proxy_controller.rb +40 -0
  88. data/app/controllers/disco_app/concerns/authenticated_controller.rb +56 -0
  89. data/app/controllers/disco_app/concerns/carrier_request_controller.rb +35 -0
  90. data/app/controllers/disco_app/frame_controller.rb +9 -0
  91. data/app/controllers/disco_app/install_controller.rb +27 -0
  92. data/app/controllers/disco_app/subscriptions_controller.rb +32 -0
  93. data/app/controllers/disco_app/webhooks_controller.rb +46 -0
  94. data/app/controllers/sessions_controller.rb +28 -0
  95. data/app/helpers/disco_app/application_helper.rb +68 -0
  96. data/app/jobs/disco_app/app_installed_job.rb +3 -0
  97. data/app/jobs/disco_app/app_uninstalled_job.rb +3 -0
  98. data/app/jobs/disco_app/concerns/app_installed_job.rb +39 -0
  99. data/app/jobs/disco_app/concerns/app_uninstalled_job.rb +20 -0
  100. data/app/jobs/disco_app/concerns/render_asset_group_job.rb +8 -0
  101. data/app/jobs/disco_app/concerns/shop_update_job.rb +13 -0
  102. data/app/jobs/disco_app/concerns/subscription_changed_job.rb +7 -0
  103. data/app/jobs/disco_app/concerns/synchronise_carrier_service_job.rb +55 -0
  104. data/app/jobs/disco_app/concerns/synchronise_resources_job.rb +12 -0
  105. data/app/jobs/disco_app/concerns/synchronise_webhooks_job.rb +52 -0
  106. data/app/jobs/disco_app/render_asset_group_job.rb +3 -0
  107. data/app/jobs/disco_app/shop_job.rb +27 -0
  108. data/app/jobs/disco_app/shop_update_job.rb +3 -0
  109. data/app/jobs/disco_app/subscription_changed_job.rb +3 -0
  110. data/app/jobs/disco_app/synchronise_carrier_service_job.rb +3 -0
  111. data/app/jobs/disco_app/synchronise_resources_job.rb +3 -0
  112. data/app/jobs/disco_app/synchronise_webhooks_job.rb +3 -0
  113. data/app/models/disco_app/app_settings.rb +3 -0
  114. data/app/models/disco_app/application_charge.rb +18 -0
  115. data/app/models/disco_app/concerns/app_settings.rb +7 -0
  116. data/app/models/disco_app/concerns/can_be_liquified.rb +45 -0
  117. data/app/models/disco_app/concerns/has_metafields.rb +48 -0
  118. data/app/models/disco_app/concerns/plan.rb +26 -0
  119. data/app/models/disco_app/concerns/plan_code.rb +15 -0
  120. data/app/models/disco_app/concerns/renders_assets.rb +166 -0
  121. data/app/models/disco_app/concerns/shop.rb +84 -0
  122. data/app/models/disco_app/concerns/subscription.rb +60 -0
  123. data/app/models/disco_app/concerns/synchronises.rb +58 -0
  124. data/app/models/disco_app/concerns/taggable.rb +16 -0
  125. data/app/models/disco_app/plan.rb +3 -0
  126. data/app/models/disco_app/plan_code.rb +3 -0
  127. data/app/models/disco_app/recurring_application_charge.rb +18 -0
  128. data/app/models/disco_app/session_storage.rb +18 -0
  129. data/app/models/disco_app/shop.rb +3 -0
  130. data/app/models/disco_app/subscription.rb +3 -0
  131. data/app/resources/disco_app/admin/resources/concerns/shop_resource.rb +100 -0
  132. data/app/resources/disco_app/admin/resources/shop_resource.rb +4 -0
  133. data/app/services/disco_app/carrier_request_service.rb +15 -0
  134. data/app/services/disco_app/charges_service.rb +81 -0
  135. data/app/services/disco_app/proxy_service.rb +17 -0
  136. data/app/services/disco_app/subscription_service.rb +46 -0
  137. data/app/services/disco_app/webhook_service.rb +30 -0
  138. data/app/views/disco_app/admin/app_settings/edit.html.erb +5 -0
  139. data/app/views/disco_app/admin/plans/_form.html.erb +72 -0
  140. data/app/views/disco_app/admin/plans/_plan_code_fields.html.erb +15 -0
  141. data/app/views/disco_app/admin/plans/edit.html.erb +7 -0
  142. data/app/views/disco_app/admin/plans/index.html.erb +43 -0
  143. data/app/views/disco_app/admin/plans/new.html.erb +7 -0
  144. data/app/views/disco_app/admin/shops/index.html.erb +13 -0
  145. data/app/views/disco_app/admin/subscriptions/edit.html.erb +33 -0
  146. data/app/views/disco_app/charges/activate.html.erb +1 -0
  147. data/app/views/disco_app/charges/create.html.erb +1 -0
  148. data/app/views/disco_app/charges/new.html.erb +23 -0
  149. data/app/views/disco_app/frame/frame.html.erb +36 -0
  150. data/app/views/disco_app/install/installing.html.erb +22 -0
  151. data/app/views/disco_app/install/uninstalling.html.erb +1 -0
  152. data/app/views/disco_app/proxy_errors/404.html.erb +1 -0
  153. data/app/views/disco_app/shared/_card.html.erb +14 -0
  154. data/app/views/disco_app/shared/_icons.html.erb +1 -0
  155. data/app/views/disco_app/shared/_section.html.erb +17 -0
  156. data/app/views/disco_app/subscriptions/new.html.erb +25 -0
  157. data/app/views/layouts/admin/_nav_items.erb +20 -0
  158. data/app/views/layouts/admin.html.erb +67 -0
  159. data/app/views/layouts/application.html.erb +18 -0
  160. data/app/views/layouts/embedded_app.html.erb +50 -0
  161. data/app/views/layouts/embedded_app_modal.html.erb +28 -0
  162. data/app/views/sessions/new.html.erb +28 -0
  163. data/config/routes.rb +63 -0
  164. data/db/migrate/20150525000000_create_shops_if_not_existent.rb +15 -0
  165. data/db/migrate/20150525162112_add_status_to_shops.rb +5 -0
  166. data/db/migrate/20150525171422_add_meta_to_shops.rb +11 -0
  167. data/db/migrate/20150629210346_add_charge_status_to_shop.rb +5 -0
  168. data/db/migrate/20150814214025_add_more_meta_to_shops.rb +15 -0
  169. data/db/migrate/20151017231302_create_disco_app_plans.rb +13 -0
  170. data/db/migrate/20151017232027_create_disco_app_subscriptions.rb +15 -0
  171. data/db/migrate/20151017234409_move_shop_to_disco_app_engine.rb +5 -0
  172. data/db/migrate/20160112233706_create_disco_app_sessions.rb +12 -0
  173. data/db/migrate/20160113194418_add_shop_id_to_disco_app_sessions.rb +6 -0
  174. data/db/migrate/20160223111044_create_disco_app_settings.rb +8 -0
  175. data/db/migrate/20160301223215_update_plans.rb +22 -0
  176. data/db/migrate/20160301224558_update_subscriptions.rb +13 -0
  177. data/db/migrate/20160302104816_create_disco_app_recurring_application_charges.rb +14 -0
  178. data/db/migrate/20160302105259_create_disco_app_application_charges.rb +14 -0
  179. data/db/migrate/20160302134728_drop_charge_status_from_shops.rb +5 -0
  180. data/db/migrate/20160302142941_add_shopify_attributes_to_charges.rb +8 -0
  181. data/db/migrate/20160331093148_create_disco_app_plan_codes.rb +14 -0
  182. data/db/migrate/20160401044420_add_status_to_plan_codes.rb +5 -0
  183. data/db/migrate/20160401045551_add_amount_and_plan_code_to_disco_app_subscriptions.rb +7 -0
  184. data/db/migrate/20160425205211_add_source_to_disco_app_subscriptions.rb +5 -0
  185. data/db/migrate/20160426033520_add_trial_period_days_to_disco_app_subscriptions.rb +5 -0
  186. data/db/migrate/20160513140727_add_name_to_disco_app_shops.rb +5 -0
  187. data/db/migrate/20160521135510_move_shop_to_synchronises.rb +61 -0
  188. data/lib/disco_app/configuration.rb +45 -0
  189. data/lib/disco_app/constants.rb +4 -0
  190. data/lib/disco_app/engine.rb +26 -0
  191. data/lib/disco_app/session.rb +14 -0
  192. data/lib/disco_app/support/file_fixtures.rb +23 -0
  193. data/lib/disco_app/test_help.rb +11 -0
  194. data/lib/disco_app/version.rb +3 -0
  195. data/lib/disco_app.rb +7 -0
  196. data/lib/generators/disco_app/USAGE +5 -0
  197. data/lib/generators/disco_app/disco_app_generator.rb +239 -0
  198. data/lib/generators/disco_app/templates/assets/javascripts/application.js +17 -0
  199. data/lib/generators/disco_app/templates/assets/javascripts/components.js +3 -0
  200. data/lib/generators/disco_app/templates/assets/stylesheets/application.scss +5 -0
  201. data/lib/generators/disco_app/templates/config/database.yml.tt +20 -0
  202. data/lib/generators/disco_app/templates/config/newrelic.yml +26 -0
  203. data/lib/generators/disco_app/templates/config/puma.rb +15 -0
  204. data/lib/generators/disco_app/templates/controllers/home_controller.rb +7 -0
  205. data/lib/generators/disco_app/templates/initializers/disco_app.rb +28 -0
  206. data/lib/generators/disco_app/templates/initializers/rollbar.rb +19 -0
  207. data/lib/generators/disco_app/templates/initializers/session_store.rb +2 -0
  208. data/lib/generators/disco_app/templates/initializers/shopify_app.rb +7 -0
  209. data/lib/generators/disco_app/templates/initializers/shopify_session_repository.rb +7 -0
  210. data/lib/generators/disco_app/templates/root/CHECKS +4 -0
  211. data/lib/generators/disco_app/templates/root/Procfile +2 -0
  212. data/lib/generators/disco_app/templates/views/home/index.html.erb +2 -0
  213. data/lib/tasks/carrier_service.rake +10 -0
  214. data/lib/tasks/database.rake +8 -0
  215. data/lib/tasks/sessions.rake +9 -0
  216. data/lib/tasks/shops.rake +10 -0
  217. data/lib/tasks/start.rake +3 -0
  218. data/lib/tasks/webhooks.rake +10 -0
  219. data/test/controllers/disco_app/admin/shops_controller_test.rb +54 -0
  220. data/test/controllers/disco_app/charges_controller_test.rb +99 -0
  221. data/test/controllers/disco_app/install_controller_test.rb +50 -0
  222. data/test/controllers/disco_app/subscriptions_controller_test.rb +68 -0
  223. data/test/controllers/disco_app/webhooks_controller_test.rb +58 -0
  224. data/test/controllers/home_controller_test.rb +92 -0
  225. data/test/controllers/proxy_controller_test.rb +42 -0
  226. data/test/disco_app_test.rb +7 -0
  227. data/test/dummy/Rakefile +6 -0
  228. data/test/dummy/app/assets/javascripts/application.js +17 -0
  229. data/test/dummy/app/assets/stylesheets/application.scss +5 -0
  230. data/test/dummy/app/controllers/application_controller.rb +6 -0
  231. data/test/dummy/app/controllers/carrier_request_controller.rb +10 -0
  232. data/test/dummy/app/controllers/disco_app/admin/shops_controller.rb +8 -0
  233. data/test/dummy/app/controllers/home_controller.rb +7 -0
  234. data/test/dummy/app/controllers/proxy_controller.rb +8 -0
  235. data/test/dummy/app/helpers/application_helper.rb +2 -0
  236. data/test/dummy/app/jobs/carts_update_job.rb +7 -0
  237. data/test/dummy/app/jobs/disco_app/app_installed_job.rb +16 -0
  238. data/test/dummy/app/jobs/disco_app/app_uninstalled_job.rb +11 -0
  239. data/test/dummy/app/jobs/products_create_job.rb +7 -0
  240. data/test/dummy/app/jobs/products_delete_job.rb +7 -0
  241. data/test/dummy/app/jobs/products_update_job.rb +7 -0
  242. data/test/dummy/app/models/cart.rb +24 -0
  243. data/test/dummy/app/models/disco_app/shop.rb +15 -0
  244. data/test/dummy/app/models/js_configuration.rb +8 -0
  245. data/test/dummy/app/models/product.rb +9 -0
  246. data/test/dummy/app/models/widget_configuration.rb +10 -0
  247. data/test/dummy/app/views/assets/script_tag.js.erb +1 -0
  248. data/test/dummy/app/views/assets/test.js.erb +1 -0
  249. data/test/dummy/app/views/assets/widget.js.erb +2 -0
  250. data/test/dummy/app/views/assets/widget.scss.erb +3 -0
  251. data/test/dummy/app/views/home/index.html.erb +2 -0
  252. data/test/dummy/app/views/snippets/widget.liquid.erb +1 -0
  253. data/test/dummy/bin/bundle +3 -0
  254. data/test/dummy/bin/rails +4 -0
  255. data/test/dummy/bin/rake +4 -0
  256. data/test/dummy/bin/setup +29 -0
  257. data/test/dummy/config/application.rb +38 -0
  258. data/test/dummy/config/boot.rb +5 -0
  259. data/test/dummy/config/database.codeship.yml +23 -0
  260. data/test/dummy/config/database.gitlab-ci.yml +24 -0
  261. data/test/dummy/config/database.yml +20 -0
  262. data/test/dummy/config/environment.rb +5 -0
  263. data/test/dummy/config/environments/development.rb +41 -0
  264. data/test/dummy/config/environments/production.rb +85 -0
  265. data/test/dummy/config/environments/test.rb +42 -0
  266. data/test/dummy/config/initializers/assets.rb +11 -0
  267. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  268. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  269. data/test/dummy/config/initializers/disco_app.rb +28 -0
  270. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  271. data/test/dummy/config/initializers/inflections.rb +16 -0
  272. data/test/dummy/config/initializers/mime_types.rb +4 -0
  273. data/test/dummy/config/initializers/omniauth.rb +9 -0
  274. data/test/dummy/config/initializers/session_store.rb +2 -0
  275. data/test/dummy/config/initializers/shopify_app.rb +7 -0
  276. data/test/dummy/config/initializers/shopify_session_repository.rb +7 -0
  277. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  278. data/test/dummy/config/locales/en.yml +23 -0
  279. data/test/dummy/config/routes.rb +11 -0
  280. data/test/dummy/config/secrets.yml +22 -0
  281. data/test/dummy/config.ru +4 -0
  282. data/test/dummy/db/migrate/20160307182229_create_products.rb +11 -0
  283. data/test/dummy/db/migrate/20160530160739_create_asset_models.rb +19 -0
  284. data/test/dummy/db/migrate/20161105054746_create_carts.rb +13 -0
  285. data/test/dummy/db/schema.rb +152 -0
  286. data/test/dummy/public/404.html +67 -0
  287. data/test/dummy/public/422.html +67 -0
  288. data/test/dummy/public/500.html +66 -0
  289. data/test/dummy/public/favicon.ico +0 -0
  290. data/test/fixtures/api/widget_store/assets/create_script_tag_js_request.json +6 -0
  291. data/test/fixtures/api/widget_store/assets/create_script_tag_js_response.json +12 -0
  292. data/test/fixtures/api/widget_store/assets/create_script_tag_request.json +6 -0
  293. data/test/fixtures/api/widget_store/assets/create_script_tag_response.json +10 -0
  294. data/test/fixtures/api/widget_store/assets/create_test_js_request.json +6 -0
  295. data/test/fixtures/api/widget_store/assets/create_test_js_response.json +12 -0
  296. data/test/fixtures/api/widget_store/assets/create_widget_js_request.json +6 -0
  297. data/test/fixtures/api/widget_store/assets/create_widget_js_response.json +12 -0
  298. data/test/fixtures/api/widget_store/assets/create_widget_liquid_request.json +6 -0
  299. data/test/fixtures/api/widget_store/assets/create_widget_liquid_response.json +12 -0
  300. data/test/fixtures/api/widget_store/assets/create_widget_scss_request.json +6 -0
  301. data/test/fixtures/api/widget_store/assets/create_widget_scss_response.json +12 -0
  302. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_request.json +1 -0
  303. data/test/fixtures/api/widget_store/assets/get_script_tags_empty_response.json +1 -0
  304. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_request.json +1 -0
  305. data/test/fixtures/api/widget_store/assets/get_script_tags_preexisting_response.json +12 -0
  306. data/test/fixtures/api/widget_store/assets/update_script_tag_request.json +10 -0
  307. data/test/fixtures/api/widget_store/assets/update_script_tag_response.json +10 -0
  308. data/test/fixtures/api/widget_store/carrier_services.json +1 -0
  309. data/test/fixtures/api/widget_store/carrier_services_create.json +8 -0
  310. data/test/fixtures/api/widget_store/charges/activate_application_charge_request.json +16 -0
  311. data/test/fixtures/api/widget_store/charges/activate_application_charge_response.json +1 -0
  312. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_request.json +20 -0
  313. data/test/fixtures/api/widget_store/charges/activate_recurring_application_charge_response.json +1 -0
  314. data/test/fixtures/api/widget_store/charges/create_application_charge_request.json +9 -0
  315. data/test/fixtures/api/widget_store/charges/create_application_charge_response.json +16 -0
  316. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_request.json +9 -0
  317. data/test/fixtures/api/widget_store/charges/create_recurring_application_charge_response.json +20 -0
  318. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_request.json +9 -0
  319. data/test/fixtures/api/widget_store/charges/create_second_recurring_application_charge_response.json +20 -0
  320. data/test/fixtures/api/widget_store/charges/get_accepted_application_charge_response.json +16 -0
  321. data/test/fixtures/api/widget_store/charges/get_accepted_recurring_application_charge_response.json +20 -0
  322. data/test/fixtures/api/widget_store/charges/get_declined_application_charge_response.json +16 -0
  323. data/test/fixtures/api/widget_store/charges/get_declined_recurring_application_charge_response.json +20 -0
  324. data/test/fixtures/api/widget_store/charges/get_pending_application_charge_response.json +16 -0
  325. data/test/fixtures/api/widget_store/charges/get_pending_recurring_application_charge_response.json +20 -0
  326. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_request.json +31 -0
  327. data/test/fixtures/api/widget_store/products/write_metafields_multiple_namespaces_response.json +1 -0
  328. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_request.json +19 -0
  329. data/test/fixtures/api/widget_store/products/write_metafields_single_namespace_response.json +1 -0
  330. data/test/fixtures/api/widget_store/shop.json +46 -0
  331. data/test/fixtures/api/widget_store/webhooks.json +1 -0
  332. data/test/fixtures/assets/test.js +1 -0
  333. data/test/fixtures/assets/test.min.js +1 -0
  334. data/test/fixtures/carts.yml +5 -0
  335. data/test/fixtures/disco_app/application_charges.yml +11 -0
  336. data/test/fixtures/disco_app/plan_codes.yml +13 -0
  337. data/test/fixtures/disco_app/plans.yml +37 -0
  338. data/test/fixtures/disco_app/recurring_application_charges.yml +11 -0
  339. data/test/fixtures/disco_app/shops.yml +10 -0
  340. data/test/fixtures/disco_app/subscriptions.yml +22 -0
  341. data/test/fixtures/js_configurations.yml +3 -0
  342. data/test/fixtures/liquid/model.liquid +8 -0
  343. data/test/fixtures/products.yml +4 -0
  344. data/test/fixtures/webhooks/app_uninstalled.json +46 -0
  345. data/test/fixtures/webhooks/cart_updated.json +28 -0
  346. data/test/fixtures/webhooks/product_created.json +167 -0
  347. data/test/fixtures/webhooks/product_deleted.json +3 -0
  348. data/test/fixtures/webhooks/product_updated.json +167 -0
  349. data/test/fixtures/widget_configurations.yml +4 -0
  350. data/test/integration/synchronises_test.rb +62 -0
  351. data/test/jobs/disco_app/app_installed_job_test.rb +57 -0
  352. data/test/jobs/disco_app/app_uninstalled_job_test.rb +30 -0
  353. data/test/jobs/disco_app/synchronise_carrier_service_job_test.rb +25 -0
  354. data/test/jobs/disco_app/synchronise_webhooks_job_test.rb +30 -0
  355. data/test/models/disco_app/can_be_liquified_test.rb +55 -0
  356. data/test/models/disco_app/has_metafields_test.rb +40 -0
  357. data/test/models/disco_app/plan_test.rb +5 -0
  358. data/test/models/disco_app/renders_assets_test.rb +109 -0
  359. data/test/models/disco_app/session_test.rb +31 -0
  360. data/test/models/disco_app/shop_test.rb +43 -0
  361. data/test/models/disco_app/subscription_test.rb +19 -0
  362. data/test/services/disco_app/charges_service_test.rb +112 -0
  363. data/test/services/disco_app/subscription_service_test.rb +60 -0
  364. data/test/support/test_file_fixtures.rb +29 -0
  365. data/test/support/test_shopify_api.rb +16 -0
  366. data/test/test_helper.rb +55 -0
  367. metadata +893 -0
@@ -0,0 +1,15 @@
1
+ class AddMoreMetaToShops < ActiveRecord::Migration
2
+ def change
3
+ add_column :shops, :plan_display_name, :string
4
+ add_column :shops, :latitude, :decimal
5
+ add_column :shops, :longitude, :decimal
6
+ add_column :shops, :customer_email, :string
7
+ add_column :shops, :password_enabled, :boolean
8
+ add_column :shops, :phone, :string
9
+ add_column :shops, :primary_locale, :string
10
+ add_column :shops, :ships_to_countries, :string
11
+ add_column :shops, :timezone, :string
12
+ add_column :shops, :iana_timezone, :string
13
+ add_column :shops, :has_storefront, :boolean
14
+ end
15
+ end
@@ -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.11.0'
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