yamlconfig 0.1.2 → 0.2.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.
@@ -1,5 +1,4 @@
1
- # $Id: yamlconfig.rb 67 2006-08-30 15:54:59Z erikh $
2
- #
1
+ #
3
2
  # See LICENSE for copyright information
4
3
  #
5
4
 
@@ -8,117 +7,126 @@ require 'yaml'
8
7
  # This class represents a configuration, using a YAML file,
9
8
  # by providing "accessor" methods for each item in the YAML file
10
9
  class YAMLConfig
11
- attr_accessor :resource
12
- include Enumerable
13
-
14
- def initialize(resource)
15
- @specialmethods = Array.new
16
- @resource = resource
17
-
18
- # initial method load
19
- reload()
20
- end
21
-
22
- #
23
- # This method is provided for keys and other structures where
24
- # getting at the method call is impossible.
25
- #
26
- # This will return 'nil' for all values if the YAML you have loaded
27
- # is improperly formed.
28
- #
29
-
30
- def [](key)
31
- if !@con.nil?
32
- return @con[key]
33
- end
34
-
35
- nil
36
- end
37
-
38
- #
39
- # This is a writer in the same spirit as the [] method. Please read
40
- # the documentation for that.
41
- #
42
-
43
- def []=(key, value)
44
- if !@con.nil?
45
- return @con[key] = value
46
- end
47
-
48
- nil
49
- end
50
-
51
- #
52
- # Rewrite and reload the yaml file. Note, that this will overwrite your current
53
- # yaml file and reload your configuration. If you want to avoid
54
- # doing this, provide the path to a filename for it to work with.
55
- #
56
-
57
- def write(io=@resource)
58
- # Some duck-typing checks to make sure we're dealing with
59
- # something that looks like an IO object.
60
-
61
- f = File.open(io, 'w')
62
-
63
- f << YAML::dump(@con)
64
-
65
- if io == @resource
66
- f.reopen(io, 'r')
67
- reload
68
- end
69
-
70
- true
71
- end
72
-
73
- # Remove all current (if any) attr_readers, then load the resource
74
- # named in @resource into psuedo attr_readers
75
- def reload
76
- # first remove all the previous methods from this instance
77
-
10
+ attr_accessor :resource
11
+ include Enumerable
12
+
13
+ def initialize(resource)
14
+ @specialmethods = Array.new
15
+ @resource = resource
16
+
17
+ reload_from_file()
18
+ end
19
+
20
+ #
21
+ # This method is provided for keys and other structures where
22
+ # getting at the method call is impossible.
23
+ #
24
+ # This will return 'nil' for all values if the YAML you have loaded
25
+ # is improperly formed.
26
+ #
27
+
28
+ def [](key)
29
+ if !@con.nil?
30
+ return @con[key]
31
+ end
32
+
33
+ nil
34
+ end
35
+
36
+ #
37
+ # This is a writer in the same spirit as the [] method. Please read
38
+ # the documentation for that.
39
+ #
40
+
41
+ def []=(key, value)
42
+ if !@con.nil?
43
+ return @con[key] = value
44
+ end
45
+
46
+ nil
47
+ end
48
+
49
+ #
50
+ # this should take a [] capable object, add it (keys and values) to
51
+ # self, and return self
52
+ #
53
+
54
+ def +(other)
55
+ if !@con.nil?
56
+ other.each do |k, v|
57
+ # add it to con
58
+ @con[k] = v
59
+
60
+ # add it as a method
61
+ (class << self; self; end).class_eval { define_method(k) { v }}
62
+
63
+ #add it to the @specialmethods array
64
+ @specialmethods.push k
65
+ end
66
+ end
67
+ self
68
+ end
69
+
70
+ #
71
+ # Rewrite and reload the yaml file. Note, that this will overwrite your current
72
+ # yaml file and reload your configuration. If you want to avoid
73
+ # doing this, provide the path to a filename for it to work with.
74
+ #
75
+
76
+ def write(io=@resource)
77
+ File.open(io, 'w+') do |f|
78
+ f << YAML::dump(@con)
79
+ end
80
+
81
+ if io == @resource
82
+ reload_from_file
83
+ end
84
+ end
85
+
86
+ # Remove all current (if any) attr_readers, then load the resource
87
+ # named in @resource into psuedo attr_readers
88
+ def reload_from_file
89
+
90
+ # first remove all the previous methods from this instance
78
91
  if @specialmethods
79
92
  @specialmethods.each do |meth|
80
- (class << self; self; end).class_eval { undef_method(meth) }
93
+ (class << self; self; end).class_eval { undef_method(meth) }
81
94
  end
82
95
  end
83
96
 
84
- # wipe the old list
85
- @specialmethods = []
97
+ @specialmethods = []
86
98
 
87
- # then load the new methods
88
- # add a method to the Singleton class of this instance of Config.
89
- # giving a private readonly accessor named "key" that returns "value" for each
90
- # key value pair of the YAML file named in @filename
91
- @con = loadresource()
99
+ # then load the new methods
100
+ # add a method to the Singleton class of this instance of Config.
101
+ # giving a private readonly accessor named "key" that returns "value" for each
102
+ # key value pair of the YAML file in @resource
103
+ @con = loadresource()
92
104
  if @con
93
105
  @con.each do |key,value|
94
106
  (class << self; self; end).class_eval { define_method(key) { value }}
95
-
96
- #add it to the @specialmethods array
97
107
  @specialmethods.push key
98
108
  end
99
109
  end
100
- end
101
-
102
- # standard each usage, iterates over the config keys
103
- # returning key,value
104
- def each
105
- @specialmethods.each do |key|
106
- yield key, self.send(key)
107
- end
108
- end
109
-
110
-
111
- #--
112
- # End of public documentation
113
- private
114
-
115
- def loadresource()
116
- # TODO, make this take plugins or some sort of adapter type scheme for
117
- # deciding how to load what into a hash
118
- YAML.load_file(@resource) || { }
119
- end
110
+ end
111
+
112
+ # standard each usage, iterates over the config keys
113
+ # returning key,value
114
+ def each
115
+ @specialmethods.each do |key|
116
+ yield key, self.send(key)
117
+ end
118
+ end
119
+
120
+
121
+ #--
122
+ # End of public documentation
123
+ private
124
+
125
+ def loadresource()
126
+ # TODO, make this take plugins or some sort of adapter type scheme for
127
+ # deciding how to load what into a hash
128
+ YAML.load_file(@resource) || { }
129
+ end
120
130
  end
121
131
 
122
132
  require 'yamlconfig/version'
123
-
124
- # vi:sw=2 ts=2
@@ -1 +1 @@
1
- YAMLConfig::VERSION = "0.1.2"
1
+ YAMLConfig::VERSION = "0.2.0"
File without changes
@@ -0,0 +1,8 @@
1
+ ---
2
+ "#nogoodshits":
3
+ - "*.bar.com"
4
+ - "*.example.com"
5
+ nogoodshits:
6
+ - cmaujean
7
+ - erikh
8
+ - PopeKetric
File without changes
File without changes
File without changes
File without changes
File without changes
@@ -0,0 +1,4 @@
1
+ require 'fileutils'
2
+
3
+ require 'simplecov'
4
+ SimpleCov.start
@@ -0,0 +1,145 @@
1
+ require 'spec_helper'
2
+ require 'yamlconfig'
3
+
4
+ describe YAMLConfig do
5
+ describe "with an empty file" do
6
+ it "does not raise an exception" do
7
+ lambda {
8
+ YAMLConfig.new('spec/data/empty_file')
9
+ }.should_not raise_error
10
+ end
11
+ end
12
+
13
+ describe "with complex values" do
14
+ before :each do
15
+ @yc = YAMLConfig.new('spec/data/complex_values')
16
+ end
17
+
18
+ it "creates an instance" do
19
+ @yc.kind_of?(YAMLConfig).should be_true
20
+ end
21
+
22
+ it "parses array values" do
23
+ @yc.arrayval[1].should == "bar"
24
+ end
25
+
26
+ it "parses hashes" do
27
+ @yc.hashval["foo"].should == "FOO"
28
+ end
29
+ end
30
+
31
+ describe "#write" do
32
+ before :each do
33
+ @old_file = 'spec/data/accessor_config'
34
+ @new_file = @old_file + '_tmp'
35
+ FileUtils.cp @old_file, @new_file
36
+
37
+ @yc = YAMLConfig.new @new_file
38
+ @yc['nogoodshits'] = %W(cmaujean erikh PopeKetric)
39
+ end
40
+
41
+ it "writes to the same filehandle and reloads" do
42
+ lambda { @yc.write }.should_not raise_error
43
+ @yc['nogoodshits'].should == %W(cmaujean erikh PopeKetric)
44
+ @yc['#nogoodshits'].should == %W(*.bar.com *.example.com)
45
+ end
46
+
47
+ it "writes to a new filehandle and does not reload" do
48
+ FileUtils.rm @new_file rescue true # don't care if the file doesn't exist
49
+ @yc.write @new_file
50
+
51
+ @yc['nogoodshits'].should == %W(cmaujean erikh PopeKetric)
52
+ @yc['#nogoodshits'].should == %W(*.bar.com *.example.com)
53
+ end
54
+
55
+ after :each do
56
+ #FileUtils.rm @new_file rescue true # don't care if the file doesn't exist
57
+ end
58
+ end
59
+
60
+ describe "#[key]" do
61
+ before :each do
62
+ lambda {
63
+ @yc = YAMLConfig.new('spec/data/accessor_config')
64
+ }.should_not raise_error
65
+ end
66
+
67
+ it "returns the value for the key requested" do
68
+ @yc['#nogoodshits'].should == %W(*.bar.com *.example.com)
69
+ end
70
+
71
+ it "returns nil for keys that do not exist" do
72
+ @yc['monkey'].should be_nil
73
+ end
74
+ end
75
+
76
+ describe "#[key]=value" do
77
+ before :each do
78
+ lambda {
79
+ @yc = YAMLConfig.new('spec/data/accessor_config')
80
+ }.should_not raise_error
81
+ @yc['monkey'] = "foo"
82
+ end
83
+
84
+ it "sets key=value for new keys" do
85
+ @yc['monkey'].should == 'foo'
86
+ end
87
+
88
+ it "sets key=value for existing keys" do
89
+ @yc['monkey'] = "bar"
90
+ @yc['monkey'].should == "bar"
91
+ end
92
+ end
93
+
94
+ describe "dynamic accessors" do
95
+ before :each do
96
+ @freakboy = YAMLConfig.new('spec/data/freakboy')
97
+ @config = YAMLConfig.new('spec/data/config')
98
+ end
99
+
100
+ it "returns the value when a key is called as an accessor" do
101
+ @freakboy.boondongle.should == "foogalicious"
102
+ end
103
+
104
+ it "it retains different values for different instances" do
105
+ @freakboy.servername.should == 'freakboy'
106
+ @config.servername.should == 'normalfairypoof'
107
+ end
108
+ end
109
+
110
+ describe "reload_from_file" do
111
+ before :each do
112
+ @yc = YAMLConfig.new('spec/data/freakboy')
113
+ @yc.resource = 'spec/data/flatulentmonkey'
114
+ @yc.reload_from_file
115
+ end
116
+
117
+ it "should throw NoMethodError for non-existent methods" do
118
+ lambda {
119
+ @yc.boondongle
120
+ }.should raise_error(NoMethodError)
121
+ end
122
+
123
+ it "should not throw errors for existing methods" do
124
+ @yc.servername.should == 'flatulentmonkey'
125
+ end
126
+ end
127
+
128
+ describe "#each" do
129
+ it "iterates the keys and values" do
130
+ f = YAMLConfig.new('spec/data/freakboy')
131
+ f.each do |key,value|
132
+ f[key].should == value
133
+ end
134
+ end
135
+ end
136
+
137
+ describe "#+" do
138
+ it "adds the new keys and values to itself" do
139
+ f = YAMLConfig.new('spec/data/freakboy')
140
+ y = { 'a' => '1', 'b' => '2' }
141
+ a = f + y
142
+ f.a.should == '1'
143
+ end
144
+ end
145
+ end
metadata CHANGED
@@ -1,57 +1,67 @@
1
1
  --- !ruby/object:Gem::Specification
2
- rubygems_version: 0.9.4
3
- specification_version: 1
4
2
  name: yamlconfig
5
3
  version: !ruby/object:Gem::Version
6
- version: 0.1.2
7
- date: 2007-09-16 00:00:00 -07:00
8
- summary: YAML file based configuration object with an EASY interface
9
- require_paths:
10
- - lib
11
- email: cmaujean@gmail.com
12
- homepage: http://rubyforge.org/projects/ngslib
13
- rubyforge_project: ngslib
14
- description:
15
- autorequire:
16
- default_executable:
17
- bindir: bin
18
- has_rdoc: true
19
- required_ruby_version: !ruby/object:Gem::Version::Requirement
20
- requirements:
21
- - - ">"
22
- - !ruby/object:Gem::Version
23
- version: 0.0.0
24
- version:
4
+ prerelease:
5
+ version: 0.2.0
25
6
  platform: ruby
26
- signing_key:
27
- cert_chain:
28
- post_install_message:
29
7
  authors:
30
8
  - Christopher Maujean
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-04-05 00:00:00 -07:00
14
+ default_executable:
15
+ dependencies: []
16
+
17
+ description:
18
+ email: cmaujean@gmail.com
19
+ executables: []
20
+
21
+ extensions: []
22
+
23
+ extra_rdoc_files:
24
+ - lib/LICENSE
31
25
  files:
32
26
  - lib/LICENSE
33
- - lib/yamlconfig
34
27
  - lib/yamlconfig/version.rb
35
28
  - lib/yamlconfig.rb
36
- - test/data
37
- - test/data/accessor_config
38
- - test/data/complex_values
39
- - test/data/config
40
- - test/data/empty_file
41
- - test/data/flatulentmonkey
42
- - test/data/freakboy
43
- - test/tc_yamlconfig.rb
44
- test_files:
45
- - test/tc_yamlconfig.rb
46
- rdoc_options: []
47
-
48
- extra_rdoc_files:
49
- - lib/LICENSE
50
- executables: []
29
+ - spec/data/accessor_config
30
+ - spec/data/accessor_config_tmp
31
+ - spec/data/complex_values
32
+ - spec/data/config
33
+ - spec/data/empty_file
34
+ - spec/data/flatulentmonkey
35
+ - spec/data/freakboy
36
+ - spec/spec_helper.rb
37
+ - spec/yamlconfig_spec.rb
38
+ has_rdoc: true
39
+ homepage: http://rubyforge.org/projects/ngslib
40
+ licenses: []
51
41
 
52
- extensions: []
42
+ post_install_message:
43
+ rdoc_options: []
53
44
 
45
+ require_paths:
46
+ - lib
47
+ required_ruby_version: !ruby/object:Gem::Requirement
48
+ none: false
49
+ requirements:
50
+ - - ">="
51
+ - !ruby/object:Gem::Version
52
+ version: "0"
53
+ required_rubygems_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ">="
57
+ - !ruby/object:Gem::Version
58
+ version: "0"
54
59
  requirements: []
55
60
 
56
- dependencies: []
57
-
61
+ rubyforge_project: ngslib
62
+ rubygems_version: 1.6.2
63
+ signing_key:
64
+ specification_version: 3
65
+ summary: YAML file based configuration object with an EASY interface
66
+ test_files:
67
+ - spec/yamlconfig_spec.rb
@@ -1,102 +0,0 @@
1
- require 'test/unit'
2
- require 'yamlconfig'
3
- require 'fileutils'
4
-
5
- class TestConfig < Test::Unit::TestCase
6
- def test_yaml_empty
7
- assert_nothing_raised do
8
- YAMLConfig.new('yamlconfig/test/data/empty_file')
9
- end
10
- end
11
-
12
- def test_yaml_complex
13
- f = YAMLConfig.new('yamlconfig/test/data/complex_values')
14
- assert_equal(f.arrayval[1], "bar", "array values work")
15
- assert_equal(f.hashval["foo"], "FOO", "hash values work")
16
- end
17
-
18
- def test_yaml_write
19
- old_file = 'yamlconfig/test/data/accessor_config'
20
- new_file = old_file + '_tmp'
21
- FileUtils.cp old_file, new_file
22
-
23
- # write to the same filehandle
24
- f = nil
25
- assert_nothing_raised do
26
- f = YAMLConfig.new new_file
27
- f['nogoodshits'] = %W(cmaujean erikh PopeKetric)
28
- f.write
29
- end
30
-
31
- # test that it reloads properly
32
-
33
- assert_equal f['nogoodshits'], %W(cmaujean erikh PopeKetric)
34
- assert_equal f['#nogoodshits'], %W(*.bar.com *.example.com)
35
-
36
- FileUtils.rm new_file
37
-
38
- # write to a new filehandle
39
-
40
- assert_nothing_raised do
41
- f.write new_file
42
- f = YAMLConfig.new new_file
43
- end
44
-
45
- # test that it created the right data
46
-
47
- assert_equal f['nogoodshits'], %W(cmaujean erikh PopeKetric)
48
- assert_equal f['#nogoodshits'], %W(*.bar.com *.example.com)
49
-
50
- FileUtils.rm new_file
51
-
52
- end
53
-
54
- def test_array_accessor
55
- f = nil
56
- assert_nothing_raised do
57
- f = YAMLConfig.new('yamlconfig/test/data/accessor_config')
58
- end
59
- assert_equal f['#nogoodshits'], %W(*.bar.com *.example.com)
60
- assert_nil f['monkey']
61
-
62
- assert_nothing_raised do
63
- f['monkey'] = "foo"
64
- end
65
-
66
- assert_equal f['monkey'], 'foo'
67
- end
68
-
69
- def test_accessors
70
- f = YAMLConfig.new('yamlconfig/test/data/freakboy')
71
- g = YAMLConfig.new('yamlconfig/test/data/config')
72
-
73
- assert_equal f.servername, 'freakboy'
74
- assert_equal g.servername, 'normalfairypoof'
75
- assert_equal f.boondongle, 'foogalicious'
76
-
77
- end
78
-
79
-
80
- def test_reload
81
- f = YAMLConfig.new('yamlconfig/test/data/freakboy')
82
- f.resource = 'yamlconfig/test/data/flatulentmonkey'
83
- f.reload
84
- begin
85
- f.boondongle
86
- rescue NoMethodError
87
- assert(true, "NoMethodError was triggered for boondongle")
88
- else
89
- assert(false, "NoMethodError was not triggered! something is wrong, return was #{f.boondongle}")
90
- end
91
- assert_equal f.servername, 'flatulentmonkey'
92
- end
93
-
94
- def test_each
95
- f = YAMLConfig.new('yamlconfig/test/data/freakboy')
96
- f.each do |key,value|
97
- assert f[key] == value, "part of the each tests, f[#{key}] == #{value}"
98
- end
99
- end
100
- end
101
-
102
- # vi:sw=2 ts=2