Skip to content

Commit 3a42694

Browse files
committed
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")
1 parent b6d3294 commit 3a42694

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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//= require react_ujs\n//= require components\n"
21+
22+
manifest = Pathname.new(destination_root).join('app/assets/javascripts',
23+
'application.js')
24+
25+
if manifest.exist?
26+
manifest_contents = File.read(manifest)
27+
28+
if manifest_contents.include? 'require turbolinks'
29+
inject_into_file manifest, require_react, {after: "//= require turbolinks\n"}
30+
elsif manifest_contents.include? 'require_tree'
31+
inject_into_file manifest, require_react, {before: '//= require_tree'}
32+
else
33+
append_file manifest, require_react
34+
end
35+
else
36+
create_file manifest, require_react
37+
end
38+
end
39+
40+
def create_components
41+
components_js = "//= require_tree ./components\n"
42+
components_file = File.join(*%w(app assets javascripts components.js))
43+
create_file components_file, components_js
44+
end
45+
end
46+
end
47+
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)