Class: Legion::Settings::Schema

Inherits:
Object
  • Object
show all
Defined in:
lib/legion/settings/schema.rb

Constant Summary collapse

TYPE_NAMES =
{ string: 'String', integer: 'Integer', float: 'Float', boolean: 'Boolean',
array: 'Array', hash: 'Hash' }.freeze

Instance Method Summary collapse

Constructor Details

#initializeSchema

Returns a new instance of Schema.



6
7
8
9
# File 'lib/legion/settings/schema.rb', line 6

def initialize
  @schemas = {}
  @registered = []
end

Instance Method Details

#constraint(mod_name, key_path) ⇒ Object



24
25
26
27
28
29
30
31
32
# File 'lib/legion/settings/schema.rb', line 24

def constraint(mod_name, key_path)
  node = @schemas[mod_name.to_sym]
  key_path.each do |key|
    return nil unless node.is_a?(Hash) && node.key?(key)

    node = node[key]
  end
  node
end

#define_override(mod_name, overrides) ⇒ Object



18
19
20
21
22
# File 'lib/legion/settings/schema.rb', line 18

def define_override(mod_name, overrides)
  mod_name = mod_name.to_sym
  @schemas[mod_name] ||= {}
  apply_overrides(overrides, @schemas[mod_name])
end

#detect_unknown_keys(settings, known_defaults: []) ⇒ Object



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/legion/settings/schema.rb', line 55

def detect_unknown_keys(settings, known_defaults: [])
  warnings = []
  all_known = @registered + known_defaults

  settings.each_key do |key|
    next if all_known.include?(key)

    suggestion = find_similar(key, all_known)
    msg = "top-level key :#{key} is not registered by any module"
    msg += " (did you mean :#{suggestion}?)" if suggestion
    warnings << { module: :unknown_key, path: key.to_s, message: msg }
  end

  check_first_level_keys(settings, warnings)
  warnings
end

#register(mod_name, defaults) ⇒ Object



11
12
13
14
15
16
# File 'lib/legion/settings/schema.rb', line 11

def register(mod_name, defaults)
  mod_name = mod_name.to_sym
  @registered << mod_name unless @registered.include?(mod_name)
  @schemas[mod_name] ||= {}
  infer_types(defaults, @schemas[mod_name])
end

#registered_modulesObject



34
35
36
# File 'lib/legion/settings/schema.rb', line 34

def registered_modules
  @registered.dup
end

#schema_for(mod_name) ⇒ Object



38
39
40
# File 'lib/legion/settings/schema.rb', line 38

def schema_for(mod_name)
  @schemas[mod_name.to_sym]
end

#validate_module(mod_name, values) ⇒ Object



42
43
44
45
46
47
48
49
50
# File 'lib/legion/settings/schema.rb', line 42

def validate_module(mod_name, values)
  mod_name = mod_name.to_sym
  mod_schema = @schemas[mod_name]
  return [] if mod_schema.nil?

  errors = []
  validate_node(mod_schema, values, mod_name, '', errors)
  errors
end