Skip to content

Minimize rails dependency #558

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 4 commits into from
Jun 27, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ gemfile:
- gemfiles/rails_4.2_sprockets_4.gemfile
- gemfiles/rails_4.1.gemfile
- gemfiles/rails_5.gemfile
- gemfiles/rails_5_no_sprockets.gemfile
- gemfiles/rails_5_sprockets_4.gemfile

matrix:
Expand All @@ -33,6 +34,8 @@ matrix:
gemfile: gemfiles/rails_4.2_sprockets_4.gemfile
- rvm: 2.1
gemfile: gemfiles/rails_5.gemfile
- rvm: 2.1
gemfile: gemfiles/rails_5_no_sprockets.gemfile
- rvm: 2.1
gemfile: gemfiles/rails_5_sprockets_4.gemfile
- rvm: jruby-9.0.1.0
Expand Down
2 changes: 1 addition & 1 deletion gemfiles/rails_5.gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

source "http://rubygems.org"

gem "rails", "~> 5.0.0.beta2"
gem "rails", "~> 5.0.0.rc2"
gem "turbolinks", "~> 5.0.0.beta"

gemspec :path => "../"
7 changes: 7 additions & 0 deletions gemfiles/rails_5_no_sprockets.gemfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# This file was generated by Appraisal

source "http://rubygems.org"

gem "rails", "~> 5.0.0.rc2"

gemspec :path => "../"
2 changes: 1 addition & 1 deletion gemfiles/rails_5_sprockets_4.gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

source "http://rubygems.org"

gem "rails", "~> 5.0.0.beta2"
gem "rails", "~> 5.0.0.rc2"
gem "sprockets", "~> 4.0.x"
gem "turbolinks", "~> 5.0.0.beta"

Expand Down
32 changes: 20 additions & 12 deletions lib/react/rails/railtie.rb
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,10 @@ class Railtie < ::Rails::Railtie
addons: app.config.react.addons,
})

sprockets_env = app.assets || app.config.assets # sprockets-rails 3.x attaches this at a different config
sprockets_env.version = [sprockets_env.version, "react-#{asset_variant.react_build}",].compact.join('-')
sprockets_env = app.assets || app.config.try(:assets) # sprockets-rails 3.x attaches this at a different config
if !sprockets_env.nil?
sprockets_env.version = [sprockets_env.version, "react-#{asset_variant.react_build}",].compact.join('-')
end

end

Expand All @@ -70,8 +72,10 @@ class Railtie < ::Rails::Railtie
addons: app.config.react.addons,
})

app.config.assets.paths << asset_variant.react_directory
app.config.assets.paths << asset_variant.jsx_directory
if app.config.respond_to?(:assets)
app.config.assets.paths << asset_variant.react_directory
app.config.assets.paths << asset_variant.jsx_directory
end
end

config.after_initialize do |app|
Expand All @@ -93,14 +97,18 @@ class Railtie < ::Rails::Railtie
end

initializer "react_rails.setup_engine", :group => :all do |app|
sprockets_env = app.assets || Sprockets # Sprockets 3.x expects this in a different place
if Gem::Version.new(Sprockets::VERSION) >= Gem::Version.new("4.x")
sprockets_env.register_mime_type("application/jsx", extensions: [".jsx", ".js.jsx", ".es.jsx", ".es6.jsx"])
sprockets_env.register_transformer("application/jsx", "application/javascript", React::JSX::Processor)
elsif Gem::Version.new(Sprockets::VERSION) >= Gem::Version.new("3.0.0")
sprockets_env.register_engine(".jsx", React::JSX::Processor, mime_type: "application/javascript")
else
sprockets_env.register_engine(".jsx", React::JSX::Template)
# Sprockets 3.x expects this in a different place
sprockets_env = app.assets || defined?(Sprockets) && Sprockets

if !sprockets_env.nil?
if Gem::Version.new(Sprockets::VERSION) >= Gem::Version.new("4.x")
sprockets_env.register_mime_type("application/jsx", extensions: [".jsx", ".js.jsx", ".es.jsx", ".es6.jsx"])
sprockets_env.register_transformer("application/jsx", "application/javascript", React::JSX::Processor)
elsif Gem::Version.new(Sprockets::VERSION) >= Gem::Version.new("3.0.0")
sprockets_env.register_engine(".jsx", React::JSX::Processor, mime_type: "application/javascript")
else
sprockets_env.register_engine(".jsx", React::JSX::Template)
end
end
end
end
Expand Down
3 changes: 2 additions & 1 deletion react-rails.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,12 @@ Gem::Specification.new do |s|
s.add_development_dependency 'poltergeist', '>= 0.3.3'
s.add_development_dependency 'test-unit', '~> 2.5'
s.add_development_dependency 'turbolinks', '>= 2.0.0'
s.add_development_dependency 'rails', '>= 3.2'

s.add_dependency 'coffee-script-source', '~>1.8'
s.add_dependency 'connection_pool'
s.add_dependency 'execjs'
s.add_dependency 'rails', '>= 3.2'
s.add_dependency 'railties', '>= 3.2'
s.add_dependency 'tilt'
s.add_dependency 'babel-transpiler', '>=0.7.0'

Expand Down
5 changes: 5 additions & 0 deletions test/dummy/app/assets/javascripts/components/PlainJSTodo.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
var Todo = React.createClass({
render: function() {
return React.createElement("li", null, this.props.todo)
}
})
13 changes: 10 additions & 3 deletions test/dummy/config/application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@
# require "active_record/railtie"
require "action_controller/railtie"
require "action_mailer/railtie"
require "sprockets/railtie"

# Test no-sprockets environment by testing the gemfile name
SKIP_SPROCKETS = ENV["BUNDLE_GEMFILE"] =~ /no_sprockets/
if !SKIP_SPROCKETS
require "sprockets/railtie"
end

require "rails/test_unit/railtie"

# Make sure gems in development group are required, for example, react-rails and turbolinks.
Expand All @@ -27,7 +33,8 @@ class Application < Rails::Application
# config.i18n.default_locale = :de
config.react.variant = :production
config.react.addons = false

config.assets.enabled = true
if !SKIP_SPROCKETS
config.assets.enabled = true
end
end
end
4 changes: 3 additions & 1 deletion test/dummy/config/environments/test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
# we need this to reload the jsx transformer when different version is dropped in
config.cache_classes = false
config.reload_plugins = true
config.assets.cache_store = :null_store
if !SKIP_SPROCKETS
config.assets.cache_store = :null_store
end

# Do not eager load code on boot. This avoids loading your whole application
# just for the purpose of running a single test. If you are using a tool that
Expand Down
97 changes: 49 additions & 48 deletions test/react/jsx/jsx_transformer_test.rb
Original file line number Diff line number Diff line change
@@ -1,63 +1,64 @@
require 'test_helper'

class JSXTransformerTest < ActionDispatch::IntegrationTest
setup do
reset_transformer
React::JSX.transformer_class = React::JSX::JSXTransformer
manually_expire_asset('JSXTransformer.js')
end
when_sprockets_available do
class JSXTransformerTest < ActionDispatch::IntegrationTest
setup do
reset_transformer
React::JSX.transformer_class = React::JSX::JSXTransformer
manually_expire_asset('JSXTransformer.js')
end

teardown do
reset_transformer
manually_expire_asset('JSXTransformer.js')
end
teardown do
reset_transformer
manually_expire_asset('JSXTransformer.js')
end

test 'can use dropped-in version of JSX transformer' do
hidden_path = Rails.root.join("vendor/assets/react/JSXTransformer__.js")
replacing_path = Rails.root.join("vendor/assets/react/JSXTransformer.js")
test 'can use dropped-in version of JSX transformer' do
hidden_path = Rails.root.join("vendor/assets/react/JSXTransformer__.js")
replacing_path = Rails.root.join("vendor/assets/react/JSXTransformer.js")

FileUtils.cp hidden_path, replacing_path
manually_expire_asset('example3.js')
FileUtils.cp hidden_path, replacing_path
manually_expire_asset('example3.js')

get '/assets/example3.js'
FileUtils.rm replacing_path
get '/assets/example3.js'
FileUtils.rm replacing_path

assert_response :success
assert_equal 'test_confirmation_token_jsx_transformed;', @response.body.strip
end
assert_response :success
assert_equal 'test_confirmation_token_jsx_transformed;', @response.body.strip
end

test 'accepts harmony: true option' do
React::JSX.transform_options = {harmony: true}
get '/assets/harmony_example.js'
assert_response :success
assert_match(/generateGreeting:\s*function\(\)/, @response.body, "object literal methods")
assert_match(/React.__spread/, @response.body, "spreading props")
assert_match(/Your greeting is: '" \+ insertedGreeting \+ "'/, @response.body, "string interpolation")
assert_match(/active=\$__0\.active/, @response.body, "destructuring assignment")
end
test 'accepts harmony: true option' do
React::JSX.transform_options = {harmony: true}
get '/assets/harmony_example.js'
assert_response :success
assert_match(/generateGreeting:\s*function\(\)/, @response.body, "object literal methods")
assert_match(/React.__spread/, @response.body, "spreading props")
assert_match(/Your greeting is: '" \+ insertedGreeting \+ "'/, @response.body, "string interpolation")
assert_match(/active=\$__0\.active/, @response.body, "destructuring assignment")
end

test 'accepts strip_types: true option' do
React::JSX.transform_options = {strip_types: true, harmony: true}
get '/assets/flow_types_example.js'
assert_response :success
assert_match(/\(i\s*,\s*name\s*\)\s*\{/, @response.body, "type annotations are removed")
end
test 'accepts strip_types: true option' do
React::JSX.transform_options = {strip_types: true, harmony: true}
get '/assets/flow_types_example.js'
assert_response :success
assert_match(/\(i\s*,\s*name\s*\)\s*\{/, @response.body, "type annotations are removed")
end

test 'accepts asset_path: option' do
hidden_path = Rails.root.join("vendor/assets/react/JSXTransformer__.js")
custom_path = Rails.root.join("vendor/assets/react/custom")
replacing_path = custom_path.join("CustomTransformer.js")
test 'accepts asset_path: option' do
hidden_path = Rails.root.join("vendor/assets/react/JSXTransformer__.js")
custom_path = Rails.root.join("vendor/assets/react/custom")
replacing_path = custom_path.join("CustomTransformer.js")

React::JSX.transform_options = {asset_path: "custom/CustomTransformer.js"}
React::JSX.transform_options = {asset_path: "custom/CustomTransformer.js"}

FileUtils.mkdir_p(custom_path)
FileUtils.cp(hidden_path, replacing_path)
manually_expire_asset('example3.js')
get '/assets/example3.js'
FileUtils.mkdir_p(custom_path)
FileUtils.cp(hidden_path, replacing_path)
manually_expire_asset('example3.js')
get '/assets/example3.js'

FileUtils.rm_rf custom_path
assert_response :success
assert_equal 'test_confirmation_token_jsx_transformed;', @response.body.strip
FileUtils.rm_rf custom_path
assert_response :success
assert_equal 'test_confirmation_token_jsx_transformed;', @response.body.strip
end
end

end
78 changes: 40 additions & 38 deletions test/react/jsx_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -26,52 +26,54 @@ def transform(code)
end
end

class JSXTransformTest < ActionDispatch::IntegrationTest
setup do
reset_transformer
end
when_sprockets_available do
class JSXTransformTest < ActionDispatch::IntegrationTest
setup do
reset_transformer
end

teardown do
reset_transformer
end
teardown do
reset_transformer
end

test 'asset pipeline should transform JSX' do
manually_expire_asset('example.js')
get '/assets/example.js'
assert_response :success
assert_compiled_javascript_matches(EXPECTED_JS, @response.body)
end
test 'asset pipeline should transform JSX' do
manually_expire_asset('example.js')
get '/assets/example.js'
assert_response :success
assert_compiled_javascript_matches(EXPECTED_JS, @response.body)
end

test 'asset pipeline should transform JSX + Coffeescript' do
manually_expire_asset('example2.js')
get '/assets/example2.js'
assert_response :success
assert_compiled_javascript_matches(EXPECTED_JS_2, @response.body)
end
test 'asset pipeline should transform JSX + Coffeescript' do
manually_expire_asset('example2.js')
get '/assets/example2.js'
assert_response :success
assert_compiled_javascript_matches(EXPECTED_JS_2, @response.body)
end

test 'use a custom transformer' do
React::JSX.transformer_class = NullTransformer
manually_expire_asset('example2.js')
get '/assets/example2.js'
test 'use a custom transformer' do
React::JSX.transformer_class = NullTransformer
manually_expire_asset('example2.js')
get '/assets/example2.js'

assert_equal "TRANSFORMED CODE!;\n", @response.body
end
assert_equal "TRANSFORMED CODE!;\n", @response.body
end

def test_babel_transformer_accepts_babel_transformation_options
React::JSX.transform_options = {blacklist: ['spec.functionName', 'validation.react', "strict"]}
manually_expire_asset('example.js')
get '/assets/example.js'
assert_response :success
def test_babel_transformer_accepts_babel_transformation_options
React::JSX.transform_options = {blacklist: ['spec.functionName', 'validation.react', "strict"]}
manually_expire_asset('example.js')
get '/assets/example.js'
assert_response :success

assert [email protected]?('strict')
end
assert [email protected]?('strict')
end


# Different processors may generate slightly different outputs,
# as some version inserts an extra "\n" at the beginning.
# Because appraisal is used, multiple versions of coffee-script are treated
# together. Remove all spaces to make test pass.
def assert_compiled_javascript_matches(javascript, expectation)
assert_equal expectation.gsub(/\s/, ''), javascript.gsub(/\s/, '')
# Different processors may generate slightly different outputs,
# as some version inserts an extra "\n" at the beginning.
# Because appraisal is used, multiple versions of coffee-script are treated
# together. Remove all spaces to make test pass.
def assert_compiled_javascript_matches(javascript, expectation)
assert_equal expectation.gsub(/\s/, ''), javascript.gsub(/\s/, '')
end
end
end
Loading