Class: ReactOnRails::Generators::BaseGenerator

Inherits:
Rails::Generators::Base
  • Object
show all
Includes:
GeneratorHelper
Defined in:
lib/generators/react_on_rails/base_generator.rb

Overview

rubocop:disable Metrics/ClassLength

Instance Method Summary collapse

Methods included from GeneratorHelper

#copy_file_and_missing_parent_directories, #dest_dir_exists?, #dest_file_exists?, #empty_directory_with_keep_file, #keep_file, #setup_file_error, #symlink_dest_file_to_dest_file

Instance Method Details

#add_base_gems_to_gemfileObject



135
136
137
138
# File 'lib/generators/react_on_rails/base_generator.rb', line 135

def add_base_gems_to_gemfile
  return unless options.server_rendering?
  append_to_file("Gemfile", "\ngem 'therubyracer', platforms: :ruby\n")
end

#add_hello_world_routeObject



44
45
46
# File 'lib/generators/react_on_rails/base_generator.rb', line 44

def add_hello_world_route
  route "get 'hello_world', to: 'hello_world#index'"
end

#append_to_assets_initializerObject



164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
# File 'lib/generators/react_on_rails/base_generator.rb', line 164

def append_to_assets_initializer
  data = <<-DATA.strip_heredoc
    # Add client/assets/ folders to asset pipeline's search path.
    # If you do not want to move existing images and fonts from your Rails app
    # you could also consider creating symlinks there that point to the original
    # rails directories. In that case, you would not add these paths here.
    Rails.application.config.assets.paths << Rails.root.join("client", "assets", "stylesheets")
    Rails.application.config.assets.paths << Rails.root.join("client", "assets", "images")
    Rails.application.config.assets.paths << Rails.root.join("client", "assets", "fonts")
    Rails.application.config.assets.precompile += %w( generated/server-bundle.js )
  DATA
  assets_intializer = File.join(destination_root, "config/initializers/assets.rb")
  if File.exist?(assets_intializer)
    append_to_file(assets_intializer, data)
  else
    create_file(assets_intializer, data)
  end
end

#copy_base_filesObject



111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'lib/generators/react_on_rails/base_generator.rb', line 111

def copy_base_files
  base_path = "base/base/"
  %w(app/controllers/hello_world_controller.rb
     config/initializers/react_on_rails.rb
     client/.babelrc
     client/index.jade
     client/server.js
     client/webpack.client.base.config.js
     client/webpack.client.rails.config.js
     REACT_ON_RAILS.md
     client/REACT_ON_RAILS_CLIENT_README.md
     package.json).each { |file| copy_file(base_path + file, file) }
end

#create_client_assets_directoriesObject



48
49
50
51
52
53
# File 'lib/generators/react_on_rails/base_generator.rb', line 48

def create_client_assets_directories
  empty_directory("client/assets")
  empty_directory("client/assets/stylesheets")
  empty_directory_with_keep_file("client/assets/fonts")
  empty_directory_with_keep_file("client/assets/images")
end

#create_react_directoriesObject



106
107
108
109
# File 'lib/generators/react_on_rails/base_generator.rb', line 106

def create_react_directories
  dirs = %w(components containers startup)
  dirs.each { |name| empty_directory("client/app/bundles/HelloWorld/#{name}") }
end

#force_application_scss_naming_if_necessaryObject

rename to application.scss from application.css or application.css.scss



184
185
186
187
188
189
190
191
192
193
194
# File 'lib/generators/react_on_rails/base_generator.rb', line 184

def force_application_scss_naming_if_necessary
  base_path = "app/assets/stylesheets/"
  application_css = "#{base_path}application.css"
  application_css_scss = "#{base_path}application.css.scss"

  bad_name = dest_file_exists?(application_css) || dest_file_exists?(application_css_scss)
  return unless bad_name

  new_name = File.join(destination_root, "#{base_path}application.scss")
  File.rename(bad_name, new_name)
end

#install_server_rendering_files_if_enabledObject



146
147
148
149
150
151
152
153
# File 'lib/generators/react_on_rails/base_generator.rb', line 146

def install_server_rendering_files_if_enabled
  return unless options.server_rendering?
  base_path = "base/server_rendering/"
  %w(client/webpack.server.rails.config.js
     client/app/bundles/HelloWorld/startup/serverRegistration.jsx).each do |file|
    copy_file(base_path + file, file)
  end
end

#strip_application_js_of_double_blank_linesObject



101
102
103
104
# File 'lib/generators/react_on_rails/base_generator.rb', line 101

def strip_application_js_of_double_blank_lines
  application_js = File.join(destination_root, "app/assets/javascripts/application.js")
  gsub_file(application_js, /^\n^\n/, "\n")
end

#strip_application_js_of_incompatible_sprockets_statementsObject



94
95
96
97
98
99
# File 'lib/generators/react_on_rails/base_generator.rb', line 94

def strip_application_js_of_incompatible_sprockets_statements
  application_js = File.join(destination_root, "app/assets/javascripts/application.js")
  gsub_file(application_js, "//= require jquery_ujs", "// require jquery_ujs")
  gsub_file(application_js, %r{//= require jquery$}, "// require jquery")
  gsub_file(application_js, %r{//= require_tree \.$}, "// require_tree .")
end

#template_assets_rake_fileObject



160
161
162
# File 'lib/generators/react_on_rails/base_generator.rb', line 160

def template_assets_rake_file
  template("base/base/lib/tasks/assets.rake.tt", "lib/tasks/assets.rake")
end

#template_base_filesObject



125
126
127
128
129
130
131
132
133
# File 'lib/generators/react_on_rails/base_generator.rb', line 125

def template_base_files
  base_path = "base/base/"
  %w(Procfile.dev
     Procfile.dev-hot
     app/views/hello_world/index.html.erb
     client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx
     client/webpack.client.hot.config.js
     client/package.json).each { |file| template(base_path + file + ".tt", file) }
end

#template_client_registration_fileObject



140
141
142
143
144
# File 'lib/generators/react_on_rails/base_generator.rb', line 140

def template_client_registration_file
  filename = "clientRegistration.jsx"
  location = "client/app/bundles/HelloWorld/startup"
  template("base/base/#{location}/clientRegistration.jsx.tt", "#{location}/#{filename}")
end

#template_linter_files_if_appropriateObject



155
156
157
158
# File 'lib/generators/react_on_rails/base_generator.rb', line 155

def template_linter_files_if_appropriate
  return if !options.ruby_linters? && options.skip_js_linters?
  template("base/base/lib/tasks/linters.rake.tt", "lib/tasks/linters.rake")
end

#update_application_jsObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/generators/react_on_rails/base_generator.rb', line 72

def update_application_js
  data = <<-DATA.strip_heredoc
    // DO NOT REQUIRE jQuery or jQuery-ujs in this file!
    // DO NOT REQUIRE TREE!

    // CRITICAL that generated/vendor-bundle must be BEFORE bootstrap-sprockets and turbolinks
    // since it is exposing jQuery and jQuery-ujs

    //= require generated/vendor-bundle
    //= require generated/app-bundle

  DATA

  app_js_path = "app/assets/javascripts/application.js"
  found_app_js = dest_file_exists?(app_js_path) || dest_file_exists?(app_js_path + ".coffee")
  if found_app_js
    prepend_to_file(found_app_js, data)
  else
    create_file(app_js_path, data)
  end
end

#update_git_ignoreObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/generators/react_on_rails/base_generator.rb', line 55

def update_git_ignore
  data = <<-DATA.strip_heredoc
    # React on Rails
    npm-debug.log
    node_modules

    # Generated js bundles
    /app/assets/javascripts/generated/*
  DATA

  if dest_file_exists?(".gitignore")
    append_to_file(".gitignore", data)
  else
    GeneratorMessages.add_error(setup_file_error(".gitignore", data))
  end
end