hyper-react 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +26 -4
  3. data/Appraisals +3 -2
  4. data/CHANGELOG.md +19 -0
  5. data/README.md +3 -3
  6. data/config.ru +2 -1
  7. data/gemfiles/opal_0.10_react_13.gemfile +13 -0
  8. data/gemfiles/opal_0.10_react_14.gemfile +13 -0
  9. data/gemfiles/opal_0.10_react_15.gemfile +13 -0
  10. data/gemfiles/opal_0.8_react_15.gemfile +1 -1
  11. data/gemfiles/opal_0.9_react_15.gemfile +1 -1
  12. data/hyper-react.gemspec +1 -1
  13. data/lib/generators/reactive_ruby/test_app/templates/assets/javascripts/components.rb +0 -1
  14. data/lib/hyper-react.rb +2 -1
  15. data/lib/react/api.rb +3 -2
  16. data/lib/react/component/class_methods.rb +2 -2
  17. data/lib/react/component/props_wrapper.rb +2 -2
  18. data/lib/react/element.rb +1 -1
  19. data/lib/react/ext/opal-jquery/element.rb +26 -0
  20. data/lib/react/state.rb +6 -5
  21. data/lib/react/test/matchers/render_html_matcher.rb +5 -0
  22. data/lib/react/test/session.rb +14 -23
  23. data/lib/react/test/utils.rb +25 -0
  24. data/lib/react/top_level.rb +12 -28
  25. data/lib/react/top_level_render.rb +29 -0
  26. data/lib/reactive-ruby/isomorphic_helpers.rb +2 -2
  27. data/lib/reactive-ruby/version.rb +1 -1
  28. data/spec/index.html.erb +1 -0
  29. data/spec/react/children_spec.rb +1 -1
  30. data/spec/react/component/base_spec.rb +2 -2
  31. data/spec/react/component_spec.rb +74 -73
  32. data/spec/react/dsl_spec.rb +24 -21
  33. data/spec/react/element_spec.rb +7 -7
  34. data/spec/react/event_spec.rb +2 -2
  35. data/spec/react/native_library_spec.rb +20 -24
  36. data/spec/react/observable_spec.rb +36 -1
  37. data/spec/react/opal_jquery_extensions_spec.rb +48 -46
  38. data/spec/react/param_declaration_spec.rb +8 -8
  39. data/spec/react/react_spec.rb +41 -28
  40. data/spec/react/test/rspec_spec.rb +1 -1
  41. data/spec/react/test/session_spec.rb +8 -20
  42. data/spec/react/test/utils_spec.rb +11 -28
  43. data/spec/react/top_level_component_spec.rb +7 -2
  44. data/spec/react/tutorial/tutorial_spec.rb +2 -2
  45. data/spec/reactive-ruby/component_loader_spec.rb +10 -4
  46. data/spec/reactive-ruby/isomorphic_helpers_spec.rb +6 -1
  47. data/spec/spec_helper.rb +2 -0
  48. data/spec/support/react/spec_helpers.rb +1 -21
  49. metadata +12 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b9734c02583fe5d4a7aee42da9c56733be0f9b1e
4
- data.tar.gz: a69ec787eaab3f82efcee4dbff6f74e02e941894
3
+ metadata.gz: 9ce1a3a5b1c6327f4acec7ec587a1bca16c12738
4
+ data.tar.gz: 9268144dd28594592f79c11a99812876fd24c905
5
5
  SHA512:
6
- metadata.gz: bc6d96170652d1b2f8d0dba3a8445ed44990ad276bdab89f9fba36c33f1198bb2c04036f8254f29daac210ef4281760e12aa17d45f4fe4e9da550641d4c2b058
7
- data.tar.gz: 5cd77c77cd1d87a0d9ea86ad2fa0ad3bbdc1058d7ea7b09cd9502f8ebc4a5806953383f27cc3155937682146692d4ca0279696638f00b8bfa4a8bcb7a9947b44
6
+ metadata.gz: 76a870924c4762816df9eda0f50edba5e4a65bc5158490f08c11953752cd022dae5da7ff67f4933f9cd0e7c28d10700822872a162245fb247b359fb581589929
7
+ data.tar.gz: 65fbb0f11b47c7bb1d5182d5a80e5109f5b748b7b87f43125b0937b7a773c09364956ae0a5dd44ba7965ff8e8acdd25ddad3043371e42d4915d2061e66412ae2
@@ -6,9 +6,8 @@ rvm:
6
6
  - jruby-19mode
7
7
  before_script:
8
8
  - phantomjs --version
9
- script:
10
- - bundle exec rake test_app
11
- - bundle exec rake
9
+ env:
10
+ - PHANTOMJS_VERSION=1.9.8
12
11
  gemfile:
13
12
  - gemfiles/opal_0.8_react_13.gemfile
14
13
  - gemfiles/opal_0.8_react_14.gemfile
@@ -16,7 +15,20 @@ gemfile:
16
15
  - gemfiles/opal_0.9_react_13.gemfile
17
16
  - gemfiles/opal_0.9_react_14.gemfile
18
17
  - gemfiles/opal_0.9_react_15.gemfile
19
-
18
+ cache:
19
+ directories:
20
+ - "travis_phantomjs"
21
+ before_install:
22
+ - "phantomjs --version"
23
+ - "export PATH=$PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64/bin:$PATH"
24
+ - "phantomjs --version"
25
+ - "if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then rm -rf $PWD/travis_phantomjs; mkdir -p $PWD/travis_phantomjs; fi"
26
+ - "if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then wget https://github.com/Medium/phantomjs/releases/download/v$PHANTOMJS_VERSION/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 -O $PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2; fi"
27
+ - "if [ $(phantomjs --version) != $PHANTOMJS_VERSION ]; then tar -xvf $PWD/travis_phantomjs/phantomjs-$PHANTOMJS_VERSION-linux-x86_64.tar.bz2 -C $PWD/travis_phantomjs; fi"
28
+ - "phantomjs --version"
29
+ script:
30
+ - bundle exec rake test_app
31
+ - bundle exec rake
20
32
  # These two setup seems to run indefinitely long
21
33
  # further investigation required.
22
34
  matrix:
@@ -27,3 +39,13 @@ matrix:
27
39
  gemfile: gemfiles/opal_0.9_react_14.gemfile
28
40
  - rvm: jruby-19mode
29
41
  gemfile: gemfiles/opal_0.9_react_15.gemfile
42
+ include:
43
+ - rvm: 2.1
44
+ env: PHANTOMJS_VERSION=2.1.1
45
+ gemfile: gemfiles/opal_0.10_react_13.gemfile
46
+ - rvm: 2.1
47
+ env: PHANTOMJS_VERSION=2.1.1
48
+ gemfile: gemfiles/opal_0.10_react_14.gemfile
49
+ - rvm: 2.1
50
+ env: PHANTOMJS_VERSION=2.1.1
51
+ gemfile: gemfiles/opal_0.10_react_15.gemfile
data/Appraisals CHANGED
@@ -1,12 +1,13 @@
1
- opal_versions = ['0.8', '0.9']
1
+ opal_versions = ['0.8', '0.9', '0.10']
2
2
  react_versions_map = {
3
3
  '13' => '~> 1.3.3',
4
4
  '14' => '~> 1.6.2',
5
- '15' => '~> 1.8.2'
5
+ '15' => '~> 1.10.0'
6
6
  }
7
7
  opal_rails_versions_map = {
8
8
  '0.8' => '~> 0.8.1',
9
9
  '0.9' => '~> 0.9.0',
10
+ '0.10' => '~> 0.9.0',
10
11
  }
11
12
 
12
13
  opal_versions.each do |opal_v|
@@ -18,6 +18,25 @@ Whitespace conventions:
18
18
  - 1 spaces before normal text
19
19
  -->
20
20
 
21
+ ## [0.11.0] - 2016-12-13
22
+
23
+ ### Changed
24
+
25
+ - The whole opal-activesuppport is not loaded by default now. This gave us about 18% size reduction on the built file. If your code rely on any of the module which is not required by hyper-react, you need to require it yourself. (#135)
26
+
27
+ ### Deprecated
28
+
29
+ - Current `React.render` behavior is deprecated. Require `"react/top_level_render"` to get the updated behavior. (#187)
30
+ - `React.is_valid_element` is deprecated in favor of `React.is_valid_element?`.
31
+ - `expect(component).to render('<div />')` is now deprecated in favor of `expect(component).to render_static_html('<div />')`, which is much clearer.
32
+
33
+ ### Fixed
34
+
35
+ - `ReferenceError: window is not defined` error in prerender context with react-rails v1.10.0. (#196)
36
+ - State might not be updated using `React::Observable` from a param. (#175)
37
+ - Arity checking failed for `_react_param_conversion` & `React::Element#initialize` (#167)
38
+
39
+
21
40
  ## [0.10.0] - 2016-10-30
22
41
 
23
42
  ### Changed
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # hyper-react
2
2
 
3
3
  [![Join the chat at https://gitter.im/reactrb/chat](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/reactrb/chat?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
- [![Build Status](https://travis-ci.org/ruby-hyperloop/reactrb.svg?branch=master)](https://travis-ci.org/reactrb/reactrb)
4
+ [![Build Status](https://travis-ci.org/ruby-hyperloop/hyper-react.svg?branch=master)](https://travis-ci.org/ruby-hyperloop/hyper-react)
5
5
  [![Code Climate](https://codeclimate.com/github/reactrb/reactrb/badges/gpa.svg)](https://codeclimate.com/github/reactrb/reactrb)
6
- [![Gem Version](https://badge.fury.io/rb/reactrb.svg)](https://badge.fury.io/rb/reactrb)
6
+ [![Gem Version](https://badge.fury.io/rb/hyper-react.svg)](https://badge.fury.io/rb/hyper-react)
7
7
 
8
8
  **hyper-react is an [Opal Ruby](http://opalrb.org) wrapper of
9
9
  [React.js library](https://facebook.github.io/react)**.
@@ -107,7 +107,7 @@ Note that these are very simple examples, for the purpose of showing how to conf
107
107
 
108
108
  1. Run `bundle exec rake test_app` to generate a dummy test app.
109
109
  2. `bundle exec appraisal install` to generate separate gemfiles for different environments.
110
- 2. `bundle exec appraisal opal-0.9-react-15 rake` to run test for opal-0.9 & react-v0.15.
110
+ 2. `bundle exec appraisal opal-0.10-react-15 rake` to run test for opal-0.10 & react-v0.15.
111
111
 
112
112
  ## Contributions
113
113
 
data/config.ru CHANGED
@@ -2,7 +2,8 @@ require 'bundler'
2
2
  Bundler.require
3
3
 
4
4
  require "opal/rspec"
5
- require "opal-jquery"
5
+
6
+ Opal::Config.arity_check_enabled = true
6
7
 
7
8
  if Opal::RSpec.const_defined?("SprocketsEnvironment")
8
9
  sprockets_env = Opal::RSpec::SprocketsEnvironment.new
@@ -0,0 +1,13 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "opal", "~> 0.10.0"
6
+ gem "opal-rails", "~> 0.9.0"
7
+ gem "react-rails", "~> 1.3.3", :require => false
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec :path => "../"
@@ -0,0 +1,13 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "opal", "~> 0.10.0"
6
+ gem "opal-rails", "~> 0.9.0"
7
+ gem "react-rails", "~> 1.6.2", :require => false
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec :path => "../"
@@ -0,0 +1,13 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "opal", "~> 0.10.0"
6
+ gem "opal-rails", "~> 0.9.0"
7
+ gem "react-rails", "~> 1.10.0", :require => false
8
+
9
+ group :development do
10
+ gem "appraisal"
11
+ end
12
+
13
+ gemspec :path => "../"
@@ -4,7 +4,7 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "opal", "~> 0.8.0"
6
6
  gem "opal-rails", "~> 0.8.1"
7
- gem "react-rails", "~> 1.8.2", :require => false
7
+ gem "react-rails", "~> 1.10.0", :require => false
8
8
 
9
9
  group :development do
10
10
  gem "appraisal"
@@ -4,7 +4,7 @@ source "https://rubygems.org"
4
4
 
5
5
  gem "opal", "~> 0.9.0"
6
6
  gem "opal-rails", "~> 0.9.0"
7
- gem "react-rails", "~> 1.8.2", :require => false
7
+ gem "react-rails", "~> 1.10.0", :require => false
8
8
 
9
9
  group :development do
10
10
  gem "appraisal"
@@ -21,7 +21,7 @@ Gem::Specification.new do |s|
21
21
  s.add_dependency 'opal', '>= 0.8.0'
22
22
  s.add_dependency 'opal-activesupport', '>= 0.2.0'
23
23
  s.add_dependency 'react-rails'
24
- s.add_development_dependency 'rake'
24
+ s.add_development_dependency 'rake', '< 11.0'
25
25
  s.add_development_dependency 'rspec-rails', '3.3.3'
26
26
  s.add_development_dependency 'timecop'
27
27
  s.add_development_dependency 'opal-rspec'
@@ -1,4 +1,3 @@
1
1
  require 'opal'
2
- require 'react/react-source'
3
2
  require 'hyper-react'
4
3
  require_tree './components'
@@ -1,7 +1,7 @@
1
1
 
2
2
 
3
3
  if RUBY_ENGINE == 'opal'
4
- if `window.React === undefined || window.React.version === undefined`
4
+ if `Opal.global.React === undefined || Opal.global.React.version === undefined`
5
5
  raise [
6
6
  "No React.js Available",
7
7
  "",
@@ -28,6 +28,7 @@ if RUBY_ENGINE == 'opal'
28
28
  require 'react/rendering_context'
29
29
  require 'react/state'
30
30
  require 'react/object'
31
+ require "react/ext/opal-jquery/element"
31
32
  require 'reactive-ruby/isomorphic_helpers'
32
33
  require 'rails-helpers/top_level_rails_component'
33
34
  require 'reactive-ruby/version'
@@ -27,14 +27,15 @@ module React
27
27
  (`!!#{component}.prototype.isReactComponent` ||
28
28
  `!!#{component}.prototype.render`)
29
29
  is_functional_component = `typeof #{component} === "function"`
30
- is_not_using_react_v13 = `!window.React.version.match(/0\.13/)`
30
+ is_not_using_react_v13 = `!Opal.global.React.version.match(/0\.13/)`
31
31
  unless is_component_class || (is_not_using_react_v13 && is_functional_component)
32
32
  raise 'does not appear to be a native react component'
33
33
  end
34
34
  component
35
35
  end
36
36
 
37
- def self.native_react_component?(name)
37
+ def self.native_react_component?(name = nil)
38
+ return false unless name
38
39
  eval_native_react_component(name)
39
40
  rescue
40
41
  nil
@@ -181,8 +181,8 @@ module React
181
181
  def export_component(opts = {})
182
182
  export_name = (opts[:as] || name).split('::')
183
183
  first_name = export_name.first
184
- Native(`window`)[first_name] = add_item_to_tree(
185
- Native(`window`)[first_name],
184
+ Native(`Opal.global`)[first_name] = add_item_to_tree(
185
+ Native(`Opal.global`)[first_name],
186
186
  [React::API.create_native_react_class(self)] + export_name[1..-1].reverse
187
187
  ).to_n
188
188
  end
@@ -35,11 +35,11 @@ module React
35
35
  define_method("#{name}") do
36
36
  fetch_from_cache(name) do
37
37
  if param_type.respond_to? :_react_param_conversion
38
- param_type._react_param_conversion props[name]
38
+ param_type._react_param_conversion props[name], nil
39
39
  elsif param_type.is_a?(Array) &&
40
40
  param_type[0].respond_to?(:_react_param_conversion)
41
41
  props[name].collect do |param|
42
- param_type[0]._react_param_conversion param
42
+ param_type[0]._react_param_conversion param, nil
43
43
  end
44
44
  else
45
45
  props[name]
@@ -25,7 +25,7 @@ module React
25
25
 
26
26
  attr_accessor :waiting_on_resources
27
27
 
28
- def initialize(native_element, type, properties, block)
28
+ def initialize(native_element, type = nil, properties = {}, block = nil)
29
29
  @type = type
30
30
  @properties = (`typeof #{properties} === 'undefined'` ? nil : properties) || {}
31
31
  @block = block
@@ -0,0 +1,26 @@
1
+ Element.instance_eval do
2
+ def self.find(selector)
3
+ selector = begin
4
+ selector.dom_node
5
+ rescue
6
+ selector
7
+ end if `#{selector}.$dom_node !== undefined`
8
+ `$(#{selector})`
9
+ end
10
+
11
+ def self.[](selector)
12
+ find(selector)
13
+ end
14
+
15
+ define_method :render do |container = nil, params = {}, &block|
16
+ if `#{self.to_n}._reactrb_component_class === undefined`
17
+ `#{self.to_n}._reactrb_component_class = #{Class.new(React::Component::Base)}`
18
+ end
19
+ klass = `#{self.to_n}._reactrb_component_class`
20
+ klass.class_eval do
21
+ render(container, params, &block)
22
+ end
23
+
24
+ React.render(React.create_element(`#{self.to_n}._reactrb_component_class`), self)
25
+ end
26
+ end if Object.const_defined?('Element')
@@ -15,15 +15,16 @@ module React
15
15
 
16
16
  def method_missing(method, *args)
17
17
  if match = method.match(/^(.+)\!$/)
18
+ key_name = $1
18
19
  if args.count > 0
19
20
  current_value = State.get_state(@from, match[1])
20
- State.set_state(@from, $1, args[0])
21
+ State.set_state(@from, key_name, args[0])
21
22
  current_value
22
23
  else
23
24
  current_state = State.get_state(@from, match[1])
24
- State.set_state(@from, $1, current_state)
25
+ State.set_state(@from, key_name, current_state)
25
26
  Observable.new(current_state) do |update|
26
- State.set_state(@from, $1, update)
27
+ State.set_state(@from, key_name, update)
27
28
  end
28
29
  end
29
30
  else
@@ -158,7 +159,7 @@ module React
158
159
  end
159
160
 
160
161
  def set_state_context_to(observer, rendering = nil) # wrap all execution that may set or get states in a block so we know which observer is executing
161
- if `typeof window.reactive_ruby_timing !== 'undefined'`
162
+ if `typeof Opal.global.reactive_ruby_timing !== 'undefined'`
162
163
  @nesting_level = (@nesting_level || 0) + 1
163
164
  start_time = Time.now.to_f
164
165
  observer_name = (observer.class.respond_to?(:name) ? observer.class.name : observer.to_s) rescue "object:#{observer.object_id}"
@@ -171,7 +172,7 @@ module React
171
172
  ensure
172
173
  @current_observer = saved_current_observer
173
174
  @rendering_level -= 1 if rendering
174
- @nesting_level = [0, @nesting_level - 1].max if `typeof window.reactive_ruby_timing !== 'undefined'`
175
+ @nesting_level = [0, @nesting_level - 1].max if `typeof Opal.global.reactive_ruby_timing !== 'undefined'`
175
176
  return_value
176
177
  end
177
178
 
@@ -41,7 +41,12 @@ module React
41
41
  end
42
42
  end
43
43
 
44
+ def render_static_html(*args)
45
+ RenderHTMLMatcher.new(*args)
46
+ end
47
+
44
48
  def render(*args)
49
+ %x{ console.error("Warning: `render` matcher is deprecated in favor of `render_static_html`."); }
45
50
  RenderHTMLMatcher.new(*args)
46
51
  end
47
52
  end
@@ -1,8 +1,7 @@
1
1
  module React
2
2
  module Test
3
3
  class Session
4
- DSL_METHODS = %i[mount instance native element update_params
5
- force_update! html].freeze
4
+ DSL_METHODS = %i[mount instance update_params html].freeze
6
5
 
7
6
  def mount(component_klass, params = {})
8
7
  @element = React.create_element(component_klass, params)
@@ -11,35 +10,27 @@ module React
11
10
 
12
11
  def instance
13
12
  unless @instance
14
- @native = Native(`React.addons.TestUtils.renderIntoDocument(#{element.to_n})`)
15
- @instance = `#{@native.to_n}._getOpalInstance()`
13
+ @container = `document.createElement('div')`
14
+ @instance = React.render(@element, @container)
16
15
  end
17
16
  @instance
18
17
  end
19
18
 
20
- def native
21
- @native
22
- end
23
-
24
- def element
25
- @element
26
- end
27
-
28
- def update_params(params)
29
- cloned_element = React::Element.new(`React.cloneElement(#{self.element.to_n}, #{params.to_n})`)
30
- prev_container = `#{self.instance.dom_node}.parentNode`
31
- React.render(cloned_element, prev_container)
19
+ def update_params(params, &block)
20
+ cloned_element = React::Element.new(`React.cloneElement(#{@element.to_n}, #{params.to_n})`)
21
+ React.render(cloned_element, @container, &block)
32
22
  nil
33
23
  end
34
24
 
35
- def force_update!
36
- native.force_update!
37
- end
38
-
39
25
  def html
40
- # How can we get the current ReactElement w/o violating private APIs?
41
- elem = Native(native[:_reactInternalInstance][:_currentElement])
42
- React.render_to_static_markup(elem)
26
+ html = `#@container.innerHTML`
27
+ %x{
28
+ var REGEX_REMOVE_ROOT_IDS = /\s?data-reactroot="[^"]*"/g;
29
+ var REGEX_REMOVE_IDS = /\s?data-reactid="[^"]+"/g;
30
+ html = html.replace(REGEX_REMOVE_ROOT_IDS, '');
31
+ html = html.replace(REGEX_REMOVE_IDS, '');
32
+ }
33
+ return html
43
34
  end
44
35
  end
45
36
  end
@@ -0,0 +1,25 @@
1
+ module React
2
+ module Test
3
+ class Utils
4
+ `var ReactTestUtils = React.addons.TestUtils`
5
+
6
+ def self.render_into_document(element, options = {})
7
+ raise "You should pass a valid React::Element" unless React.is_valid_element?(element)
8
+ native_instance = `ReactTestUtils.renderIntoDocument(#{element.to_n})`
9
+
10
+ if `#{native_instance}._getOpalInstance !== undefined`
11
+ `#{native_instance}._getOpalInstance()`
12
+ elsif `ReactTestUtils.isDOMComponent(#{native_instance}) && React.findDOMNode !== undefined`
13
+ `React.findDOMNode(#{native_instance})`
14
+ else
15
+ native_instance
16
+ end
17
+ end
18
+
19
+ def self.simulate(event, element, params = {})
20
+ simulator = Native(`ReactTestUtils.Simulate`)
21
+ simulator[event.to_s].call(`element.$dom_node === undefined` ? element : element.dom_node, params)
22
+ end
23
+ end
24
+ end
25
+ end