puppet 0.13.6 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of puppet might be problematic. Click here for more details.

Files changed (149) hide show
  1. data/CHANGELOG +57 -0
  2. data/Rakefile +38 -410
  3. data/bin/puppet +14 -12
  4. data/bin/puppetca +1 -3
  5. data/bin/puppetd +25 -7
  6. data/bin/puppetdoc +161 -104
  7. data/bin/puppetmasterd +4 -4
  8. data/conf/epm.list +8 -0
  9. data/conf/redhat/client.init +6 -1
  10. data/conf/redhat/no-chuser-0.15.1.patch +38 -0
  11. data/conf/redhat/puppet.spec +20 -5
  12. data/conf/redhat/puppetd.conf +1 -1
  13. data/conf/redhat/puppetmasterd.conf +1 -1
  14. data/conf/redhat/server.init +2 -4
  15. data/examples/code/snippets/{casestatement → casestatement.pp} +12 -1
  16. data/examples/code/snippets/selectorvalues.pp +15 -0
  17. data/examples/code/snippets/singleselector.pp +22 -0
  18. data/examples/code/snippets/tag.pp +9 -0
  19. data/ext/module_puppet +1 -1
  20. data/install.rb +303 -303
  21. data/lib/puppet.rb +7 -9
  22. data/lib/puppet/client.rb +18 -5
  23. data/lib/puppet/client/dipper.rb +12 -10
  24. data/lib/puppet/client/master.rb +113 -41
  25. data/lib/puppet/client/pelement.rb +20 -0
  26. data/lib/puppet/config.rb +113 -6
  27. data/lib/puppet/element.rb +1 -3
  28. data/lib/puppet/event.rb +12 -23
  29. data/lib/puppet/filetype.rb +93 -5
  30. data/lib/puppet/inifile.rb +201 -0
  31. data/lib/puppet/log.rb +18 -6
  32. data/lib/puppet/parameter.rb +80 -29
  33. data/lib/puppet/parser/ast.rb +6 -4
  34. data/lib/puppet/parser/ast/caseopt.rb +13 -4
  35. data/lib/puppet/parser/ast/casestatement.rb +2 -2
  36. data/lib/puppet/parser/ast/component.rb +4 -14
  37. data/lib/puppet/parser/ast/hostclass.rb +1 -1
  38. data/lib/puppet/parser/ast/leaf.rb +12 -0
  39. data/lib/puppet/parser/ast/node.rb +4 -4
  40. data/lib/puppet/parser/ast/objectdef.rb +5 -51
  41. data/lib/puppet/parser/ast/selector.rb +2 -0
  42. data/lib/puppet/parser/ast/tag.rb +26 -0
  43. data/lib/puppet/parser/interpreter.rb +89 -74
  44. data/lib/puppet/parser/lexer.rb +4 -3
  45. data/lib/puppet/parser/parser.rb +440 -378
  46. data/lib/puppet/parser/scope.rb +844 -887
  47. data/lib/puppet/server.rb +12 -1
  48. data/lib/puppet/server/authconfig.rb +166 -0
  49. data/lib/puppet/server/authstore.rb +8 -6
  50. data/lib/puppet/server/ca.rb +23 -26
  51. data/lib/puppet/server/filebucket.rb +24 -23
  52. data/lib/puppet/server/fileserver.rb +116 -47
  53. data/lib/puppet/server/master.rb +58 -19
  54. data/lib/puppet/server/pelement.rb +176 -0
  55. data/lib/puppet/server/rights.rb +78 -0
  56. data/lib/puppet/server/servlet.rb +19 -6
  57. data/lib/puppet/sslcertificates.rb +4 -2
  58. data/lib/puppet/sslcertificates/ca.rb +66 -34
  59. data/lib/puppet/storage.rb +20 -26
  60. data/lib/puppet/transaction.rb +49 -92
  61. data/lib/puppet/type.rb +142 -35
  62. data/lib/puppet/type/cron.rb +29 -14
  63. data/lib/puppet/type/exec.rb +92 -35
  64. data/lib/puppet/type/group.rb +29 -11
  65. data/lib/puppet/type/nameservice.rb +50 -1
  66. data/lib/puppet/type/nameservice/netinfo.rb +68 -1
  67. data/lib/puppet/type/nameservice/objectadd.rb +1 -0
  68. data/lib/puppet/type/package.rb +150 -109
  69. data/lib/puppet/type/package/apple.rb +27 -0
  70. data/lib/puppet/type/package/apt.rb +1 -0
  71. data/lib/puppet/type/package/darwinport.rb +97 -0
  72. data/lib/puppet/type/package/dpkg.rb +10 -2
  73. data/lib/puppet/type/package/freebsd.rb +19 -0
  74. data/lib/puppet/type/package/{bsd.rb → openbsd.rb} +36 -7
  75. data/lib/puppet/type/package/ports.rb +98 -0
  76. data/lib/puppet/type/package/rpm.rb +43 -7
  77. data/lib/puppet/type/package/sun.rb +53 -36
  78. data/lib/puppet/type/package/yum.rb +5 -16
  79. data/lib/puppet/type/parsedtype.rb +41 -29
  80. data/lib/puppet/type/parsedtype/host.rb +13 -5
  81. data/lib/puppet/type/parsedtype/mount.rb +250 -0
  82. data/lib/puppet/type/parsedtype/port.rb +8 -6
  83. data/lib/puppet/type/pfile.rb +284 -30
  84. data/lib/puppet/type/pfile/checksum.rb +96 -68
  85. data/lib/puppet/type/pfile/content.rb +16 -13
  86. data/lib/puppet/type/pfile/ensure.rb +64 -126
  87. data/lib/puppet/type/pfile/group.rb +12 -5
  88. data/lib/puppet/type/pfile/mode.rb +16 -4
  89. data/lib/puppet/type/pfile/source.rb +47 -73
  90. data/lib/puppet/type/pfile/target.rb +81 -0
  91. data/lib/puppet/type/pfile/uid.rb +10 -3
  92. data/lib/puppet/type/pfilebucket.rb +12 -3
  93. data/lib/puppet/type/schedule.rb +5 -1
  94. data/lib/puppet/type/service.rb +138 -66
  95. data/lib/puppet/type/service/debian.rb +9 -3
  96. data/lib/puppet/type/service/init.rb +51 -56
  97. data/lib/puppet/type/service/smf.rb +16 -6
  98. data/lib/puppet/type/state.rb +71 -32
  99. data/lib/puppet/type/symlink.rb +12 -7
  100. data/lib/puppet/type/tidy.rb +5 -1
  101. data/lib/puppet/type/user.rb +116 -20
  102. data/lib/puppet/type/yumrepo.rb +314 -0
  103. data/lib/puppet/util.rb +84 -14
  104. data/test/client/client.rb +41 -18
  105. data/test/client/master.rb +50 -4
  106. data/test/executables/puppetbin.rb +31 -4
  107. data/test/executables/puppetca.rb +18 -2
  108. data/test/language/ast.rb +201 -31
  109. data/test/language/interpreter.rb +8 -2
  110. data/test/{parser → language}/lexer.rb +1 -1
  111. data/test/language/node.rb +84 -0
  112. data/test/{parser → language}/parser.rb +1 -1
  113. data/test/language/scope.rb +101 -2
  114. data/test/language/snippets.rb +23 -2
  115. data/test/other/config.rb +99 -1
  116. data/test/other/filetype.rb +95 -0
  117. data/test/other/inifile.rb +114 -0
  118. data/test/other/log.rb +3 -2
  119. data/test/other/transactions.rb +55 -10
  120. data/test/puppet/utiltest.rb +25 -1
  121. data/test/puppettest.rb +140 -46
  122. data/test/server/authconfig.rb +56 -0
  123. data/test/server/bucket.rb +32 -18
  124. data/test/server/fileserver.rb +75 -30
  125. data/test/server/master.rb +27 -4
  126. data/test/server/pelement.rb +298 -0
  127. data/test/server/rights.rb +41 -0
  128. data/test/server/server.rb +2 -2
  129. data/test/tagging/tagging.rb +100 -1
  130. data/test/types/basic.rb +3 -3
  131. data/test/types/cron.rb +24 -1
  132. data/test/types/exec.rb +99 -1
  133. data/test/types/file.rb +298 -2
  134. data/test/types/filebucket.rb +4 -15
  135. data/test/types/filesources.rb +43 -14
  136. data/test/types/group.rb +1 -13
  137. data/test/types/mount.rb +277 -0
  138. data/test/types/package.rb +164 -33
  139. data/test/types/parameter.rb +107 -0
  140. data/test/types/port.rb +2 -1
  141. data/test/types/service.rb +37 -2
  142. data/test/types/state.rb +92 -0
  143. data/test/types/symlink.rb +30 -2
  144. data/test/types/tidy.rb +2 -14
  145. data/test/types/type.rb +35 -1
  146. data/test/types/user.rb +110 -1
  147. data/test/types/yumrepo.rb +95 -0
  148. metadata +316 -290
  149. data/test/types/filetype.rb +0 -160
@@ -34,7 +34,7 @@ class TestMaster < Test::Unit::TestCase
34
34
  assert_nothing_raised() {
35
35
  # this is the default server setup
36
36
  master = Puppet::Server::Master.new(
37
- :File => file,
37
+ :Manifest => file,
38
38
  :UseNodes => false,
39
39
  :Local => true
40
40
  )
@@ -79,7 +79,7 @@ class TestMaster < Test::Unit::TestCase
79
79
  assert_nothing_raised() {
80
80
  # this is the default server setup
81
81
  master = Puppet::Server::Master.new(
82
- :File => file,
82
+ :Manifest => file,
83
83
  :UseNodes => false,
84
84
  :Local => true
85
85
  )
@@ -111,7 +111,7 @@ class TestMaster < Test::Unit::TestCase
111
111
  assert_nothing_raised() {
112
112
  # this is the default server setup
113
113
  master = Puppet::Server::Master.new(
114
- :File => manifest,
114
+ :Manifest => manifest,
115
115
  :UseNodes => false,
116
116
  :Local => true,
117
117
  :FileTimeout => 15
@@ -173,7 +173,30 @@ class TestMaster < Test::Unit::TestCase
173
173
  assert(FileTest.exists?(file2), "Second file %s does not exist" % file2)
174
174
  end
175
175
 
176
+ def test_addfacts
177
+ master = nil
178
+ file = mktestmanifest()
179
+ # create our master
180
+ assert_nothing_raised() {
181
+ # this is the default server setup
182
+ master = Puppet::Server::Master.new(
183
+ :Manifest => file,
184
+ :UseNodes => false,
185
+ :Local => true
186
+ )
187
+ }
188
+
189
+ facts = {}
190
+
191
+ assert_nothing_raised {
192
+ master.addfacts(facts)
193
+ }
194
+
195
+ %w{serverversion servername serverip}.each do |fact|
196
+ assert(facts.include?(fact), "Fact %s was not set" % fact)
197
+ end
198
+ end
176
199
  end
177
200
 
178
- # $Id: master.rb 845 2006-01-18 21:30:56Z luke $
201
+ # $Id: master.rb 1102 2006-04-11 16:12:38Z luke $
179
202
 
@@ -0,0 +1,298 @@
1
+ if __FILE__ == $0
2
+ $:.unshift '../../lib'
3
+ $:.unshift '..'
4
+ $puppetbase = "../.."
5
+ end
6
+
7
+ require 'puppet'
8
+ require 'puppet/server/pelement'
9
+ require 'test/unit'
10
+ require 'puppettest.rb'
11
+ require 'base64'
12
+ require 'cgi'
13
+
14
+ class TestPElementServer < Test::Unit::TestCase
15
+ include ServerTest
16
+
17
+ def verify_described(type, described)
18
+ described.each do |name, trans|
19
+ type.clear
20
+ obj = nil
21
+ assert_nothing_raised do
22
+ obj = trans.to_type
23
+ end
24
+
25
+ assert(obj, "Could not create object")
26
+ assert_nothing_raised do
27
+ obj.retrieve
28
+ end
29
+
30
+ assert(obj.insync?, "Described %s[%s] is not in sync" %
31
+ [trans.type, name])
32
+
33
+ if trans.type == :package
34
+ assert_equal(Puppet::Type.type(:package).default, obj[:type])
35
+ end
36
+ end
37
+ type.clear
38
+ end
39
+
40
+ def test_describe_file
41
+ # Make a file to describe
42
+ file = tempfile()
43
+ str = "yayness\n"
44
+
45
+ server = nil
46
+
47
+ assert_nothing_raised do
48
+ server = Puppet::Server::PElement.new()
49
+ end
50
+
51
+ # The first run we create the file on the copy, the second run
52
+ # the file is already there so the object should be in sync
53
+ 2.times do |i|
54
+ [ [nil],
55
+ [[:content, :mode], []],
56
+ [[], [:content]],
57
+ [[:content], [:mode]]
58
+ ].each do |ary|
59
+ retrieve = ary[0] || []
60
+ ignore = ary[1] || []
61
+
62
+ File.open(file, "w") { |f| f.print str }
63
+
64
+ result = nil
65
+ assert_nothing_raised do
66
+ result = server.describe("file", file, *ary)
67
+ end
68
+
69
+ assert(result, "Could not retrieve file information")
70
+
71
+ assert_instance_of(Puppet::TransObject, result)
72
+
73
+ # Now we have to clear, so that the server's object gets removed
74
+ Puppet::Type.type(:file).clear
75
+
76
+ # And remove the file, so we can verify it gets recreated
77
+ if i == 0
78
+ File.unlink(file)
79
+ end
80
+
81
+ object = nil
82
+ assert_nothing_raised do
83
+ object = result.to_type
84
+ end
85
+
86
+ assert(object, "Could not create type")
87
+
88
+ retrieve.each do |state|
89
+ assert(object.should(state), "Did not retrieve %s" % state)
90
+ end
91
+
92
+ ignore.each do |state|
93
+ assert(! object.should(state), "Incorrectly retrieved %s" % state)
94
+ end
95
+
96
+ if i == 0
97
+ assert_events([:file_created], object)
98
+ else
99
+ assert_nothing_raised {
100
+ object.retrieve
101
+ }
102
+ assert(object.insync?, "Object was not in sync")
103
+ end
104
+
105
+ assert(FileTest.exists?(file), "File did not get recreated")
106
+
107
+ if i == 0
108
+ if object.should(:content)
109
+ assert_equal(str, File.read(file), "File contents are not the same")
110
+ else
111
+ assert_equal("", File.read(file), "File content was incorrectly made")
112
+ end
113
+ end
114
+ if FileTest.exists? file
115
+ File.unlink(file)
116
+ end
117
+ end
118
+ end
119
+ end
120
+
121
+ def test_describe_directory
122
+ # Make a file to describe
123
+ file = tempfile()
124
+
125
+ server = nil
126
+
127
+ assert_nothing_raised do
128
+ server = Puppet::Server::PElement.new()
129
+ end
130
+
131
+ [ [nil],
132
+ [[:ensure, :checksum, :mode], []],
133
+ [[], [:checksum]],
134
+ [[:ensure, :checksum], [:mode]]
135
+ ].each do |ary|
136
+ retrieve = ary[0] || []
137
+ ignore = ary[1] || []
138
+
139
+ Dir.mkdir(file)
140
+
141
+ result = nil
142
+ assert_nothing_raised do
143
+ result = server.describe("file", file, *ary)
144
+ end
145
+
146
+ assert(result, "Could not retrieve file information")
147
+
148
+ assert_instance_of(Puppet::TransObject, result)
149
+
150
+ # Now we have to clear, so that the server's object gets removed
151
+ Puppet::Type.type(:file).clear
152
+
153
+ # And remove the file, so we can verify it gets recreated
154
+ Dir.rmdir(file)
155
+
156
+ object = nil
157
+ assert_nothing_raised do
158
+ object = result.to_type
159
+ end
160
+
161
+ assert(object, "Could not create type")
162
+
163
+ retrieve.each do |state|
164
+ assert(object.should(state), "Did not retrieve %s" % state)
165
+ end
166
+
167
+ ignore.each do |state|
168
+ assert(! object.should(state), "Incorrectly retrieved %s" % state)
169
+ end
170
+
171
+ assert_events([:directory_created], object)
172
+
173
+ assert(FileTest.directory?(file), "Directory did not get recreated")
174
+ Dir.rmdir(file)
175
+ end
176
+ end
177
+
178
+ def test_describe_alltypes
179
+ # Systems get pretty retarded, so I'm going to set the path to some fake
180
+ # data for ports
181
+ #Puppet::Type::ParsedType::Port.path = File.join($puppetbase,
182
+ # "test/data/types/ports/1")
183
+ #Puppet.err Puppet::Type::ParsedType::Port.path
184
+ server = nil
185
+ assert_nothing_raised do
186
+ server = Puppet::Server::PElement.new()
187
+ end
188
+
189
+ require 'etc'
190
+
191
+ # Make the example schedules, for testing
192
+ Puppet::Type.type(:schedule).mkdefaultschedules
193
+
194
+ Puppet::Type.eachtype do |type|
195
+ unless type.respond_to? :list
196
+ Puppet.warning "%s does not respond to :list" % type.name
197
+ next
198
+ end
199
+ #next unless type.name == :port
200
+ Puppet.info "Describing each %s" % type.name
201
+
202
+ # First do a listing from the server
203
+ bucket = nil
204
+ assert_nothing_raised {
205
+ bucket = server.list(type.name)
206
+ }
207
+
208
+ #type.clear
209
+
210
+ count = 0
211
+ described = {}
212
+ bucket.each do |obj|
213
+ assert_instance_of(Puppet::TransObject, obj)
214
+ break if count > 5
215
+ described[obj.name] = server.describe(obj.type, obj.name)
216
+ count += 1
217
+ end
218
+
219
+ verify_described(type, described)
220
+
221
+ count = 0
222
+ described = {}
223
+ type.list.each do |obj|
224
+ assert_instance_of(type, obj)
225
+
226
+ break if count > 5
227
+ trans = nil
228
+ assert_nothing_raised do
229
+ described[obj.name] = server.describe(type.name, obj.name)
230
+ end
231
+
232
+ count += 1
233
+ end
234
+
235
+ if described.empty?
236
+ Puppet.notice "Got no example objects for %s" % type.name
237
+ end
238
+
239
+ # We separate these, in case the list operation creates objects
240
+ verify_described(type, described)
241
+ end
242
+ end
243
+
244
+ def test_apply
245
+ server = nil
246
+ assert_nothing_raised do
247
+ server = Puppet::Server::PElement.new()
248
+ end
249
+
250
+ file = tempfile()
251
+ str = "yayness\n"
252
+
253
+ File.open(file, "w") { |f| f.print str }
254
+
255
+ filetrans = nil
256
+ assert_nothing_raised {
257
+ filetrans = server.describe("file", file)
258
+ }
259
+
260
+ Puppet::Type.type(:file).clear
261
+
262
+ bucket = Puppet::TransBucket.new
263
+ bucket.type = "file"
264
+ bucket.push filetrans
265
+
266
+ File.unlink(file)
267
+ assert_nothing_raised {
268
+ server.apply(bucket)
269
+ }
270
+
271
+ assert(FileTest.exists?(file), "File did not get recreated")
272
+
273
+ # Now try it as a "nonlocal" server
274
+ server.local = false
275
+ yaml = nil
276
+ assert_nothing_raised {
277
+ yaml = CGI.escape(YAML::dump(bucket))
278
+ }
279
+
280
+ Puppet::Type.type(:file).clear
281
+ File.unlink(file)
282
+
283
+ if yaml =~ /(.{20}Loglevel.{20})/
284
+ Puppet.warning "YAML is broken on this machine"
285
+ return
286
+ end
287
+ assert_nothing_raised("Could not reload yaml") {
288
+ YAML::load(CGI.unescape(yaml))
289
+ }
290
+
291
+ assert_nothing_raised {
292
+ server.apply(yaml)
293
+ }
294
+ assert(FileTest.exists?(file), "File did not get recreated from YAML")
295
+ end
296
+ end
297
+
298
+ # $Id: pelement.rb 1129 2006-04-21 19:14:59Z luke $
@@ -0,0 +1,41 @@
1
+ if __FILE__ == $0
2
+ $:.unshift '../../lib'
3
+ $:.unshift '..'
4
+ $puppetbase = "../.."
5
+ end
6
+
7
+ require 'puppet'
8
+ require 'puppet/server/rights'
9
+ require 'test/unit'
10
+ require 'puppettest.rb'
11
+
12
+ class TestRights < Test::Unit::TestCase
13
+ include TestPuppet
14
+
15
+ def test_rights
16
+ store = nil
17
+ assert_nothing_raised {
18
+ store = Puppet::Server::Rights.new
19
+ }
20
+
21
+ assert(store, "Did not create store")
22
+
23
+ assert_raise(ArgumentError, "Did not fail on unknown right") {
24
+ store.allowed?(:write, "host.madstop.com", "0.0.0.0")
25
+ }
26
+
27
+ assert_nothing_raised {
28
+ store.newright(:write)
29
+ }
30
+
31
+ assert(! store.allowed?(:write, "host.madstop.com", "0.0.0.0"),
32
+ "Defaulted to allowing access")
33
+
34
+ assert_nothing_raised {
35
+ store[:write].info "This is a log message"
36
+ }
37
+ end
38
+ end
39
+
40
+ # $Id: rights.rb 1129 2006-04-21 19:14:59Z luke $
41
+
@@ -13,7 +13,7 @@ require 'xmlrpc/client'
13
13
  require 'test/unit'
14
14
  require 'puppettest.rb'
15
15
 
16
- # $Id: server.rb 816 2006-01-12 21:04:06Z luke $
16
+ # $Id: server.rb 1068 2006-04-04 23:13:55Z luke $
17
17
 
18
18
  if ARGV.length > 0 and ARGV[0] == "short"
19
19
  $short = true
@@ -85,7 +85,7 @@ class TestServer < Test::Unit::TestCase
85
85
  :CA => {}, # so that certs autogenerate
86
86
  :Master => {
87
87
  :UseNodes => false,
88
- :File => file
88
+ :Manifest => file
89
89
  },
90
90
  :Status => nil
91
91
  }
@@ -75,6 +75,105 @@ class TestTagging < Test::Unit::TestCase
75
75
  "Incorrect tags")
76
76
  }
77
77
  end
78
+
79
+ # Make sure that specifying tags results in only those objects getting
80
+ # run.
81
+ def test_tagspecs
82
+ a = tempfile()
83
+ b = tempfile()
84
+
85
+ afile = Puppet.type(:file).create(
86
+ :path => a,
87
+ :ensure => :file
88
+ )
89
+ afile.tag("a")
90
+
91
+ bfile = Puppet.type(:file).create(
92
+ :path => b,
93
+ :ensure => :file
94
+ )
95
+ bfile.tag(:b)
96
+
97
+ # First, make sure they get created when no spec'ed tags
98
+ assert_events([:file_created,:file_created], afile, bfile)
99
+ assert(FileTest.exists?(a), "A did not get created")
100
+ assert(FileTest.exists?(b), "B did not get created")
101
+ File.unlink(a)
102
+ File.unlink(b)
103
+
104
+ # Set the tags to a
105
+ assert_nothing_raised {
106
+ Puppet[:tags] = "a"
107
+ }
108
+
109
+ assert_events([:file_created], afile, bfile)
110
+ assert(FileTest.exists?(a), "A did not get created")
111
+ assert(!FileTest.exists?(b), "B got created")
112
+ File.unlink(a)
113
+
114
+ # Set the tags to b
115
+ assert_nothing_raised {
116
+ Puppet[:tags] = "b"
117
+ }
118
+
119
+ assert_events([:file_created], afile, bfile)
120
+ assert(!FileTest.exists?(a), "A got created")
121
+ assert(FileTest.exists?(b), "B did not get created")
122
+ File.unlink(b)
123
+
124
+ # Set the tags to something else
125
+ assert_nothing_raised {
126
+ Puppet[:tags] = "c"
127
+ }
128
+
129
+ assert_events([], afile, bfile)
130
+ assert(!FileTest.exists?(a), "A got created")
131
+ assert(!FileTest.exists?(b), "B got created")
132
+
133
+ # Now set both tags
134
+ assert_nothing_raised {
135
+ Puppet[:tags] = "b, a"
136
+ }
137
+
138
+ assert_events([:file_created, :file_created], afile, bfile)
139
+ assert(FileTest.exists?(a), "A did not get created")
140
+ assert(FileTest.exists?(b), "B did not get created")
141
+ File.unlink(a)
142
+
143
+ end
144
+
145
+ def test_metaparamtag
146
+ path = tempfile()
147
+
148
+ start = %w{some tags}
149
+ tags = %w{a list of tags}
150
+
151
+ obj = nil
152
+ assert_nothing_raised do
153
+ obj = Puppet.type(:file).create(
154
+ :path => path,
155
+ :ensure => "file",
156
+ :tag => start
157
+ )
158
+ end
159
+
160
+
161
+ assert(obj, "Did not make object")
162
+
163
+ start.each do |tag|
164
+ assert(obj.tagged?(tag), "Object was not tagged with %s" % tag)
165
+ end
166
+
167
+ tags.each do |tag|
168
+ assert_nothing_raised {
169
+ obj[:tag] = tag
170
+ }
171
+ end
172
+
173
+ tags.each do |tag|
174
+ assert(obj.tagged?(tag), "Object was not tagged with %s" % tag)
175
+ end
176
+ end
78
177
  end
79
178
 
80
- # $Id: tagging.rb 952 2006-02-27 22:21:44Z luke $
179
+ # $Id: tagging.rb 1099 2006-04-11 15:30:19Z luke $