jets 0.8.4 → 0.8.5

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.
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