Class: Dpl::Interpolate::Interpolator
- Inherits:
-
Struct
- Object
- Struct
- Dpl::Interpolate::Interpolator
- Includes:
- Dpl::Interpolate
- Defined in:
- lib/dpl/helper/interpolate.rb
Constant Summary collapse
- MODIFIER =
%i[obfuscate escape quote].freeze
- PATTERN =
/%\{(\$?[\w]+)\}/
- ENV_VAR =
/^\$[A-Z_]+$/
- UPCASE =
/^[A-Z_]+$/
- UNKNOWN =
'[unknown variable: %s]'
Instance Attribute Summary collapse
-
#args ⇒ Object
Returns the value of attribute args.
-
#obj ⇒ Object
Returns the value of attribute obj.
-
#opts ⇒ Object
Returns the value of attribute opts.
-
#str ⇒ Object
Returns the value of attribute str.
Instance Method Summary collapse
- #apply ⇒ Object
- #interpolate(str) ⇒ Object
- #lookup(key) ⇒ Object
- #modifier(key) ⇒ Object
- #normalize(obj) ⇒ Object
- #obfuscate(str) ⇒ Object
- #secrets(str) ⇒ Object
- #var?(key) ⇒ Boolean
- #vars ⇒ Object
- #vars? ⇒ Boolean
Instance Attribute Details
#args ⇒ Object
Returns the value of attribute args
78 79 80 |
# File 'lib/dpl/helper/interpolate.rb', line 78 def args @args end |
#obj ⇒ Object
Returns the value of attribute obj
78 79 80 |
# File 'lib/dpl/helper/interpolate.rb', line 78 def obj @obj end |
#opts ⇒ Object
Returns the value of attribute opts
78 79 80 |
# File 'lib/dpl/helper/interpolate.rb', line 78 def opts @opts end |
#str ⇒ Object
Returns the value of attribute str
78 79 80 |
# File 'lib/dpl/helper/interpolate.rb', line 78 def str @str end |
Instance Method Details
#apply ⇒ Object
87 88 89 90 91 92 |
# File 'lib/dpl/helper/interpolate.rb', line 87 def apply str = interpolate(self.str.to_s) str = obfuscate(str) unless opts[:secure] str = str.gsub(' ', ' ') if str.lines.size == 1 str end |
#interpolate(str) ⇒ Object
94 95 96 97 98 99 100 101 102 |
# File 'lib/dpl/helper/interpolate.rb', line 94 def interpolate(str) str = str % args if args.is_a?(Array) && args.any? @blacklist_result = false str = str.to_s.gsub(PATTERN) do @blacklist_result = true normalize(lookup(::Regexp.last_match(1).to_sym)) end @blacklist_result || (args.is_a?(Array) && args.any? { |arg| arg.is_a?(String) && arg.blacklisted? }) ? str.blacklist : str end |
#lookup(key) ⇒ Object
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/dpl/helper/interpolate.rb', line 124 def lookup(key) if vars? && !var?(key) UNKNOWN % key elsif mod = modifier(key) key = key.to_s.sub("#{mod}d_", '') obj.send(mod, lookup(key)) elsif key.to_s =~ ENV_VAR ENV[key.to_s.sub('$', '')] elsif key.to_s =~ UPCASE && obj.class.const_defined?(key) obj.class.const_get(key) elsif args.is_a?(Hash) && args.key?(key) args[key] elsif obj.respond_to?(key, true) obj.send(key) else raise KeyError, key end end |
#modifier(key) ⇒ Object
143 144 145 |
# File 'lib/dpl/helper/interpolate.rb', line 143 def modifier(key) MODIFIER.detect { |mod| key.to_s.start_with?("#{mod}d_") } end |
#normalize(obj) ⇒ Object
120 121 122 |
# File 'lib/dpl/helper/interpolate.rb', line 120 def normalize(obj) obj.is_a?(Array) ? obj.join(' ') : obj.to_s end |
#obfuscate(str) ⇒ Object
104 105 106 107 108 109 110 |
# File 'lib/dpl/helper/interpolate.rb', line 104 def obfuscate(str) secrets(str).inject(str) do |str, secret| secret = secret.dup if secret.frozen? secret.blacklist if str.blacklisted? str.gsub(secret, super(secret)) end end |
#secrets(str) ⇒ Object
112 113 114 115 116 117 118 |
# File 'lib/dpl/helper/interpolate.rb', line 112 def secrets(str) return [] unless str.is_a?(String) && str.blacklisted? opts = obj.class.opts.select(&:secret?) secrets = opts.map { |opt| obj.opts[opt.name] }.compact secrets.select { |secret| str.include?(secret) } end |
#var?(key) ⇒ Boolean
147 148 149 |
# File 'lib/dpl/helper/interpolate.rb', line 147 def var?(key) vars.include?(key) end |
#vars ⇒ Object
151 152 153 |
# File 'lib/dpl/helper/interpolate.rb', line 151 def vars opts[:vars] end |
#vars? ⇒ Boolean
155 156 157 |
# File 'lib/dpl/helper/interpolate.rb', line 155 def vars? !!vars end |