Class: PDK::Config::Namespace
- Inherits:
-
Object
- Object
- PDK::Config::Namespace
- Defined in:
- lib/pdk/config/namespace.rb
Direct Known Subclasses
Instance Attribute Summary collapse
-
#file ⇒ String
readonly
The path to the file associated with the contents of this namespace.
-
#name ⇒ String
Determines the fully qualified name of the namespace.
-
#parent ⇒ self
The parent namespace of this namespace.
Instance Method Summary collapse
-
#[](key) ⇒ Object
Get the value of the named key.
-
#[]=(key, value) ⇒ nil
After the value has been set in memory, the value will then be persisted to disk.
-
#child_namespace? ⇒ Boolean
True if the namespace has a parent, otherwise false.
-
#fetch(key, default_value) ⇒ Object
Get the value of the named key or the provided default value if not present.
-
#include_in_parent? ⇒ Boolean
Determines if the contents of the namespace should be included in the parent namespace when persisting to disk.
-
#initialize(name = nil, file: nil, parent: nil, persistent_defaults: false, &block) ⇒ Namespace
constructor
Initialises the PDK::Config::Namespace object.
-
#mount(key, obj, &block) ⇒ self
Mount a provided [self] (or subclass) into the namespace.
-
#namespace(name, &block) ⇒ Object
Create and mount a new child namespace.
-
#resolve(filter = nil) ⇒ Hash{String => Object}
Resolves all filtered settings, including child namespaces, fully namespaced and filling in default values.
-
#setting(key, &block) ⇒ nil
Pre-configure a value in the namespace.
-
#to_h ⇒ Hash{String => Object}
Convert the namespace into a Hash of values, suitable for serialising and persisting to disk.
Constructor Details
#initialize(name = nil, file: nil, parent: nil, persistent_defaults: false, &block) ⇒ Namespace
Initialises the PDK::Config::Namespace object.
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.(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
#file ⇒ String (readonly)
Returns 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 |
#name ⇒ String
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>”.
191 192 193 |
# File 'lib/pdk/config/namespace.rb', line 191 def name child_namespace? ? [parent.name, @name].join('.') : @name end |
#parent ⇒ self
Returns 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
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.
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.
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.
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.
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.
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.
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.
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.
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).
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_h ⇒ Hash{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.
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 |