jets 1.9.32 → 2.0.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 (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
@@ -1,6 +1,8 @@
1
1
  module Jets
2
2
  class Router
3
3
  class Scope
4
+ include Util
5
+
4
6
  attr_reader :options, :parent, :level
5
7
  def initialize(options = {}, parent = nil, level = 1)
6
8
  @options = options
@@ -16,14 +18,73 @@ module Jets
16
18
  self.class.new(options, self, level + 1)
17
19
  end
18
20
 
19
- def full_namespace
20
- ns = []
21
+ def full_module
22
+ items = walk_parents do |current, i, result|
23
+ mod = current.options[:module]
24
+ next unless mod
25
+ result.unshift(mod)
26
+ end
27
+
28
+ items.empty? ? nil : items.join('/')
29
+ end
30
+
31
+ def full_prefix
32
+ items = walk_parents do |current, i, result|
33
+ prefix = current.options[:prefix]
34
+ next unless prefix
35
+
36
+ case current.from
37
+ when :resources
38
+ variable = prefix.to_s.split('/').last
39
+ variable = ":#{variable.singularize}_id"
40
+ result.unshift(variable)
41
+ result.unshift(prefix)
42
+ else # resource, namespace or general scope
43
+ result.unshift(prefix)
44
+ end
45
+ end
46
+
47
+ items.empty? ? nil : items.join('/')
48
+ end
49
+
50
+ def full_as
51
+ items = []
21
52
  current = self
22
53
  while current
23
- ns.unshift(current.options[:namespace])
54
+ items.unshift(current.options[:as]) # <= option_name
55
+ current = current.parent
56
+ end
57
+
58
+ items.compact!
59
+ return if items.empty?
60
+
61
+ items = singularize_leading(items)
62
+ items.join('_')
63
+ end
64
+
65
+ def walk_parents
66
+ current, i, result = self, 0, []
67
+ while current
68
+ yield(current, i, result)
24
69
  current = current.parent
70
+ i += 1
25
71
  end
26
- ns.empty? ? nil : ns.join('/')
72
+ result
73
+ end
74
+
75
+ # singularize all except last item
76
+ def singularize_leading(items)
77
+ result = []
78
+ items.each_with_index do |item, index|
79
+ item = item.to_s
80
+ r = index == items.size - 1 ? item : item.singularize
81
+ result << r
82
+ end
83
+ result
84
+ end
85
+
86
+ def from
87
+ @options[:from]
27
88
  end
28
89
  end
29
90
  end
@@ -0,0 +1,38 @@
1
+ class Jets::Router
2
+ module Util
3
+ # used in MethodCreator logic
4
+ def join(*items)
5
+ list = items.compact.join('_')
6
+ underscore(list)
7
+ end
8
+
9
+ def underscore(str)
10
+ return unless str
11
+ str.to_s.gsub(/[^a-zA-Z0-9]/,'_')
12
+ end
13
+
14
+ def get_controller_action(options)
15
+ if options.key?(:controller) && options.key?(:action)
16
+ [options[:controller], options[:action]]
17
+ elsif options.key?(:controller) && options.key?(:to)
18
+ action = options[:to].split('#').last
19
+ [options[:controller], action]
20
+ elsif options.key?(:on)
21
+ handle_on!(options)
22
+ else
23
+ options[:to].split('#') # controller, action
24
+ end
25
+ end
26
+
27
+ def handle_on!(options)
28
+ controller = @scope.options[:prefix].to_s
29
+ to = "#{controller}##{options[:path]}"
30
+ options[:to] = to
31
+
32
+ as = @options[:on] == :member ? controller.singularize : controller
33
+ as = "#{@options[:path]}_#{as}"
34
+ options[:as] = as
35
+ to.split('#')
36
+ end
37
+ end
38
+ end
@@ -1,4 +1,5 @@
1
1
  Jets.application.configure do
2
2
  config.project_name = "project"
3
3
  config.mode = "api"
4
+ config.controllers.default_protect_from_forgery = false
4
5
  end
@@ -1,3 +1,3 @@
1
1
  module Jets
2
- VERSION = "1.9.32"
2
+ VERSION = "2.0.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jets
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.9.32
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
@@ -727,6 +727,7 @@ files:
727
727
  - lib/jets/commands/upgrade.rb
728
728
  - lib/jets/commands/upgrade/templates/bin/webpack
729
729
  - lib/jets/commands/upgrade/templates/bin/webpack-dev-server
730
+ - lib/jets/commands/upgrade/version1.rb
730
731
  - lib/jets/commands/url.rb
731
732
  - lib/jets/commands/webpacker_template.rb
732
733
  - lib/jets/controller.rb
@@ -734,6 +735,9 @@ files:
734
735
  - lib/jets/controller/callbacks.rb
735
736
  - lib/jets/controller/cookies.rb
736
737
  - lib/jets/controller/cookies/jar.rb
738
+ - lib/jets/controller/error.rb
739
+ - lib/jets/controller/error/invalid_authenticity_token.rb
740
+ - lib/jets/controller/forgery_protection.rb
737
741
  - lib/jets/controller/layout.rb
738
742
  - lib/jets/controller/middleware/cors.rb
739
743
  - lib/jets/controller/middleware/local.rb
@@ -759,6 +763,8 @@ files:
759
763
  - lib/jets/dotenv/ssm.rb
760
764
  - lib/jets/erb.rb
761
765
  - lib/jets/generator.rb
766
+ - lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt
767
+ - lib/jets/generator/templates/active_job/job/templates/job.rb.tt
762
768
  - lib/jets/generator/templates/erb/controller/view.html.erb
763
769
  - lib/jets/generator/templates/erb/scaffold/_form.html.erb
764
770
  - lib/jets/generator/templates/erb/scaffold/edit.html.erb
@@ -817,6 +823,7 @@ files:
817
823
  - lib/jets/overrides/lambda.rb
818
824
  - lib/jets/overrides/lambda/marshaller.rb
819
825
  - lib/jets/overrides/rails.rb
826
+ - lib/jets/overrides/rails/action_controller.rb
820
827
  - lib/jets/overrides/rails/asset_tag_helper.rb
821
828
  - lib/jets/overrides/rails/common_methods.rb
822
829
  - lib/jets/overrides/rails/rendering_helper.rb
@@ -884,9 +891,26 @@ files:
884
891
  - lib/jets/resource/sns/topic_policy.rb
885
892
  - lib/jets/resource/sqs/queue.rb
886
893
  - lib/jets/resource/standardizer.rb
887
- - lib/jets/route.rb
888
894
  - lib/jets/router.rb
895
+ - lib/jets/router/dsl.rb
896
+ - lib/jets/router/error.rb
897
+ - lib/jets/router/helpers.rb
898
+ - lib/jets/router/helpers/core_helper.rb
899
+ - lib/jets/router/helpers/named_routes_helper.rb
900
+ - lib/jets/router/method_creator.rb
901
+ - lib/jets/router/method_creator/code.rb
902
+ - lib/jets/router/method_creator/edit.rb
903
+ - lib/jets/router/method_creator/generic.rb
904
+ - lib/jets/router/method_creator/index.rb
905
+ - lib/jets/router/method_creator/new.rb
906
+ - lib/jets/router/method_creator/root.rb
907
+ - lib/jets/router/method_creator/show.rb
908
+ - lib/jets/router/resources/base.rb
909
+ - lib/jets/router/resources/filter.rb
910
+ - lib/jets/router/resources/options.rb
911
+ - lib/jets/router/route.rb
889
912
  - lib/jets/router/scope.rb
913
+ - lib/jets/router/util.rb
890
914
  - lib/jets/rule/base.rb
891
915
  - lib/jets/rule/dsl.rb
892
916
  - lib/jets/spec_helpers.rb
@@ -1,166 +0,0 @@
1
- # route = Jets::Route.new(
2
- # path: "posts",
3
- # method: :get,
4
- # to: "posts#index",
5
- # )
6
- class Jets::Route
7
- CAPTURE_REGEX = "([^/]*)" # as string
8
-
9
- def initialize(options)
10
- @options = options
11
- end
12
-
13
- # IE: standard: posts/:id/edit
14
- # api_gateway: posts/{id}/edit
15
- def path(format=:jets)
16
- case format
17
- when :api_gateway
18
- api_gateway_format(@options[:path])
19
- when :raw
20
- @options[:path]
21
- else # jets format
22
- ensure_jets_format(@options[:path])
23
- end
24
- end
25
-
26
- def method
27
- @options[:method].to_s.upcase
28
- end
29
-
30
- # IE: posts#index
31
- def to
32
- @options[:to]
33
- end
34
-
35
- def internal?
36
- !!@options[:internal]
37
- end
38
-
39
- def homepage?
40
- path == ''
41
- end
42
-
43
- # IE: PostsController
44
- def controller_name
45
- to.sub(/#.*/,'').camelize + "Controller"
46
- end
47
-
48
- # IE: index
49
- def action_name
50
- to.sub(/.*#/,'')
51
- end
52
-
53
- # Checks to see if the corresponding controller exists. Useful to validate routes
54
- # before deploying to CloudFormation and then rolling back.
55
- def valid?
56
- controller_class = begin
57
- controller_name.constantize
58
- rescue NameError
59
- return false
60
- end
61
- controller_class.lambda_functions.include?(action_name.to_sym)
62
- end
63
-
64
- # Extracts the path parameters from the actual path
65
- # Only supports extracting 1 parameter. So:
66
- #
67
- # actual_path: posts/tung/edit
68
- # route.path: posts/:id/edit
69
- #
70
- # Returns:
71
- # { id: "tung" }
72
- def extract_parameters(actual_path)
73
- if path.include?(':')
74
- extract_parameters_capture(actual_path)
75
- elsif path.include?('*')
76
- extract_parameters_proxy(actual_path)
77
- else
78
- # Lambda AWS_PROXY sets null to the input request when there are no path parmeters
79
- nil
80
- end
81
- end
82
-
83
- def extract_parameters_proxy(actual_path)
84
- # changes path to a string used for a regexp
85
- # others/*proxy => others\/(.*)
86
- # nested/others/*proxy => nested/others\/(.*)
87
- if path.include?('/')
88
- leading_path = path.split('/')[0..-2].join('/') # drop last segment
89
- # leading_path: nested/others
90
- # capture everything after the leading_path as the value
91
- regexp = Regexp.new("#{leading_path}/(.*)")
92
- value = actual_path.match(regexp)[1]
93
- else
94
- value = actual_path
95
- end
96
-
97
- # the last segment without the '*' is the key
98
- proxy_segment = path.split('/').last # last segment is the proxy segment
99
- # proxy_segment: *proxy
100
- key = proxy_segment.sub('*','')
101
-
102
- { key => value }
103
- end
104
-
105
- def extract_parameters_capture(actual_path)
106
- # changes path to a string used for a regexp
107
- # posts/:id/edit => posts\/(.*)\/edit
108
- labels = []
109
- regexp_string = path.split('/').map do |s|
110
- if s.start_with?(':')
111
- labels << s.delete_prefix(':')
112
- CAPTURE_REGEX
113
- else
114
- s
115
- end
116
- end.join('\/')
117
- # make sure beginning and end of the string matches
118
- regexp_string = "^#{regexp_string}$"
119
- regexp = Regexp.new(regexp_string)
120
-
121
- values = regexp.match(actual_path).captures
122
- labels.map do |next_label|
123
- [next_label, values.delete_at(0)]
124
- end.to_h
125
- end
126
-
127
- def authorization_type
128
- @options[:authorization_type]
129
- end
130
-
131
- private
132
- def ensure_jets_format(path)
133
- path.split('/').map do |s|
134
- if s =~ /^\{/ and s =~ /\+\}$/
135
- s.sub(/^\{/, '*').sub(/\+\}$/,'') # {proxy+} => *proxy
136
- elsif s =~ /^\{/ and s =~ /\}$/
137
- s.sub('{',':').sub(/\}$/,'') # {id} => :id
138
- else
139
- s
140
- end
141
- end.join('/')
142
- end
143
-
144
- def api_gateway_format(path)
145
- path.split('/')
146
- .map {|s| transform_capture(s) }
147
- .map {|s| transform_proxy(s) }
148
- .join('/')
149
- end
150
-
151
- def transform_capture(text)
152
- if text.starts_with?(':')
153
- text = text.sub(':','')
154
- text = "{#{text}}"
155
- end
156
- text
157
- end
158
-
159
- def transform_proxy(text)
160
- if text.starts_with?('*')
161
- text = text.sub('*','')
162
- text = "{#{text}+}"
163
- end
164
- text
165
- end
166
- end