make_it_so 0.4.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +34 -0
  3. data/Gemfile +18 -1
  4. data/README.md +5 -4
  5. data/lib/generators/rails_app_generator.rb +17 -10
  6. data/lib/make_it_so.rb +3 -0
  7. data/lib/make_it_so/command_line_interface.rb +4 -2
  8. data/lib/make_it_so/rails.rb +1 -2
  9. data/lib/make_it_so/rails/app_builder.rb +102 -86
  10. data/lib/make_it_so/rails/prerequisite_check.rb +29 -0
  11. data/lib/make_it_so/version.rb +1 -1
  12. data/make_it_so.gemspec +1 -3
  13. data/snippets/rails/js_enzyme_testing_deps.json +6 -0
  14. data/snippets/rails/js_jest_testing_deps.json +15 -5
  15. data/snippets/rails/{js_testing_deps.json → js_karma_jasmine_testing_deps.json} +8 -7
  16. data/snippets/rails/react_dependencies.json +14 -3
  17. data/snippets/rails/user_factory.rb +2 -2
  18. data/spec/features/rails/user_generates_rails_spec.rb +410 -0
  19. data/spec/features/rails/user_generates_rails_with_karma_spec.rb +68 -0
  20. data/spec/features/rails/user_generates_rails_without_js_test_lib_spec.rb +51 -0
  21. data/spec/support/make_it_so_spec_helpers.rb +23 -0
  22. data/templates/rails/app/assets/javascripts/application.foundation.js +18 -0
  23. data/templates/rails/app/assets/javascripts/application.js +16 -0
  24. data/templates/rails/app/javascript/packs/new_application.js +1 -1
  25. data/templates/rails/app/javascript/react/components/{app.js → App.js} +1 -1
  26. data/templates/rails/app/javascript/react/components/example.test.js +5 -0
  27. data/templates/rails/app/views/layouts/application.html.erb.tt +1 -8
  28. data/templates/rails/babel.config.js +77 -0
  29. data/templates/rails/karma.conf.js +2 -5
  30. data/templates/rails/spec/javascript/example.test.js +5 -0
  31. data/templates/rails/spec/javascript/support/enzyme.js +1 -3
  32. data/templates/rails/spec/javascript/testHelper.js +6 -1
  33. metadata +24 -48
  34. data/Appraisals +0 -4
  35. data/gemfiles/rails_4_0.gemfile +0 -11
  36. data/gemfiles/rails_4_0.gemfile.lock +0 -88
  37. data/gemfiles/rails_4_1.gemfile +0 -11
  38. data/gemfiles/rails_4_1.gemfile.lock +0 -92
  39. data/gemfiles/rails_4_2.gemfile +0 -11
  40. data/gemfiles/rails_4_2.gemfile.lock +0 -106
  41. data/spec/features/user_generates_rails_spec.rb +0 -352
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 949efd8fd6f8be81fbd78b38d2db7aa56aa1c427
4
- data.tar.gz: eb3c702c131873e182246d57368836423e3ed9bb
2
+ SHA256:
3
+ metadata.gz: 62d0d492e8ebf31a42c217e5294c22c11e8e27fda46526c9ed9466e63e3cbc0a
4
+ data.tar.gz: 4d9e66ac27776841fb882234c0da8dc98458836a9f44650c0a82dd6a284fb813
5
5
  SHA512:
6
- metadata.gz: 445f44e631fb2f8a7af9f5d4bb6b92c8952ade88ccc99712a751059bfe8fae71f472c9ce65422baffff8d0c95c53f4dcff7c0af4b7566c468e24f7781f12d402
7
- data.tar.gz: 47503825241b5a8c3f032b993541ba7771c7c3b2cbf483fb6488359484b30aa96e7fc14032cbf3ec319db9ee82a39cef461d312aaa5e6a827e4f3c25a6dd2543
6
+ metadata.gz: 4a56507b200ab5a6b5237b1b33abc919d8e7cb871e5b9533862024b6c47c02c983d155d04d91e7b819cb405a1ad04f783067802c0490b54d40c0c9c4bfb8353d
7
+ data.tar.gz: ebf9b7057c86b84dd9d1fa8ffcb7ab9837306efe1e81ebddac6f6a4ad4855024baafa76e12e935aaef7f8ec15e38f1541a3ec06e9701d7d4936079ee60ee36c4
data/CHANGELOG.md ADDED
@@ -0,0 +1,34 @@
1
+ # Changelog
2
+ All notable changes to this project will be documented in this file.
3
+
4
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
+
7
+ ## [Unreleased]
8
+
9
+ - add @types/jest for VSCode intellisense
10
+
11
+ ## [0.5.1] - 2019-10-08
12
+
13
+ - skip bootsnap by default
14
+ - added prerequisite rails version check
15
+ - adjust webpacker routines to run `after_bundle`
16
+ - only stop spring if it is being installed
17
+
18
+ ## [0.5.0] - 2019-09-02
19
+
20
+ ### Added
21
+
22
+ - `react-router` is now installed by default
23
+
24
+ ### Changed
25
+
26
+ - `--karma` and `--jest` options have been removed in favor of a `--js-test-lib` param.
27
+ - The default behavior of `make_it_so` now generates `jest` as the default test lib instead of `karma`
28
+ - `foundation-rails` was updated to v6.5
29
+ - `modernizr` was removed
30
+ - Development runtime was upgraded to ruby v2.6.3
31
+
32
+ [Unreleased]:https://github.com/LaunchAcademy/make_it_so/compare/v0.5.0...HEAD
33
+ [0.5.1]:https://github.com/LaunchAcademy/make_it_so/compare/v0.5.0...v0.5.1
34
+ [0.5.0]:https://github.com/LaunchAcademy/make_it_so/compare/v0.4.5...v0.5.0
data/Gemfile CHANGED
@@ -1,10 +1,27 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- ruby '2.4.2'
3
+ require_relative 'lib/make_it_so/rails'
4
+
5
+ ruby '2.7.3'
4
6
 
5
7
  # Specify your gem's dependencies in make_it_so.gemspec
6
8
  gemspec
7
9
 
8
10
  group :development do
9
11
  gem 'pry'
12
+ gem 'solargraph'
13
+
14
+ [
15
+ 'rails',
16
+ 'activejob',
17
+ 'actionmailer'
18
+ ].each do |gem_name|
19
+ gem gem_name, MakeItSo::Rails::VERSION
20
+ end
21
+
22
+ gem 'sprockets-rails', '3.2.2'
23
+ gem 'listen'
24
+ gem 'rspec-rails'
25
+ gem 'devise'
26
+ gem 'webpacker'
10
27
  end
data/README.md CHANGED
@@ -30,8 +30,9 @@ make_it_so rails <app_name>
30
30
  Then run:
31
31
 
32
32
  ```ruby
33
- rake db:create
34
- rake db:migrate
33
+ yarn install
34
+ bundle exec rake db:create
35
+ bundle exec rake db:migrate
35
36
  ```
36
37
 
37
38
  By default, the generator will create a Rails app with the following options activated:
@@ -41,7 +42,7 @@ By default, the generator will create a Rails app with the following options act
41
42
  - Postgres
42
43
  - Foundation
43
44
  - React
44
- - Karma
45
+ - Jest
45
46
 
46
47
  To take advantage of view-specific javascript, inject a script tag at the end of the body tag. Javascript should always be the last thing loaded on the page. In view logic you can do the following:
47
48
 
@@ -53,7 +54,7 @@ var widget = new Something.Widget('foo');
53
54
  <% end %>
54
55
  ```
55
56
 
56
- There is experimental support for a `--jest` flag that will use Jest for client side testing instead of karma/jasmine.
57
+ Using the `--js-test-lib` flag, it is also possible to set up a Karma/Jasmine test framework instead of Jest (`--js-test-lib karma`) or to omit either framework (`--js-test-lib false`).
57
58
 
58
59
  ### Sinatra
59
60
 
@@ -42,20 +42,27 @@ module MakeItSo
42
42
  default: true,
43
43
  desc: 'Skip spring gem'
44
44
 
45
- class_option :react,
45
+ class_option :skip_active_storage,
46
46
  type: :boolean,
47
47
  default: true,
48
- desc: 'Generate React setup'
48
+ desc: "Skip Active Storage"
49
49
 
50
- class_option :karma,
50
+ class_option :react,
51
51
  type: :boolean,
52
52
  default: true,
53
- desc: 'Generate karma testing setup'
53
+ desc: 'Generate React setup'
54
54
 
55
- class_option :jest,
55
+ class_option :js_test_lib,
56
+ type: :string,
57
+ default: "jest",
58
+ desc:
59
+ "Generate Jest testing framework (default), Karma/Jasmine ('karma'), or no framework ('false')"
60
+
61
+ class_option :skip_bootsnap,
56
62
  type: :boolean,
57
- default: false,
58
- desc: 'Generate jest testing setup'
63
+ default: true,
64
+ desc:
65
+ "Skip bootsnap"
59
66
 
60
67
  def initialize(*args)
61
68
  super
@@ -101,13 +108,13 @@ module MakeItSo
101
108
  build 'react'
102
109
  end
103
110
 
104
- if options[:jest]
111
+ if options[:js_test_lib] == "jest"
105
112
  build 'jest'
106
- elsif options[:karma]
113
+ elsif options[:js_test_lib] == "karma"
107
114
  build 'karma'
108
115
  end
109
116
 
110
- if options[:react] || options[:jest] || options[:karma]
117
+ if options[:react] || options[:js_test_lib]
111
118
  build 'yarn_install'
112
119
  end
113
120
  end
data/lib/make_it_so.rb CHANGED
@@ -11,6 +11,9 @@ end
11
11
  require "make_it_so/version"
12
12
 
13
13
  require "make_it_so/rails"
14
+ require 'make_it_so/rails/app_builder'
15
+
16
+ require "make_it_so/rails/prerequisite_check"
14
17
 
15
18
  require "make_it_so/command_line_interface"
16
19
  require "generators/rails_app_generator"
@@ -4,9 +4,11 @@ module MakeItSo
4
4
  desc "rails <app_name>",
5
5
  "generates a rails application based on your specifications"
6
6
  option :devise, type: :boolean
7
- option :jest, type: :boolean
7
+ option :js_test_lib, default: "jest"
8
8
  def rails(app_name)
9
- MakeItSo::RailsAppGenerator.start(ARGV[1..-1])
9
+ if MakeItSo::Rails::PrerequisiteCheck.new.check
10
+ MakeItSo::RailsAppGenerator.start(ARGV[1..-1])
11
+ end
10
12
  end
11
13
 
12
14
  desc "sinatra <app_name>",
@@ -1,6 +1,5 @@
1
- require 'make_it_so/rails/app_builder'
2
-
3
1
  module MakeItSo
4
2
  module Rails
3
+ VERSION="5.2.5"
5
4
  end
6
5
  end
@@ -50,41 +50,42 @@ module MakeItSo
50
50
  def react
51
51
  @generator.gem 'webpacker', '~> 3.3'
52
52
 
53
- rake 'webpacker:install'
54
- rake 'webpacker:install:react'
55
- remove_file 'app/javascript/packs/application.js'
56
- remove_file 'app/javascript/packs/hello_react.jsx'
57
-
58
- unparsed_json = snippet('react_dependencies.json')
59
- parsed_json = JSON.parse(unparsed_json)
60
-
61
- modify_json(package_json_file) do |json|
62
- ["dependencies", "devDependencies"].each do |key|
63
- json[key] ||= {}
64
- json[key].merge!(parsed_json[key])
53
+ after_bundle do
54
+ rake 'webpacker:install'
55
+ rake 'webpacker:install:react'
56
+ remove_file 'app/javascript/packs/application.js'
57
+ remove_file 'app/javascript/packs/hello_react.jsx'
58
+
59
+ unparsed_json = snippet('react_dependencies.json')
60
+ parsed_json = JSON.parse(unparsed_json)
61
+
62
+ modify_json(package_json_file) do |json|
63
+ ["dependencies", "devDependencies"].each do |key|
64
+ json[key] ||= {}
65
+ json[key].merge!(parsed_json[key])
66
+ end
67
+
68
+ json["scripts"] ||= {}
69
+ json["scripts"]["start"] = "./bin/webpack-dev-server"
70
+
71
+ json["dependencies"].delete("babel-preset-react")
65
72
  end
66
73
 
67
- json["scripts"] ||= {}
68
- json["scripts"]["start"] = "./bin/webpack-dev-server"
69
- end
74
+ inside 'app/javascript/packs' do
75
+ copy_file 'new_application.js', 'application.js'
76
+ remove_file 'new_application.js'
77
+ end
70
78
 
71
- inside 'app/javascript/packs' do
72
- copy_file 'new_application.js', 'application.js'
73
- remove_file 'new_application.js'
74
79
  end
75
80
  end
76
81
 
77
82
  def karma
78
83
  after_bundle do
79
- unparsed_json = snippet('js_testing_deps.json')
80
- parsed_json = JSON.parse(unparsed_json)
84
+ add_test_dependency_snippets(
85
+ ["js_karma_jasmine_testing_deps.json", "js_enzyme_testing_deps.json"]
86
+ )
81
87
 
82
- modify_json(package_json_file) do |json|
83
- json["devDependencies"] ||= {}
84
- json["devDependencies"].merge!(parsed_json["devDependencies"])
85
- json["scripts"] ||= {}
86
- json["scripts"]["test"] = "node_modules/.bin/karma start karma.conf.js"
87
- end
88
+ create_enzyme_config
88
89
 
89
90
  template 'karma.conf.js'
90
91
  inside 'spec/javascript' do
@@ -95,54 +96,24 @@ module MakeItSo
95
96
  append_to_file '.gitignore' do
96
97
  "coverage/*\n"
97
98
  end
99
+
100
+ remove_file '.babelrc'
101
+ remove_file 'babel.config.js'
102
+ template 'babel.config.js'
98
103
  end
99
104
  end
100
105
 
101
106
  def jest
102
107
  after_bundle do
103
- unparsed_json = snippet('js_jest_testing_deps.json')
104
- parsed_json = JSON.parse(unparsed_json)
105
-
106
- run 'mkdir -p spec/javascript/support'
107
- inside 'spec/javascript/support' do
108
- template 'enzyme.js'
109
- end
108
+ add_test_dependency_snippets(
109
+ ["js_jest_testing_deps.json", "js_enzyme_testing_deps.json"]
110
+ )
110
111
 
111
- modify_json(package_json_file) do |json|
112
- json["devDependencies"] ||= {}
113
- json["devDependencies"].merge!(parsed_json["devDependencies"])
114
- json["scripts"] ||= {}
115
- json["scripts"]["test"] = "node_modules/.bin/jest"
116
- json["scripts"]["test:dev"] = "node_modules/.bin/jest --notify --watch"
117
- json["jest"] ||= {}
118
- json["jest"].merge!({
119
- "automock": false,
120
- "roots": [
121
- "spec/javascript"
122
- ],
123
- "moduleDirectories": [
124
- "node_modules",
125
- "app/javascript"
126
- ],
127
- "setupFiles": [
128
- "./spec/javascript/support/enzyme.js"
129
- ],
130
- "testURL": "http://localhost/"
131
- })
132
- end
112
+ create_enzyme_config
133
113
 
134
- run 'touch .babelrc'
135
- modify_json(File.join(destination_root, '.babelrc')) do |json|
136
- json["env"] ||= {}
137
- json["env"]["test"] ||= {}
138
- json["env"]["test"].merge!({
139
- "env": {
140
- "test": {
141
- "presets": ["react", "env"],
142
- }
143
- }
144
- })
145
- end
114
+ remove_file '.babelrc'
115
+ remove_file 'babel.config.js'
116
+ template 'babel.config.js'
146
117
  end
147
118
  end
148
119
 
@@ -161,14 +132,16 @@ module MakeItSo
161
132
  end
162
133
 
163
134
  def rspec_dependency
164
- @generator.gem 'rspec-rails', group: [:development, :test]
135
+ @generator.gem 'rspec-rails', '3.8.2', group: [:development, :test]
165
136
  @generator.gem 'capybara', group: [:development, :test]
166
137
  @generator.gem 'launchy', group: [:development, :test]
167
138
 
168
139
  after_bundle do
169
- #stop spring in case it is running - it will hang
170
- #https://github.com/rails/rails/issues/13381
171
- run 'spring stop'
140
+ if !options[:skip_spring]
141
+ #stop spring in case it is running - it will hang
142
+ #https://github.com/rails/rails/issues/13381
143
+ run 'spring stop'
144
+ end
172
145
  generate 'rspec:install'
173
146
  inside 'spec' do
174
147
  empty_directory 'support'
@@ -188,7 +161,11 @@ module MakeItSo
188
161
  @generator.gem 'factory_bot', group: [:development, :test]
189
162
  after_bundle do
190
163
  inside 'spec' do
191
- uncomment_lines 'rails_helper.rb', /spec\/support\/\*\*\/\*.rb/
164
+ insert_into_file 'rails_helper.rb',
165
+ after: rails_helper_insertion_hook do
166
+
167
+ "require File.join(File.dirname(__FILE__), 'support/factory_bot')\n"
168
+ end
192
169
 
193
170
  inside 'support' do
194
171
  template 'factory_bot.rb'
@@ -230,8 +207,16 @@ module MakeItSo
230
207
  group: [:development, :test],
231
208
  require: false
232
209
  after_bundle do
233
- inside 'spec/support' do
234
- template 'shoulda.rb'
210
+ inside 'spec' do
211
+ insert_into_file 'rails_helper.rb',
212
+ after: rails_helper_insertion_hook do
213
+
214
+ "require File.join(File.dirname(__FILE__), 'support/shoulda')\n"
215
+ end
216
+
217
+ inside 'support' do
218
+ template 'shoulda.rb'
219
+ end
235
220
  end
236
221
  end
237
222
  end
@@ -247,7 +232,7 @@ module MakeItSo
247
232
  #note: temporary fix that can be removed once devise progresses #beyond v4.4.3
248
233
  # https://github.com/plataformatec/devise/pull/4869/files
249
234
  inside 'config/initializers' do
250
- insert_into_file 'devise.rb',
235
+ insert_into_file 'devise.rb',
251
236
  after: "Devise.setup do |config|" do
252
237
  " config.secret_key = Rails.application.secret_key_base\n"
253
238
  end
@@ -274,29 +259,60 @@ module MakeItSo
274
259
  end
275
260
 
276
261
  def foundation_dependency
277
- @generator.gem 'foundation-rails', '~> 5.0'
262
+ @generator.gem 'foundation-rails', '~> 6.5'
278
263
 
279
264
  after_bundle do
280
265
  generate 'foundation:install foundation'
281
- # foundation-rails generates an application layout so we
282
- # must remove it
283
- # there is a pull request open to skip this:
284
- # https://github.com/zurb/foundation-rails/pull/108
266
+ # foundation install always messes with the JS manifest
285
267
  remove_file 'app/views/layouts/foundation.html.erb'
286
268
 
287
269
  inside 'app/assets/javascripts' do
288
- insert_into_file 'application.js',
289
- "//= require foundation\n",
290
- after: "//= require jquery_ujs\n"
270
+ remove_file 'application.js'
271
+ template 'application.foundation.js', 'application.js'
291
272
  end
273
+ # foundation-rails generates an application layout so we
274
+ # must remove it
275
+ remove_file 'app/views/layouts/foundation.html.erb'
276
+
277
+
292
278
  end
293
279
  end
294
280
 
295
281
  protected
296
- PACKAGE_PATH = 'package.json'
297
- WEBCONFIG_PATH = 'webpack.config.js'
298
282
 
299
- protected
283
+ PACKAGE_PATH = "package.json"
284
+ WEBCONFIG_PATH = "webpack.config.js"
285
+
286
+ def add_test_dependency_snippets(snippet_paths)
287
+ snippet_paths.each do |snippet_path|
288
+ snippet = snippet(snippet_path)
289
+ parsed_snippet = JSON.parse(snippet)
290
+ keys = parsed_snippet.keys
291
+
292
+ modify_json(package_json_file) do |json|
293
+ keys.each do |key|
294
+ json[key] ||= {}
295
+ json[key].merge!(parsed_snippet[key])
296
+ end
297
+ end
298
+ end
299
+ end
300
+
301
+ def create_enzyme_config
302
+ run 'mkdir -p spec/javascript/support'
303
+ devDependencies = parsed_package_json["devDependencies"].keys
304
+ enzymeAdapter = devDependencies.select{ |d| d =~ /^enzyme-adapter-react-[0-9]*/ }[0]
305
+
306
+ inside 'spec/javascript/support' do
307
+ template 'enzyme.js'
308
+ gsub_file 'enzyme.js', 'ADAPTER NAME GOES HERE', enzymeAdapter
309
+ end
310
+
311
+ inside 'app/javascript/react/components' do
312
+ template "example.test.js"
313
+ end
314
+ end
315
+
300
316
  def parsed_package_json
301
317
  @package_json ||= parse_json_file(package_json_file)
302
318
  end