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
- .infer(name, usages) ⇒ Object
- .infer_type(name) ⇒ Object
- .pick_default(usages) ⇒ Object
- .secret?(name) ⇒ Boolean
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
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 |