configtoolkit 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/FAQ.txt +113 -25
- data/Hash.txt +128 -0
- data/History.txt +45 -2
- data/KeyValue.txt +235 -0
- data/Manifest.txt +66 -4
- data/README.txt +666 -202
- data/Rakefile +3 -5
- data/Ruby.txt +172 -0
- data/YAML.txt +188 -0
- data/examples/hash_example.rb +71 -0
- data/examples/key_value_example.dump.cfg +5 -0
- data/examples/key_value_example.normal1.cfg +20 -0
- data/examples/key_value_example.normal2.cfg +15 -0
- data/examples/key_value_example.rb +72 -0
- data/examples/key_value_example.wacky.cfg +13 -0
- data/examples/load_example.rb +32 -0
- data/examples/load_example.yaml +34 -0
- data/examples/load_group_example.rb +28 -0
- data/examples/load_group_example.yaml +33 -0
- data/examples/machineconfig.rb +77 -0
- data/examples/ruby_example.rb +32 -0
- data/examples/ruby_example.rcfg +52 -0
- data/examples/usage_example.rb +93 -0
- data/examples/yaml_example.dump.yaml +12 -0
- data/examples/yaml_example.rb +48 -0
- data/examples/yaml_example.yaml +59 -0
- data/lib/configtoolkit.rb +1 -1
- data/lib/configtoolkit/baseconfig.rb +522 -418
- data/lib/configtoolkit/hasharrayvisitor.rb +242 -0
- data/lib/configtoolkit/hashreader.rb +41 -0
- data/lib/configtoolkit/hashwriter.rb +45 -0
- data/lib/configtoolkit/keyvalueconfig.rb +105 -0
- data/lib/configtoolkit/keyvaluereader.rb +597 -0
- data/lib/configtoolkit/keyvaluewriter.rb +157 -0
- data/lib/configtoolkit/prettyprintwriter.rb +167 -0
- data/lib/configtoolkit/reader.rb +62 -0
- data/lib/configtoolkit/rubyreader.rb +270 -0
- data/lib/configtoolkit/types.rb +42 -26
- data/lib/configtoolkit/writer.rb +116 -0
- data/lib/configtoolkit/yamlreader.rb +10 -6
- data/lib/configtoolkit/yamlwriter.rb +113 -71
- data/test/bad_array_index.rcfg +1 -0
- data/test/bad_containing_object_assignment.rcfg +2 -0
- data/test/bad_directive.cfg +1 -0
- data/test/bad_include1.cfg +2 -0
- data/test/bad_include2.cfg +3 -0
- data/test/bad_parameter_reference.rcfg +1 -0
- data/test/contained_sample.cfg +10 -0
- data/test/contained_sample.pretty_print +30 -0
- data/test/contained_sample.rcfg +22 -0
- data/test/contained_sample.yaml +22 -21
- data/test/containers.cfg +6 -0
- data/test/exta_string_after_container.cfg +2 -0
- data/test/extra_container_closing.cfg +2 -0
- data/test/extra_string_after_container.cfg +2 -0
- data/test/extra_string_after_nested_container.cfg +1 -0
- data/test/missing_array_closing.cfg +2 -0
- data/test/missing_array_element.cfg +2 -0
- data/test/missing_directive.cfg +1 -0
- data/test/missing_hash_closing.cfg +2 -0
- data/test/missing_hash_element.cfg +2 -0
- data/test/missing_hash_value.cfg +1 -0
- data/test/missing_include_argument.cfg +1 -0
- data/test/missing_key_value_delimiter.cfg +1 -0
- data/test/readerwritertest.rb +28 -7
- data/test/sample.cfg +10 -0
- data/test/sample.pretty_print +30 -0
- data/test/sample.rcfg +26 -0
- data/test/test_baseconfig.rb +152 -38
- data/test/test_hash.rb +82 -0
- data/test/test_keyvalue.rb +185 -0
- data/test/test_prettyprint.rb +28 -0
- data/test/test_ruby.rb +50 -0
- data/test/test_yaml.rb +33 -26
- data/test/wacky_sample1.cfg +16 -0
- data/test/wacky_sample2.cfg +5 -0
- data/test/wacky_sample3.cfg +4 -0
- data/test/wacky_sample4.cfg +1 -0
- metadata +101 -10
- data/lib/configtoolkit/toolkit.rb +0 -20
- data/test/common.rb +0 -5
@@ -0,0 +1,5 @@
|
|
1
|
+
production.www.num_cpus : 64
|
2
|
+
production.www.behind_firewall : true
|
3
|
+
production.www.os : {version <<-->> 10.0, name <<-->> Solaris}
|
4
|
+
production.www.addresses : [http://www.designingpatterns.com, http://tokyo.designingpatterns.com]
|
5
|
+
production.www.contains_sensitive_data : true
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#
|
2
|
+
# This file contains MachineConfig configurations
|
3
|
+
# (see examples/machineconfig.rb for the configuration's specification).
|
4
|
+
#
|
5
|
+
|
6
|
+
############################################################
|
7
|
+
# First configuration
|
8
|
+
num_cpus = 32
|
9
|
+
os = {name => AIX, version => 5.3}
|
10
|
+
behind_firewall = no
|
11
|
+
contains_sensitive_data = no
|
12
|
+
addresses = [http://default.designingpatterns.com, http://apple.designingpatterns.com]
|
13
|
+
############################################################
|
14
|
+
|
15
|
+
#
|
16
|
+
# Include a second configuration from a different file.
|
17
|
+
# Note that the path to the second file is relative to
|
18
|
+
# *this* file (they are in the same directory).
|
19
|
+
#
|
20
|
+
*include key_value_example.normal2.cfg
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#
|
2
|
+
# This file contains MachineConfig configurations
|
3
|
+
# (see examples/machineconfig.rb for the configuration's specification).
|
4
|
+
#
|
5
|
+
|
6
|
+
############################################################
|
7
|
+
# Second configuration (nested in the production.www
|
8
|
+
# containing object). Note how all of the keys are prefixed
|
9
|
+
# with production.www in order to indicate that they are
|
10
|
+
# within the production.www containing object.
|
11
|
+
production.www.num_cpus = 64
|
12
|
+
production.www.os = {name => Solaris, version => 10.0}
|
13
|
+
production.www.contains_sensitive_data = yes
|
14
|
+
production.www.addresses = [http://www.designingpatterns.com, http://tokyo.designingpatterns.com]
|
15
|
+
############################################################
|
@@ -0,0 +1,72 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#
|
4
|
+
# These example programs use the 'relative' gem in order to
|
5
|
+
# express paths relative to __FILE__ cleanly, allowing them to be run from
|
6
|
+
# any directory. In particular, they use the require_relative
|
7
|
+
# method to load examples/machineconfig.rb and
|
8
|
+
# File.expand_path_relative_to_caller in order to refer to
|
9
|
+
# configuration files within the examples directory.
|
10
|
+
#
|
11
|
+
require 'rubygems'
|
12
|
+
require 'relative'
|
13
|
+
require_relative 'machineconfig'
|
14
|
+
|
15
|
+
require 'configtoolkit/keyvaluereader'
|
16
|
+
require 'configtoolkit/keyvaluewriter'
|
17
|
+
|
18
|
+
#
|
19
|
+
# The key-value format used by this file is the default format.
|
20
|
+
#
|
21
|
+
NORMAL_CONFIGURATION_FILE =
|
22
|
+
File.expand_path_relative_to_caller("key_value_example.normal1.cfg")
|
23
|
+
|
24
|
+
#
|
25
|
+
# The first configuration has no containing object name.
|
26
|
+
#
|
27
|
+
reader = ConfigToolkit::KeyValueReader.new(NORMAL_CONFIGURATION_FILE)
|
28
|
+
first_config = MachineConfig.load(reader)
|
29
|
+
print("The first config:\n#{first_config}\n")
|
30
|
+
|
31
|
+
#
|
32
|
+
# The second configuration has "production.www" as a containing
|
33
|
+
# object name. Note that the second configuration is contained in a different
|
34
|
+
# file that the first file includes.
|
35
|
+
#
|
36
|
+
reader = ConfigToolkit::KeyValueReader.new(NORMAL_CONFIGURATION_FILE)
|
37
|
+
second_config = MachineConfig.load(reader, "production.www")
|
38
|
+
print("The second config:\n#{second_config}\n")
|
39
|
+
|
40
|
+
#
|
41
|
+
# Configure a new, admittedly wacky, key-value format.
|
42
|
+
# Note how the block passed to the constructor initializes
|
43
|
+
# only a few of the KeyValueConfig parameters; the other
|
44
|
+
# parameters will be assigned their default values.
|
45
|
+
#
|
46
|
+
key_value_config = ConfigToolkit::KeyValueConfig.new() do |config|
|
47
|
+
config.key_value_delimiter = ":"
|
48
|
+
config.comment_line_prefix = ";"
|
49
|
+
config.hash_key_value_delimiter = "<<-->>"
|
50
|
+
end
|
51
|
+
|
52
|
+
#
|
53
|
+
# Read the first configuration from a file containing it in the new
|
54
|
+
# format.
|
55
|
+
#
|
56
|
+
WACKY_CONFIGURATION_FILE =
|
57
|
+
File.expand_path_relative_to_caller("key_value_example.wacky.cfg")
|
58
|
+
reader = ConfigToolkit::KeyValueReader.new(WACKY_CONFIGURATION_FILE,
|
59
|
+
key_value_config)
|
60
|
+
first_config = MachineConfig.load(reader)
|
61
|
+
print("The first config sourced from a different key-value format:\n")
|
62
|
+
print("#{first_config}\n")
|
63
|
+
|
64
|
+
#
|
65
|
+
# Write second_config in the new format to a string stream, the contents
|
66
|
+
# of which will be printed.
|
67
|
+
#
|
68
|
+
string_stream = StringIO.new()
|
69
|
+
writer = ConfigToolkit::KeyValueWriter.new(string_stream, key_value_config)
|
70
|
+
second_config.dump(writer)
|
71
|
+
print("The second configuration dumped to a new key-value file format:\n")
|
72
|
+
print("#{string_stream.string}")
|
@@ -0,0 +1,13 @@
|
|
1
|
+
;
|
2
|
+
; This file contains MachineConfig configurations
|
3
|
+
; (see examples/machineconfig.rb for the configuration's specification).
|
4
|
+
;
|
5
|
+
|
6
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
7
|
+
; First configuration, but with a wacky format
|
8
|
+
num_cpus: 32
|
9
|
+
os: {name <<-->> AIX, version <<-->> 5.3}
|
10
|
+
behind_firewall: no
|
11
|
+
contains_sensitive_data: no
|
12
|
+
addresses: [http://default.designingpatterns.com, http://apple.designingpatterns.com]
|
13
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#
|
4
|
+
# These example programs use the 'relative' gem in order to
|
5
|
+
# express paths relative to __FILE__ cleanly, allowing them to be run from
|
6
|
+
# any directory. In particular, they use the require_relative
|
7
|
+
# method to load examples/machineconfig.rb and
|
8
|
+
# File.expand_path_relative_to_caller in order to refer to
|
9
|
+
# configuration files within the examples directory.
|
10
|
+
#
|
11
|
+
require 'rubygems'
|
12
|
+
require 'relative'
|
13
|
+
require_relative 'machineconfig'
|
14
|
+
|
15
|
+
require 'configtoolkit/yamlreader'
|
16
|
+
|
17
|
+
CONFIGURATION_FILE = File.expand_path_relative_to_caller("load_example.yaml")
|
18
|
+
|
19
|
+
#
|
20
|
+
# The first configuration has no containing object name.
|
21
|
+
#
|
22
|
+
reader = ConfigToolkit::YAMLReader.new(CONFIGURATION_FILE)
|
23
|
+
first_config = MachineConfig.load(reader)
|
24
|
+
print("The first config:\n#{first_config}\n")
|
25
|
+
|
26
|
+
#
|
27
|
+
# The second configuration has "production.www" as a containing
|
28
|
+
# object name.
|
29
|
+
#
|
30
|
+
reader = ConfigToolkit::YAMLReader.new(CONFIGURATION_FILE)
|
31
|
+
second_config = MachineConfig.load(reader, "production.www")
|
32
|
+
print("The second config:\n#{second_config}\n")
|
@@ -0,0 +1,34 @@
|
|
1
|
+
#
|
2
|
+
# This file contains MachineConfig configurations
|
3
|
+
# (see examples/machineconfig.rb for the configuration's specification).
|
4
|
+
#
|
5
|
+
|
6
|
+
############################################################
|
7
|
+
# First configuration
|
8
|
+
num_cpus: 32
|
9
|
+
os:
|
10
|
+
name: AIX
|
11
|
+
version: 5.3
|
12
|
+
behind_firewall: no
|
13
|
+
contains_sensitive_data: no
|
14
|
+
addresses:
|
15
|
+
- http://default.designingpatterns.com
|
16
|
+
- http://apple.designingpatterns.com
|
17
|
+
############################################################
|
18
|
+
|
19
|
+
# production is a containing object
|
20
|
+
production:
|
21
|
+
# production.www is a containing object
|
22
|
+
www:
|
23
|
+
############################################################
|
24
|
+
# Second configuration (nested in the production.www
|
25
|
+
# containing object)
|
26
|
+
num_cpus: 64
|
27
|
+
os:
|
28
|
+
name: Solaris
|
29
|
+
version: 10.0
|
30
|
+
contains_sensitive_data: yes
|
31
|
+
addresses:
|
32
|
+
- http://www.designingpatterns.com
|
33
|
+
- http://tokyo.designingpatterns.com
|
34
|
+
############################################################
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#
|
4
|
+
# These example programs use the 'relative' gem in order to
|
5
|
+
# express paths relative to __FILE__ cleanly, allowing them to be run from
|
6
|
+
# any directory. In particular, they use the require_relative
|
7
|
+
# method to load examples/machineconfig.rb and
|
8
|
+
# File.expand_path_relative_to_caller in order to refer to
|
9
|
+
# configuration files within the examples directory.
|
10
|
+
#
|
11
|
+
require 'rubygems'
|
12
|
+
require 'relative'
|
13
|
+
require_relative 'machineconfig'
|
14
|
+
|
15
|
+
require 'configtoolkit/yamlreader'
|
16
|
+
|
17
|
+
CONFIGURATION_FILE =
|
18
|
+
File.expand_path_relative_to_caller("load_group_example.yaml")
|
19
|
+
|
20
|
+
#
|
21
|
+
# The group of configurations is under the db_cluster containing
|
22
|
+
# object name.
|
23
|
+
#
|
24
|
+
reader = ConfigToolkit::YAMLReader.new(CONFIGURATION_FILE)
|
25
|
+
configs = MachineConfig.load_group(reader, "db_cluster")
|
26
|
+
configs.each do |name, config|
|
27
|
+
print "The #{name} configuration:\n#{config}\n"
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#
|
2
|
+
# This file contains MachineConfig configurations
|
3
|
+
# (see examples/machineconfig.rb for the configuration's specification).
|
4
|
+
#
|
5
|
+
|
6
|
+
db_cluster:
|
7
|
+
db1:
|
8
|
+
num_cpus: 16
|
9
|
+
os:
|
10
|
+
name: Solaris
|
11
|
+
version: 10.0
|
12
|
+
contains_sensitive_data: yes
|
13
|
+
behind_firewall: yes
|
14
|
+
addresses:
|
15
|
+
- http://db1.designingpatterns.com
|
16
|
+
db2:
|
17
|
+
num_cpus: 12
|
18
|
+
os:
|
19
|
+
name: AIX
|
20
|
+
version: 5.3
|
21
|
+
contains_sensitive_data: yes
|
22
|
+
behind_firewall: yes
|
23
|
+
addresses:
|
24
|
+
- http://db2.designingpatterns.com
|
25
|
+
db3:
|
26
|
+
num_cpus: 24
|
27
|
+
os:
|
28
|
+
name: Solaris
|
29
|
+
version: 10.0
|
30
|
+
contains_sensitive_data: yes
|
31
|
+
behind_firewall: yes
|
32
|
+
addresses:
|
33
|
+
- http://db3.designingpatterns.com
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'configtoolkit'
|
3
|
+
|
4
|
+
require 'uri'
|
5
|
+
|
6
|
+
#
|
7
|
+
# This configuration class is nested within MachineConfig (below).
|
8
|
+
# All configuration classes must descend from ConfigToolkit::BaseConfig.
|
9
|
+
#
|
10
|
+
class OSConfig < ConfigToolkit::BaseConfig
|
11
|
+
add_required_param(:name, String)
|
12
|
+
add_required_param(:version, Float)
|
13
|
+
end
|
14
|
+
|
15
|
+
#
|
16
|
+
# This configuration class is used in all of the example programs.
|
17
|
+
# Since it is a configuration class, it descends from
|
18
|
+
# ConfigToolkit::BaseConfig.
|
19
|
+
#
|
20
|
+
class MachineConfig < ConfigToolkit::BaseConfig
|
21
|
+
#
|
22
|
+
# This is a required parameter with extra user-specified validation
|
23
|
+
# (that :num_cpus > 0 must be true)
|
24
|
+
#
|
25
|
+
add_required_param(:num_cpus, Integer) do |value|
|
26
|
+
if(value <= 0)
|
27
|
+
raise_error("num_cpus must be greater than zero")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# This required parameter is itself a BaseConfig instance; BaseConfig
|
33
|
+
# instances can be nested within each other.
|
34
|
+
#
|
35
|
+
add_required_param(:os, OSConfig)
|
36
|
+
|
37
|
+
#
|
38
|
+
# This is a required boolean parameter. Note that Ruby does not
|
39
|
+
# have a boolean type (it has a TrueClass and a FalseClass), so use
|
40
|
+
# a marker class (ConfigToolkit::Boolean) to indicate that
|
41
|
+
# the parameter will have boolean values (true and false).
|
42
|
+
# Boolean values can be written as "true"/"false" or as
|
43
|
+
# "yes"/"no" in configuration files.
|
44
|
+
#
|
45
|
+
add_required_param(:contains_sensitive_data, ConfigToolkit::Boolean)
|
46
|
+
|
47
|
+
#
|
48
|
+
# The behind_firewall parameter is optional and has a default value of
|
49
|
+
# true, which means that it will be set to the true if not explicitly set
|
50
|
+
# by a configuration file.
|
51
|
+
#
|
52
|
+
add_optional_param(:behind_firewall, ConfigToolkit::Boolean, true)
|
53
|
+
|
54
|
+
#
|
55
|
+
# The primary_contact parameter is optional and has no default value, which
|
56
|
+
# means that it will be absent if not explicitly set by a configuration file.
|
57
|
+
#
|
58
|
+
add_optional_param(:primary_contact, String)
|
59
|
+
|
60
|
+
#
|
61
|
+
# This parameter's values are guaranteed to be Arrays with URI elements.
|
62
|
+
#
|
63
|
+
add_required_param(:addresses, ConfigToolkit::ConstrainedArray.new(URI))
|
64
|
+
|
65
|
+
#
|
66
|
+
# This method is called by load() after loading values for
|
67
|
+
# all parameters from a specified configuration and can enforce
|
68
|
+
# constraints between different parameters. In this case, this method
|
69
|
+
# ensures that all machines containing sensitive data are behind
|
70
|
+
# the firewall.
|
71
|
+
#
|
72
|
+
def validate_all_values
|
73
|
+
if(contains_sensitive_data && !behind_firewall)
|
74
|
+
raise_error("only machines behind firewalls can contain sensitive data")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#
|
4
|
+
# These example programs use the 'relative' gem in order to
|
5
|
+
# express paths relative to __FILE__ cleanly, allowing them to be run from
|
6
|
+
# any directory. In particular, they use the require_relative
|
7
|
+
# method to load examples/machineconfig.rb and
|
8
|
+
# File.expand_path_relative_to_caller in order to refer to
|
9
|
+
# configuration files within the examples directory.
|
10
|
+
#
|
11
|
+
require 'rubygems'
|
12
|
+
require 'relative'
|
13
|
+
require_relative 'machineconfig'
|
14
|
+
|
15
|
+
require 'configtoolkit/rubyreader'
|
16
|
+
|
17
|
+
CONFIGURATION_FILE = File.expand_path_relative_to_caller("ruby_example.rcfg")
|
18
|
+
|
19
|
+
#
|
20
|
+
# The first configuration has no containing object name.
|
21
|
+
#
|
22
|
+
reader = ConfigToolkit::RubyReader.new(CONFIGURATION_FILE)
|
23
|
+
first_config = MachineConfig.load(reader)
|
24
|
+
print("The first config:\n#{first_config}\n")
|
25
|
+
|
26
|
+
#
|
27
|
+
# The second configuration has "production.www" as a containing
|
28
|
+
# object name.
|
29
|
+
#
|
30
|
+
reader = ConfigToolkit::RubyReader.new(CONFIGURATION_FILE)
|
31
|
+
second_config = MachineConfig.load(reader, "production.www")
|
32
|
+
print("The second config:\n#{second_config}\n")
|
@@ -0,0 +1,52 @@
|
|
1
|
+
#
|
2
|
+
# This file contains MachineConfig configurations
|
3
|
+
# (see examples/machineconfig.rb for the configuration's specification).
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'uri'
|
7
|
+
|
8
|
+
config.num_cpus = 32
|
9
|
+
|
10
|
+
#
|
11
|
+
# Note how the members of the nested OSConfig
|
12
|
+
# can be set by first referring to "os" and then to the
|
13
|
+
# desired member (i.e., config.os.name). config.os
|
14
|
+
# also could have been set with a Hash (see below
|
15
|
+
# for an example).
|
16
|
+
#
|
17
|
+
config.os.name = "AIX"
|
18
|
+
config.os.version = 5.3
|
19
|
+
|
20
|
+
config.behind_firewall = false
|
21
|
+
|
22
|
+
#
|
23
|
+
# Notice how the behind_firewall value can be referenced
|
24
|
+
# in the contains_sensitive_data value assignment, since
|
25
|
+
# it was set above.
|
26
|
+
#
|
27
|
+
config.contains_sensitive_data = config.behind_firewall
|
28
|
+
config.addresses = [
|
29
|
+
URI("http://default.designingpatterns.com"),
|
30
|
+
URI("http://apple.designingpatterns.com")
|
31
|
+
]
|
32
|
+
|
33
|
+
#
|
34
|
+
# A trivial example of using a Ruby expression to calculate
|
35
|
+
# a parameter value.
|
36
|
+
#
|
37
|
+
config.production.www.num_cpus = 32 + 16 + 8 + 4 + 2 + 1 + 1
|
38
|
+
|
39
|
+
#
|
40
|
+
# Note that here the nested OSConfig is being set with a Hash (the
|
41
|
+
# configuration above sets the OSConfig parameters individually).
|
42
|
+
#
|
43
|
+
config.production.www.os = {
|
44
|
+
:name => "Solaris",
|
45
|
+
:version => 10.0
|
46
|
+
}
|
47
|
+
|
48
|
+
config.production.www.contains_sensitive_data = true
|
49
|
+
config.production.www.addresses = [
|
50
|
+
URI("http://www.designingpatterns.com"),
|
51
|
+
URI("http://tokyo.designingpatterns.com")
|
52
|
+
]
|
@@ -0,0 +1,93 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#
|
4
|
+
# These example programs use the 'relative' gem in order to
|
5
|
+
# express paths relative to __FILE__ cleanly, allowing them to be run from
|
6
|
+
# any directory. In particular, they use the require_relative
|
7
|
+
# method to load examples/machineconfig.rb and
|
8
|
+
# File.expand_path_relative_to_caller in order to refer to
|
9
|
+
# configuration files within the examples directory.
|
10
|
+
#
|
11
|
+
require 'rubygems'
|
12
|
+
require 'relative'
|
13
|
+
require_relative 'machineconfig'
|
14
|
+
|
15
|
+
#
|
16
|
+
# If new() is passed a block, the block *must* initialize all
|
17
|
+
# required parameters (otherwise a ConfigToolkit::Error will
|
18
|
+
# be thrown). Optional parameters to not need to be
|
19
|
+
# explicitly initialized, however. If a default value was
|
20
|
+
# specified for an uninitialized optional parameter, the
|
21
|
+
# optional parameter will be set to the default value after
|
22
|
+
# the block (the behind_firewall parameter is an example of this below);
|
23
|
+
# otherwise, the default value will have no value
|
24
|
+
# (the primary_contact parameter is an example of this below).
|
25
|
+
#
|
26
|
+
config = MachineConfig.new() do |config|
|
27
|
+
config.num_cpus = 8
|
28
|
+
config.os = OSConfig.new() do |os_config|
|
29
|
+
os_config.name = "Solaris"
|
30
|
+
os_config.version = 10.0
|
31
|
+
end
|
32
|
+
config.contains_sensitive_data = true
|
33
|
+
config.addresses = [URI("http://www.designingpatterns.com"),
|
34
|
+
URI("http://jackfruit.designingpatterns.com")]
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Note in the output that the behind_firewall parameter is true, its
|
39
|
+
# default value, because it was not initialized in the block above.
|
40
|
+
# Also note that the primary_contact parameter is not present.
|
41
|
+
#
|
42
|
+
print "Config after initialization:\n#{config}\n"
|
43
|
+
|
44
|
+
#
|
45
|
+
# Each parameter has a predicate method (automatically generated by
|
46
|
+
# add_required_param or add_optional_param) that returns whether or not
|
47
|
+
# the parameter has a value.
|
48
|
+
#
|
49
|
+
if(!config.primary_contact?)
|
50
|
+
#
|
51
|
+
# This will be printed...
|
52
|
+
#
|
53
|
+
print "Optional primary_contact parameter is NOT set!\n"
|
54
|
+
end
|
55
|
+
|
56
|
+
#
|
57
|
+
# Each parameter has getter and setter accessor methods (automatically
|
58
|
+
# generated by add_required_param or add_optional_param), just like
|
59
|
+
# "normal" attributes.
|
60
|
+
#
|
61
|
+
config.primary_contact = "Tony"
|
62
|
+
print("primary_contact parameter set to: #{config.primary_contact}\n")
|
63
|
+
|
64
|
+
if(config.primary_contact?)
|
65
|
+
#
|
66
|
+
# This will be printed...
|
67
|
+
#
|
68
|
+
print "Optional primary_contact parameter is now IS set!\n\n"
|
69
|
+
end
|
70
|
+
|
71
|
+
#
|
72
|
+
# Note in the output that the primary_contact parameter *now* is present.
|
73
|
+
#
|
74
|
+
print "Config after setting optional primary_contact parameter:\n#{config}\n"
|
75
|
+
|
76
|
+
#
|
77
|
+
# Each optional parameter has a clear method (automatically generated by
|
78
|
+
# add_optional_param) that deletes the parameter's value.
|
79
|
+
#
|
80
|
+
config.clear_primary_contact()
|
81
|
+
|
82
|
+
if(!config.primary_contact?)
|
83
|
+
#
|
84
|
+
# This will be printed...
|
85
|
+
#
|
86
|
+
print "Optional primary_contact parameter has been deleted!\n\n"
|
87
|
+
end
|
88
|
+
|
89
|
+
#
|
90
|
+
# Note in the output that the primary_contact parameter once again
|
91
|
+
# is absent.
|
92
|
+
#
|
93
|
+
print "Config after deleting the primary_contact parameter:\n#{config}\n"
|