rwr-react_router 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b7b462334865192fbb07b80e8621277f714c2288
4
+ data.tar.gz: 43242f975b90f04020d90dcec54c89b1e5a8c416
5
+ SHA512:
6
+ metadata.gz: ee235dca96f5b32928e23f6aeb0145a9d6728cb1749a26094aff66a29cd9004e921dcbe4afbab45ba3bd817b13a17cdb8a8503c88a3f196ba5c6bc07a1fead0d
7
+ data.tar.gz: 00a6283039ef9f1ec8802a465b7e1b4a9116750615241d08d8f1ba33ef0eae8b1f07238390c053a84e38a0b82adf3b02838384af8b871c27cf51b4a9fb9431cb
@@ -0,0 +1,3 @@
1
+ {
2
+ "presets": ["es2015", "react"]
3
+ }
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /js/lib/
11
+
12
+ node_modules
13
+ rwr-react_router-*.gem
@@ -0,0 +1 @@
1
+ js/src/
@@ -0,0 +1,33 @@
1
+ branches:
2
+ except:
3
+ - docs
4
+
5
+ language: ruby
6
+
7
+ cache:
8
+ bundler: true
9
+ directories:
10
+ - node_modules
11
+
12
+ matrix:
13
+ include:
14
+ - rvm: 2.2.4
15
+ gemfile: spec/rails4_dummy_app/Gemfile
16
+ env: TEST_SUITE=rails4
17
+ - rvm: 2.2.4
18
+ gemfile: Gemfile
19
+ env: TEST_SUITE=gem
20
+ - rvm: 2.2.4
21
+ env: TEST_SUITE=node
22
+
23
+ before_script:
24
+ - npm install -g npm@^2.0
25
+ - npm install -g webpack@^1.12.1
26
+ - bundle exec rake setup:$TEST_SUITE
27
+ - 'export CHROME_BIN=chromium-browser'
28
+ - "export DISPLAY=:99.0" # Setup display for selenium driver
29
+ - "sh -e /etc/init.d/xvfb start"
30
+ - sleep 3 # give xvfb some time to start
31
+
32
+ script:
33
+ - bundle exec rake test:$TEST_SUITE
@@ -0,0 +1 @@
1
+ ## UNRELEASED
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rwr-react_router.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015 Rafał Gawlik
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,56 @@
1
+ rwr-react_router
2
+ ====
3
+
4
+ [react-router](https://github.com/reactjs/react-router) integration plugin for [react_webpack_rails](https://github.com/netguru/react_webpack_rails).
5
+
6
+ This integration makes it possible to render previously created router in rails view.
7
+
8
+ ## Setup
9
+ * Add `rwr-react_router` to your Gemfile:
10
+
11
+ ```
12
+ gem 'rwr-react_router'
13
+ ```
14
+
15
+ * Install rwr-react-router package:
16
+ ```
17
+ $ npm install --save rwr-react-router
18
+ ```
19
+
20
+ ## Usage
21
+ * Make sure that you have `react-router` installed.
22
+ * Import RWRReactRouter in your index.js file:
23
+ ```js
24
+ import RWRReactRouter from 'rwr-react-router';
25
+ ```
26
+
27
+ * Register one of your routers:
28
+ ```js
29
+ RWRReactRouter.register('MyRouter', MyRouter);
30
+ ```
31
+
32
+ * In chosen view, render your router:
33
+ ```erb
34
+ <%= react_router('MyRouter') %>
35
+ ```
36
+
37
+ ## Contributing
38
+ ## Issues
39
+
40
+ Found a bug in rwr-react_router? Open an issue on [GitHub Issues](https://github.com/netguru/rwr-react_router/issues).
41
+
42
+ ## Pull requests
43
+
44
+ Interested in contributing to rwr-react_router? That's great, and thank you for your interest!
45
+
46
+ After checking out the repo, run `bundle exec rake setup:all` to install every environment dependencies.
47
+
48
+ To get your contributions accepted, make sure:
49
+
50
+ * All the tests pass. Run `bundle exec rake test:all`.
51
+ * Any new code paths you've added are covered by tests.
52
+ * Describe your changes in pull request (what it adds, how to migrate from previous version etc.)
53
+
54
+ ## License
55
+
56
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,49 @@
1
+ require 'bundler/gem_tasks'
2
+ require 'rspec/core/rake_task'
3
+
4
+ namespace :test do
5
+ desc 'Run all tests'
6
+ task all: [:node, :gem, :rails4] do
7
+ puts 'Finished all tests, yay!'
8
+ end
9
+
10
+ desc 'Run node package tests'
11
+ task :node do
12
+ sh %Q(npm test)
13
+ end
14
+
15
+ desc 'Run gem tests'
16
+ task :gem do
17
+ sh %Q(bundle exec rspec spec/rwr-react_router.rb)
18
+ end
19
+ desc 'Run rspec for rails4 application'
20
+ task :rails4 do
21
+ Bundler.with_clean_env do
22
+ sh %Q(cd spec/rails4_dummy_app && npm run build && bundle exec rspec)
23
+ end
24
+ end
25
+ end
26
+
27
+ task default: 'test:all'
28
+
29
+ namespace :setup do
30
+ desc 'Prepare every environment'
31
+ task all: [:node, :gem, :rails4] do
32
+ puts 'Prepared all, yay!'
33
+ end
34
+
35
+ desc 'Prepare node module dependencies'
36
+ task :node do
37
+ sh %Q(npm install)
38
+ end
39
+
40
+ desc 'Prepare gem dependencies'
41
+ task :gem do
42
+ sh %Q(bundle install)
43
+ end
44
+
45
+ desc 'Prepare rails4 test app dependencies'
46
+ task :rails4 do
47
+ sh %Q(npm install && cd spec/rails4_dummy_app && npm install && bundle install)
48
+ end
49
+ end
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "rwr-react_router"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
@@ -0,0 +1,5 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle exec rake setup:all
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "airbnb",
3
+ "globals": {
4
+ "__RWR_ENV__": true
5
+ },
6
+ "env": {
7
+ "mocha": true
8
+ },
9
+ "rules": {
10
+ func-names: 0
11
+ }
12
+ }
@@ -0,0 +1,51 @@
1
+ import ReactDOM from 'react-dom';
2
+ import VERSION from './version';
3
+
4
+ class ReactRouterIntegration {
5
+ constructor() {
6
+ this.version = VERSION;
7
+ this.routers = {};
8
+ this.enabled = false;
9
+ this.register = this.register.bind(this);
10
+ this.get = this.get.bind(this);
11
+ this.render = this.render.bind(this);
12
+ }
13
+
14
+ register(name, route) {
15
+ this.routers[name] = route;
16
+ }
17
+
18
+ get(name) {
19
+ return this.routers[name];
20
+ }
21
+
22
+ render(name, node) {
23
+ if (this.enabled === true) {
24
+ throw new Error(
25
+ `Error when rendering ${name}\n
26
+ \trenderRouter: can't render more than one router on the same page.`
27
+ );
28
+ }
29
+ this.enabled = true;
30
+ ReactDOM.render(this.get(name), node);
31
+ }
32
+
33
+ unmount(node) {
34
+ ReactDOM.unmountComponentAtNode(node);
35
+ this.enabled = false;
36
+ }
37
+
38
+ get integrationWrapper() {
39
+ return {
40
+ mount: function _mount(node, payload) {
41
+ this.render(payload.name, node);
42
+ }.bind(this),
43
+
44
+ unmount: function _unmount(node) {
45
+ this.unmount(node);
46
+ }.bind(this),
47
+ };
48
+ }
49
+ }
50
+
51
+ export default new ReactRouterIntegration;
@@ -0,0 +1 @@
1
+ export default '0.1.0';
@@ -0,0 +1,139 @@
1
+ import expect, { spyOn } from 'expect';
2
+ import ReactDOM from 'react-dom';
3
+ import subject from '../src/index';
4
+
5
+ const HelloRouter = {};
6
+
7
+ describe('RWRReactRouter', function () {
8
+ afterEach(function () {
9
+ subject.routers = {};
10
+ subject.enabled = false;
11
+ });
12
+
13
+ describe('.version', function () {
14
+ it('is present', function () {
15
+ expect(subject.version).toNotEqual(undefined);
16
+ });
17
+ });
18
+
19
+ describe('.constructor', function () {
20
+ it('intializes empty components dictionary', function () {
21
+ expect(subject.routers).toEqual({});
22
+ });
23
+
24
+ it('by default sets router presence flag to false', function () {
25
+ expect(subject.enabled).toBe(false);
26
+ });
27
+ });
28
+
29
+ describe('#register', function () {
30
+ it('adds router to the routers storage', function () {
31
+ subject.register('HelloRouter', HelloRouter);
32
+ expect(subject.routers.HelloRouter).toBe(HelloRouter);
33
+ });
34
+ });
35
+
36
+ describe('#get', function () {
37
+ it('returns route by name', function () {
38
+ subject.register('HelloRouter', HelloRouter);
39
+ expect(subject.get('HelloRouter')).toBe(HelloRouter);
40
+ });
41
+
42
+ it('returns undefined if route is not found', function () {
43
+ expect(subject.get('HelloRouter')).toBe(undefined);
44
+ });
45
+ });
46
+
47
+ describe('#render', function () {
48
+ beforeEach(function () {
49
+ subject.register('HelloRouter', HelloRouter);
50
+ });
51
+
52
+ context('when router is present', function () {
53
+ it('throws an error', function () {
54
+ expect(function () {
55
+ subject.render('HelloRouter', { node: 'someNode' });
56
+ })
57
+ .withContext(subject.enabled = true)
58
+ .toThrow(/Error when rendering HelloRouter/);
59
+ });
60
+ });
61
+
62
+ context('when router does not exist', function () {
63
+ let ReactDOMSpy;
64
+ const node = { nodeType: 1, nodeName: 'DIV' };
65
+ beforeEach(function () {
66
+ ReactDOMSpy = spyOn(ReactDOM, 'render');
67
+ });
68
+
69
+ afterEach(function () {
70
+ expect.restoreSpies();
71
+ });
72
+
73
+ it('sets router presence flag to true', function () {
74
+ subject.render('HelloRouter', node);
75
+
76
+ expect(subject.enabled).toBe(true);
77
+ });
78
+
79
+ it('calls ReactDOM renderer once', function () {
80
+ subject.render('HelloRouter', { nodeType: 1, nodeName: 'DIV' });
81
+
82
+ expect(ReactDOMSpy.calls.length).toEqual(1);
83
+ expect(ReactDOMSpy).toHaveBeenCalledWith(HelloRouter, { nodeType: 1, nodeName: 'DIV' });
84
+ });
85
+ });
86
+ });
87
+
88
+ describe('#unmount', function () {
89
+ let ReactDOMSpy;
90
+ beforeEach(function () {
91
+ ReactDOMSpy = spyOn(ReactDOM, 'unmountComponentAtNode');
92
+ });
93
+
94
+ afterEach(function () {
95
+ expect.restoreSpies();
96
+ });
97
+
98
+ it('unmounts router component at specified node', function () {
99
+ subject.unmount({ node: 'someNode' });
100
+
101
+ expect(ReactDOMSpy.calls.length).toEqual(1);
102
+ expect(ReactDOMSpy).toHaveBeenCalledWith({ node: 'someNode' });
103
+ });
104
+
105
+ it('allows to add new router', function () {
106
+ subject.unmount({ node: 'someNode' });
107
+ expect(subject.enabled).toBe(false);
108
+ });
109
+ });
110
+
111
+ describe('#integrationWrapper', function () {
112
+ const node = { nodeType: 1, nodeName: 'DIV' };
113
+
114
+ describe('function mount', function () {
115
+ it('calls renderComponent', function () {
116
+ const mountSpy = spyOn(subject, 'render');
117
+
118
+ const payload = { name: 'routerName' };
119
+ subject.integrationWrapper.mount(node, payload);
120
+
121
+ expect(mountSpy.calls.length).toEqual(1);
122
+ expect(mountSpy).toHaveBeenCalledWith(
123
+ 'routerName',
124
+ { nodeType: 1, nodeName: 'DIV' }
125
+ );
126
+ });
127
+ });
128
+
129
+ describe('function unmount', function () {
130
+ it('calls unmountComponent', function () {
131
+ const unmountSpy = spyOn(subject, 'unmount');
132
+ subject.integrationWrapper.unmount(node);
133
+
134
+ expect(unmountSpy.calls.length).toEqual(1);
135
+ expect(unmountSpy).toHaveBeenCalledWith({ nodeType: 1, nodeName: 'DIV' });
136
+ });
137
+ });
138
+ });
139
+ });
@@ -0,0 +1,6 @@
1
+ module ReactWebpackRails
2
+ module ReactRouterIntegration
3
+ class Engine < ::Rails::Engine
4
+ end
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ require 'react_webpack_rails/react_router_integration/view_helpers'
2
+
3
+ module ReactWebpackRails
4
+ module ReactRouterIntegration
5
+ class Railtie < ::Rails::Railtie
6
+ initializer 'react_webpack_rails.react_router_helpers.view_helpers' do
7
+ ActionView::Base.send :include, ViewHelpers
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ module ReactWebpackRails
2
+ module ReactRouterIntegration
3
+ VERSION = '0.1.0'
4
+ end
5
+ end
@@ -0,0 +1,9 @@
1
+ module ReactWebpackRails
2
+ module ReactRouterIntegration
3
+ module ViewHelpers
4
+ def react_router(name)
5
+ react_element('react-router', name: name)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,4 @@
1
+ require 'react_webpack_rails/react_router_integration/version'
2
+
3
+ require 'react_webpack_rails/react_router_integration/engine' if defined?(Rails)
4
+ require 'react_webpack_rails/react_router_integration/railtie' if defined?(Rails)
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "rwr-react-router",
3
+ "version": "0.1.0",
4
+ "description": "",
5
+ "main": "js/lib/index.js",
6
+ "files": [
7
+ "js/lib"
8
+ ],
9
+ "scripts": {
10
+ "compile": "babel --presets es2015 -d js/lib/ js/src/",
11
+ "prepublish": "npm run compile",
12
+ "test": "mocha js/test --ui bdd --recursive --require babel-core/register"
13
+ },
14
+ "repository": {
15
+ "type": "",
16
+ "url": ""
17
+ },
18
+ "keywords": [
19
+ ],
20
+ "author": "",
21
+ "license": "",
22
+ "bugs": {
23
+ "url": ""
24
+ },
25
+ "homepage": "",
26
+ "peerDependencies": {
27
+ "react": "^0.14.0",
28
+ "react-dom": "^0.14.0"
29
+ },
30
+ "dependencies": {
31
+ "react-webpack-rails": "^0.1.0"
32
+ },
33
+ "devDependencies": {
34
+ "babel-cli": "^6.4.0",
35
+ "babel-core": "^6.4.0",
36
+ "babel-preset-es2015": "^6.3.0",
37
+ "babel-preset-react": "^6.3.0",
38
+ "eslint": "^1.10.3",
39
+ "eslint-config-airbnb": "^3.1.0",
40
+ "eslint-plugin-react": "^3.15.0",
41
+ "expect": "^1.13.4",
42
+ "history": "^1.17.0",
43
+ "mocha": "^2.3.4"
44
+ }
45
+ }
@@ -0,0 +1,30 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'react_webpack_rails/react_router_integration/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'rwr-react_router'
8
+ spec.version = ReactWebpackRails::ReactRouterIntegration::VERSION
9
+ spec.authors = ['Rafał Gawlik']
10
+ spec.email = ['react@netguru.co']
11
+
12
+ spec.summary = 'React router integration for react_webpack_rails'
13
+ spec.description = ''
14
+ spec.homepage = ''
15
+ spec.license = 'MIT'
16
+
17
+ # Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
18
+ # delete this section to allow pushing this gem to any host.
19
+
20
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
21
+ spec.bindir = 'exe'
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.10'
26
+ spec.add_development_dependency 'rake', '~> 10.0'
27
+ spec.add_development_dependency 'rspec', '~> 3.3'
28
+
29
+ spec.add_dependency 'react_webpack_rails', '>= 0.1.0'
30
+ end
metadata ADDED
@@ -0,0 +1,122 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rwr-react_router
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Rafał Gawlik
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-03-20 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.10'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.10'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.3'
55
+ - !ruby/object:Gem::Dependency
56
+ name: react_webpack_rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 0.1.0
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 0.1.0
69
+ description: ''
70
+ email:
71
+ - react@netguru.co
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - ".babelrc"
77
+ - ".gitignore"
78
+ - ".npmignore"
79
+ - ".travis.yml"
80
+ - CHANGELOG.md
81
+ - Gemfile
82
+ - LICENSE.txt
83
+ - README.md
84
+ - Rakefile
85
+ - bin/console
86
+ - bin/setup
87
+ - js/.eslintrc
88
+ - js/src/index.js
89
+ - js/src/version.js
90
+ - js/test/index.js
91
+ - lib/react_webpack_rails/react_router_integration/engine.rb
92
+ - lib/react_webpack_rails/react_router_integration/railtie.rb
93
+ - lib/react_webpack_rails/react_router_integration/version.rb
94
+ - lib/react_webpack_rails/react_router_integration/view_helpers.rb
95
+ - lib/rwr-react_router.rb
96
+ - package.json
97
+ - rwr-react_router.gemspec
98
+ homepage: ''
99
+ licenses:
100
+ - MIT
101
+ metadata: {}
102
+ post_install_message:
103
+ rdoc_options: []
104
+ require_paths:
105
+ - lib
106
+ required_ruby_version: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ required_rubygems_version: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - ">="
114
+ - !ruby/object:Gem::Version
115
+ version: '0'
116
+ requirements: []
117
+ rubyforge_project:
118
+ rubygems_version: 2.4.5.1
119
+ signing_key:
120
+ specification_version: 4
121
+ summary: React router integration for react_webpack_rails
122
+ test_files: []