workarea-mail_chimp 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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