Class: CfnCamelizer
- Inherits:
-
Object
- Object
- CfnCamelizer
- Extended by:
- Memoist
- Defined in:
- lib/cfn_camelizer.rb,
lib/cfn_camelizer/version.rb
Overview
Custom Camelizer with CloudFormation specific handling. Based on: stackoverflow.com/questions/8706930/converting-nested-hash-keys-from-camelcase-to-snake-case-in-ruby
Constant Summary collapse
- VERSION =
"0.4.8"
Class Method Summary collapse
- .camelize(value, resource_type = nil) ⇒ Object
- .camelize_key(k, parent_keys = [], resource_type = nil) ⇒ Object
- .camelizer_yaml ⇒ Object
- .pascalize(value) ⇒ Object
- .passthrough?(k, parent_keys) ⇒ Boolean
- .resource_map(resource_type) ⇒ Object
-
.special_map ⇒ Object
Some keys have special mappings.
- .transform(value, parent_keys = [], resource_type = nil) ⇒ Object
Class Method Details
.camelize(value, resource_type = nil) ⇒ Object
58 59 60 61 62 63 64 |
# File 'lib/cfn_camelizer.rb', line 58 def camelize(value, resource_type=nil) return value if value.is_a?(Integer) value = value.to_s.camelize v = special_map[value] || value # after the special_keys map resource_map(resource_type)[v] || v end |
.camelize_key(k, parent_keys = [], resource_type = nil) ⇒ Object
34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/cfn_camelizer.rb', line 34 def camelize_key(k, parent_keys=[], resource_type=nil) k = k.to_s if passthrough?(k, parent_keys) k # pass through untouch elsif parent_keys.last == "EventPattern" # top-level k.dasherize elsif parent_keys.include?("EventPattern") # Any keys at 2nd level under EventPattern will be pascalized pascalize(k) else camelize(k, resource_type) end end |
.camelizer_yaml ⇒ Object
82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/cfn_camelizer.rb', line 82 def camelizer_yaml # default path = File.("camelizer.yml", File.dirname(__FILE__)) default = YAML.load_file(path) # project specific path = "#{Dir.pwd}/configs/camelizer.yml" if File.exist?(path) project = YAML.load_file(path) default.deep_merge(project) else default end end |
.pascalize(value) ⇒ Object
66 67 68 69 70 71 |
# File 'lib/cfn_camelizer.rb', line 66 def pascalize(value) new_value = value.camelize first_char = new_value[0..0].downcase new_value[0] = first_char new_value end |
.passthrough?(k, parent_keys) ⇒ Boolean
49 50 51 52 53 54 55 56 |
# File 'lib/cfn_camelizer.rb', line 49 def passthrough?(k, parent_keys) # Do not transform keys under certain parent keys or keys that contain - or / passthrough = camelizer_yaml["passthrough_parent_keys"] intersection = parent_keys & passthrough top_level_parameters = parent_keys.first == "Parameters" return false if top_level_parameters !intersection.empty? || k.include?('-') || k.include?('/') || k.include?('.') end |
.resource_map(resource_type) ⇒ Object
78 79 80 |
# File 'lib/cfn_camelizer.rb', line 78 def resource_map(resource_type) camelizer_yaml["resource_keys"][resource_type] || {} end |
.special_map ⇒ Object
Some keys have special mappings
74 75 76 |
# File 'lib/cfn_camelizer.rb', line 74 def special_map camelizer_yaml["special_keys"] end |
.transform(value, parent_keys = [], resource_type = nil) ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/cfn_camelizer.rb', line 14 def transform(value, parent_keys=[], resource_type=nil) case value when Array value.map { |v| transform(v, parent_keys, resource_type) } when Hash camelized_copy = value.dup.deep_transform_keys { |k| k.to_s.camelize } if camelized_copy.keys.include?("Type") resource_type ||= camelized_copy["Type"] end initializer = value.map do |k, v| new_key = camelize_key(k, parent_keys, resource_type) [new_key, transform(v, parent_keys+[new_key], resource_type)] end Hash[initializer] else value # do not transform values end end |