workarea-mail_chimp 3.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +7 -0
  2. data/.editorconfig +15 -0
  3. data/.gitignore +55 -0
  4. data/.markdownlint.json +10 -0
  5. data/.rails-rubocop.yml +119 -0
  6. data/.rubocop.yml +8 -0
  7. data/.scss-lint.yml +188 -0
  8. data/CHANGELOG.md +244 -0
  9. data/Gemfile +9 -0
  10. data/README.md +115 -0
  11. data/Rakefile +53 -0
  12. data/app/assets/javascripts/workarea/storefront/mail_chimp/mail_chimp_tracking.js +15 -0
  13. data/app/controllers/workarea/storefront/application_controller.decorator +11 -0
  14. data/app/controllers/workarea/storefront/cart_items_controller.decorator +18 -0
  15. data/app/controllers/workarea/storefront/checkout/addresses_controller.decorator +13 -0
  16. data/app/controllers/workarea/storefront/checkout/shipping_controller.decorator +13 -0
  17. data/app/controllers/workarea/storefront/users/accounts_controller.decorator +37 -0
  18. data/app/models/workarea/catalog/product.decorator +7 -0
  19. data/app/models/workarea/mail_chimp/group.rb +39 -0
  20. data/app/models/workarea/mail_chimp/store.rb +26 -0
  21. data/app/models/workarea/order.decorator +9 -0
  22. data/app/models/workarea/user.decorator +31 -0
  23. data/app/services/workarea/mail_chimp/address.rb +28 -0
  24. data/app/services/workarea/mail_chimp/cart.rb +78 -0
  25. data/app/services/workarea/mail_chimp/order.rb +97 -0
  26. data/app/services/workarea/mail_chimp/product.rb +43 -0
  27. data/app/services/workarea/mail_chimp/variant.rb +43 -0
  28. data/app/view_models/workarea/storefront/user_view_model.decorator +16 -0
  29. data/app/views/workarea/storefront/mail_chimp/_ecommerce_javascript.html.haml +2 -0
  30. data/app/views/workarea/storefront/users/accounts/_edit.html.haml +12 -0
  31. data/app/views/workarea/storefront/users/accounts/_email_interests.html.haml +13 -0
  32. data/app/workers/workarea/mail_chimp/ecommerce/save_cart.rb +40 -0
  33. data/app/workers/workarea/mail_chimp/ecommerce/save_order.rb +31 -0
  34. data/app/workers/workarea/mail_chimp/ecommerce/save_product.rb +31 -0
  35. data/app/workers/workarea/mail_chimp/list_subscriber.rb +30 -0
  36. data/app/workers/workarea/mail_chimp/list_unsubscriber.rb +22 -0
  37. data/app/workers/workarea/mail_chimp/subscription_edit.rb +28 -0
  38. data/bin/rails +19 -0
  39. data/config/initializers/appends.rb +21 -0
  40. data/config/initializers/workarea.rb +14 -0
  41. data/config/locales/en.yml +15 -0
  42. data/lib/gibbon/request_decorator.rb +10 -0
  43. data/lib/integrations/workarea/mail_chimp/bogus_api_request.rb +30 -0
  44. data/lib/integrations/workarea/mail_chimp/bogus_gateway.rb +35 -0
  45. data/lib/integrations/workarea/mail_chimp/bogus_request.rb +78 -0
  46. data/lib/integrations/workarea/mail_chimp/gateway.rb +86 -0
  47. data/lib/integrations/workarea/mail_chimp/gateway/list.rb +47 -0
  48. data/lib/integrations/workarea/mail_chimp/gateway/members.rb +61 -0
  49. data/lib/integrations/workarea/mail_chimp/gateway/subscribe_argument_builder.rb +101 -0
  50. data/lib/tasks/mail_chimp.rake +71 -0
  51. data/lib/workarea/mail_chimp.rb +72 -0
  52. data/lib/workarea/mail_chimp/engine.rb +14 -0
  53. data/lib/workarea/mail_chimp/errors.rb +2 -0
  54. data/lib/workarea/mail_chimp/tasks/ecommerce.rb +43 -0
  55. data/lib/workarea/mail_chimp/version.rb +5 -0
  56. data/script/admin_ci +9 -0
  57. data/script/ci +11 -0
  58. data/script/core_ci +9 -0
  59. data/script/plugins_ci +9 -0
  60. data/script/storefront_ci +9 -0
  61. data/test/dummy/Rakefile +6 -0
  62. data/test/dummy/app/assets/config/manifest.js +4 -0
  63. data/test/dummy/app/assets/images/.keep +0 -0
  64. data/test/dummy/app/assets/javascripts/application.js +13 -0
  65. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  66. data/test/dummy/app/controllers/application_controller.rb +3 -0
  67. data/test/dummy/app/controllers/concerns/.keep +0 -0
  68. data/test/dummy/app/helpers/application_helper.rb +2 -0
  69. data/test/dummy/app/jobs/application_job.rb +2 -0
  70. data/test/dummy/app/mailers/application_mailer.rb +4 -0
  71. data/test/dummy/app/models/concerns/.keep +0 -0
  72. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  73. data/test/dummy/app/views/layouts/mailer.html.erb +13 -0
  74. data/test/dummy/app/views/layouts/mailer.text.erb +1 -0
  75. data/test/dummy/bin/bundle +3 -0
  76. data/test/dummy/bin/rails +4 -0
  77. data/test/dummy/bin/rake +4 -0
  78. data/test/dummy/bin/setup +34 -0
  79. data/test/dummy/bin/update +29 -0
  80. data/test/dummy/config.ru +5 -0
  81. data/test/dummy/config/application.rb +23 -0
  82. data/test/dummy/config/boot.rb +5 -0
  83. data/test/dummy/config/cable.yml +9 -0
  84. data/test/dummy/config/environment.rb +5 -0
  85. data/test/dummy/config/environments/development.rb +56 -0
  86. data/test/dummy/config/environments/production.rb +86 -0
  87. data/test/dummy/config/environments/test.rb +43 -0
  88. data/test/dummy/config/initializers/application_controller_renderer.rb +6 -0
  89. data/test/dummy/config/initializers/assets.rb +11 -0
  90. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  91. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  92. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  93. data/test/dummy/config/initializers/inflections.rb +16 -0
  94. data/test/dummy/config/initializers/mime_types.rb +4 -0
  95. data/test/dummy/config/initializers/new_framework_defaults.rb +21 -0
  96. data/test/dummy/config/initializers/session_store.rb +3 -0
  97. data/test/dummy/config/initializers/workarea.rb +5 -0
  98. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  99. data/test/dummy/config/locales/en.yml +23 -0
  100. data/test/dummy/config/puma.rb +47 -0
  101. data/test/dummy/config/routes.rb +5 -0
  102. data/test/dummy/config/secrets.yml +22 -0
  103. data/test/dummy/config/spring.rb +6 -0
  104. data/test/dummy/db/seeds.rb +2 -0
  105. data/test/dummy/lib/assets/.keep +0 -0
  106. data/test/factories/mail_chimp.rb +50 -0
  107. data/test/integration/workarea/mailchimp/subscription_test.rb +52 -0
  108. data/test/integration/workarea/mailchimp/tracking_params_test.rb +50 -0
  109. data/test/integration/workarea/mailchimp/unsubscribe_test.rb +14 -0
  110. data/test/integration/workarea/storefront/mail_chimp_order_test.rb +106 -0
  111. data/test/integration/workarea/storefront/mail_chimp_product_test.rb +51 -0
  112. data/test/integration/workarea/storefront/mail_chimp_site_javascript_test.rb +25 -0
  113. data/test/lib/workarea/mailchimp/gateway/list_test.rb +48 -0
  114. data/test/lib/workarea/mailchimp/gateway_test.rb +196 -0
  115. data/test/lib/workarea/mailchimp/tasks/ecommerce_test.rb +40 -0
  116. data/test/services/workarea/mail_chimp/cart_test.rb +44 -0
  117. data/test/services/workarea/mail_chimp/order_test.rb +50 -0
  118. data/test/services/workarea/mail_chimp/product_test.rb +29 -0
  119. data/test/support/workarea/mail_chimp_api_config.rb +33 -0
  120. data/test/system/workarea/storefront/campaign_tracking_test.rb +14 -0
  121. data/test/system/workarea/storefront/group_test.rb +33 -0
  122. data/test/system/workarea/storefront/mail_chimp_accounts_system_test.rb +79 -0
  123. data/test/test_helper.rb +17 -0
  124. data/test/vcr_cassettes/get_default_list_interests.yml +104 -0
  125. data/test/vcr_cassettes/get_member_details_no_match.yml +51 -0
  126. data/test/vcr_cassettes/get_member_details_unsubscribed.yml +51 -0
  127. data/test/vcr_cassettes/interest_categories_read.yml +104 -0
  128. data/test/vcr_cassettes/mail_chimp/tasks/create_store-successful.yml +97 -0
  129. data/test/vcr_cassettes/mc_order_test.yml +381 -0
  130. data/test/vcr_cassettes/mc_product_test.yml +234 -0
  131. data/test/vcr_cassettes/subscribe_to_default_list.yml +254 -0
  132. data/test/vcr_cassettes/subscribe_to_default_list_interest_groups.yml +254 -0
  133. data/test/vcr_cassettes/subscribe_to_default_list_with_groupings.yml +254 -0
  134. data/test/vcr_cassettes/subscribe_to_default_list_with_user_details.yml +254 -0
  135. data/test/vcr_cassettes/unsubscribe_from_default_list.yml +53 -0
  136. data/test/vcr_cassettes/update_member_on_default_list_change_email.yml +254 -0
  137. data/test/vcr_cassettes/update_member_on_default_list_change_groupings.yml +254 -0
  138. data/test/workers/workarea/mail_chimp/ecommerce/save_cart_test.rb +28 -0
  139. data/test/workers/workarea/mail_chimp/ecommerce/save_order_test.rb +15 -0
  140. data/test/workers/workarea/mail_chimp/ecommerce/save_product_test.rb +15 -0
  141. data/workarea-mail_chimp.gemspec +20 -0
  142. metadata +212 -0
@@ -0,0 +1,101 @@
1
+ module Workarea
2
+ module MailChimp
3
+ class Gateway::SubscribeArgumentBuilder
4
+ attr_reader :email, :options, :default_list_id, :email_interests_id
5
+
6
+ def initialize(email, options, default_list_id, email_interests_id)
7
+ @email = email
8
+ @options = options
9
+ @default_list_id = default_list_id
10
+ @email_interests_id = email_interests_id
11
+ end
12
+
13
+ def build
14
+ args = get_args(email, options[:user], default_list_options)
15
+ merge_new_email(args, options)
16
+ end
17
+
18
+ private
19
+
20
+ def merge_new_email(args, options)
21
+ return args unless options[:new_email].present?
22
+ args.merge(merge_vars: { email: options[:new_email] })
23
+ end
24
+
25
+ def default_list_options
26
+ {
27
+ id: default_list_id,
28
+ double_optin: false,
29
+ send_welcome: true,
30
+ replace_interests: true,
31
+ update_existing: true, # updating existing so we can make same API
32
+ # call for new subscribers and existing subscribers
33
+ email_type: "html" # other option is "text"
34
+ }
35
+ end
36
+
37
+ def get_args(email, user = nil, options = {})
38
+ group_merge = merge_groups({}, user)
39
+ user_details_merge = merge_user_details({}, user)
40
+
41
+ { email_address: email }.
42
+ merge(options).
43
+ merge(merge_fields: user_details_merge).
44
+ merge(group_merge)
45
+ end
46
+
47
+ def merge_user_details(merge_vars, user)
48
+ return merge_vars unless user.present?
49
+ merge_vars[:FNAME] = user.first_name if user.first_name.present?
50
+ merge_vars[:LNAME] = user.last_name if user.last_name.present?
51
+ merge_vars
52
+ end
53
+
54
+ def merge_groups(merge_vars, user)
55
+ if user&.groups.present?
56
+ merge_vars.merge(interests: build_merged_groups(user.groups))
57
+ else
58
+ merge_vars.merge(interests: build_merged_groups(all_groups))
59
+ end
60
+ end
61
+
62
+ def build_merged_groups(groups)
63
+ hash = groups.first.interests.each_with_object({}) do |(id, _int), hsh|
64
+ hsh[id] = true
65
+ end
66
+ all_interests.each do |id, int|
67
+ hash[id] = false unless hash.keys.include?(id)
68
+ end
69
+
70
+ hash
71
+ end
72
+
73
+ def all_groups
74
+ [default_group(group_interests)]
75
+ end
76
+
77
+ def all_interests
78
+ group_interests.inject({}) { |aggregate, int| aggregate.merge(int.interests) }
79
+ end
80
+
81
+ def default_group(groups)
82
+ default = groups.detect do |group|
83
+ group.id == email_interests_id
84
+ end
85
+
86
+ default || groups.first
87
+ end
88
+
89
+ def group_interests
90
+ key = "mail_chimp_email_interests/#{Workarea::MailChimp.config.default_store[:list_id]}"
91
+ options = { expires_in: 1.hour }
92
+
93
+ options.merge!(force: true) if Rails.cache.read(key).nil?
94
+
95
+ Rails.cache.fetch(key, options) do
96
+ Workarea::MailChimp.gateway.list.interests
97
+ end
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,71 @@
1
+ require 'workarea/mail_chimp/tasks/ecommerce'
2
+
3
+ namespace :workarea do
4
+ namespace :mail_chimp do
5
+ desc 'Seed MailChimp data'
6
+ task install: :environment do
7
+ Rake::Task['workarea:mail_chimp:seed_store'].execute
8
+ Rake::Task['workarea:mail_chimp:seed_products'].execute
9
+ Rake::Task['workarea:mail_chimp:seed_orders'].execute
10
+ end
11
+
12
+ desc 'Create Default Store for MailChimp Ecommerce'
13
+ task seed_store: :environment do
14
+ puts 'Creating Store ...'
15
+ Workarea::MailChimp::Tasks::Ecommerce.create_store
16
+ end
17
+
18
+ desc 'Export full products to MailChimp'
19
+ task seed_products: :environment do
20
+ puts 'Creating Products...'
21
+ raise RuntimeError.new("No Store ID set in configuration!") unless Workarea::MailChimp.config.default_store[:id].present?
22
+
23
+ Workarea::Catalog::Product.purchasable.each do |product|
24
+ next if product.variants.empty?
25
+
26
+ mc_product = Workarea::MailChimp::Product.new(product)
27
+
28
+ request = Workarea::MailChimp.request
29
+ store_id = Workarea::MailChimp.config.default_store[:id]
30
+
31
+ if product.exported_to_mail_chimp_at.present?
32
+ puts "Updating #{product.name}"
33
+ request.ecommerce.stores(store_id).products(product.id.to_s).update(body: mc_product.to_h)
34
+ else
35
+ puts "Creating #{product.name}"
36
+ request.ecommerce.stores(store_id).products.create(body: mc_product.to_h)
37
+
38
+ product.update_attributes!(exported_to_mail_chimp_at: Time.current)
39
+ end
40
+ end
41
+ end
42
+
43
+ desc 'Export full orders to MailChimp'
44
+ task seed_orders: :environment do
45
+ puts 'Creating Orders...'
46
+ raise RuntimeError.new("No Store ID set in configuration!") unless Workarea::MailChimp.config.default_store[:id].present?
47
+
48
+ # turn on the syncing feature of MC - this will stop users from getting unwanted emails
49
+ puts "Enable store sync"
50
+ Workarea::MailChimp::Store.with_syncing_enabled do
51
+
52
+ Workarea::Order.placed.each do |order|
53
+
54
+ request = Workarea::MailChimp.request
55
+ store_id = Workarea::MailChimp.config.default_store[:id]
56
+ mc_order = Workarea::MailChimp::Order.new(order)
57
+
58
+ if order.exported_to_mail_chimp_at.present?
59
+ puts "Updating #{order.id}"
60
+ request.ecommerce.stores(store_id).orders(order.id.to_s).update(body: mc_order.to_h)
61
+ else
62
+ puts "Creating #{order.id}"
63
+ request.ecommerce.stores(store_id).orders.create(body: mc_order.to_h)
64
+
65
+ order.update_attributes!(exported_to_mail_chimp_at: Time.current)
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,72 @@
1
+ require "workarea"
2
+ require "workarea/storefront"
3
+ require "workarea/admin"
4
+ require "gibbon"
5
+ require 'gibbon/request_decorator'
6
+
7
+ module Workarea
8
+ module MailChimp
9
+ def self.credentials
10
+ (Rails.application.secrets.mail_chimp || {}).deep_symbolize_keys
11
+ end
12
+
13
+ def self.api_key
14
+ credentials[:api_key]
15
+ end
16
+
17
+ def self.config
18
+ Workarea.config.mail_chimp
19
+ end
20
+
21
+ def self.default_list_id
22
+ Workarea.config[:default_list_id]
23
+ end
24
+
25
+ def self.list_prefrences_id
26
+ Workarea.config[:default_list_id]
27
+ end
28
+
29
+ def self.config
30
+ Workarea.config.mail_chimp
31
+ end
32
+
33
+ def self.current_store
34
+ return unless config&.default_store && config.default_store[:id].present?
35
+
36
+ Store.find_by(mail_chimp_id: config.default_store[:id]) rescue nil
37
+ end
38
+
39
+ def self.initialize_gateway
40
+ if Rails.application.secrets.mail_chimp.present?
41
+ secrets = Rails.application.secrets.mail_chimp.deep_symbolize_keys
42
+ Workarea.config.gateways.mail_chimp = Workarea::MailChimp::Gateway.new(
43
+ secrets[:default_list_id],
44
+ secrets[:list_preferences_id]
45
+ )
46
+ else
47
+ Workarea.config.gateways.mail_chimp = Workarea::MailChimp::BogusGateway.new
48
+ end
49
+ end
50
+
51
+ def self.gateway
52
+ if credentials.present?
53
+ Workarea::MailChimp::Gateway.new
54
+ else
55
+ Workarea::MailChimp::BogusGateway.new
56
+ end
57
+ end
58
+
59
+ # Returns a single use gibbon request object
60
+ def self.request
61
+ if Workarea::MailChimp.api_key.present?
62
+ Gibbon::Request.new(api_key: Workarea::MailChimp.api_key)
63
+ else
64
+ Workarea::MailChimp::BogusRequest.new(api_key: 'test-us1')
65
+ end
66
+ end
67
+ end
68
+ end
69
+
70
+ require "workarea/mail_chimp/version"
71
+ require "workarea/mail_chimp/errors"
72
+ require "workarea/mail_chimp/engine"
@@ -0,0 +1,14 @@
1
+ module Workarea
2
+ module MailChimp
3
+ class Engine < ::Rails::Engine
4
+ include Workarea::Plugin
5
+
6
+ isolate_namespace Workarea::MailChimp
7
+
8
+ %w(lib/integrations).each do |path|
9
+ config.autoload_paths << "#{config.root}/#{path}"
10
+ config.eager_load_paths << "#{config.root}/#{path}"
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,2 @@
1
+ class Workarea::MailChimp::Errors < StandardError; end
2
+ class Workarea::MailChimp::Errors::UserAlreadySubscribed < Workarea::MailChimp::Errors; end
@@ -0,0 +1,43 @@
1
+ module Workarea
2
+ module MailChimp
3
+ module Tasks
4
+ module Ecommerce
5
+ extend self
6
+
7
+ # Creates an ecommerce store in Mail Chimp
8
+ def create_store
9
+ raise RuntimeError.new("No list id defined in store configuration!") unless Workarea::MailChimp.config.default_store[:list_id].present?
10
+
11
+ if Workarea::MailChimp::Store.where(mail_chimp_id: Workarea::MailChimp.config.default_store[:id]).exists?
12
+ raise RuntimeError, "Mailchimp store with id #{Workarea::MailChimp.config.default_store[:id]} already exists"
13
+ end
14
+
15
+ request = Workarea::MailChimp.request
16
+ begin
17
+ response = request.ecommerce.stores.create(body: Workarea::MailChimp.config.default_store)
18
+ rescue Gibbon::MailChimpError => error
19
+ raise RuntimeError, error.detail
20
+ end
21
+
22
+ Workarea::MailChimp::Store.create!(
23
+ mail_chimp_id: response.body["id"],
24
+ list_id: response.body["list_id"],
25
+ name: response.body["name"],
26
+ currency_code: response.body["currency_code"],
27
+ connected_site: response.body.dig("connected_site"),
28
+ )
29
+
30
+ connected_site_id = response.body.dig("connected_site", "site_foreign_id")
31
+
32
+ Workarea::MailChimp
33
+ .request
34
+ .connected_sites
35
+ .add_path_part(connected_site_id)
36
+ .actions
37
+ .send('verify-script-installation')
38
+ .create
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,5 @@
1
+ module Workarea
2
+ module MailChimp
3
+ VERSION = "3.0.2".freeze
4
+ end
5
+ end
data/script/admin_ci ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ gem install bundler
4
+ bundle update
5
+
6
+ CI_GEM_PATH="$(bundle show workarea-ci)"
7
+ . ${CI_GEM_PATH}/exe/workarea-set-ci-env
8
+
9
+ bin/rails app:workarea:test:admin
data/script/ci ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env bash
2
+
3
+ gem install bundler
4
+ bundle update
5
+
6
+ CI_GEM_PATH="$(bundle show workarea-ci)"
7
+ . ${CI_GEM_PATH}/exe/workarea-set-ci-env
8
+
9
+ bundle exec workarea-lint
10
+ bundle exec workarea-audit
11
+ bin/rails test test/**/*_test.rb
data/script/core_ci ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ gem install bundler
4
+ bundle update
5
+
6
+ CI_GEM_PATH="$(bundle show workarea-ci)"
7
+ . ${CI_GEM_PATH}/exe/workarea-set-ci-env
8
+
9
+ bin/rails app:workarea:test:core
data/script/plugins_ci ADDED
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ gem install bundler
4
+ bundle update
5
+
6
+ CI_GEM_PATH="$(bundle show workarea-ci)"
7
+ . ${CI_GEM_PATH}/exe/workarea-set-ci-env
8
+
9
+ bin/rails app:workarea:test:plugins
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env bash
2
+
3
+ gem install bundler
4
+ bundle update
5
+
6
+ CI_GEM_PATH="$(bundle show workarea-ci)"
7
+ . ${CI_GEM_PATH}/exe/workarea-set-ci-env
8
+
9
+ bin/rails app:workarea:test:storefront
@@ -0,0 +1,6 @@
1
+ # Add your own tasks in files placed in lib/tasks ending in .rake,
2
+ # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
3
+
4
+ require_relative 'config/application'
5
+
6
+ Rails.application.load_tasks
@@ -0,0 +1,4 @@
1
+
2
+ //= link_tree ../images
3
+ //= link_directory ../javascripts .js
4
+ //= link_directory ../stylesheets .css
File without changes
@@ -0,0 +1,13 @@
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. JavaScript code in this file should be added after the last require_* statement.
9
+ //
10
+ // Read Sprockets README (https://github.com/rails/sprockets#sprockets-directives) for details
11
+ // about supported directives.
12
+ //
13
+ //= require_tree .
@@ -0,0 +1,15 @@
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
+ * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
+ * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
+ *
8
+ * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
+ * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
+ * files in this directory. Styles in this file should be added after the last require_* statement.
11
+ * It is generally better to create a new file per style scope.
12
+ *
13
+ *= require_tree .
14
+ *= require_self
15
+ */
@@ -0,0 +1,3 @@
1
+ class ApplicationController < ActionController::Base
2
+ protect_from_forgery with: :exception
3
+ end
File without changes
@@ -0,0 +1,2 @@
1
+ module ApplicationHelper
2
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationJob < ActiveJob::Base
2
+ end
@@ -0,0 +1,4 @@
1
+ class ApplicationMailer < ActionMailer::Base
2
+ default from: 'from@example.com'
3
+ layout 'mailer'
4
+ end