Skip to content

Commit 62f9a71

Browse files
committed
Merge pull request #64 from xionon/generators
[feedback requested] Create a installation generator
2 parents 6afb9f5 + 2c2f79f commit 62f9a71

File tree

5 files changed

+117
-0
lines changed

5 files changed

+117
-0
lines changed

README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ As with all gem dependencies, we strongly recommend adding `react-rails` to your
2626
gem 'react-rails', '~> 1.0.0.pre', github: 'reactjs/react-rails'
2727
```
2828

29+
Next, run the installation script.
30+
31+
```bash
32+
rails g react:install
33+
```
34+
35+
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.
36+
2937
## Usage
3038

3139
### react.js
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
module React
2+
module Generators
3+
class InstallGenerator < ::Rails::Generators::Base
4+
source_root File.expand_path '../../templates', __FILE__
5+
6+
desc 'Create default react.js folder layout and prep application.js'
7+
8+
class_option :skip_git,
9+
type: :boolean,
10+
aliases: '-g',
11+
default: false,
12+
desc: 'Skip Git keeps'
13+
14+
def create_directory
15+
empty_directory 'app/assets/javascripts/components'
16+
create_file 'app/assets/javascripts/components/.gitkeep' unless options[:skip_git]
17+
end
18+
19+
def inject_react
20+
require_react = "//= require react\n"
21+
22+
if manifest.exist?
23+
manifest_contents = File.read(manifest)
24+
25+
if manifest_contents.include? 'require turbolinks'
26+
inject_into_file manifest, require_react, {after: "//= require turbolinks\n"}
27+
elsif manifest_contents.include? 'require_tree'
28+
inject_into_file manifest, require_react, {before: '//= require_tree'}
29+
else
30+
append_file manifest, require_react
31+
end
32+
else
33+
create_file manifest, require_react
34+
end
35+
end
36+
37+
def inject_components
38+
inject_into_file manifest, "//= require components\n", {after: "//= require react\n"}
39+
end
40+
41+
def inject_react_ujs
42+
inject_into_file manifest, "//= require react_ujs\n", {after: "//= require react\n"}
43+
end
44+
45+
def create_components
46+
components_js = "//= require_tree ./components\n"
47+
components_file = File.join(*%w(app assets javascripts components.js))
48+
create_file components_file, components_js
49+
end
50+
51+
private
52+
53+
def manifest
54+
Pathname.new(destination_root).join('app/assets/javascripts', 'application.js')
55+
end
56+
end
57+
end
58+
end

lib/generators/templates/.gitkeep

Whitespace-only changes.
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
require 'test_helper'
2+
require 'generators/react/install_generator'
3+
4+
class InstallGeneratorTest < Rails::Generators::TestCase
5+
destination File.join(Rails.root, 'tmp', 'generator_test_output')
6+
tests React::Generators::InstallGenerator
7+
8+
def copy_directory(dir)
9+
source = Rails.root.join(dir)
10+
dest = Rails.root.join(destination_root, File.dirname(dir))
11+
12+
FileUtils.mkdir_p dest
13+
FileUtils.cp_r source, dest
14+
end
15+
16+
test "adds requires to `application.js`" do
17+
run_generator
18+
19+
assert_application_file_modified
20+
end
21+
22+
test "it modifes an existing 'application.js'" do
23+
copy_directory('app/assets/javascripts/application.js')
24+
run_generator
25+
assert_application_file_modified
26+
end
27+
28+
test "creates `application.js` if it doesn't exist" do
29+
copy_directory('app/assets/javascripts/application.js')
30+
File.delete destination_root + '/app/assets/javascripts/application.js'
31+
32+
run_generator
33+
34+
assert_application_file_modified
35+
end
36+
37+
test "modifies `application.js` it's empty" do
38+
File.write(destination_root + '/app/assets/javascripts/application.js', '')
39+
40+
run_generator
41+
42+
assert_application_file_modified
43+
end
44+
45+
def assert_application_file_modified
46+
assert_file 'app/assets/javascripts/application.js', %r{//= require react}
47+
assert_file 'app/assets/javascripts/application.js', %r{//= require react_ujs}
48+
assert_file 'app/assets/javascripts/application.js', %r{//= require components}
49+
end
50+
end

test/test_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
require File.expand_path("../dummy/config/environment.rb", __FILE__)
55
require "rails/test_help"
6+
require "rails/generators"
67
require "pathname"
78

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

0 commit comments

Comments
 (0)