react_on_rails 2.0.0.beta.1 → 2.0.0.beta.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.dockerignore +2 -0
- data/.eslintignore +7 -0
- data/.eslintrc +19 -0
- data/.gitignore +28 -0
- data/.jscsrc +27 -0
- data/.npmignore +20 -0
- data/.rspec +2 -0
- data/.rubocop.yml +70 -0
- data/.scss-lint.yml +205 -0
- data/.travis.yml +43 -0
- data/CHANGELOG.md +34 -0
- data/Dockerfile_tests +12 -0
- data/Gemfile +40 -0
- data/README.md +365 -0
- data/Rakefile +5 -0
- data/app/helpers/react_on_rails_helper.rb +215 -0
- data/docker-compose.yml +11 -0
- data/docs/LICENSE +21 -0
- data/docs/additional_reading/heroku_deployment.md +23 -0
- data/docs/additional_reading/manual_installation.md +118 -0
- data/docs/additional_reading/node_dependencies_and_npm.md +29 -0
- data/docs/additional_reading/optional_configuration.md +33 -0
- data/docs/additional_reading/react-and-redux.md +36 -0
- data/docs/additional_reading/react_router.md +45 -0
- data/docs/additional_reading/server_rendering_tips.md +11 -0
- data/docs/additional_reading/tips.md +10 -0
- data/docs/additional_reading/webpack.md +46 -0
- data/docs/code_of_conduct.md +13 -0
- data/docs/coding-style/linters.md +64 -0
- data/docs/coding-style/style.md +42 -0
- data/docs/contributing.md +157 -0
- data/docs/generator_testing.md +20 -0
- data/docs/releasing.md +29 -0
- data/lib/generators/USAGE +99 -0
- data/lib/generators/react_on_rails/base_generator.rb +191 -0
- data/lib/generators/react_on_rails/bootstrap_generator.rb +89 -0
- data/lib/generators/react_on_rails/dev_tests_generator.rb +39 -0
- data/lib/generators/react_on_rails/generator_helper.rb +50 -0
- data/lib/generators/react_on_rails/heroku_deployment_generator.rb +30 -0
- data/lib/generators/react_on_rails/install_generator.rb +99 -0
- data/lib/generators/react_on_rails/js_linters_generator.rb +19 -0
- data/lib/generators/react_on_rails/react_no_redux_generator.rb +40 -0
- data/lib/generators/react_on_rails/react_with_redux_generator.rb +51 -0
- data/lib/generators/react_on_rails/ruby_linters_generator.rb +33 -0
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt +4 -0
- data/lib/generators/react_on_rails/templates/base/base/REACT_ON_RAILS.md +16 -0
- data/lib/generators/react_on_rails/templates/base/base/app/controllers/hello_world_controller.rb +5 -0
- data/lib/generators/react_on_rails/templates/base/base/app/views/hello_world/index.html.erb.tt +4 -0
- data/lib/generators/react_on_rails/templates/base/base/client/.babelrc +3 -0
- data/lib/generators/react_on_rails/templates/base/base/client/REACT_ON_RAILS_CLIENT_README.md +3 -0
- data/lib/generators/react_on_rails/templates/base/base/client/app/bundles/HelloWorld/startup/clientRegistration.jsx.tt +5 -0
- data/lib/generators/react_on_rails/templates/base/base/client/index.jade +15 -0
- data/lib/generators/react_on_rails/templates/base/base/client/package.json.tt +104 -0
- data/lib/generators/react_on_rails/templates/base/base/client/server.js +64 -0
- data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.base.config.js.tt +62 -0
- data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.hot.config.js.tt +69 -0
- data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.rails.config.js +42 -0
- data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +26 -0
- data/lib/generators/react_on_rails/templates/base/base/lib/tasks/assets.rake.tt +26 -0
- data/lib/generators/react_on_rails/templates/base/base/lib/tasks/linters.rake.tt +88 -0
- data/lib/generators/react_on_rails/templates/base/base/package.json +31 -0
- data/lib/generators/react_on_rails/templates/base/server_rendering/client/app/bundles/HelloWorld/startup/serverRegistration.jsx +4 -0
- data/lib/generators/react_on_rails/templates/base/server_rendering/client/webpack.server.rails.config.js +39 -0
- data/lib/generators/react_on_rails/templates/bootstrap/app/assets/stylesheets/_bootstrap-custom.scss +63 -0
- data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_post-bootstrap.scss +10 -0
- data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_pre-bootstrap.scss +8 -0
- data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_react-on-rails-sass-helper.scss +19 -0
- data/lib/generators/react_on_rails/templates/bootstrap/client/bootstrap-sass.config.js +89 -0
- data/lib/generators/react_on_rails/templates/dev_tests/.rspec +2 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/features/hello_world_spec.rb +25 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb +57 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb +21 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/spec_helper.rb +95 -0
- data/lib/generators/react_on_rails/templates/heroku_deployment/.buildpacks +2 -0
- data/lib/generators/react_on_rails/templates/heroku_deployment/Procfile +1 -0
- data/lib/generators/react_on_rails/templates/heroku_deployment/config/puma.rb +15 -0
- data/lib/generators/react_on_rails/templates/js_linters/client/.eslintignore +1 -0
- data/lib/generators/react_on_rails/templates/js_linters/client/.eslintrc +48 -0
- data/lib/generators/react_on_rails/templates/js_linters/client/.jscsrc +18 -0
- data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx +39 -0
- data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/containers/HelloWorld.jsx +33 -0
- data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/startup/HelloWorldAppClient.jsx.tt +8 -0
- data/lib/generators/react_on_rails/templates/no_redux/server_rendering/client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx +8 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/actions/helloWorldActionCreators.jsx +8 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx +48 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/constants/helloWorldConstants.jsx +8 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/containers/HelloWorld.jsx +43 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/reducers/helloWorldReducer.jsx +19 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/reducers/index.jsx +14 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/startup/HelloWorldAppClient.jsx.tt +19 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/store/helloWorldStore.jsx +35 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/lib/middlewares/loggerMiddleware.js +20 -0
- data/lib/generators/react_on_rails/templates/redux/server_rendering/client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx +19 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/.rubocop.yml +26 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/.scss-lint.yml +205 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/lib/tasks/brakeman.rake +17 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/lib/tasks/ci.rake +33 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/ruby-lint.yml +20 -0
- data/lib/react_on_rails.rb +6 -0
- data/lib/react_on_rails/configuration.rb +60 -0
- data/lib/react_on_rails/engine.rb +7 -0
- data/lib/react_on_rails/prerender_error.rb +31 -0
- data/lib/react_on_rails/server_rendering_pool.rb +110 -0
- data/lib/react_on_rails/version.rb +3 -0
- data/package.json +76 -0
- data/rakelib/docker.rake +33 -0
- data/rakelib/dummy_apps.rake +20 -0
- data/rakelib/example_type.rb +160 -0
- data/rakelib/examples.rake +103 -0
- data/rakelib/examples_config.yml +19 -0
- data/rakelib/lint.rake +37 -0
- data/rakelib/node_package.rake +11 -0
- data/rakelib/run_rspec.rake +65 -0
- data/rakelib/task_helpers.rb +44 -0
- data/react_on_rails.gemspec +31 -0
- data/ruby-lint.yml +24 -0
- metadata +119 -2
data/docs/releasing.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Install and Release
|
2
|
+
|
3
|
+
We're now releasing this as a combined ruby gem plus npm package. We will keep the version numbers in sync.
|
4
|
+
|
5
|
+
## Testing the Gem before Release from a Rails App
|
6
|
+
See [Contributing](../contributing.md)
|
7
|
+
|
8
|
+
## Releaseing a new gem version
|
9
|
+
Install https://github.com/svenfuchs/gem-release
|
10
|
+
|
11
|
+
```bash
|
12
|
+
# Having the examples prevents publishing
|
13
|
+
rm -rf examples
|
14
|
+
gem bump
|
15
|
+
# Or manually update the version number
|
16
|
+
cd spec/dummy
|
17
|
+
# Update the Gemfile.lock of the tests
|
18
|
+
bundle
|
19
|
+
git commit -am "Updated Gemfile.lock"
|
20
|
+
cd ../..
|
21
|
+
gem tag
|
22
|
+
gem release
|
23
|
+
```
|
24
|
+
|
25
|
+
|
26
|
+
## Releasing a npm version
|
27
|
+
Be sure to keep the version number the same as the ruby gem!
|
28
|
+
|
29
|
+
Use the npm package `release-it`
|
@@ -0,0 +1,99 @@
|
|
1
|
+
Description:
|
2
|
+
|
3
|
+
The react_on_rails:install generator combined with the example pull requests of
|
4
|
+
generator runs will get you up and running efficiently. There's a fair bit of
|
5
|
+
setup involved when ~with~ integrating Webpack with Rails. Defaults for options
|
6
|
+
are such that the default is for the flag to be off. For example, the default for
|
7
|
+
`-R` is that redux is off, and the default of -b means that skip-bootstrap is off.
|
8
|
+
|
9
|
+
* Redux
|
10
|
+
|
11
|
+
Passing the --redux generator option causes the generated Hello World example
|
12
|
+
to integrate the Redux state container framework. The necessary node modules
|
13
|
+
will be automatically included for you.
|
14
|
+
|
15
|
+
The generator uses the organizational `paradigm of "bundles"`. These are like
|
16
|
+
application domains and are used for grouping your code into webpack bundles
|
17
|
+
in case you decide to create different bundles for deployment. This is also
|
18
|
+
useful for separating out logical parts of your application. We recommend that
|
19
|
+
that each bundle will have it's own Redux store. If you have code that you
|
20
|
+
want to reuse across bundles, such as middleware or common utilities, place them
|
21
|
+
under `/client/app/lib`. You can then import them in your client code:
|
22
|
+
`import MyModule from 'lib/MyModule'`; since we have configured webpack to
|
23
|
+
automatically resolve the word lib to point to this folder.
|
24
|
+
|
25
|
+
* Using Images and Fonts
|
26
|
+
|
27
|
+
The generator has amended the folders created in `client/assets/` to Rails's
|
28
|
+
asset path. We recommend that if you have any existing assets that you want
|
29
|
+
to use with your client code, you should move them to these folders and use
|
30
|
+
webpack as normal. This allows webpack's development server to have access
|
31
|
+
to your assets, as it will not be able to see any assets in the default Rails
|
32
|
+
directories which are above the `/client` directory.
|
33
|
+
|
34
|
+
Alternatively, if you have many existing assets and don't wish to move them,
|
35
|
+
you could consider creating symlinks from `client/assets` that point to your
|
36
|
+
Rails assets folders inside of `app/assets/`. The assets there will then be
|
37
|
+
visible to both Rails and webpack.
|
38
|
+
|
39
|
+
* Bootstrap Integration
|
40
|
+
|
41
|
+
React on Rails ships with Twitter Bootstrap already integrated into the build.
|
42
|
+
Note that the generator removes require_tree in both the application.js and
|
43
|
+
application.css.scss files. This is to ensure the correct load order for the
|
44
|
+
bootstrap integration, and is usually a good idea in general. You will therefore
|
45
|
+
need to explicitly require your files.
|
46
|
+
|
47
|
+
How the Bootstrap library is loaded depends upon whether one is using the Rails
|
48
|
+
server or the HMR development server.
|
49
|
+
|
50
|
+
1. Bootstrap via Rails Server
|
51
|
+
|
52
|
+
The Rails server loads bootstrap-sprockets, provided
|
53
|
+
by the bootstrap-sass ruby gem (added automatically to your Gemfile by
|
54
|
+
the generator), via the `app/assets/stylesheets/_bootstrap-custom.scss`
|
55
|
+
partial.
|
56
|
+
|
57
|
+
This allows for using Bootstrap in your regular Rails stylesheets. If you
|
58
|
+
wish to customize any of the Bootstrap variables, you can do so via the
|
59
|
+
`client/assets/stylesheets/_pre-bootstrap.scss` partial.
|
60
|
+
|
61
|
+
2. Bootstrap via Webpack Dev Server
|
62
|
+
|
63
|
+
The webpack dev server does not go through Rails but instead loads bootstrap
|
64
|
+
via the `bootstrap-sass-loader` webpack loader. You can configure the loader
|
65
|
+
via the `client/bootstrap-sass-config.js` file.
|
66
|
+
|
67
|
+
3. Keeping Custom Bootstrap Configurations Synced
|
68
|
+
|
69
|
+
Because the webpack dev server and Rails each load Bootstrap via a different
|
70
|
+
file (explained in the two sections immediately above), any changes to
|
71
|
+
the way components are loaded in one file must also be made to the other
|
72
|
+
file in order to keep styling consistent between the two. For example,
|
73
|
+
if an import is excluded in _bootstrap-custom.scss, the same import should
|
74
|
+
be excluded in `bootstrap-sass-config.js` so that styling in the Rails
|
75
|
+
server and the webpack dev server will be the same.
|
76
|
+
|
77
|
+
4. Skip Bootstrap Integration
|
78
|
+
|
79
|
+
Bootstrap integration is enabled by default, but can be disabled by passing
|
80
|
+
the --skip-bootstrap flag (alias -b). When you don't need Bootstrap in your
|
81
|
+
existing project, just skip it as needed.
|
82
|
+
|
83
|
+
* JavaScript Linters
|
84
|
+
|
85
|
+
JavaScript linters are enabled by default, but can be disabled by passing the
|
86
|
+
--skip-js-linters flag (alias j), and those that run in Node have been add to
|
87
|
+
`client/package.json` under devDependencies.
|
88
|
+
|
89
|
+
* Ruby Linters
|
90
|
+
|
91
|
+
Ruby linters are disabled by default, but can be enabled by passing the
|
92
|
+
`--ruby-linters` flag when generating. These linters have been added to your
|
93
|
+
Gemfile in addition to the the appropriate Rake tasks.
|
94
|
+
|
95
|
+
We really love using all the linters! Give them a try.
|
96
|
+
|
97
|
+
More Details:
|
98
|
+
|
99
|
+
`https://github.com/shakacode/react_on_rails#generator`
|
@@ -0,0 +1,191 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
require File.expand_path("../generator_helper", __FILE__)
|
3
|
+
|
4
|
+
include GeneratorHelper
|
5
|
+
|
6
|
+
module ReactOnRails
|
7
|
+
module Generators
|
8
|
+
class BaseGenerator < Rails::Generators::Base # rubocop:disable Metrics/ClassLength
|
9
|
+
hide!
|
10
|
+
source_root(File.expand_path("../templates", __FILE__))
|
11
|
+
|
12
|
+
# --redux
|
13
|
+
class_option :redux,
|
14
|
+
type: :boolean,
|
15
|
+
default: false,
|
16
|
+
desc: "Install Redux gems and Redux version of Hello World Example",
|
17
|
+
aliases: "-R"
|
18
|
+
# --server-rendering
|
19
|
+
class_option :server_rendering,
|
20
|
+
type: :boolean,
|
21
|
+
default: false,
|
22
|
+
desc: "Configure for server-side rendering of webpack JavaScript",
|
23
|
+
aliases: "-S"
|
24
|
+
# --skip-js-linters
|
25
|
+
class_option :skip_js_linters,
|
26
|
+
type: :boolean,
|
27
|
+
default: false,
|
28
|
+
desc: "Skip installing JavaScript linting files",
|
29
|
+
aliases: "-j"
|
30
|
+
# --ruby-linters
|
31
|
+
class_option :ruby_linters,
|
32
|
+
type: :boolean,
|
33
|
+
default: false,
|
34
|
+
desc: "Install ruby linting files, tasks, and configs",
|
35
|
+
aliases: "-L"
|
36
|
+
|
37
|
+
# --skip-bootstrap
|
38
|
+
class_option :skip_bootstrap,
|
39
|
+
type: :boolean,
|
40
|
+
default: false,
|
41
|
+
desc: "Skip integrating Bootstrap and don't initialize files and regarding configs",
|
42
|
+
aliases: "-b"
|
43
|
+
|
44
|
+
def add_hello_world_route
|
45
|
+
route "get 'hello_world', to: 'hello_world#index'"
|
46
|
+
end
|
47
|
+
|
48
|
+
def create_client_assets_directories
|
49
|
+
empty_directory("client/assets")
|
50
|
+
empty_directory("client/assets/stylesheets")
|
51
|
+
empty_directory_with_keep_file("client/assets/fonts")
|
52
|
+
empty_directory_with_keep_file("client/assets/images")
|
53
|
+
end
|
54
|
+
|
55
|
+
def update_git_ignore
|
56
|
+
data = <<-DATA.strip_heredoc
|
57
|
+
# React on Rails
|
58
|
+
npm-debug.log
|
59
|
+
node_modules
|
60
|
+
|
61
|
+
# Generated js bundles
|
62
|
+
/app/assets/javascripts/generated/*
|
63
|
+
DATA
|
64
|
+
|
65
|
+
dest_file_exists?(".gitignore") ? append_to_file(".gitignore", data) : puts_setup_file_error(".gitignore", data)
|
66
|
+
end
|
67
|
+
|
68
|
+
def update_application_js
|
69
|
+
data = <<-DATA.strip_heredoc
|
70
|
+
// DO NOT REQUIRE jQuery or jQuery-ujs in this file!
|
71
|
+
// DO NOT REQUIRE TREE!
|
72
|
+
|
73
|
+
// CRITICAL that generated/vendor-bundle must be BEFORE bootstrap-sprockets and turbolinks
|
74
|
+
// since it is exposing jQuery and jQuery-ujs
|
75
|
+
|
76
|
+
//= require generated/vendor-bundle
|
77
|
+
//= require generated/app-bundle
|
78
|
+
|
79
|
+
DATA
|
80
|
+
|
81
|
+
app_js_path = "app/assets/javascripts/application.js"
|
82
|
+
found_app_js = dest_file_exists?(app_js_path) || dest_file_exists?(app_js_path + ".coffee")
|
83
|
+
if found_app_js
|
84
|
+
prepend_to_file(found_app_js, data)
|
85
|
+
else
|
86
|
+
create_file(app_js_path, data)
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def strip_application_js_of_incompatible_sprockets_statements
|
91
|
+
application_js = File.join(destination_root, "app/assets/javascripts/application.js")
|
92
|
+
gsub_file(application_js, "//= require jquery_ujs", "// require jquery_ujs")
|
93
|
+
gsub_file(application_js, %r{//= require jquery$}, "// require jquery")
|
94
|
+
gsub_file(application_js, %r{//= require_tree \.$}, "// require_tree .")
|
95
|
+
end
|
96
|
+
|
97
|
+
def strip_application_js_of_double_blank_lines
|
98
|
+
application_js = File.join(destination_root, "app/assets/javascripts/application.js")
|
99
|
+
gsub_file(application_js, /^\n^\n/, "\n")
|
100
|
+
end
|
101
|
+
|
102
|
+
def create_react_directories
|
103
|
+
dirs = %w(components containers startup)
|
104
|
+
dirs.each { |name| empty_directory("client/app/bundles/HelloWorld/#{name}") }
|
105
|
+
end
|
106
|
+
|
107
|
+
def copy_base_files
|
108
|
+
base_path = "base/base/"
|
109
|
+
%w(app/controllers/hello_world_controller.rb
|
110
|
+
config/initializers/react_on_rails.rb
|
111
|
+
client/.babelrc
|
112
|
+
client/index.jade
|
113
|
+
client/server.js
|
114
|
+
client/webpack.client.rails.config.js
|
115
|
+
REACT_ON_RAILS.md
|
116
|
+
client/REACT_ON_RAILS_CLIENT_README.md
|
117
|
+
package.json).each { |file| copy_file(base_path + file, file) }
|
118
|
+
end
|
119
|
+
|
120
|
+
def template_base_files
|
121
|
+
base_path = "base/base/"
|
122
|
+
%w(Procfile.dev
|
123
|
+
app/views/hello_world/index.html.erb
|
124
|
+
client/webpack.client.base.config.js
|
125
|
+
client/webpack.client.hot.config.js
|
126
|
+
client/package.json).each { |file| template(base_path + file + ".tt", file) }
|
127
|
+
end
|
128
|
+
|
129
|
+
def add_base_gems_to_gemfile
|
130
|
+
return unless options.server_rendering?
|
131
|
+
append_to_file("Gemfile", "\ngem 'therubyracer', platforms: :ruby\n")
|
132
|
+
end
|
133
|
+
|
134
|
+
def template_client_registration_file
|
135
|
+
filename = "clientRegistration.jsx"
|
136
|
+
location = "client/app/bundles/HelloWorld/startup"
|
137
|
+
template("base/base/#{location}/clientRegistration.jsx.tt", "#{location}/#{filename}")
|
138
|
+
end
|
139
|
+
|
140
|
+
def install_server_rendering_files_if_enabled
|
141
|
+
return unless options.server_rendering?
|
142
|
+
base_path = "base/server_rendering/"
|
143
|
+
%w(client/webpack.server.rails.config.js
|
144
|
+
client/app/bundles/HelloWorld/startup/serverRegistration.jsx).each do |file|
|
145
|
+
copy_file(base_path + file, file)
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def template_linter_files_if_appropriate
|
150
|
+
return if !options.ruby_linters? && options.skip_js_linters?
|
151
|
+
template("base/base/lib/tasks/linters.rake.tt", "lib/tasks/linters.rake")
|
152
|
+
end
|
153
|
+
|
154
|
+
def template_assets_rake_file
|
155
|
+
template("base/base/lib/tasks/assets.rake.tt", "lib/tasks/assets.rake")
|
156
|
+
end
|
157
|
+
|
158
|
+
def append_to_assets_initializer
|
159
|
+
data = <<-DATA.strip_heredoc
|
160
|
+
# Add client/assets/ folders to asset pipeline's search path.
|
161
|
+
# If you do not want to move existing images and fonts from your Rails app
|
162
|
+
# you could also consider creating symlinks there that point to the original
|
163
|
+
# rails directories. In that case, you would not add these paths here.
|
164
|
+
Rails.application.config.assets.paths << Rails.root.join("client", "assets", "stylesheets")
|
165
|
+
Rails.application.config.assets.paths << Rails.root.join("client", "assets", "images")
|
166
|
+
Rails.application.config.assets.paths << Rails.root.join("client", "assets", "fonts")
|
167
|
+
Rails.application.config.assets.precompile += %w( generated/server-bundle.js )
|
168
|
+
DATA
|
169
|
+
assets_intializer = File.join(destination_root, "config/initializers/assets.rb")
|
170
|
+
if File.exist?(assets_intializer)
|
171
|
+
append_to_file(assets_intializer, data)
|
172
|
+
else
|
173
|
+
create_file(assets_intializer, data)
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
# rename to application.scss from application.css or application.css.scss
|
178
|
+
def force_application_scss_naming_if_necessary
|
179
|
+
base_path = "app/assets/stylesheets/"
|
180
|
+
application_css = "#{base_path}application.css"
|
181
|
+
application_css_scss = "#{base_path}application.css.scss"
|
182
|
+
|
183
|
+
bad_name = dest_file_exists?(application_css) || dest_file_exists?(application_css_scss)
|
184
|
+
return unless bad_name
|
185
|
+
|
186
|
+
new_name = File.join(destination_root, "#{base_path}application.scss")
|
187
|
+
File.rename(bad_name, new_name)
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
require File.expand_path("../generator_helper", __FILE__)
|
3
|
+
include GeneratorHelper
|
4
|
+
|
5
|
+
module ReactOnRails
|
6
|
+
module Generators
|
7
|
+
class BootstrapGenerator < Rails::Generators::Base
|
8
|
+
hide!
|
9
|
+
source_root(File.expand_path("../templates", __FILE__))
|
10
|
+
|
11
|
+
def copy_bootstrap_files
|
12
|
+
base_path = "bootstrap/"
|
13
|
+
%w(app/assets/stylesheets/_bootstrap-custom.scss
|
14
|
+
client/assets/stylesheets/_post-bootstrap.scss
|
15
|
+
client/assets/stylesheets/_pre-bootstrap.scss
|
16
|
+
client/assets/stylesheets/_react-on-rails-sass-helper.scss
|
17
|
+
client/bootstrap-sass.config.js).each { |file| copy_file(base_path + file, file) }
|
18
|
+
end
|
19
|
+
|
20
|
+
# if there still is not application.scss, just create one
|
21
|
+
def create_application_scss_if_necessary
|
22
|
+
path = File.join(destination_root, "app/assets/stylesheets/application.scss")
|
23
|
+
return if File.exist?(path)
|
24
|
+
File.open(path, "w") { |f| f.puts "// Created by React on Rails gem\n\n" }
|
25
|
+
end
|
26
|
+
|
27
|
+
def prepend_to_application_scss
|
28
|
+
data = <<-DATA.strip_heredoc
|
29
|
+
// DO NOT REQUIRE TREE! It will interfere with load order!
|
30
|
+
|
31
|
+
// Account for differences between Rails and Webpack Sass code.
|
32
|
+
$rails: true;
|
33
|
+
|
34
|
+
// Included from bootstrap-sprockets gem and loaded in app/assets/javascripts/application.rb
|
35
|
+
@import 'bootstrap-sprockets';
|
36
|
+
|
37
|
+
// Customizations - needs to be imported after bootstrap-sprocket but before bootstrap-custom!
|
38
|
+
// The _pre-bootstrap.scss file is located under
|
39
|
+
// client/assets/stylesheets, which has been added to the Rails asset
|
40
|
+
// pipeline search path. See config/application.rb.
|
41
|
+
@import 'pre-bootstrap';
|
42
|
+
|
43
|
+
// These scss files are located under client/assets/stylesheets
|
44
|
+
// (which has been added to the Rails asset pipeline search path in config/application.rb).
|
45
|
+
@import 'bootstrap-custom';
|
46
|
+
|
47
|
+
// This must come after all the boostrap styles are loaded so that these styles can override those.
|
48
|
+
@import 'post-bootstrap';
|
49
|
+
|
50
|
+
DATA
|
51
|
+
|
52
|
+
application_scss = File.join(destination_root, "app/assets/stylesheets/application.scss")
|
53
|
+
|
54
|
+
if File.exist?(application_scss)
|
55
|
+
append_to_file(application_scss, data)
|
56
|
+
else
|
57
|
+
puts_setup_file_error(application_scss, data)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def strip_application_scss_of_incompatible_sprockets_statements
|
62
|
+
application_scss = File.join(destination_root, "app/assets/stylesheets/application.scss")
|
63
|
+
gsub_file(application_scss, "*= require_tree .", "")
|
64
|
+
gsub_file(application_scss, "*= require_self", "")
|
65
|
+
end
|
66
|
+
|
67
|
+
def add_bootstrap_sprockets_to_gemfile
|
68
|
+
append_to_file("Gemfile", "gem 'bootstrap-sass'\n")
|
69
|
+
end
|
70
|
+
|
71
|
+
def add_bootstrap_sprockets_to_application_js
|
72
|
+
data = <<-DATA.strip_heredoc
|
73
|
+
|
74
|
+
// bootstrap-sprockets depends on generated/vendor-bundle for jQuery.
|
75
|
+
//= require bootstrap-sprockets
|
76
|
+
|
77
|
+
DATA
|
78
|
+
|
79
|
+
app_js_path = "app/assets/javascripts/application.js"
|
80
|
+
found_app_js = dest_file_exists?(app_js_path) || dest_file_exists?(app_js_path + ".coffee")
|
81
|
+
if found_app_js
|
82
|
+
append_to_file(found_app_js, data)
|
83
|
+
else
|
84
|
+
create_file(app_js_path, data)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "rails/generators"
|
2
|
+
require_relative "generator_helper"
|
3
|
+
include GeneratorHelper
|
4
|
+
|
5
|
+
module ReactOnRails
|
6
|
+
module Generators
|
7
|
+
class DevTestsGenerator < Rails::Generators::Base
|
8
|
+
hide!
|
9
|
+
source_root(File.expand_path("../templates/dev_tests", __FILE__))
|
10
|
+
|
11
|
+
def copy_rspec_files
|
12
|
+
%w(spec/spec_helper.rb
|
13
|
+
spec/rails_helper.rb
|
14
|
+
spec/simplecov_helper.rb
|
15
|
+
.rspec).each { |file| copy_file(file) }
|
16
|
+
end
|
17
|
+
|
18
|
+
def copy_tests
|
19
|
+
%w(spec/features/hello_world_spec.rb).each { |file| copy_file(file) }
|
20
|
+
end
|
21
|
+
|
22
|
+
# We want to use the node module in the local build, not the one published to NPM
|
23
|
+
def change_package_json_to_use_local_react_on_rails_module
|
24
|
+
package_json = File.join(destination_root, "client", "package.json")
|
25
|
+
old_contents = File.read(package_json)
|
26
|
+
new_contents = old_contents.gsub(/"react-on-rails": ".+",/,
|
27
|
+
'"react-on-rails": "../../..",')
|
28
|
+
File.open(package_json, "w+") { |f| f.puts new_contents }
|
29
|
+
end
|
30
|
+
|
31
|
+
def add_test_related_gems_to_gemfile
|
32
|
+
gem("rspec-rails", group: :test)
|
33
|
+
gem("capybara", group: :test)
|
34
|
+
gem("selenium-webdriver", group: :test)
|
35
|
+
gem("coveralls", require: false)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|