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
data/lib/configtoolkit/types.rb
CHANGED
@@ -1,23 +1,37 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'singleton'
|
4
|
+
|
2
5
|
module ConfigToolkit
|
3
6
|
|
7
|
+
#
|
8
|
+
# All errors raised by ConfigToolkit code descend from
|
9
|
+
# this one; while right now it is the only error raised
|
10
|
+
# from the ConfigToolkit, at some point an error class hierarchy
|
11
|
+
# rooted in this class might be developed.
|
12
|
+
#
|
13
|
+
class Error < RuntimeError; end
|
14
|
+
|
4
15
|
#
|
5
16
|
# Since Ruby does not have a boolean type (TrueClass and FalseClass classes
|
6
17
|
# for boolean values exist, but they descend from Object),
|
7
|
-
#
|
8
|
-
# to add new parameters
|
9
|
-
#
|
18
|
+
# this is an empty marker class that can be passed into the BaseConfig methods
|
19
|
+
# to add new parameters (BaseConfig.add_required_param and
|
20
|
+
# BaseConfig.add_optional_param) in order to indicate that the
|
21
|
+
# parameter is a boolean (the value of the parameter will be +true+ or
|
22
|
+
# +false+, however). Boolean values can be written as "true"/"false" or as
|
23
|
+
# "yes"/"no" in configuration files.
|
10
24
|
#
|
11
25
|
class Boolean; end
|
12
26
|
|
13
27
|
#
|
14
|
-
#
|
15
|
-
# and with all elements being
|
16
|
-
# the arrays generally offerred by statically typed languages).
|
28
|
+
# ConstrainedArray classes model Arrays with specified sizes
|
29
|
+
# and with all elements being instances of specified classes (basically,
|
30
|
+
# they model the arrays generally offerred by statically typed languages).
|
17
31
|
# A ConstrainedArray has:
|
18
|
-
#
|
19
|
-
#
|
20
|
-
#
|
32
|
+
# * A minimum number of elements (could be zero)
|
33
|
+
# * A maximum number of elements (could be infinity)
|
34
|
+
# * An element class (could be Object, which allows any class)
|
21
35
|
#
|
22
36
|
# A future enhancement might be to allow users to specify a different
|
23
37
|
# class for each element. Note that the ConstrainedArray also allows
|
@@ -25,13 +39,14 @@ class Boolean; end
|
|
25
39
|
# just instances of its element class. Thus, a ConstrainedArray containing
|
26
40
|
# class Object essentially would have no class constraints.
|
27
41
|
#
|
28
|
-
#
|
29
|
-
# Its new
|
30
|
-
# instead returns a new class with the specified constraints that
|
31
|
-
# descends from ConstrainedArray. The class returned by new
|
32
|
-
# to be used in the BaseConfig methods to add new parameters
|
42
|
+
# ConstrainedArray actually is a class generator, similar to Struct.
|
43
|
+
# Its new method does *not* return a ConstrainedArray instance
|
44
|
+
# but instead returns a new class with the specified constraints that
|
45
|
+
# descends from ConstrainedArray. The class returned by new is meant
|
46
|
+
# to be used in the BaseConfig methods to add new parameters
|
47
|
+
# (BaseConfig.add_required_param and BaseConfig.add_optional_param). The
|
33
48
|
# value of one of these parameters actually will be a native Ruby
|
34
|
-
# Array, but one that
|
49
|
+
# Array, but one that is guaranteed to satisify the constraints contained in
|
35
50
|
# the ConstrainedArray class.
|
36
51
|
#
|
37
52
|
class ConstrainedArray
|
@@ -46,13 +61,13 @@ class ConstrainedArray
|
|
46
61
|
attr_reader :element_class
|
47
62
|
|
48
63
|
#
|
49
|
-
# The minimum number of elements, or nil if there is no
|
64
|
+
# The minimum number of elements, or +nil+ if there is no
|
50
65
|
# minimum.
|
51
66
|
#
|
52
67
|
attr_reader :min_num_elements
|
53
68
|
|
54
69
|
#
|
55
|
-
# The maximum number of elements, or nil if there is no
|
70
|
+
# The maximum number of elements, or +nil+ if there is no
|
56
71
|
# maximum.
|
57
72
|
#
|
58
73
|
attr_reader :max_num_elements
|
@@ -62,23 +77,24 @@ class ConstrainedArray
|
|
62
77
|
# ====Description:
|
63
78
|
# This method does *not* return a ConstrainedArray instance. Instead,
|
64
79
|
# it returns a new ConstrainedArray child class that represents
|
65
|
-
# an
|
80
|
+
# an Array with the constraints specified in the method arguments.
|
66
81
|
# This class can be passed as a parameter class into the BaseConfig methods
|
67
|
-
# to add parameters.
|
82
|
+
# to add parameters (BaseConfig.add_required_param and
|
83
|
+
# BaseConfig.add_optional_param).
|
68
84
|
#
|
69
85
|
# ====Parameters:
|
70
86
|
# [element_class]
|
71
87
|
# This constrains all elements of the generated ConstrainedArray
|
72
|
-
# class to be of this class or one of its child classes.
|
73
|
-
# If this argument is
|
88
|
+
# class to be of this class or of one of its child classes.
|
89
|
+
# If this argument is Object, then this constraint effectively
|
74
90
|
# disappears.
|
75
|
-
# [min_num_elements
|
91
|
+
# [min_num_elements]
|
76
92
|
# This constrains the generated ConstrainedArray class to have
|
77
|
-
# at least min_num_elements elements; if this argument is nil or
|
78
|
-
# the constraint effectively disappears.
|
79
|
-
# [max_num_elements
|
93
|
+
# at least +min_num_elements+ elements; if this argument is +nil+ or
|
94
|
+
# zero, the constraint effectively disappears.
|
95
|
+
# [max_num_elements]
|
80
96
|
# This constrains the generated ConstrainedArray class to have
|
81
|
-
# at most max_num_elements elements; if this argument is nil
|
97
|
+
# at most +max_num_elements+ elements; if this argument is +nil+,
|
82
98
|
# the constraint effectively disappears.
|
83
99
|
#
|
84
100
|
# ====Returns:
|
@@ -0,0 +1,116 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
module ConfigToolkit
|
4
|
+
|
5
|
+
#
|
6
|
+
# This is an "abstract class" that documents the Writer interface.
|
7
|
+
# I put "abstract class" in quotes because Ruby of course neither supports
|
8
|
+
# nor requires abstract classes (that is, one can create a new writer class
|
9
|
+
# without extending Writer). It solely serves to document the interface.
|
10
|
+
#
|
11
|
+
# Writers write configuration (represented by Hashes of parameter names to
|
12
|
+
# parameter values with the parameter names being Strings or Symbols and
|
13
|
+
# the parameter values being scalars, Hashes, or Arrays) to some underlying
|
14
|
+
# data sink (the write method).
|
15
|
+
#
|
16
|
+
# Writers must implement require_symbol_parameter_names? in order to
|
17
|
+
# advertise whether they want parameter names as Strings or Symbols in the
|
18
|
+
# Hash passed to the write method.
|
19
|
+
#
|
20
|
+
class Writer
|
21
|
+
#
|
22
|
+
# ====Description:
|
23
|
+
# This is a concrete method that may be useful to Writers. It
|
24
|
+
# returns a Hash containing (possibly nested) entries for
|
25
|
+
# +containing_object_name+ and, in the last object name's Hash,
|
26
|
+
# +config_hash+. Basically, it returns a Hash that reflects
|
27
|
+
# +config_hash+ *and* +containing_object_name+.
|
28
|
+
#
|
29
|
+
# Some Writers may want to display containing objects in a special way,
|
30
|
+
# in which case the arguments to the +write+ method (the configuration Hash
|
31
|
+
# and the containing object name) allow them to do so. For Writers
|
32
|
+
# that do not want any special handling for containing objects,
|
33
|
+
# however, this method can convert that information into a
|
34
|
+
# single Hash representation in which the configuration parameters
|
35
|
+
# are nested within Hashes for the containing objects (this matches
|
36
|
+
# the format returned by readers, as they do not know about
|
37
|
+
# containing objects).
|
38
|
+
#
|
39
|
+
# This should *not* be re-implemented by writers.
|
40
|
+
#
|
41
|
+
# ====Parameters:
|
42
|
+
# [config_hash]
|
43
|
+
# A configuration represented as a Hash
|
44
|
+
# [containing_object_name]
|
45
|
+
# The configuration's containing object name
|
46
|
+
#
|
47
|
+
# ====Returns:
|
48
|
+
# A Hash in which +config_hash+ is nested within Hashes for the
|
49
|
+
# containing objects in +containing_object_name+
|
50
|
+
#
|
51
|
+
def create_containing_object_hash(config_hash, containing_object_name)
|
52
|
+
if(containing_object_name.empty?())
|
53
|
+
return config_hash
|
54
|
+
else
|
55
|
+
use_symbol_parameter_names = require_symbol_parameter_names?()
|
56
|
+
|
57
|
+
containing_object_hash = {}
|
58
|
+
object_hash = containing_object_hash
|
59
|
+
|
60
|
+
object_names = containing_object_name.split(".")
|
61
|
+
object_names.each_with_index do |object_name, index|
|
62
|
+
#
|
63
|
+
# The hash for the last object in containing_object_name must
|
64
|
+
# be config_hash, so it gets treated specially.
|
65
|
+
#
|
66
|
+
if(index < (object_names.size() - 1))
|
67
|
+
contained_hash = {}
|
68
|
+
else
|
69
|
+
contained_hash = config_hash
|
70
|
+
end
|
71
|
+
|
72
|
+
if(use_symbol_parameter_names)
|
73
|
+
object_hash[object_names[index].to_sym()] = contained_hash
|
74
|
+
else
|
75
|
+
object_hash[object_names[index]] = contained_hash
|
76
|
+
end
|
77
|
+
|
78
|
+
object_hash = contained_hash
|
79
|
+
end
|
80
|
+
|
81
|
+
return containing_object_hash
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
public
|
86
|
+
#
|
87
|
+
# This *must* be implemented by Writers.
|
88
|
+
#
|
89
|
+
# ====Returns:
|
90
|
+
# Returns +true+ if and only if the Writer requires Symbol parameter
|
91
|
+
# names (rather than String parameter names) in the Hash passed to write.
|
92
|
+
#
|
93
|
+
def require_symbol_parameter_names?
|
94
|
+
raise NotImplementedError, "abstract method called"
|
95
|
+
end
|
96
|
+
|
97
|
+
#
|
98
|
+
# ====Description:
|
99
|
+
# This method writes the configuration in +config_hash+, with
|
100
|
+
# containing object name +containing_object_name+, to the
|
101
|
+
# underlying data sink.
|
102
|
+
#
|
103
|
+
# This *must* be implemented by Writers.
|
104
|
+
#
|
105
|
+
# ====Parameters:
|
106
|
+
# [config_hash]
|
107
|
+
# A configuration represented as a Hash
|
108
|
+
# [containing_object_name]
|
109
|
+
# The configuration's containing object name
|
110
|
+
#
|
111
|
+
def write(config_hash, containing_object_name)
|
112
|
+
raise NotImplementedError, "abstract method called"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
end
|
@@ -1,24 +1,28 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
require 'configtoolkit/reader'
|
3
|
+
|
2
4
|
require 'yaml'
|
3
5
|
|
4
6
|
module ConfigToolkit
|
5
7
|
|
6
8
|
#
|
7
|
-
# This class implements the
|
9
|
+
# This class implements the Reader interface for
|
8
10
|
# YAML configuration files. It basically is a wrapper
|
9
11
|
# over Ruby's YAML library.
|
10
12
|
#
|
11
|
-
|
13
|
+
# See YAML.txt for more details.
|
14
|
+
#
|
15
|
+
class YAMLReader < Reader
|
12
16
|
#
|
13
17
|
# ====Description:
|
14
|
-
# This constructs a YAMLReader instance for stream
|
15
|
-
# where stream either is a file name (a String)
|
18
|
+
# This constructs a YAMLReader instance for +stream+,
|
19
|
+
# where +stream+ either is a file name (a String)
|
16
20
|
# or an IO object.
|
17
21
|
#
|
18
22
|
# ====Parameters:
|
19
23
|
# [stream]
|
20
24
|
# A file name (String) or an IO object. If
|
21
|
-
# stream is a file name, then the YAMLReader
|
25
|
+
# +stream+ is a file name, then the YAMLReader
|
22
26
|
# will open the associated file.
|
23
27
|
#
|
24
28
|
def initialize(stream)
|
@@ -31,7 +35,7 @@ class YAMLReader
|
|
31
35
|
|
32
36
|
#
|
33
37
|
# ====Returns:
|
34
|
-
#
|
38
|
+
# The contents of the next YAML document read from the underlying
|
35
39
|
# stream.
|
36
40
|
#
|
37
41
|
def read
|
@@ -1,45 +1,50 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'configtoolkit/hasharrayvisitor'
|
4
|
+
require 'configtoolkit/writer'
|
5
|
+
|
2
6
|
require 'yaml'
|
3
7
|
|
4
8
|
module ConfigToolkit
|
5
9
|
|
6
10
|
#
|
7
|
-
# This class implements the
|
11
|
+
# This class implements the Writer interface for
|
8
12
|
# YAML configuration files. It basically is a wrapper
|
9
13
|
# over Ruby's YAML library.
|
10
14
|
#
|
11
15
|
# YAML natively supports Integers, Floats, Strings, and Booleans.
|
12
16
|
# Instances of other classes are written by Ruby to YAML configuration
|
13
17
|
# files by recursively writing each of the instance's variables and
|
14
|
-
# noting in the YAML file
|
18
|
+
# noting the associated Ruby class in the YAML file. This may not
|
15
19
|
# be desired behavior for a configuration file, especially if the file
|
16
20
|
# is going to be shared with a non-Ruby program. On the other hand,
|
17
21
|
# if only Ruby is using the configuration the file, this behavior may
|
18
22
|
# well be very desirable (since arbitrarily complex objects can be
|
19
|
-
# supported
|
23
|
+
# supported directly by the YAML format). Thus, the YAMLWriter
|
20
24
|
# offers two options:
|
21
25
|
# * Only standard YAML classes will be written. Values of classes
|
22
|
-
# not supported natively by YAML will be converted to Strings.
|
23
|
-
# * Non-standard YAML classes will be written.
|
26
|
+
# not supported natively by YAML will be converted to Strings (with +to_s+).
|
27
|
+
# * Non-standard YAML classes will be written (Ruby object->YAML serialization).
|
28
|
+
#
|
29
|
+
# See YAML.txt for more details.
|
24
30
|
#
|
25
|
-
class YAMLWriter
|
31
|
+
class YAMLWriter < Writer
|
26
32
|
#
|
27
33
|
# ====Description:
|
28
|
-
# This constructs a YAMLWriter instance for stream
|
29
|
-
# where stream either is a file name (a String)
|
30
|
-
# or an IO object. If only_output_standard_yaml_classes
|
34
|
+
# This constructs a YAMLWriter instance for +stream+,
|
35
|
+
# where +stream+ either is a file name (a String)
|
36
|
+
# or an IO object. If +only_output_standard_yaml_classes+, then
|
31
37
|
# the writer only will output standard YAML classes; all classes not
|
32
|
-
# native to YAML will be converted into Strings before being
|
33
|
-
# written. If
|
38
|
+
# native to YAML will be converted into Strings with +to_s+ before being
|
39
|
+
# written. If not +only_output_standard_yaml_classes+, however, then
|
34
40
|
# Ruby serialized classes will be written to the configuration
|
35
41
|
# file.
|
36
42
|
#
|
37
43
|
# ====Parameters:
|
38
44
|
# [stream]
|
39
45
|
# A file name (String) or an IO object. If
|
40
|
-
# stream is a file name, then the
|
46
|
+
# +stream+ is a file name, then the YAMLWriter
|
41
47
|
# will open the associated file.
|
42
|
-
#
|
43
48
|
# [only_output_standard_yaml_classes]
|
44
49
|
# Whether or not the writer should output only standard
|
45
50
|
# YAML classes.
|
@@ -53,86 +58,123 @@ class YAMLWriter
|
|
53
58
|
|
54
59
|
@only_output_standard_yaml_classes = only_output_standard_yaml_classes
|
55
60
|
end
|
56
|
-
|
57
|
-
#
|
58
|
-
#
|
59
|
-
#
|
60
|
-
#
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
64
|
-
#
|
65
|
-
#
|
66
|
-
#
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
61
|
+
|
62
|
+
#
|
63
|
+
# This class is used for converting the elements of the structure
|
64
|
+
# passed to write to standard YAML types. See the comments for
|
65
|
+
# HashArrayVisitor for details on how this visitor works.
|
66
|
+
#
|
67
|
+
# As this visitor visits the nodes of a structure, it builds up a parallel
|
68
|
+
# structure that is the same as the original except that all elements are
|
69
|
+
# of standard YAML types.
|
70
|
+
#
|
71
|
+
class Visitor < HashArrayVisitor # :nodoc:
|
72
|
+
#
|
73
|
+
# The structure currently being built.
|
74
|
+
#
|
75
|
+
attr_reader :config_hash
|
76
|
+
|
77
|
+
#
|
78
|
+
# A StackFrame contains the container currently being
|
79
|
+
# built.
|
80
|
+
#
|
81
|
+
StackFrame = Struct.new(:container)
|
82
|
+
|
83
|
+
def initialize
|
84
|
+
@config_hash = {}
|
85
|
+
@next_container = @config_hash
|
86
|
+
|
87
|
+
super()
|
88
|
+
end
|
89
|
+
|
90
|
+
#
|
91
|
+
# ====Description:
|
92
|
+
# This method returns a representation of value using
|
93
|
+
# standard YAML types.
|
94
|
+
#
|
95
|
+
# ====Parameters:
|
96
|
+
# [value]
|
97
|
+
# The value to convert
|
98
|
+
#
|
99
|
+
# ====Returns:
|
100
|
+
# A standard YAML representation of value
|
101
|
+
#
|
102
|
+
def convert_value(value)
|
103
|
+
if(value.is_a?(Hash))
|
104
|
+
return {}
|
105
|
+
elsif(value.is_a?(Array))
|
106
|
+
return []
|
107
|
+
elsif((value.class <= Integer) ||
|
108
|
+
(value.class <= Float) ||
|
109
|
+
(value.class == TrueClass) ||
|
110
|
+
(value.class == FalseClass) ||
|
111
|
+
(value.class == String))
|
112
|
+
return value
|
113
|
+
else
|
114
|
+
return value.to_s
|
82
115
|
end
|
116
|
+
end
|
117
|
+
private :convert_value
|
83
118
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
119
|
+
def enter_hash(hash)
|
120
|
+
return StackFrame.new(@next_container)
|
121
|
+
end
|
122
|
+
|
123
|
+
def visit_hash_element(key, value, index, is_container)
|
124
|
+
converted_value = convert_value(value)
|
125
|
+
|
126
|
+
if(is_container)
|
127
|
+
@next_container = converted_value
|
128
|
+
end
|
129
|
+
|
130
|
+
stack_top().container[key] = converted_value
|
131
|
+
end
|
132
|
+
|
133
|
+
def enter_array(array)
|
134
|
+
return StackFrame.new(@next_container)
|
135
|
+
end
|
136
|
+
|
137
|
+
def visit_array_element(value, index, is_container)
|
138
|
+
converted_value = convert_value(value)
|
139
|
+
|
140
|
+
if(is_container)
|
141
|
+
@next_container = converted_value
|
142
|
+
end
|
143
|
+
|
144
|
+
stack_top().container.push(converted_value)
|
93
145
|
end
|
94
146
|
end
|
95
|
-
private :convert_value_to_standard_yaml_class
|
96
147
|
|
97
|
-
#
|
98
|
-
# ====Description:
|
99
|
-
# This method converts all elements of hash_value to standard
|
100
|
-
# YAML classes via convert_value_to_standard_yaml_class calls.
|
101
|
-
#
|
102
|
-
# ====Parameters:
|
103
|
-
# [hash_value]
|
104
|
-
# The Hash to convert
|
105
148
|
#
|
106
149
|
# ====Returns:
|
107
|
-
#
|
150
|
+
# Returns +false+, since the YAMLWriter requires String parameter names
|
151
|
+
# in the Hash passed to write.
|
108
152
|
#
|
109
|
-
def
|
110
|
-
|
111
|
-
|
112
|
-
hash_value.each do |param_name, value|
|
113
|
-
standard_yaml_class_hash_value[param_name] = convert_value_to_standard_yaml_class(value)
|
114
|
-
end
|
115
|
-
|
116
|
-
return standard_yaml_class_hash_value
|
153
|
+
def require_symbol_parameter_names?
|
154
|
+
return false
|
117
155
|
end
|
118
|
-
private :convert_hash_values_to_standard_yaml_classes
|
119
156
|
|
120
157
|
#
|
121
158
|
# ====Description:
|
122
|
-
# This method writes config_hash to the underlying stream.
|
159
|
+
# This method writes +config_hash+ to the underlying stream.
|
123
160
|
#
|
124
161
|
# ====Parameters:
|
125
162
|
# [config_hash]
|
126
163
|
# The configuration hash to write
|
164
|
+
# [containing_object_name]
|
165
|
+
# The configuration's containing object name
|
127
166
|
#
|
128
|
-
def write(config_hash)
|
167
|
+
def write(config_hash, containing_object_name)
|
129
168
|
if(@only_output_standard_yaml_classes)
|
130
|
-
|
169
|
+
visitor = Visitor.new()
|
170
|
+
visitor.visit(config_hash)
|
171
|
+
output_hash = visitor.config_hash
|
131
172
|
else
|
132
173
|
output_hash = config_hash
|
133
174
|
end
|
134
175
|
|
135
|
-
|
176
|
+
containing_object_hash = create_containing_object_hash(output_hash, containing_object_name)
|
177
|
+
YAML::dump(containing_object_hash, @stream)
|
136
178
|
@stream.flush()
|
137
179
|
end
|
138
180
|
end
|