jets 1.9.32 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/lib/jets/application/defaults.rb +6 -0
  4. data/lib/jets/cli.rb +9 -0
  5. data/lib/jets/commands/help/generate.md +25 -19
  6. data/lib/jets/commands/main.rb +3 -3
  7. data/lib/jets/commands/rake_tasks.rb +3 -0
  8. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +1 -0
  9. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +4 -0
  10. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +3 -0
  11. data/lib/jets/commands/upgrade.rb +42 -109
  12. data/lib/jets/commands/upgrade/version1.rb +136 -0
  13. data/lib/jets/controller/base.rb +16 -0
  14. data/lib/jets/controller/error.rb +4 -0
  15. data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
  16. data/lib/jets/controller/forgery_protection.rb +43 -0
  17. data/lib/jets/controller/middleware/local.rb +3 -3
  18. data/lib/jets/controller/middleware/local/route_matcher.rb +1 -1
  19. data/lib/jets/controller/middleware/main.rb +7 -1
  20. data/lib/jets/controller/rack/adapter.rb +1 -1
  21. data/lib/jets/controller/rack/env.rb +1 -1
  22. data/lib/jets/controller/rendering/rack_renderer.rb +44 -37
  23. data/lib/jets/controller/stage.rb +2 -1
  24. data/lib/jets/generator.rb +72 -8
  25. data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
  26. data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
  27. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +11 -16
  28. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +2 -2
  29. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +5 -5
  30. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +1 -1
  31. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +3 -3
  32. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +5 -5
  33. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +1 -0
  34. data/lib/jets/overrides/rails.rb +2 -1
  35. data/lib/jets/overrides/rails/action_controller.rb +12 -0
  36. data/lib/jets/overrides/rails/url_helper.rb +66 -5
  37. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +1 -1
  38. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +1 -1
  39. data/lib/jets/router.rb +32 -46
  40. data/lib/jets/router/dsl.rb +136 -0
  41. data/lib/jets/router/error.rb +4 -0
  42. data/lib/jets/router/helpers.rb +4 -0
  43. data/lib/jets/router/helpers/core_helper.rb +17 -0
  44. data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
  45. data/lib/jets/router/method_creator.rb +54 -0
  46. data/lib/jets/router/method_creator/code.rb +98 -0
  47. data/lib/jets/router/method_creator/edit.rb +7 -0
  48. data/lib/jets/router/method_creator/generic.rb +11 -0
  49. data/lib/jets/router/method_creator/index.rb +42 -0
  50. data/lib/jets/router/method_creator/new.rb +7 -0
  51. data/lib/jets/router/method_creator/root.rb +15 -0
  52. data/lib/jets/router/method_creator/show.rb +7 -0
  53. data/lib/jets/router/resources/base.rb +7 -0
  54. data/lib/jets/router/resources/filter.rb +15 -0
  55. data/lib/jets/router/resources/options.rb +13 -0
  56. data/lib/jets/router/route.rb +226 -0
  57. data/lib/jets/router/scope.rb +65 -4
  58. data/lib/jets/router/util.rb +38 -0
  59. data/lib/jets/turbo/project/config/application.rb +1 -0
  60. data/lib/jets/version.rb +1 -1
  61. metadata +26 -2
  62. data/lib/jets/route.rb +0 -166
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5d10f05b816286dec593e0c9ca8581e2676508bd0654f482d820daed75f5d530
4
- data.tar.gz: 478a8b35bab50653e88310fec4433cb9bed0f083080c0263d44fcb03fb5df0c0
3
+ metadata.gz: 90b750940941cb6ebaa69fc6a0cda74dc858db9f646a2c90b5a90e1b037518d8
4
+ data.tar.gz: b591655943debcf36b60618e11745d172658dd3fe7415a9ab46c6e4e2adf4c27
5
5
  SHA512:
6
- metadata.gz: da638c5d9a3b9f2e4dd2b1061230d03082e942e2a5f0f574d6ef098759e948401d61b518384f985a520e23910cd30f347caf26364b4e0850865356524b1938a9
7
- data.tar.gz: b1e6cf71f5bfac26f35f508ca7370a6acf80cead9282a11e25c114fb8f6bb9d4d411cd324c2721f6e9896f94eb34b6196be9fdb629375a03f2048b1d7e3fe58c
6
+ metadata.gz: 694c37c3c6331c565441ae486643969bdebc914ec193ca8fdec5d36fb928915aee9ede4c8fbe689b06fef1a52f6bd8072188b4796c247e16e9b9bb810163dfbb
7
+ data.tar.gz: b28b1b16569a58d06e647a3d05ac8ecdb9d0ba7e615870d82273d6911da31386ae7c86593a97ee41933ed6aa592eae3b92b407ad5b8cb5d2a11fa0f3c98fd0fd
@@ -3,6 +3,15 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  This project *loosely tries* to adhere to [Semantic Versioning](http://semver.org/).
5
5
 
6
+ ## [2.0.0]
7
+ - #318 Major Routing upgrade
8
+ - Routing Upgrades: nested resources, namespace, scope, singular resource
9
+ - Name routes helpers
10
+ - Forgery protection
11
+ - Generators upgrades: scaffold, controller, model, job, etc
12
+ - Autoload Rake tasks in lib/tasks.
13
+ - Update upgrading docs
14
+
6
15
  ## [1.9.32]
7
16
  - #317 fix jets deploy when no /tmp/jets exists yet
8
17
 
@@ -139,6 +139,12 @@ class Jets::Application
139
139
  # So tried to defined this in the jets/mailer.rb Turbine only but jets new requires it
140
140
  # config.action_mailer = ActiveSupport::OrderedOptions.new
141
141
 
142
+ config.helpers = ActiveSupport::OrderedOptions.new
143
+ config.helpers.host = nil # nil by default. Other examples: https://myurl.com:8888
144
+
145
+ config.controllers = ActiveSupport::OrderedOptions.new
146
+ config.controllers.default_protect_from_forgery = true
147
+
142
148
  config
143
149
  end
144
150
 
@@ -76,6 +76,15 @@ class Jets::CLI
76
76
  def thor_args
77
77
  args = @given_args.clone
78
78
 
79
+ # jets generate is a special command requires doesn't puts out the help menu automatically when
80
+ # `jets generate` is called without additional args. We'll take it over early and fix it here.
81
+ autocomplete_command = Jets::Commands::Base.autocomplete(args[0])
82
+ generate = autocomplete_command == "generate"
83
+ if generate && (args.size == 1 || help_flags.include?(args.last))
84
+ puts Jets::Generator.help
85
+ exit
86
+ end
87
+
79
88
  help_args = args & help_flags
80
89
  unless help_args.empty?
81
90
  # Allow using help flags at the end of the command to trigger help menu
@@ -1,22 +1,28 @@
1
1
  This piggy backs off of the [rails scaffold generator](https://guides.rubyonrails.org/command_line.html#rails-generate).
2
2
 
3
- ## Example
3
+ ## General options
4
4
 
5
- $ jets generate scaffold post title:string body:text published:boolean
6
- invoke active_record
7
- create db/migrate/20180817052529_create_posts.rb
8
- create app/models/post.rb
9
- invoke resource_route
10
- route resources :posts
11
- invoke scaffold_controller
12
- create app/controllers/posts_controller.rb
13
- invoke erb
14
- create app/views/posts
15
- create app/views/posts/index.html.erb
16
- create app/views/posts/edit.html.erb
17
- create app/views/posts/show.html.erb
18
- create app/views/posts/new.html.erb
19
- create app/views/posts/_form.html.erb
20
- invoke helper
21
- create app/helpers/posts_helper.rb
22
- $
5
+ -h, [--help] # Print generator's options and usage
6
+ -p, [--pretend] # Run but do not make any changes
7
+ -f, [--force] # Overwrite files that already exist
8
+ -s, [--skip] # Skip files that already exist
9
+ -q, [--quiet] # Suppress status output
10
+
11
+ Please choose a generator below.
12
+
13
+ Jets:
14
+
15
+ application_record
16
+ controller
17
+ helper
18
+ job
19
+ migration
20
+ model
21
+ resource
22
+ scaffold
23
+ scaffold_controller
24
+ task
25
+
26
+ ActiveRecord:
27
+
28
+ active_record:application_record
@@ -51,7 +51,7 @@ module Jets::Commands
51
51
  desc "routes", "Print out your application routes"
52
52
  long_desc Help.text(:routes)
53
53
  def routes
54
- puts Jets::Router.routes_help
54
+ puts Jets::Router.help(Jets::Router.routes)
55
55
  end
56
56
 
57
57
  desc "console", "REPL console with Jets environment loaded"
@@ -97,13 +97,13 @@ module Jets::Commands
97
97
  end
98
98
 
99
99
  desc "generate [type] [args]", "Generates things like scaffolds"
100
- long_desc Help.text(:generate)
100
+ long_desc Jets::Generator.help
101
101
  def generate(generator, *args)
102
102
  Jets::Generator.invoke(generator, *args)
103
103
  end
104
104
 
105
105
  desc "degenerate [type] [args]", "Destroys things like scaffolds"
106
- long_desc Help.text(:degenerate)
106
+ long_desc Jets::Generator.help
107
107
  def degenerate(generator, *args)
108
108
  Jets::Generator.revoke(generator, *args)
109
109
  end
@@ -17,6 +17,9 @@ class Jets::Commands::RakeTasks
17
17
  Jets::Commands::Db::Tasks.load!
18
18
  load_webpacker_tasks
19
19
 
20
+ # custom project rake tasks
21
+ Dir.glob("#{Jets.root}/lib/tasks/*.rake").each { |r| load r }
22
+
20
23
  @@loaded = true
21
24
  end
22
25
 
@@ -5,6 +5,7 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
6
6
  <meta name="theme-color" content="#000000">
7
7
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
8
+ <%%= csrf_meta_tags %>
8
9
  <title>Jets App</title>
9
10
  <%%= javascript_pack_tag "application" %>
10
11
  <%%= stylesheet_pack_tag "theme" %>
@@ -64,4 +64,8 @@ Jets.application.configure do
64
64
  # local testing environment you may want to log these messages to 'test.log' file to keep your
65
65
  # testing suite output readable.
66
66
  # config.logger = Jets::Logger.new($strerr)
67
+
68
+ <% if @options[:mode] == 'api' -%>
69
+ config.controllers.default_protect_from_forgery = false
70
+ <% end -%>
67
71
  end
@@ -66,9 +66,12 @@ $(function() {
66
66
  node.hide(); // immediately hide element
67
67
 
68
68
  var resource = link.attr("href");
69
+ var token = $('meta[name=csrf-token]').attr('content');
70
+ var data = { authenticity_token: token };
69
71
  var request = $.ajax({
70
72
  url: resource,
71
73
  method: "DELETE",
74
+ data: data,
72
75
  dataType: "json"
73
76
  });
74
77
 
@@ -9,138 +9,71 @@ module Jets::Commands
9
9
 
10
10
  def run
11
11
  puts "Upgrading to Jets structure to latest version"
12
- environment_configs
13
- update_routes
14
- update_mode_setting
15
- update_config_ru
16
- remove_ruby_lazy_load
17
- update_webpack_binstubs
18
- add_dynomite_to_gemfile
12
+ Version1.new.run
13
+ # version 2 upgrades
14
+ inject_csrf_meta_tags
15
+ update_crud_js
16
+ update_config_application_rb
19
17
  puts "Upgrade complete."
20
18
  end
21
19
 
22
- def environment_configs
23
- path = File.expand_path("templates/skeleton/config/environments", File.dirname(__FILE__))
24
- puts "path #{path}"
25
- Dir.glob("#{path}/*").each do |src|
26
- config_file = "config/environments/#{File.basename(src)}"
27
- dest = "#{Jets.root}/#{config_file}"
20
+ def inject_csrf_meta_tags
21
+ layout = "app/views/layouts/application.html.erb"
22
+ return unless File.exist?(layout)
28
23
 
29
- puts "src #{src}"
30
- puts "dest #{dest}"
31
- unless File.exist?(dest)
32
- puts "Create: #{config_file}"
33
- FileUtils.mkdir_p(File.dirname(dest))
34
- FileUtils.cp(src, dest)
35
- end
36
- end
37
- end
38
-
39
- def update_routes
40
- routes_file = "#{Jets.root}/config/routes.rb"
41
- return unless File.exist?(routes_file)
42
-
43
- lines = IO.readlines(routes_file)
44
- deprecated_code = 'root "jets/welcome#index"'
45
- return unless lines.detect { |l| l.include?(deprecated_code) }
24
+ lines = IO.readlines(layout)
25
+ csrf_meta_tags = lines.find { |l| l =~ /<%= csrf_meta_tags %>/ }
26
+ return if csrf_meta_tags
46
27
 
47
- puts "Update: config/routes.rb"
28
+ puts "Update: #{layout} with csrf_meta_tags helper"
48
29
  lines.map! do |line|
49
- if line.include?(deprecated_code)
50
- %Q| root "jets/public#show"\n| # assume 2 spaces for simplicity
30
+ if line.include?("<head>")
31
+ # add csrf_meta_tags helper
32
+ "#{line} <%= csrf_meta_tags %>\n"
51
33
  else
52
34
  line
53
35
  end
54
36
  end
55
37
 
56
38
  content = lines.join
57
- IO.write(routes_file, content)
39
+ IO.write(layout, content)
58
40
  end
59
41
 
60
- def update_mode_setting
61
- application_file = "#{Jets.root}/config/application.rb"
62
- lines = IO.readlines(application_file)
63
- deprecated_code = 'config.api_generator'
64
- return unless lines.detect { |l| l.include?(deprecated_code) }
65
-
66
- puts "Update: config/application.rb"
67
- lines.map! do |line|
68
- if line.include?(deprecated_code)
69
- mode = Jets.config.api_generator ? 'api' : 'html'
70
- %Q| config.mode = "#{mode}"\n| # assume 2 spaces for simplicity
71
- else
72
- line
73
- end
74
- end
75
-
76
- content = lines.join
77
- IO.write(application_file, content)
78
- end
42
+ def update_crud_js
43
+ src = File.expand_path("templates/webpacker/app/javascript/src/jets/crud.js", File.dirname(__FILE__))
44
+ dest = "app/javascript/src/jets/crud.js"
45
+ return unless File.exist?(dest)
79
46
 
80
- def update_config_ru
81
- src = "#{Jets.root}/config.ru"
82
- return unless File.exist?(src)
83
- config_ru = File.read(src)
84
- return if config_ru.include?("Jets.boot")
47
+ lines = IO.readlines(dest)
48
+ csrf = lines.find { |l| l =~ /csrf-token/ }
49
+ return if csrf
85
50
 
86
- src = File.expand_path("templates/skeleton/config.ru", File.dirname(__FILE__))
87
- dest = src
88
- puts "Update: config.ru"
51
+ FileUtils.mkdir_p(File.dirname(dest))
89
52
  FileUtils.cp(src, dest)
53
+ puts "Update: #{dest}"
90
54
  end
91
55
 
92
- def remove_ruby_lazy_load
93
- app_config = "#{Jets.root}/config/application.rb"
94
- remove_ruby_lazy_load_for(app_config)
95
- Dir.glob("#{Jets.root}/config/environments/*.rb").each do |env_config|
96
- remove_ruby_lazy_load_for(env_config)
97
- end
98
- end
99
-
100
- def remove_ruby_lazy_load_for(path)
101
- lines = IO.readlines(path)
102
- new_lines = lines.reject do |l|
103
- l =~ %r{config.ruby.lazy_load}
104
- end
105
- return unless lines != new_lines
106
-
107
- content = new_lines.join("")
108
- IO.write(path, content)
109
- puts "Update: #{path}"
110
- end
111
-
112
- def update_webpack_binstubs
113
- return unless File.exist?("bin/webpack")
114
- lines = IO.readlines("bin/webpack")
115
- already_upgraded = lines.detect { |l| l =~ /WebpackRunner/ }
116
- return if already_upgraded
117
-
118
- update_project_file("bin/webpack")
119
- update_project_file("bin/webpack-dev-server")
120
- puts "Updated webpack binstubs."
121
- end
122
-
123
- def add_dynomite_to_gemfile
124
- return unless File.exist?("app/models/application_item.rb")
56
+ def update_config_application_rb
57
+ app_rb = "config/application.rb"
58
+ lines = IO.readlines(app_rb)
59
+ api_mode = lines.find { |l| l =~ /config\.mode/ && l =~ /api/ }
60
+ return unless api_mode
125
61
 
126
- lines = IO.readlines("Gemfile")
127
- dynomite_found = lines.detect { |l| l =~ /dynomite/ }
128
- return if dynomite_found
62
+ forgery = lines.find { |l| l =~ /default_protect_from_forgery/ }
63
+ return if forgery
129
64
 
130
- File.open('Gemfile', 'a') do |f|
131
- f.puts 'gem "dynomite"'
65
+ lines.map! do |line|
66
+ if line =~ /^end/
67
+ # add default_protect_from_forgery = false
68
+ " config.controllers.default_protect_from_forgery = false\n#{line}"
69
+ else
70
+ line
71
+ end
132
72
  end
133
- puts "Updated Gemfile: add dynomite gem"
134
- end
135
73
 
136
- private
137
- def update_project_file(relative_path)
138
- templates = File.expand_path("upgrade/templates", File.dirname(__FILE__))
139
- src = "#{templates}/#{relative_path}"
140
- dest = relative_path
141
- FileUtils.mkdir_p(File.dirname(dest))
142
- FileUtils.cp(src, dest)
143
- puts "Update: #{dest}"
74
+ content = lines.join
75
+ IO.write(app_rb, content)
76
+ puts "Update: #{app_rb} with default_protect_from_forgery"
144
77
  end
145
78
  end
146
79
  end
@@ -0,0 +1,136 @@
1
+ class Jets::Commands::Upgrade
2
+ class Version1
3
+ def run
4
+ environment_configs
5
+ update_routes
6
+ update_mode_setting
7
+ update_config_ru
8
+ remove_ruby_lazy_load
9
+ update_webpack_binstubs
10
+ add_dynomite_to_gemfile
11
+ end
12
+
13
+ def environment_configs
14
+ path = File.expand_path("templates/skeleton/config/environments", File.dirname(__FILE__))
15
+ Dir.glob("#{path}/*").each do |src|
16
+ config_file = "config/environments/#{File.basename(src)}"
17
+ dest = "#{Jets.root}/#{config_file}"
18
+
19
+ puts "src #{src}"
20
+ puts "dest #{dest}"
21
+ unless File.exist?(dest)
22
+ puts "Create: #{config_file}"
23
+ FileUtils.mkdir_p(File.dirname(dest))
24
+ FileUtils.cp(src, dest)
25
+ end
26
+ end
27
+ end
28
+
29
+ def update_routes
30
+ routes_file = "#{Jets.root}/config/routes.rb"
31
+ return unless File.exist?(routes_file)
32
+
33
+ lines = IO.readlines(routes_file)
34
+ deprecated_code = 'root "jets/welcome#index"'
35
+ return unless lines.detect { |l| l.include?(deprecated_code) }
36
+
37
+ puts "Update: config/routes.rb"
38
+ lines.map! do |line|
39
+ if line.include?(deprecated_code)
40
+ %Q| root "jets/public#show"\n| # assume 2 spaces for simplicity
41
+ else
42
+ line
43
+ end
44
+ end
45
+
46
+ content = lines.join
47
+ IO.write(routes_file, content)
48
+ end
49
+
50
+ def update_mode_setting
51
+ application_file = "#{Jets.root}/config/application.rb"
52
+ lines = IO.readlines(application_file)
53
+ deprecated_code = 'config.api_generator'
54
+ return unless lines.detect { |l| l.include?(deprecated_code) }
55
+
56
+ puts "Update: config/application.rb"
57
+ lines.map! do |line|
58
+ if line.include?(deprecated_code)
59
+ mode = Jets.config.api_generator ? 'api' : 'html'
60
+ %Q| config.mode = "#{mode}"\n| # assume 2 spaces for simplicity
61
+ else
62
+ line
63
+ end
64
+ end
65
+
66
+ content = lines.join
67
+ IO.write(application_file, content)
68
+ end
69
+
70
+ def update_config_ru
71
+ src = "#{Jets.root}/config.ru"
72
+ return unless File.exist?(src)
73
+ config_ru = File.read(src)
74
+ return if config_ru.include?("Jets.boot")
75
+
76
+ src = File.expand_path("templates/skeleton/config.ru", File.dirname(__FILE__))
77
+ dest = src
78
+ puts "Update: config.ru"
79
+ FileUtils.cp(src, dest)
80
+ end
81
+
82
+ def remove_ruby_lazy_load
83
+ app_config = "#{Jets.root}/config/application.rb"
84
+ remove_ruby_lazy_load_for(app_config)
85
+ Dir.glob("#{Jets.root}/config/environments/*.rb").each do |env_config|
86
+ remove_ruby_lazy_load_for(env_config)
87
+ end
88
+ end
89
+
90
+ def remove_ruby_lazy_load_for(path)
91
+ lines = IO.readlines(path)
92
+ new_lines = lines.reject do |l|
93
+ l =~ %r{config.ruby.lazy_load}
94
+ end
95
+ return unless lines != new_lines
96
+
97
+ content = new_lines.join("")
98
+ IO.write(path, content)
99
+ puts "Update: #{path}"
100
+ end
101
+
102
+ def update_webpack_binstubs
103
+ return unless File.exist?("bin/webpack")
104
+ lines = IO.readlines("bin/webpack")
105
+ already_upgraded = lines.detect { |l| l =~ /WebpackRunner/ }
106
+ return if already_upgraded
107
+
108
+ update_project_file("bin/webpack")
109
+ update_project_file("bin/webpack-dev-server")
110
+ puts "Updated webpack binstubs."
111
+ end
112
+
113
+ def add_dynomite_to_gemfile
114
+ return unless File.exist?("app/models/application_item.rb")
115
+
116
+ lines = IO.readlines("Gemfile")
117
+ dynomite_found = lines.detect { |l| l =~ /dynomite/ }
118
+ return if dynomite_found
119
+
120
+ File.open('Gemfile', 'a') do |f|
121
+ f.puts 'gem "dynomite"'
122
+ end
123
+ puts "Updated Gemfile: add dynomite gem"
124
+ end
125
+
126
+ private
127
+ def update_project_file(relative_path)
128
+ templates = File.expand_path("upgrade/templates", File.dirname(__dir__))
129
+ src = "#{templates}/#{relative_path}"
130
+ dest = relative_path
131
+ FileUtils.mkdir_p(File.dirname(dest))
132
+ FileUtils.cp(src, dest)
133
+ puts "Update: #{dest}"
134
+ end
135
+ end
136
+ end