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.
-
#read_only! ⇒ Object
private
Disables the namespace, and child namespaces, from writing changes to disk.
-
#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 40 |
# File 'lib/pdk/config/namespace.rb', line 29 def initialize(name = nil, file: nil, parent: nil, persistent_defaults: false, &block) @file = PDK::Util::Filesystem.(file) unless file.nil? @settings = {} @name = name.to_s @parent = parent @persistent_defaults = persistent_defaults @mounts = {} @loaded_from_file = false @read_only = 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>”.
193 194 195 |
# File 'lib/pdk/config/namespace.rb', line 193 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.
95 96 97 98 99 100 101 102 103 104 105 106 107 108 |
# File 'lib/pdk/config/namespace.rb', line 95 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? # Duplicate arrays and hashes so that they are isolated from changes being made default_value = PDK::Util.deep_duplicate(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.
139 140 141 142 143 144 145 |
# File 'lib/pdk/config/namespace.rb', line 139 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.
183 184 185 |
# File 'lib/pdk/config/namespace.rb', line 183 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.
123 124 125 126 127 128 129 130 |
# File 'lib/pdk/config/namespace.rb', line 123 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.
206 207 208 |
# File 'lib/pdk/config/namespace.rb', line 206 def include_in_parent? child_namespace? && file.nil? end |
#mount(key, obj, &block) ⇒ self
Mount a provided [self] (or subclass) into the namespace.
67 68 69 70 71 72 73 |
# File 'lib/pdk/config/namespace.rb', line 67 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.
79 80 81 |
# File 'lib/pdk/config/namespace.rb', line 79 def namespace(name, &block) mount(name, PDK::Config::Namespace.new, &block) end |
#read_only! ⇒ Object
This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.
Disables the namespace, and child namespaces, from writing changes to disk. Typically this is only needed for unit testing.
213 214 215 216 |
# File 'lib/pdk/config/namespace.rb', line 213 def read_only! @read_only = true @mounts.each { |_, child| child.read_only! } end |
#resolve(filter = nil) ⇒ Hash{String => Object}
Resolves all filtered settings, including child namespaces, fully namespaced and filling in default values.
168 169 170 171 172 173 174 175 176 177 178 179 180 |
# File 'lib/pdk/config/namespace.rb', line 168 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).
51 52 53 54 |
# File 'lib/pdk/config/namespace.rb', line 51 def setting(key, &block) @settings[key.to_s] ||= default_setting_class.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.
156 157 158 159 160 161 162 |
# File 'lib/pdk/config/namespace.rb', line 156 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 |