Module: EnvSpec::Heuristics

Defined in:
lib/envspec/heuristics.rb

Overview

Best-effort, conservative inference of envspec syntax from a key name and observed usage data. Output is ALWAYS suggestive — the generated env.spec file marks heuristic decisions as TODO comments so the dev reviews them.

Constant Summary collapse

SECRET_NAME_RE =
/(?:KEY|SECRET|TOKEN|PASSWORD|PASS|CREDENTIAL|PRIVATE)\b/.freeze
DSN_NAME_RE =
/(?:_URL|_URI|_DSN|DATABASE_URL|REDIS_URL|MONGO_URL|AMQP_URL)\z/.freeze
INT_NAME_RE =
/(?:PORT|TIMEOUT|INTERVAL|SIZE|COUNT|LIMIT|MAX_|MIN_)/.freeze
BOOL_NAME_RE =
/\A(?:DEBUG|VERBOSE|ENABLE_|.*_ENABLED|IS_|HAS_|USE_)/.freeze

Class Method Summary collapse

Class Method Details

.infer(name, usages) ⇒ Object



11
12
13
14
15
16
17
18
# File 'lib/envspec/heuristics.rb', line 11

def self.infer(name, usages)
  {
    secret:   secret?(name),
    type:     infer_type(name),
    optional: usages.any? { |u| u[:optional] },
    default:  pick_default(usages),
  }
end

.infer_type(name) ⇒ Object



26
27
28
29
30
31
# File 'lib/envspec/heuristics.rb', line 26

def self.infer_type(name)
  return :dsn  if name =~ DSN_NAME_RE
  return :int  if name =~ INT_NAME_RE
  return :bool if name =~ BOOL_NAME_RE
  :str
end

.pick_default(usages) ⇒ Object



33
34
35
36
# File 'lib/envspec/heuristics.rb', line 33

def self.pick_default(usages)
  defaults = usages.map { |u| u[:default] }.compact.uniq
  defaults.first
end

.secret?(name) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
23
24
# File 'lib/envspec/heuristics.rb', line 20

def self.secret?(name)
  return true if name =~ SECRET_NAME_RE
  return true if name =~ DSN_NAME_RE
  false
end