Skip to content
Next Next commit
Create a installation generator
[Heavily based on the ember.js bootstrap generator] Running rails generate react:install will append the basic require directives to application.js Possible avenues for upgrades: - allow for files with arbitrary names ("mycomponents.js" instead of "application.js") - allow for files with different extensions ("application.js.coffee" instead of "application.js")
  • Loading branch information
xionon committed Aug 5, 2014
commit 3a42694800538c44bfa17dcf2c9ff96b11a8d082
47 changes: 47 additions & 0 deletions lib/generators/react/install_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
module React
module Generators
class InstallGenerator < ::Rails::Generators::Base
source_root File.expand_path '../../templates', __FILE__

desc 'Create default react.js folder layout and prep application.js'

class_option :skip_git,
type: :boolean,
aliases: '-g',
default: false,
desc: 'Skip Git keeps'

def create_directory
empty_directory 'app/assets/javascripts/components'
create_file 'app/assets/javascripts/components/.gitkeep' unless options[:skip_git]
end

def inject_react
require_react = "//= require react\n//= require react_ujs\n//= require components\n"

manifest = Pathname.new(destination_root).join('app/assets/javascripts',
'application.js')

if manifest.exist?
manifest_contents = File.read(manifest)

if manifest_contents.include? 'require turbolinks'
inject_into_file manifest, require_react, {after: "//= require turbolinks\n"}
elsif manifest_contents.include? 'require_tree'
inject_into_file manifest, require_react, {before: '//= require_tree'}
else
append_file manifest, require_react
end
else
create_file manifest, require_react
end
end

def create_components
components_js = "//= require_tree ./components\n"
components_file = File.join(*%w(app assets javascripts components.js))
create_file components_file, components_js
end
end
end
end
Empty file.
50 changes: 50 additions & 0 deletions test/generators/install_generator_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
require 'test_helper'
require 'generators/react/install_generator'

class InstallGeneratorTest < Rails::Generators::TestCase
destination File.join(Rails.root, 'tmp', 'generator_test_output')
tests React::Generators::InstallGenerator

def copy_directory(dir)
source = Rails.root.join(dir)
dest = Rails.root.join(destination_root, File.dirname(dir))

FileUtils.mkdir_p dest
FileUtils.cp_r source, dest
end

test "adds requires to `application.js`" do
run_generator

assert_application_file_modified
end

test "it modifes an existing 'application.js'" do
copy_directory('app/assets/javascripts/application.js')
run_generator
assert_application_file_modified
end

test "creates `application.js` if it doesn't exist" do
copy_directory('app/assets/javascripts/application.js')
File.delete destination_root + '/app/assets/javascripts/application.js'

run_generator

assert_application_file_modified
end

test "modifies `application.js` it's empty" do
File.write(destination_root + '/app/assets/javascripts/application.js', '')

run_generator

assert_application_file_modified
end

def assert_application_file_modified
assert_file 'app/assets/javascripts/application.js', %r{//= require react}
assert_file 'app/assets/javascripts/application.js', %r{//= require react_ujs}
assert_file 'app/assets/javascripts/application.js', %r{//= require components}
end
end
1 change: 1 addition & 0 deletions test/test_helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

require File.expand_path("../dummy/config/environment.rb", __FILE__)
require "rails/test_help"
require "rails/generators"
require "pathname"

CACHE_PATH = Pathname.new File.expand_path("../dummy/tmp/cache", __FILE__)
Expand Down