Class: DiscoAppGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Defined in:
lib/generators/disco_app/disco_app_generator.rb

Instance Method Summary collapse

Instance Method Details

#add_env_variablesObject

Add entries to .env and .env.local



147
148
149
150
151
152
153
154
155
# File 'lib/generators/disco_app/disco_app_generator.rb', line 147

def add_env_variables
  configuration = <<-CONFIG.strip_heredoc

    MAILGUN_API_KEY=
    MAILGUN_API_DOMAIN=
  CONFIG
  append_to_file '.env', configuration
  append_to_file '.env.local', configuration
end

#add_test_helperObject

Add the Disco App test helper to test/test_helper.rb



197
198
199
# File 'lib/generators/disco_app/disco_app_generator.rb', line 197

def add_test_helper
  inject_into_file 'test/test_helper.rb', "require 'disco_app/test_help'\n", { after: "require 'rails/test_help'\n" }
end

#bundle_installObject

Run bundle install to add our new gems before running tasks.



68
69
70
71
72
# File 'lib/generators/disco_app/disco_app_generator.rb', line 68

def bundle_install
  Bundler.with_clean_env do
    run 'bundle install'
  end
end

#configure_applicationObject

Make any required adjustments to the application configuration.



75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/generators/disco_app/disco_app_generator.rb', line 75

def configure_application
  # The force_ssl flag is commented by default for production.
  # Uncomment to ensure config.force_ssl = true in production.
  uncomment_lines 'config/environments/production.rb', /force_ssl/

  # Set time zone to UTC
  application "config.time_zone = 'UTC'"
  application "# Ensure UTC is the default timezone"

  # Set server side rendereing for components.js
  application "config.react.server_renderer_options = {\nfiles: ['components.js'], # files to load for prerendering\n}"
  application "# Enable server side react rendering"

  # Set defaults for various charge attributes.
  application "config.x.shopify_charges_default_trial_days = 14\n"
  application "config.x.shopify_charges_default_price = 10.00"
  application "config.x.shopify_charges_default_type = :recurring"
  application "# Set defaults for charges created by the application"

  # Set the "real charges" config variable to false explicitly by default.
  # Only in production do we read from the environment variable and
  # potentially have it become true.
  application "config.x.shopify_charges_real = false\n"
  application "# Explicitly prevent real charges being created by default"
  application "config.x.shopify_charges_real = ENV['SHOPIFY_CHARGES_REAL'] == 'true'\n", env: :production
  application "# Allow real charges in production with an ENV variable", env: :production

  # Configure session storage.
  application "ActiveRecord::SessionStore::Session.table_name = 'disco_app_sessions'"
  application "ActionDispatch::Session::ActiveRecordStore.session_class = DiscoApp::Session"
  application "# Configure custom session storage"

  # Set Sidekiq as the queue adapter in production.
  application "config.active_job.queue_adapter = :sidekiq\n", env: :production
  application "# Use Sidekiq as the active job backend", env: :production

  # Ensure the application configuration uses the DEFAULT_HOST environment
  # variable to set up support for reverse routing absolute URLS (needed when
  # generating Webhook URLs for example).
  application "routes.default_url_options[:host] = ENV['DEFAULT_HOST']\n"
  application "# Set the default host for absolute URL routing purposes"

  # Configure React in development and production.
  application "config.react.variant = :development", env: :development
  application "# Use development variant of React in development.", env: :development
  application "config.react.variant = :production", env: :production
  application "# Use production variant of React in production.", env: :production

  # Copy over the default puma configuration.
  copy_file 'config/puma.rb', 'config/puma.rb'

  # Mail configuration
  configuration = <<-CONFIG.strip_heredoc

      # Configure ActionMailer to use MailGun
      if ENV['MAILGUN_API_KEY']
        config.action_mailer.delivery_method = :mailgun
        config.action_mailer.mailgun_settings = {
          api_key: ENV['MAILGUN_API_KEY'],
          domain: ENV['MAILGUN_API_DOMAIN']
        }
      end
  CONFIG
  application configuration, env: :production

  # Monitoring configuration
  copy_file 'initializers/rollbar.rb', 'config/initializers/rollbar.rb'
  copy_file 'config/newrelic.yml', 'config/newrelic.yml'
end

#configure_gemfileObject

Configure the application’s Gemfile.



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/generators/disco_app/disco_app_generator.rb', line 25

def configure_gemfile
  # Remove sqlite.
  gsub_file 'Gemfile', /^# Use sqlite3 as the database for Active Record\ngem 'sqlite3'/m, ''

  # Add gem requirements.
  gem 'shopify_app'
  gem 'pg'
  gem 'sidekiq'
  gem 'rollbar'
  gem 'newrelic_rpm'
  gem 'react-rails'
  gem 'classnames-rails'
  gem 'premailer-rails'
  gem 'rails-bigint-pk'
  gem 'acts_as_singleton'
  gem 'active_link_to'
  gem 'nokogiri'
  gem 'oj'
  gem 'render_anywhere'

  # Specify the threadsafe version of ActiveResource.
  gem 'activeresource', git: 'https://github.com/shopify/activeresource.git', tag: '4.2-threadsafe'

  # Indicate which gems should only be used in production.
  gem_group :production do
    gem 'rails_12factor'
    gem 'mailgun_rails'
  end

  # Indicate which gems should only be used in development and test.
  gem_group :development, :test do
    gem 'dotenv-rails'
    gem 'minitest-reporters'
    gem 'webmock'
  end
end

#copy_and_remove_filesObject

Copy template files to the appropriate location. In some cases, we’ll be overwriting or removing existing files or those created by ShopifyApp.



172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/generators/disco_app/disco_app_generator.rb', line 172

def copy_and_remove_files
  # Copy initializers
  copy_file 'initializers/shopify_app.rb', 'config/initializers/shopify_app.rb'
  copy_file 'initializers/disco_app.rb', 'config/initializers/disco_app.rb'
  copy_file 'initializers/shopify_session_repository.rb', 'config/initializers/shopify_session_repository.rb'
  copy_file 'initializers/session_store.rb', 'config/initializers/session_store.rb'

  # Copy default home controller and view
  copy_file 'controllers/home_controller.rb', 'app/controllers/home_controller.rb'
  copy_file 'views/home/index.html.erb', 'app/views/home/index.html.erb'

  # Copy assets
  copy_file 'assets/javascripts/application.js', 'app/assets/javascripts/application.js'
  copy_file 'assets/javascripts/components.js', 'app/assets/javascripts/components.js'
  copy_file 'assets/stylesheets/application.scss', 'app/assets/stylesheets/application.scss'

  # Remove application.css
  remove_file 'app/assets/stylesheets/application.css'

  # Remove the layout files created by ShopifyApp
  remove_file 'app/views/layouts/application.html.erb'
  remove_file 'app/views/layouts/embedded_app.html.erb'
end

#copy_root_filesObject

Copy a number of template files to the top-level directory of our application:

- .env and .env.local for settings environment variables in development with dotenv-rails;
- Slightly customised version of the default Rails .gitignore;
- Default simple Procfile for Heroku.


11
12
13
14
15
# File 'lib/generators/disco_app/disco_app_generator.rb', line 11

def copy_root_files
  %w(.env .env.local .gitignore Procfile CHECKS).each do |file|
    copy_file "root/#{file}", file
  end
end

#create_databaseObject

Create PG database



207
208
209
# File 'lib/generators/disco_app/disco_app_generator.rb', line 207

def create_database
  rake 'db:create'
end

#install_migrationsObject

Copy engine migrations over.



202
203
204
# File 'lib/generators/disco_app/disco_app_generator.rb', line 202

def install_migrations
  rake 'disco_app:install:migrations'
end

#migrateObject

Run migrations.



212
213
214
# File 'lib/generators/disco_app/disco_app_generator.rb', line 212

def migrate
  rake 'db:migrate'
end

#remove_root_filesObject

Remove a number of root files.



18
19
20
21
22
# File 'lib/generators/disco_app/disco_app_generator.rb', line 18

def remove_root_files
  %w(README.rdoc).each do |file|
    remove_file file
  end
end

#run_generatorsObject

Run generators.



163
164
165
166
167
168
# File 'lib/generators/disco_app/disco_app_generator.rb', line 163

def run_generators
  generate 'shopify_app:install'
  generate 'shopify_app:home_controller'
  generate 'bigint_pk:install'
  generate 'react:install'
end

#set_ruby_versionObject

Lock down the application to a specific Ruby version:

- Via .ruby-version file for rbenv in development;
- Via a Gemfile line in production.

This should be the last operation, to allow all other operations to run in the initial Ruby version.



222
223
224
225
# File 'lib/generators/disco_app/disco_app_generator.rb', line 222

def set_ruby_version
  copy_file 'root/.ruby-version', '.ruby-version'
  prepend_to_file 'Gemfile', "ruby '2.3.3'\n"
end

#setup_routesObject

Set up routes.



158
159
160
# File 'lib/generators/disco_app/disco_app_generator.rb', line 158

def setup_routes
  route "mount DiscoApp::Engine, at: '/'"
end

#update_database_configObject

copy template for pg configuration



63
64
65
# File 'lib/generators/disco_app/disco_app_generator.rb', line 63

def update_database_config
  template 'config/database.yml.tt'
end