Module: CaptiveStackDetector::EnvVarsScanner

Defined in:
lib/captive_stack_detector/env_vars_scanner.rb

Constant Summary collapse

HANDLED_VARS =
%w[
  RAILS_ENV SECRET_KEY_BASE DATABASE_URL REDIS_URL
  RAILS_LOG_TO_STDOUT RAILS_SERVE_STATIC_FILES PORT RACK_ENV
].freeze
ENV_KEY_PATTERN =
/ENV\.fetch\(['"]([A-Z_][A-Z0-9_]*)['"]|ENV\[['"]([A-Z_][A-Z0-9_]*)['"]\]/
SAFE_DEFAULT_PATTERN =
/\A,\s*(?:nil\b|true\b|false\b|'[^']*'|"[^"]*"|\d+)\s*[,)]/
BLOCK_DEFAULT_PATTERN =
/\A\s*\)\s*(?:do|\{)/
ASSIGNMENT_PATTERN =
/\A\s*\|\|=/

Class Method Summary collapse

Class Method Details

.scan(content) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/captive_stack_detector/env_vars_scanner.rb', line 15

def self.scan(content)
  result = {}
  uncommented(content).scan(ENV_KEY_PATTERN) do |fetch_key, bracket_key|
    after = Regexp.last_match.post_match
    if bracket_key
      next if ASSIGNMENT_PATTERN.match?(after)

      result[bracket_key] ||= "placeholder"
    else
      next if SAFE_DEFAULT_PATTERN.match?(after) || BLOCK_DEFAULT_PATTERN.match?(after)

      result[fetch_key] ||= "placeholder"
    end
  end
  result.reject { |k, _| HANDLED_VARS.include?(k) }
end