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.
27 28 29 30 31 32 33 34 35 36 37 |
# File 'lib/pdk/config/namespace.rb', line 27 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.
9 10 11 |
# File 'lib/pdk/config/namespace.rb', line 9 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>”.
189 190 191 |
# File 'lib/pdk/config/namespace.rb', line 189 def name child_namespace? ? [parent.name, @name].join('.') : @name end |
#parent ⇒ self
Returns the parent namespace of this namespace.
12 13 14 |
# File 'lib/pdk/config/namespace.rb', line 12 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.
92 93 94 95 96 97 98 99 100 101 102 103 104 |
# File 'lib/pdk/config/namespace.rb', line 92 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.
135 136 137 138 139 140 141 |
# File 'lib/pdk/config/namespace.rb', line 135 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.
179 180 181 |
# File 'lib/pdk/config/namespace.rb', line 179 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.
119 120 121 122 123 124 125 126 |
# File 'lib/pdk/config/namespace.rb', line 119 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.
202 203 204 |
# File 'lib/pdk/config/namespace.rb', line 202 def include_in_parent? child_namespace? && file.nil? end |
#mount(key, obj, &block) ⇒ self
Mount a provided [self] (or subclass) into the namespace.
64 65 66 67 68 69 70 |
# File 'lib/pdk/config/namespace.rb', line 64 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.
76 77 78 |
# File 'lib/pdk/config/namespace.rb', line 76 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.
164 165 166 167 168 169 170 171 172 173 174 175 176 |
# File 'lib/pdk/config/namespace.rb', line 164 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).
48 49 50 51 |
# File 'lib/pdk/config/namespace.rb', line 48 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.
152 153 154 155 156 157 158 |
# File 'lib/pdk/config/namespace.rb', line 152 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 |