Class: PDK::Config::Namespace

Inherits:
Object
  • Object
show all
Defined in:
lib/pdk/config/namespace.rb

Direct Known Subclasses

JSON, JSONSchemaNamespace, YAML

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name = nil, file: nil, parent: nil, persistent_defaults: false, &block) ⇒ Namespace

Initialises the PDK::Config::Namespace object.

Parameters:

  • name (String) (defaults to: nil)

    the name of the namespace (defaults to nil).

  • params (Hash{Symbol => Object})

    keyword parameters for the method.

  • block (Proc)

    a block that is evaluated within the new instance.



29
30
31
32
33
34
35
36
37
38
39
# File 'lib/pdk/config/namespace.rb', line 29

def initialize(name = nil, file: nil, parent: nil, persistent_defaults: false, &block)
  @file = File.expand_path(file) unless file.nil?
  @settings = {}
  @name = name.to_s
  @parent = parent
  @persistent_defaults = persistent_defaults
  @mounts = {}
  @loaded_from_file = false

  instance_eval(&block) if block_given?
end

Instance Attribute Details

#fileString (readonly)

Returns the path to the file associated with the contents of this namespace.

Returns:

  • (String)

    the path to the file associated with the contents of this namespace.



11
12
13
# File 'lib/pdk/config/namespace.rb', line 11

def file
  @file
end

#nameString

Determines the fully qualified name of the namespace.

If this is a child namespace, then fully qualified name for the namespace will be “<parent>.<child>”.

Returns:

  • (String)

    the fully qualifed name of the namespace.



191
192
193
# File 'lib/pdk/config/namespace.rb', line 191

def name
  child_namespace? ? [parent.name, @name].join('.') : @name
end

#parentself

Returns the parent namespace of this namespace.

Returns:

  • (self)

    the parent namespace of this namespace.



14
15
16
# File 'lib/pdk/config/namespace.rb', line 14

def parent
  @parent
end

Instance Method Details

#[](key) ⇒ Object

Note:

Unlike a Ruby Hash, this will not return ‘nil` in the event that the key does not exist (see #fetch).

Get the value of the named key.

If there is a value for that key, return it. If not, follow the logic described in #default_config_value to determine the default value to return.

Parameters:

  • key (String, Symbol)

    the name of the value to retrieve.

Returns:

  • (Object)

    the requested value.



94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/pdk/config/namespace.rb', line 94

def [](key)
  # Check if it's a mount first...
  return @mounts[key.to_s] unless @mounts[key.to_s].nil?
  # Check if it's a setting, otherwise nil
  return nil if settings[key.to_s].nil?
  return settings[key.to_s].value unless settings[key.to_s].value.nil?
  default_value = settings[key.to_s].default
  return default_value if default_value.nil? || !@persistent_defaults
  # Persist the default value
  settings[key.to_s].value = default_value
  save_data
  default_value
end

#[]=(key, value) ⇒ nil

After the value has been set in memory, the value will then be persisted to disk.

Parameters:

  • key (String, Symbol)

    the name of the configuration value.

  • value (Object)

    the value of the configuration value.

Returns:

  • (nil)

Raises:

  • (ArgumentError)


137
138
139
140
141
142
143
# File 'lib/pdk/config/namespace.rb', line 137

def []=(key, value)
  # You can't set the value of a mount
  raise ArgumentError, _('Namespace mounts can not be set a value') unless @mounts[key.to_s].nil?
  set_volatile_value(key, value)
  # Persist the change
  save_data
end

#child_namespace?Boolean

Returns true if the namespace has a parent, otherwise false.

Returns:

  • (Boolean)

    true if the namespace has a parent, otherwise false.



181
182
183
# File 'lib/pdk/config/namespace.rb', line 181

def child_namespace?
  !parent.nil?
end

#fetch(key, default_value) ⇒ Object

Get the value of the named key or the provided default value if not present. Note that this does not trigger persistent defaults

This differs from #[] in an important way in that it allows you to return a default value, which is not possible using ‘[] || default` as non-existent values when accessed normally via #[] will be defaulted to a new Hash.

Parameters:

  • key (String, Symbol)

    the name of the value to fetch.

  • default_value (Object)

    the value to return if the namespace does not contain the requested value.

Returns:

  • (Object)

    the requested value.



121
122
123
124
125
126
127
128
# File 'lib/pdk/config/namespace.rb', line 121

def fetch(key, default_value)
  # Check if it's a mount first...
  return @mounts[key.to_s] unless @mounts[key.to_s].nil?
  # Check if it's a setting, otherwise default_value
  return default_value if settings[key.to_s].nil?
  # Check if has a value, otherwise default_value
  settings[key.to_s].value.nil? ? default_value : settings[key.to_s].value
end

#include_in_parent?Boolean

Determines if the contents of the namespace should be included in the parent namespace when persisting to disk.

If the namespace has been mounted into a parent namespace and is not associated with its own file on disk, then the values in the namespace should be included in the parent namespace when persisting to disk.

Returns:

  • (Boolean)

    true if the values should be included in the parent namespace.



204
205
206
# File 'lib/pdk/config/namespace.rb', line 204

def include_in_parent?
  child_namespace? && file.nil?
end

#mount(key, obj, &block) ⇒ self

Mount a provided [self] (or subclass) into the namespace.

Parameters:

  • key (String, Symbol)

    the name of the namespace to be mounted.

  • obj (self)

    the namespace to be mounted.

  • block (Proc)

    a block to be evaluated within the instance of the newly mounted namespace.

Returns:

  • (self)

    the mounted namespace.

Raises:

  • (ArgumentError)

    if the object to be mounted is not a self or subclass thereof.



66
67
68
69
70
71
72
# File 'lib/pdk/config/namespace.rb', line 66

def mount(key, obj, &block)
  raise ArgumentError, _('Only PDK::Config::Namespace objects can be mounted into a namespace') unless obj.is_a?(PDK::Config::Namespace)
  obj.parent = self
  obj.name = key.to_s
  obj.instance_eval(&block) if block_given?
  @mounts[key.to_s] = obj
end

#namespace(name, &block) ⇒ Object

Create and mount a new child namespace.

Parameters:

  • name (String, Symbol)

    the name of the new namespace.

  • block (Proc)


78
79
80
# File 'lib/pdk/config/namespace.rb', line 78

def namespace(name, &block)
  mount(name, PDK::Config::Namespace.new, &block)
end

#resolve(filter = nil) ⇒ Hash{String => Object}

Resolves all filtered settings, including child namespaces, fully namespaced and filling in default values.

Parameters:

  • filter (String) (defaults to: nil)

    Only resolve setting names which match the filter. See #be_resolved? for matching rules

Returns:

  • (Hash{String => Object})

    All resolved settings for example => ‘johndoe’



166
167
168
169
170
171
172
173
174
175
176
177
178
# File 'lib/pdk/config/namespace.rb', line 166

def resolve(filter = nil)
  resolved = {}
  # Resolve the settings
  settings.values.each do |setting|
    setting_name = setting.qualified_name
    if be_resolved?(setting_name, filter)
      resolved[setting_name] = setting.value.nil? ? setting.default : setting.value
    end
  end
  # Resolve the mounts
  @mounts.values.each { |mount| resolved.merge!(mount.resolve(filter)) }
  resolved
end

#setting(key, &block) ⇒ nil

Pre-configure a value in the namespace.

Allows you to specify validators and a default value for value in the namespace (see PDK::Config::Value#initialize).

Parameters:

  • key (String, Symbol)

    the name of the value.

  • block (Proc)

    a block that is evaluated within the new [self].

Returns:

  • (nil)


50
51
52
53
# File 'lib/pdk/config/namespace.rb', line 50

def setting(key, &block)
  @settings[key.to_s] ||= PDK::Config::Setting.new(key.to_s, self)
  @settings[key.to_s].instance_eval(&block) if block_given?
end

#to_hHash{String => Object}

Convert the namespace into a Hash of values, suitable for serialising and persisting to disk.

Child namespaces that are associated with their own files are excluded from the Hash (as their values will be persisted to their own files) and nil values are removed from the Hash.

Returns:

  • (Hash{String => Object})

    the values from the namespace that should be persisted to disk.



154
155
156
157
158
159
160
# File 'lib/pdk/config/namespace.rb', line 154

def to_h
  new_hash = {}
  settings.each_pair { |k, v| new_hash[k] = v.value }
  @mounts.each_pair { |k, mount_point| new_hash[k] = mount_point.to_h if mount_point.include_in_parent? }
  new_hash.delete_if { |_, v| v.nil? }
  new_hash
end