Skip to content
8 changes: 8 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,14 @@ As with all gem dependencies, we strongly recommend adding `react-rails` to your
gem 'react-rails', '~> 1.0.0.pre', github: 'reactjs/react-rails'
```

Next, run the installation script.

```bash
rails g react:install
```

This will require `react.js`, `react_ujs.js`, and a `components.js` manifest file in application.js, and create a directory named `app/assets/javascripts/components` for you to store React components in.

## Usage

### react.js
Expand Down
58 changes: 58 additions & 0 deletions lib/generators/react/install_generator.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
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"

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 inject_components
inject_into_file manifest, "//= require components\n", {after: "//= require react\n"}
end

def inject_react_ujs
inject_into_file manifest, "//= require react_ujs\n", {after: "//= require react\n"}
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

private

def manifest
Pathname.new(destination_root).join('app/assets/javascripts', 'application.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