jets 0.8.4 → 0.8.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a1e324ead9b88c6b0bb6086abfa1335cda56a02f1e99626fd670ebbb0c24c11
4
- data.tar.gz: fb549594a20485ac5b0102b1693bc37e0082ef5031b073557cb4ffea7d90a73d
3
+ metadata.gz: 96421520e6785d9b0ecf33b41d2e2b86d7d516f417c634fa0ec537b50ec462c1
4
+ data.tar.gz: 36c7a0111342c116e6c9fa90da21f8b6beadf0657a3e88f38c94fc1741e3ad09
5
5
  SHA512:
6
- metadata.gz: 04307b921ea8deb8a0b9db73aef2ba1920ec6e975a71d0b913d0d903b0e160a6bafe02cd4c3203684aaf9fa892b5370c8dd97b4e853778b534b064682e4321c5
7
- data.tar.gz: 0a60c57975f1e121fd8bd35150ce9d8469d15616ff91c4a71c9f0bc04d7201707ee27427b5b3bf893599e0219ccf67adfc45edc6fc0524dcc3933c00f6842a43
6
+ metadata.gz: 8cc413d4a3c20e6b039d19c40ce28e2cc018c334bc6183b907832235ab43df113c78b22fe9c05b69f03627cb42c72ca46889cf4523ac160ad7caaaee2b85b785
7
+ data.tar.gz: 4e4f81cd56d96bc637fc8d1bad521039f9c1693e4f2e9b46a98f047bad200ac239b8af66269d1f4330a71ee61a73ce202419e64236563cf118e12ca6ec2b706d
data/CHANGELOG.md CHANGED
@@ -3,6 +3,10 @@
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/), even before v1.0.
5
5
 
6
+ ## [0.8.5]
7
+ - Rename to Camelizer PR #23
8
+ - Fix helpers PR #22 from tongueroo/helpers
9
+
6
10
  ## [0.8.4]
7
11
  - fix custom iam policies
8
12
  - fix edge case: allow stack to be delete in rollback completed state
data/Gemfile.lock CHANGED
@@ -11,7 +11,7 @@ GIT
11
11
  PATH
12
12
  remote: .
13
13
  specs:
14
- jets (0.8.4)
14
+ jets (0.8.5)
15
15
  actionpack (>= 5.2.1)
16
16
  actionview (>= 5.2.1)
17
17
  activerecord (>= 5.2.1)
@@ -66,28 +66,28 @@ GEM
66
66
  arel (9.0.0)
67
67
  aws-eventstream (1.0.1)
68
68
  aws-partitions (1.102.0)
69
- aws-sdk-cloudformation (1.6.0)
70
- aws-sdk-core (~> 3)
69
+ aws-sdk-cloudformation (1.8.0)
70
+ aws-sdk-core (~> 3, >= 3.26.0)
71
71
  aws-sigv4 (~> 1.0)
72
- aws-sdk-cloudwatchlogs (1.5.0)
73
- aws-sdk-core (~> 3)
72
+ aws-sdk-cloudwatchlogs (1.7.0)
73
+ aws-sdk-core (~> 3, >= 3.26.0)
74
74
  aws-sigv4 (~> 1.0)
75
- aws-sdk-core (3.25.0)
75
+ aws-sdk-core (3.27.0)
76
76
  aws-eventstream (~> 1.0)
77
77
  aws-partitions (~> 1.0)
78
78
  aws-sigv4 (~> 1.0)
79
79
  jmespath (~> 1.0)
80
- aws-sdk-dynamodb (1.11.0)
81
- aws-sdk-core (~> 3)
80
+ aws-sdk-dynamodb (1.13.0)
81
+ aws-sdk-core (~> 3, >= 3.26.0)
82
82
  aws-sigv4 (~> 1.0)
83
- aws-sdk-kms (1.7.0)
84
- aws-sdk-core (~> 3)
83
+ aws-sdk-kms (1.9.0)
84
+ aws-sdk-core (~> 3, >= 3.26.0)
85
85
  aws-sigv4 (~> 1.0)
86
- aws-sdk-lambda (1.8.0)
87
- aws-sdk-core (~> 3)
86
+ aws-sdk-lambda (1.10.0)
87
+ aws-sdk-core (~> 3, >= 3.26.0)
88
88
  aws-sigv4 (~> 1.0)
89
- aws-sdk-s3 (1.17.1)
90
- aws-sdk-core (~> 3, >= 3.21.2)
89
+ aws-sdk-s3 (1.19.0)
90
+ aws-sdk-core (~> 3, >= 3.26.0)
91
91
  aws-sdk-kms (~> 1)
92
92
  aws-sigv4 (~> 1.0)
93
93
  aws-sigv4 (1.0.3)
data/lib/jets.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  $:.unshift(File.expand_path("../", __FILE__))
2
2
  require "jets/version"
3
- require "jets/pascalize"
3
+ require "jets/camelizer"
4
4
  require "active_support/core_ext/string"
5
5
  require "active_support/ordered_hash"
6
6
  require "colorize"
@@ -21,7 +21,7 @@ class Jets::Application
21
21
 
22
22
  config.prewarm = ActiveSupport::OrderedOptions.new
23
23
  config.prewarm.enable = true
24
- config.prewarm.rate = '2 hours'
24
+ config.prewarm.rate = '30 minutes'
25
25
  config.prewarm.concurrency = 2
26
26
  config.prewarm.public_ratio = 10
27
27
 
@@ -0,0 +1,64 @@
1
+ # Custom Camelizer with CloudFormation specific handling.
2
+ # Based on: https://stackoverflow.com/questions/8706930/converting-nested-hash-keys-from-camelcase-to-snake-case-in-ruby
3
+ module Jets
4
+ class Camelizer
5
+ class << self
6
+ def transform(value, parent_keys=[])
7
+ case value
8
+ when Array
9
+ value.map { |v| transform(v) }
10
+ when Hash
11
+ initializer = value.map do |k, v|
12
+ new_key = camelize_key(k, parent_keys)
13
+ [new_key, transform(v, parent_keys+[new_key])]
14
+ end
15
+ Hash[initializer]
16
+ else
17
+ value # do not transform values
18
+ end
19
+ end
20
+
21
+ def camelize_key(k, parent_keys=[])
22
+ k = k.to_s
23
+
24
+ if passthrough?(k, parent_keys)
25
+ k # pass through untouch
26
+ elsif parent_keys.last == "EventPattern" # top-level
27
+ k.dasherize
28
+ elsif parent_keys.include?("EventPattern")
29
+ # Any keys at 2nd level under EventPattern will be pascalized
30
+ pascalize(k)
31
+ else
32
+ camelize(k)
33
+ end
34
+ end
35
+
36
+ def passthrough?(k, parent_keys)
37
+ parent_keys.include?("Variables") || # do not transform keys anything under Variables
38
+ parent_keys.include?("ResponseParameters") || # do not transform keys anything under Variables
39
+ k.include?('-') || k.include?('/')
40
+ end
41
+
42
+ def camelize(value)
43
+ return value if value.is_a?(Integer)
44
+
45
+ value = value.to_s.camelize
46
+ special_map[value] || value
47
+ end
48
+
49
+ def pascalize(value)
50
+ new_value = value.camelize
51
+ first_char = new_value[0..0].downcase
52
+ new_value[0] = first_char
53
+ new_value
54
+ end
55
+
56
+ # Some keys have special mappings
57
+ def special_map
58
+ {
59
+ "TemplateUrl" => "TemplateURL"
60
+ }
61
+ end
62
+ end
63
+ end
64
+ end
@@ -110,7 +110,7 @@ class Jets::Cfn::Builders
110
110
  # )
111
111
  #
112
112
  def add_template_resource(logical_id, type, options)
113
- options = Jets::Pascalize.pascalize(options)
113
+ options = Jets::Camelizer.transform(options)
114
114
 
115
115
  attributes = if options.include?('Type')
116
116
  base = { 'Type' => type }
@@ -56,6 +56,7 @@ class Jets::Commands::Delete
56
56
 
57
57
  def empty_s3_bucket
58
58
  return unless s3_bucket_name # Happens when minimal stack fails to build
59
+ return unless bucket_exists?(s3_bucket_name)
59
60
 
60
61
  resp = s3.list_objects(bucket: s3_bucket_name)
61
62
  if resp.contents.size > 0
@@ -74,7 +75,6 @@ class Jets::Commands::Delete
74
75
 
75
76
  def s3_bucket_name
76
77
  return @s3_bucket_name if defined?(@s3_bucket_name)
77
- return unless bucket_exists?
78
78
 
79
79
  resp = cfn.describe_stacks(stack_name: parent_stack_name)
80
80
  outputs = resp.stacks[0].outputs
@@ -86,10 +86,10 @@ class Jets::Commands::Delete
86
86
  end
87
87
 
88
88
  # Thanks: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-does-bucket-exist.html
89
- def bucket_exists?
89
+ def bucket_exists?(bucket_name)
90
90
  bucket_exists = false
91
91
  begin
92
- resp = s3.head_bucket(bucket: @s3_bucket_name, use_accelerate_endpoint: false)
92
+ resp = s3.head_bucket(bucket: bucket_name, use_accelerate_endpoint: false)
93
93
  bucket_exists = true
94
94
  rescue
95
95
  end
@@ -104,12 +104,12 @@ class Jets::Commands::Delete
104
104
  if @options[:sure]
105
105
  sure = 'y'
106
106
  else
107
- puts "Are you sure you want to want to delete the '#{Jets.config.project_namespace}' project? (y/N)"
107
+ puts "Are you sure you want to want to delete the #{Jets.config.project_namespace.colorize(:green)} project? (y/N)"
108
108
  sure = $stdin.gets
109
109
  end
110
110
 
111
111
  unless sure =~ /^y/
112
- puts "Phew! Jets '#{Jets.config.project_namespace}' project was not deleted."
112
+ puts "Phew! Jets #{Jets.config.project_namespace.colorize(:green)} project was not deleted."
113
113
  exit 0
114
114
  end
115
115
  end
@@ -3,7 +3,7 @@ Jets.application.configure do
3
3
  config.api_generator = <%= !!@options[:api] %>
4
4
 
5
5
  # config.prewarm.enable = true # default is true
6
- # config.prewarm.rate = '2 hours' # default is '2 hours'
6
+ # config.prewarm.rate = '30 minutes' # default is '30 minutes'
7
7
  # config.prewarm.concurrency = 2 # default is 2
8
8
  # config.prewarm.public_ratio = 10 # default is 10
9
9
 
@@ -24,7 +24,7 @@
24
24
  "stageVariables": null,
25
25
  "requestContext": {
26
26
  "path": "/prod/posts",
27
- "accountId": "160619113767",
27
+ "accountId": "123456789012",
28
28
  "resourceId": "ery965",
29
29
  "stage": "prod",
30
30
  "requestId": "292fbcc8-c015-11e7-94fa-cd109b693f3c",
@@ -26,7 +26,7 @@
26
26
  "stageVariables": null,
27
27
  "requestContext": {
28
28
  "path": "/prod/posts/tung",
29
- "accountId": "160619113767",
29
+ "accountId": "123456789012",
30
30
  "resourceId": "wf2gvu",
31
31
  "stage": "prod",
32
32
  "requestId": "3feafb4e-c015-11e7-85c9-194f38f4c414",
@@ -11,8 +11,6 @@ module Jets::Controller::Renderers
11
11
  end
12
12
 
13
13
  def render
14
- setup_action_controller # setup only when necessary
15
-
16
14
  # Rails rendering does heavy lifting
17
15
  renderer = ActionController::Base.renderer.new(renderer_options)
18
16
  body = renderer.render(render_options)
@@ -73,35 +71,55 @@ module Jets::Controller::Renderers
73
71
  render_options
74
72
  end
75
73
 
76
- def setup_action_controller
77
- require "action_controller"
78
- require "jets/rails_overrides"
79
-
80
- # laod helpers
81
- helper_class = self.class.name.to_s.sub("Controller", "Helper")
82
- helper_path = "#{Jets.root}app/helpers/#{helper_class.underscore}.rb"
83
- ActiveSupport.on_load :action_view do
84
- include ApplicationHelper
85
- include helper_class.constantize if File.exist?(helper_path)
86
- end
74
+ class << self
75
+ def setup!
76
+ require "action_controller"
77
+ require "jets/rails_overrides"
87
78
 
88
- ActionController::Base.append_view_path("#{Jets.root}app/views")
79
+ # Load helpers
80
+ # Assign local variable because scoe in the `:action_view do` changes
81
+ app_helper_classes = find_app_helper_classes
82
+ ActiveSupport.on_load :action_view do
83
+ include ApplicationHelper # include first
84
+ app_helper_classes.each do |helper_class|
85
+ include helper_class
86
+ end
87
+ end
89
88
 
90
- setup_webpacker if Jets.webpacker?
91
- end
89
+ ActionController::Base.append_view_path("#{Jets.root}app/views")
92
90
 
93
- def setup_webpacker
94
- require 'webpacker'
95
- require 'webpacker/helper'
91
+ setup_webpacker if Jets.webpacker?
92
+ end
96
93
 
97
- ActiveSupport.on_load :action_controller do
98
- ActionController::Base.helper Webpacker::Helper
94
+ # Does not include ApplicationHelper, will include ApplicationHelper explicitly first.
95
+ def find_app_helper_classes
96
+ klasses = []
97
+ expression = "#{Jets.root}app/helpers/**/*"
98
+ Dir.glob(expression).each do |path|
99
+ next unless File.file?(path)
100
+ class_name = path.sub("#{Jets.root}app/helpers/","").sub(/\.rb/,'')
101
+ unless class_name == "application_helper"
102
+ klasses << class_name.classify.constantize # autoload
103
+ end
104
+ end
105
+ klasses
99
106
  end
100
107
 
101
- ActiveSupport.on_load :action_view do
102
- include Webpacker::Helper
108
+ def setup_webpacker
109
+ require 'webpacker'
110
+ require 'webpacker/helper'
111
+
112
+ ActiveSupport.on_load :action_controller do
113
+ ActionController::Base.helper Webpacker::Helper
114
+ end
115
+
116
+ ActiveSupport.on_load :action_view do
117
+ include Webpacker::Helper
118
+ end
103
119
  end
104
120
  end
105
121
 
106
122
  end
107
123
  end
124
+
125
+ Jets::Controller::Renderers::TemplateRenderer.setup!
data/lib/jets/resource.rb CHANGED
@@ -20,7 +20,7 @@ class Jets::Resource
20
20
  id = definition.keys.first
21
21
  # replace possible {namespace} in the logical id
22
22
  id = replacer.replace_value(id)
23
- Jets::Pascalize.pascalize_string(id)
23
+ Jets::Camelizer.camelize(id)
24
24
  end
25
25
 
26
26
  def type
@@ -34,7 +34,7 @@ class Jets::Resource
34
34
  def attributes
35
35
  attributes = definition.values.first
36
36
  attributes = replacer.replace_placeholders(attributes)
37
- Jets::Pascalize.pascalize(attributes)
37
+ Jets::Camelizer.transform(attributes)
38
38
  end
39
39
 
40
40
  def parameters
@@ -16,7 +16,7 @@ module Jets::Resource::Iam
16
16
 
17
17
  def policy_document
18
18
  definitions.map { |definition| standardize(definition) }
19
- Jets::Pascalize.pascalize(@policy)
19
+ Jets::Camelizer.transform(@policy)
20
20
  end
21
21
  memoize :policy_document # only process policy_document once
22
22
 
@@ -16,7 +16,7 @@ class Jets::Resource
16
16
  logical_id = [logical_id, counter].compact.join('')
17
17
  # replace possible {namespace} in the logical id
18
18
  logical_id = replacer.replace_value(logical_id)
19
- Jets::Pascalize.pascalize_string(logical_id)
19
+ Jets::Camelizer.camelize(logical_id)
20
20
  end
21
21
 
22
22
  def type
@@ -38,7 +38,7 @@ class Jets::Resource
38
38
  }
39
39
  }
40
40
  attributes = replacer.replace_placeholders(attributes)
41
- Jets::Pascalize.pascalize(attributes)
41
+ Jets::Camelizer.transform(attributes)
42
42
  end
43
43
  memoize :attributes
44
44
 
data/lib/jets/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Jets
2
- VERSION = "0.8.4"
2
+ VERSION = "0.8.5"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4
4
+ version: 0.8.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tung Nguyen
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-09-05 00:00:00.000000000 Z
11
+ date: 2018-09-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -439,6 +439,7 @@ files:
439
439
  - lib/jets/builders/handler_generator.rb
440
440
  - lib/jets/builders/node-hello.js
441
441
  - lib/jets/builders/node-shim.js
442
+ - lib/jets/camelizer.rb
442
443
  - lib/jets/cfn.rb
443
444
  - lib/jets/cfn/builders.rb
444
445
  - lib/jets/cfn/builders/api_deployment_builder.rb
@@ -591,7 +592,6 @@ files:
591
592
  - lib/jets/lambda/task.rb
592
593
  - lib/jets/logger.rb
593
594
  - lib/jets/naming.rb
594
- - lib/jets/pascalize.rb
595
595
  - lib/jets/poly_fun.rb
596
596
  - lib/jets/poly_fun/base_executor.rb
597
597
  - lib/jets/poly_fun/lambda_executor.rb
@@ -1,58 +0,0 @@
1
- module Jets
2
- class Pascalize
3
- class << self
4
- # Specialized pascalize that will not pascalize keys under the
5
- # Variables part of the hash structure.
6
- # Based on: https://stackoverflow.com/questions/8706930/converting-nested-hash-keys-from-camelcase-to-snake-case-in-ruby
7
- def pascalize(value, parent_keys=[])
8
- case value
9
- when Array
10
- value.map { |v| pascalize(v) }
11
- when Hash
12
- initializer = value.map do |k, v|
13
- new_key = pascal_key(k, parent_keys)
14
- [new_key, pascalize(v, parent_keys+[new_key])]
15
- end
16
- Hash[initializer]
17
- else
18
- value
19
- end
20
- end
21
-
22
- def pascal_key(k, parent_keys=[])
23
- k = k.to_s
24
- if parent_keys.include?("Variables") # do not pascalize keys anything under Variables
25
- k # pass through untouch
26
- elsif parent_keys.include?("ResponseParameters")
27
- k # pass through untouch
28
- elsif k.include?('-') || k.include?('/')
29
- k # pass through untouch
30
- elsif parent_keys.last == "EventPattern" # top-level
31
- k.dasherize
32
- elsif parent_keys.include?("EventPattern")
33
- # any keys at 2nd level under EventPattern will be camelize
34
- new_k = k.camelize # an earlier pascalize has made the first char upcase
35
- # so we need to downcase it again
36
- first_char = new_k[0..0].downcase
37
- new_k[0] = first_char
38
- new_k
39
- else
40
- pascalize_string(k)
41
- end
42
- end
43
-
44
- def pascalize_string(s)
45
- s = s.to_s.camelize
46
- s = s.slice(0,1).capitalize + s.slice(1..-1) # capitalize first letter only
47
- special_map[s] || s
48
- end
49
-
50
- # Some keys have special mappings
51
- def special_map
52
- {
53
- "TemplateUrl" => "TemplateURL"
54
- }
55
- end
56
- end
57
- end
58
- end