shadow_puppet 0.4.1 → 0.5.2

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/.rspec ADDED
@@ -0,0 +1 @@
1
+ --debugger --require ./spec/spec_helper.rb --backtrace --color --format d
data/Gemfile ADDED
@@ -0,0 +1,15 @@
1
+ source :rubygems
2
+
3
+ gem 'puppet', '2.7.3'
4
+ gem 'highline', '>= 1.5.0'
5
+ gem 'builder', '>= 2.1.2'
6
+ gem 'activesupport', '>= 2.0.0'
7
+ gem 'i18n', '>= 0.5.0'
8
+
9
+ group :development do
10
+ gem "rspec", "~> 2.6.0"
11
+ gem "rspec-core", "~> 2.6.0"
12
+ gem "jeweler", "~> 1.6.2"
13
+ gem 'ruby-debug', :platforms => :ruby_18
14
+ gem 'ruby-debug19', :platforms => :ruby_19
15
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,62 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activesupport (3.0.10)
5
+ archive-tar-minitar (0.5.2)
6
+ builder (2.1.2)
7
+ columnize (0.3.4)
8
+ diff-lcs (1.1.3)
9
+ facter (1.6.0)
10
+ git (1.2.5)
11
+ highline (1.5.2)
12
+ i18n (0.6.0)
13
+ jeweler (1.6.4)
14
+ bundler (~> 1.0)
15
+ git (>= 1.2.5)
16
+ rake
17
+ linecache (0.46)
18
+ rbx-require-relative (> 0.0.4)
19
+ linecache19 (0.5.12)
20
+ ruby_core_source (>= 0.1.4)
21
+ puppet (2.7.3)
22
+ facter (>= 1.5.1)
23
+ rake (0.9.2)
24
+ rbx-require-relative (0.0.5)
25
+ rspec (2.6.0)
26
+ rspec-core (~> 2.6.0)
27
+ rspec-expectations (~> 2.6.0)
28
+ rspec-mocks (~> 2.6.0)
29
+ rspec-core (2.6.4)
30
+ rspec-expectations (2.6.0)
31
+ diff-lcs (~> 1.1.2)
32
+ rspec-mocks (2.6.0)
33
+ ruby-debug (0.10.4)
34
+ columnize (>= 0.1)
35
+ ruby-debug-base (~> 0.10.4.0)
36
+ ruby-debug-base (0.10.4)
37
+ linecache (>= 0.3)
38
+ ruby-debug-base19 (0.11.25)
39
+ columnize (>= 0.3.1)
40
+ linecache19 (>= 0.5.11)
41
+ ruby_core_source (>= 0.1.4)
42
+ ruby-debug19 (0.11.6)
43
+ columnize (>= 0.3.1)
44
+ linecache19 (>= 0.5.11)
45
+ ruby-debug-base19 (>= 0.11.19)
46
+ ruby_core_source (0.1.5)
47
+ archive-tar-minitar (>= 0.5.2)
48
+
49
+ PLATFORMS
50
+ ruby
51
+
52
+ DEPENDENCIES
53
+ activesupport (>= 2.0.0)
54
+ builder (>= 2.1.2)
55
+ highline (>= 1.5.0)
56
+ i18n (>= 0.5.0)
57
+ jeweler (~> 1.6.2)
58
+ puppet (= 2.7.3)
59
+ rspec (~> 2.6.0)
60
+ rspec-core (~> 2.6.0)
61
+ ruby-debug
62
+ ruby-debug19
data/README.rdoc CHANGED
@@ -12,7 +12,6 @@ ShadowPuppet::Manifest.
12
12
 
13
13
  == Running the Test Suite
14
14
 
15
- $ gem install rspec isolate-scenarios
16
- $ rake spec
17
- # To test against all supported versions of ActiveSupport:
18
- $ isolate-scenarios rake spec
15
+ $ gem install bundler
16
+ $ bundle install
17
+ $ bundle exec rake spec
data/Rakefile CHANGED
@@ -5,24 +5,15 @@ Jeweler::Tasks.new do |gem|
5
5
  gem.name = "shadow_puppet"
6
6
  gem.summary = %Q{A Ruby Puppet DSL}
7
7
  gem.description = %Q{A Ruby Puppet DSL}
8
- gem.email = "jesse@railsmachine.com"
8
+ gem.email = "will@railsmachine.com"
9
9
  gem.homepage = "http://railsmachine.github.com/shadow_puppet"
10
10
  gem.rubyforge_project = "moonshine"
11
- gem.authors = ["Jesse Newland", "Josh Nichols", "Eric Lindvall", "Lee Jones", "dreamcat4", "Patrick Schless", "Ches Martin", "Rob Lingle", "Scott Fleckenstein", "Will Farrington"]
11
+ gem.authors = ["Jesse Newland", "Josh Nichols", "Eric Lindvall", "Lee Jones", "Will Farrington", "dreamcat4", "Patrick Schless", "Ches Martin", "Rob Lingle", "Scott Fleckenstein"]
12
12
 
13
- gem.version = "0.4.1"
14
-
15
- gem.add_dependency('puppet', ["= 0.24.8"])
16
- gem.add_dependency('facter', [">= 1.5.4"])
17
- gem.add_dependency('highline', [">= 1.5.0"])
18
- gem.add_dependency('builder', [">= 2.1.2"])
19
- gem.add_dependency('activesupport', [">= 2.0.0"])
13
+ gem.version = "0.5.2"
20
14
 
21
15
  gem.rdoc_options << '--inline-source' << '--webcvs=http://github.com/railsmachine/shadow_puppet/tree/master/'
22
16
 
23
- gem.add_development_dependency "rspec", ">= 0"
24
- gem.add_development_dependency "isolate-scenarios", ">= 0"
25
-
26
17
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
27
18
  end
28
19
  Jeweler::GemcutterTasks.new
@@ -46,9 +37,15 @@ Rake::RDocTask.new(:rdoc) do |rdoc|
46
37
  rdoc.options << '--webcvs=http://github.com/railsmachine/shadow_puppet/tree/master/'
47
38
  end
48
39
 
40
+ require 'rspec/core/rake_task'
41
+
42
+ desc 'Default: run specs.'
49
43
  task :default => :spec
50
- task :spec do
51
- system("spec --options spec/spec.opts spec/*_spec.rb") || raise
44
+
45
+ desc "Run specs"
46
+ RSpec::Core::RakeTask.new do |t|
47
+ t.pattern = "./spec/**/*_spec.rb" # don't need this, it's default.
48
+ # Put spec opts in a file named .rspec in root
52
49
  end
53
50
 
54
51
  task :build => :cleanup do
data/bin/shadow_puppet CHANGED
@@ -102,18 +102,19 @@ begin
102
102
 
103
103
  opts.parse!
104
104
 
105
+ # Take any variables set on the command line and update ENV
106
+ ARGV.delete_if do |arg|
107
+ next unless arg =~ /^(\w+)=(.*)$/
108
+ ENV[$1] = $2
109
+ end
110
+
105
111
  unless filename = ARGV[0]
106
112
  puts "Error: Manifest filename must be provided\n\n"
107
113
  puts opts
108
114
  exit(1)
109
- # Take any variables set on the command line and update ENV
110
- ARGV.delete_if do |arg|
111
- next unless arg =~ /^(\w+)=(.*)$/
112
- ENV[$1] = $2
113
- end
114
115
  end
115
116
 
116
- require 'rubygems'
117
+ $LOAD_PATH.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
117
118
  require 'shadow_puppet/core_ext'
118
119
  require 'shadow_puppet'
119
120
  require 'fileutils'
@@ -123,6 +124,8 @@ begin
123
124
  Puppet[:show_diff] = true
124
125
  end
125
126
 
127
+ Puppet::Util::Log.newdestination(:console)
128
+
126
129
  klass = File.basename(filename, ".rb")
127
130
  require filename
128
131
  manifest = klass.camelize.constantize.new
@@ -75,7 +75,7 @@ module ShadowPuppet
75
75
 
76
76
  class_inheritable_accessor :recipes
77
77
  write_inheritable_attribute(:recipes, [])
78
- attr_reader :puppet_resources
78
+ attr_reader :catalog
79
79
  class_inheritable_accessor :__config__
80
80
  write_inheritable_attribute(:__config__, Hash.new)
81
81
 
@@ -97,9 +97,9 @@ module ShadowPuppet
97
97
 
98
98
  configure(config)
99
99
  @executed = false
100
- @puppet_resources = Hash.new do |hash, key|
101
- hash[key] = {}
102
- end
100
+ @catalog = Puppet::Resource::Catalog.new
101
+ @catalog.host_config = false
102
+ @catalog.name = self.name
103
103
  end
104
104
 
105
105
  # Declares that the named method or methods will be called whenever
@@ -208,11 +208,7 @@ module ShadowPuppet
208
208
  # remove the method rdoc placeholders
209
209
  remove_method(type.name) rescue nil
210
210
  define_method(type.name) do |*args|
211
- if args && args.flatten.size == 1
212
- reference(type.name, args.first)
213
- else
214
- new_resource(type, args.first, args.last)
215
- end
211
+ resource_or_reference(type, *args)
216
212
  end
217
213
  end
218
214
  end
@@ -269,9 +265,7 @@ module ShadowPuppet
269
265
  def graph_to(name, destination)
270
266
  evaluate_recipes
271
267
 
272
- bucket = export()
273
- catalog = bucket.to_catalog
274
- relationship_graph = catalog.relationship_graph
268
+ relationship_graph = @catalog.relationship_graph
275
269
 
276
270
  graph = relationship_graph.to_dot_graph("name" => "#{name} Relationships".gsub(/\W+/, '_'))
277
271
  graph.options['label'] = "#{name} Relationships"
@@ -294,29 +288,6 @@ module ShadowPuppet
294
288
  @executed
295
289
  end
296
290
 
297
- #An Array of all currently defined resources.
298
- def flat_resources
299
- a = []
300
- @puppet_resources.each_value do |by_type|
301
- by_type.each_value do |by_name|
302
- a << by_name
303
- end
304
- end
305
- a
306
- end
307
-
308
- #A Puppet::TransBucket of all defined resoureces.
309
- def export
310
- transportable_objects = flat_resources.dup.reject { |a| a.nil? }.flatten.collect do |obj|
311
- obj.to_trans
312
- end
313
- b = Puppet::TransBucket.new(transportable_objects)
314
- b.name = name
315
- b.type = "class"
316
-
317
- return b
318
- end
319
-
320
291
  private
321
292
 
322
293
  #Evaluate the methods calls queued in self.recipes
@@ -333,68 +304,46 @@ module ShadowPuppet
333
304
 
334
305
  # Create a catalog of all contained Puppet Resources and apply that
335
306
  # catalog to the currently running system
336
- def apply(bucket = nil)
337
- bucket ||= export()
338
- catalog = bucket.to_catalog
307
+ def apply
339
308
  catalog.apply
340
309
  catalog.clear
341
310
  end
342
311
 
343
- def scope #:nodoc:
344
- unless defined?(@scope)
345
- # Set the code to something innocuous; we just need the
346
- # scopes, not the interpreter. Hackish, but true.
347
- Puppet[:code] = " "
348
- @interp = Puppet::Parser::Interpreter.new
349
- require 'puppet/node'
350
- @node = Puppet::Node.new(Facter.value(:hostname))
351
- if env = Puppet[:environment] and env == ""
352
- env = nil
312
+ def resource_or_reference(type, *args)
313
+ if args
314
+ if args.flatten.size == 1
315
+ reference(type, args.first)
316
+ elsif resource = existing_resource(type.name, args.first)
317
+ new_resource(type, args.first, args.last).parameters.each do |name, param|
318
+ resource[name] = param.value if param.value
319
+ end
320
+ resource
321
+ else
322
+ add_resource(type, args.first, args.last)
353
323
  end
354
- @node.parameters = Facter.to_hash
355
- @compile = Puppet::Parser::Compiler.new(@node, @interp.send(:parser, env))
356
- @scope = @compile.topscope
357
324
  end
358
- @scope
359
325
  end
360
326
 
361
- # Create a reference to another Puppet Resource.
362
- def reference(type, title)
363
- Puppet::Parser::Resource::Reference.new(:type => type.to_s, :title => title.to_s, :scope => scope)
327
+ def existing_resource(type, title)
328
+ catalog.resources.detect { |r| r.type == type && r.title == title }
364
329
  end
365
330
 
366
- # Creates a new Puppet Resource.
367
- def new_resource(type, name, params = {})
368
- unless obj = @puppet_resources[type][name]
369
- obj = Puppet::Parser::Resource.new(
370
- :title => name,
371
- :type => type.name,
372
- :source => self,
373
- :scope => scope
374
- )
375
- @puppet_resources[type][name] = obj
376
- end
377
-
378
- case type.name
379
- when :exec
380
- param = Puppet::Parser::Resource::Param.new(
381
- :name => :path,
382
- :value => ENV["PATH"],
383
- :source => self
384
- )
385
- obj.send(:set_parameter, param)
386
- end
331
+ # Create a reference to another Puppet Resource.
332
+ def reference(type, title, params = {})
333
+ Puppet::Parser::Resource::Reference.new(type.name.to_s.capitalize, title.to_s)
334
+ end
387
335
 
388
- params.each do |param_name, param_value|
389
- param = Puppet::Parser::Resource::Param.new(
390
- :name => param_name,
391
- :value => param_value,
392
- :source => self
393
- )
394
- obj.send(:set_parameter, param)
395
- end
336
+ # Creates a new Puppet Resource and adds it to the Catalog.
337
+ def add_resource(type, title, params = {})
338
+ catalog.add_resource(new_resource(type, title, params))
339
+ end
396
340
 
397
- obj
341
+ def new_resource(type, title, params = {})
342
+ params.merge!({:title => title.to_s})
343
+ params.merge!({:catalog => catalog})
344
+ params.merge!({:path => ENV["PATH"]}) if type.name == :exec && params[:path].nil?
345
+ params.merge!({:cwd => params[:cwd].to_s}) if params[:cwd]
346
+ Puppet::Type.type(type.name).new(params)
398
347
  end
399
348
 
400
349
  end
@@ -1,18 +1,15 @@
1
1
  module Puppet
2
- module Parser
3
- class Resource
2
+ class Type
4
3
 
5
- # clearing out some puppet methods that we probably won't need for testing
6
- # that are also used in the params hash when defining the resource.
7
- undef path
8
- undef source
9
- undef require
4
+ # clearing out some puppet methods that we probably won't need for testing
5
+ # that are also used in the params hash when defining the resource.
6
+ undef path
7
+ undef require
10
8
 
11
- # This allows access to resource options as methods on the resource.
12
- def method_missing name, *args
13
- if params.keys.include? name.to_sym
14
- params[name.to_sym].value
15
- end
9
+ # This allows access to resource options as methods on the resource.
10
+ def method_missing name, *args
11
+ if parameters.keys.include? name.to_sym
12
+ parameters[name.to_sym].value
16
13
  end
17
14
  end
18
15
  end
@@ -59,7 +56,9 @@ module ShadowPuppet
59
56
  #undefine the method rdoc placeholders
60
57
  undef_method(plural_type) rescue nil
61
58
  define_method(plural_type) do |*args|
62
- puppet_resources[type]
59
+ catalog.resources.select { |r| r.type == type.name }.inject({}) do |hash, resource|
60
+ hash[resource.title] = resource; hash
61
+ end
63
62
  end
64
63
  end
65
64
  end
@@ -5,14 +5,14 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{shadow_puppet}
8
- s.version = "0.4.1"
8
+ s.version = "0.5.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
- s.authors = ["Jesse Newland", "Josh Nichols", "Eric Lindvall", "Lee Jones", "dreamcat4", "Patrick Schless", "Ches Martin", "Rob Lingle", "Scott Fleckenstein", "Will Farrington"]
12
- s.date = %q{2011-08-12}
11
+ s.authors = ["Jesse Newland", "Josh Nichols", "Eric Lindvall", "Lee Jones", "Will Farrington", "dreamcat4", "Patrick Schless", "Ches Martin", "Rob Lingle", "Scott Fleckenstein"]
12
+ s.date = %q{2011-09-20}
13
13
  s.default_executable = %q{shadow_puppet}
14
14
  s.description = %q{A Ruby Puppet DSL}
15
- s.email = %q{jesse@railsmachine.com}
15
+ s.email = %q{will@railsmachine.com}
16
16
  s.executables = ["shadow_puppet"]
17
17
  s.extra_rdoc_files = [
18
18
  "LICENSE",
@@ -20,7 +20,9 @@ Gem::Specification.new do |s|
20
20
  ]
21
21
  s.files = [
22
22
  ".gitmodules",
23
- "IsolateScenarios",
23
+ ".rspec",
24
+ "Gemfile",
25
+ "Gemfile.lock",
24
26
  "LICENSE",
25
27
  "README.rdoc",
26
28
  "Rakefile",
@@ -31,9 +33,10 @@ Gem::Specification.new do |s|
31
33
  "lib/shadow_puppet/manifest.rb",
32
34
  "lib/shadow_puppet/test.rb",
33
35
  "shadow_puppet.gemspec",
36
+ "spec/cli_spec.rb",
37
+ "spec/fixtures/cli_spec_manifest.rb",
34
38
  "spec/fixtures/manifests.rb",
35
39
  "spec/manifest_spec.rb",
36
- "spec/spec.opts",
37
40
  "spec/spec_helper.rb",
38
41
  "spec/test_spec.rb",
39
42
  "spec/type_spec.rb"
@@ -42,37 +45,46 @@ Gem::Specification.new do |s|
42
45
  s.rdoc_options = ["--inline-source", "--webcvs=http://github.com/railsmachine/shadow_puppet/tree/master/"]
43
46
  s.require_paths = ["lib"]
44
47
  s.rubyforge_project = %q{moonshine}
45
- s.rubygems_version = %q{1.6.2}
48
+ s.rubygems_version = %q{1.4.2}
46
49
  s.summary = %q{A Ruby Puppet DSL}
47
50
 
48
51
  if s.respond_to? :specification_version then
49
52
  s.specification_version = 3
50
53
 
51
54
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
52
- s.add_runtime_dependency(%q<puppet>, ["= 0.24.8"])
53
- s.add_runtime_dependency(%q<facter>, [">= 1.5.4"])
55
+ s.add_runtime_dependency(%q<puppet>, ["= 2.7.3"])
54
56
  s.add_runtime_dependency(%q<highline>, [">= 1.5.0"])
55
57
  s.add_runtime_dependency(%q<builder>, [">= 2.1.2"])
56
58
  s.add_runtime_dependency(%q<activesupport>, [">= 2.0.0"])
57
- s.add_development_dependency(%q<rspec>, [">= 0"])
58
- s.add_development_dependency(%q<isolate-scenarios>, [">= 0"])
59
+ s.add_runtime_dependency(%q<i18n>, [">= 0.5.0"])
60
+ s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
61
+ s.add_development_dependency(%q<rspec-core>, ["~> 2.6.0"])
62
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
63
+ s.add_development_dependency(%q<ruby-debug>, [">= 0"])
64
+ s.add_development_dependency(%q<ruby-debug19>, [">= 0"])
59
65
  else
60
- s.add_dependency(%q<puppet>, ["= 0.24.8"])
61
- s.add_dependency(%q<facter>, [">= 1.5.4"])
66
+ s.add_dependency(%q<puppet>, ["= 2.7.3"])
62
67
  s.add_dependency(%q<highline>, [">= 1.5.0"])
63
68
  s.add_dependency(%q<builder>, [">= 2.1.2"])
64
69
  s.add_dependency(%q<activesupport>, [">= 2.0.0"])
65
- s.add_dependency(%q<rspec>, [">= 0"])
66
- s.add_dependency(%q<isolate-scenarios>, [">= 0"])
70
+ s.add_dependency(%q<i18n>, [">= 0.5.0"])
71
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
72
+ s.add_dependency(%q<rspec-core>, ["~> 2.6.0"])
73
+ s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
74
+ s.add_dependency(%q<ruby-debug>, [">= 0"])
75
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
67
76
  end
68
77
  else
69
- s.add_dependency(%q<puppet>, ["= 0.24.8"])
70
- s.add_dependency(%q<facter>, [">= 1.5.4"])
78
+ s.add_dependency(%q<puppet>, ["= 2.7.3"])
71
79
  s.add_dependency(%q<highline>, [">= 1.5.0"])
72
80
  s.add_dependency(%q<builder>, [">= 2.1.2"])
73
81
  s.add_dependency(%q<activesupport>, [">= 2.0.0"])
74
- s.add_dependency(%q<rspec>, [">= 0"])
75
- s.add_dependency(%q<isolate-scenarios>, [">= 0"])
82
+ s.add_dependency(%q<i18n>, [">= 0.5.0"])
83
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
84
+ s.add_dependency(%q<rspec-core>, ["~> 2.6.0"])
85
+ s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
86
+ s.add_dependency(%q<ruby-debug>, [">= 0"])
87
+ s.add_dependency(%q<ruby-debug19>, [">= 0"])
76
88
  end
77
89
  end
78
90
 
data/spec/cli_spec.rb ADDED
@@ -0,0 +1,16 @@
1
+ describe "ShadowPuppet's cli" do
2
+ before(:all) do
3
+ @root = File.expand_path(File.join(File.dirname(__FILE__), '..'))
4
+ @output = `#{@root}/bin/shadow_puppet #{@root}/spec/fixtures/cli_spec_manifest.rb echo=works`
5
+ end
6
+
7
+ it "accepts env variables on the end of the command line" do
8
+ @output.should =~ /Exec\[from_env\]\/returns: works/
9
+ end
10
+
11
+ it "outputs the name of the manifest it's executing" do
12
+ pending "can't yet determine how to do this"
13
+ @output.should =~ /CliSpecManifest/
14
+ end
15
+
16
+ end
@@ -0,0 +1,7 @@
1
+ class CliSpecManifest < ShadowPuppet::Manifest
2
+ def test_setting_env
3
+ exec :from_env, :command => "echo #{ENV['echo']}", :logoutput => true
4
+ exec :normal, :command => "echo test", :logoutput => true
5
+ end
6
+ recipe :test_setting_env
7
+ end
@@ -135,7 +135,54 @@ class TestHelpers < ShadowPuppet::Manifest
135
135
  def foo
136
136
  exec('foo', :command => 'true',:onlyif => 'test `hostname` == "foo"')
137
137
  package('bar',:ensure => :installed)
138
- file('baz', :content => 'bar',:mode => '644',:owner => 'rails')
138
+ file('/tmp/baz', :content => 'bar',:mode => '644',:owner => 'rails', :before => package('bar'))
139
139
  end
140
140
 
141
141
  end
142
+
143
+ class DependencyTestManifest < ShadowPuppet::Manifest
144
+ def test
145
+ exec('foobar', :command => 'true', :before => exec('barbaz'))
146
+ exec('trololol', :command => 'true', :alias => "winning")
147
+ exec('barbaz', :command => 'true', :require => [exec('foobar'), exec('winning')])
148
+
149
+ end
150
+ recipe :test
151
+ end
152
+
153
+ class StupidTestManifest < ShadowPuppet::Manifest
154
+ def my_recipe
155
+ exec 'my_command',
156
+ :command => 'true',
157
+ :require => [ file('/tmp/foo'), exec('jk') ]
158
+ file '/tmp/foo',
159
+ :content => 'true'
160
+ exec 'jk',
161
+ :command => 'true'
162
+ end
163
+ recipe :my_recipe
164
+ end
165
+
166
+ class CwdCoercionTest < ShadowPuppet::Manifest
167
+ def test
168
+ tmp = Pathname.new('/tmp')
169
+ exec 'true',
170
+ :cwd => tmp
171
+ file tmp + '/foo',
172
+ :ensure => :present
173
+ end
174
+ recipe :test
175
+ end
176
+
177
+ class DuplicateResourceTest < ShadowPuppet::Manifest
178
+ def first_resource
179
+ exec 'true',
180
+ :cwd => Pathname.new('/tmp')
181
+ end
182
+
183
+ def second_resource
184
+ exec 'true',
185
+ :cwd => Pathname.new('/tmp'),
186
+ :logoutput => true
187
+ end
188
+ end
@@ -1,5 +1,3 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
1
  describe "A manifest" do
4
2
 
5
3
  describe "when blank" do
@@ -39,7 +37,7 @@ describe "A manifest" do
39
37
  end
40
38
 
41
39
  it "applies our customizations to resources" do
42
- @manifest.execs["foo"].path.should == ENV["PATH"]
40
+ @manifest.execs["foo"].path.should == ENV["PATH"].split(':')
43
41
  end
44
42
 
45
43
  describe "and then executing" do
@@ -124,18 +122,14 @@ describe "A manifest" do
124
122
  end
125
123
 
126
124
  it "creates new resources" do
127
- @manifest.should_receive(:new_resource).with(Puppet::Type::Exec, 'foo', :command => 'true').exactly(1).times
128
- @manifest.should_receive(:new_resource).with(Puppet::Type::Exec, 'bar', :command => 'true').exactly(1).times
125
+ @manifest.should_receive(:add_resource).with(Puppet::Type::Exec, 'foo', :command => 'true').exactly(1).times
126
+ @manifest.should_receive(:add_resource).with(Puppet::Type::Exec, 'bar', :command => 'true').exactly(1).times
129
127
  @manifest.send(:evaluate_recipes)
130
128
  end
131
129
 
132
130
  it "creates new resources" do
133
131
  @manifest.send(:evaluate_recipes)
134
- @manifest.puppet_resources[Puppet::Type::Exec].keys.sort.should == ['bar', 'foo']
135
- end
136
-
137
- it "can acess a flat array of resources" do
138
- @manifest.send(:flat_resources).should == []
132
+ @manifest.execs.keys.sort.should == ['bar', 'foo']
139
133
  end
140
134
 
141
135
  end
@@ -221,22 +215,86 @@ describe "A manifest" do
221
215
 
222
216
  describe "when moonshine setup" do
223
217
 
218
+ before(:each) do
219
+ @manifest = MoonshineSetupManifest.new
220
+ end
221
+
222
+ it "include directories recipe" do
223
+ @manifest.class.recipes.map(&:first).should include(:directories)
224
+ end
225
+
226
+ it "calls specified methods" do
227
+ @manifest.should_receive(:directories)
228
+ @manifest.send(:evaluate_recipes)
229
+ end
230
+
231
+ it "returns true when executed" do
232
+ @manifest.execute.should be_true
233
+ end
234
+
235
+ end
236
+
237
+ describe "when dependency test manifest" do
224
238
  before(:each) do
225
- @manifest = MoonshineSetupManifest.new
239
+ @manifest = DependencyTestManifest.new
226
240
  end
227
241
 
228
242
  it "include directories recipe" do
229
- @manifest.class.recipes.map(&:first).should include(:directories)
243
+ @manifest.class.recipes.map(&:first).should include(:test)
230
244
  end
231
245
 
232
246
  it "calls specified methods" do
233
- @manifest.should_receive(:directories)
247
+ @manifest.should_receive(:test)
234
248
  @manifest.send(:evaluate_recipes)
235
249
  end
236
250
 
237
251
  it "returns true when executed" do
238
- @manifest.execute.should be_true
252
+ @manifest.execute!.should be_true
253
+ end
254
+ end
255
+
256
+ describe "when referencing files" do
257
+ before(:each) do
258
+ @manifest = StupidTestManifest.new
259
+ end
260
+
261
+ it "returns true when executed " do
262
+ @manifest.execute!.should be_true
239
263
  end
264
+ end
240
265
 
266
+ describe "when passing a pathname to cwd" do
267
+ before(:each) do
268
+ @manifest = CwdCoercionTest.new
269
+ end
270
+
271
+ it "returns true when executed" do
272
+ @manifest.execute!.should be_true
273
+ end
274
+ end
275
+
276
+ describe "with multiple calls to the same resource" do
277
+ before(:each) do
278
+ @manifest = DuplicateResourceTest.new
279
+ end
280
+
281
+ it "creates the resource the first time" do
282
+ @manifest.first_resource
283
+ @manifest.execs["true"].cwd.should == '/tmp'
284
+ @manifest.execs["true"].logoutput.should be_nil
285
+ end
286
+
287
+ it "updates the resource subsequent times" do
288
+ @manifest.first_resource
289
+ @manifest.second_resource
290
+ @manifest.execs["true"].cwd.should == '/tmp'
291
+ @manifest.execs["true"].logoutput.should be_true
292
+ end
293
+
294
+ it "can execute successfully" do
295
+ @manifest.first_resource
296
+ @manifest.second_resource
297
+ @manifest.execute!
298
+ end
241
299
  end
242
300
  end
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,13 @@
1
- require 'rubygems'
2
- require 'isolate/scenarios/now'
3
- gem 'rspec'
4
- require 'spec'
5
- require File.join(File.dirname(__FILE__), '..', 'lib', 'shadow_puppet', 'core_ext.rb')
6
- require File.join(File.dirname(__FILE__), '..', 'lib', 'shadow_puppet.rb')
7
- require File.join(File.dirname(__FILE__), '..', 'lib', 'shadow_puppet', 'test.rb')
8
- Dir.glob(File.join(File.dirname(__FILE__), 'fixtures', '*.rb')).each do |manifest|
1
+ require 'bundler'
2
+ Bundler.require
3
+
4
+ $LOAD_PATH.unshift(File.expand_path(File.dirname(__FILE__)))
5
+ $LOAD_PATH.unshift(File.join(File.expand_path(File.dirname(__FILE__)), '..', 'lib'))
6
+
7
+ require 'shadow_puppet/core_ext'
8
+ require 'shadow_puppet'
9
+ require 'shadow_puppet/test'
10
+
11
+ Dir.glob(File.join(File.expand_path(File.dirname(__FILE__)), 'fixtures', '*.rb')).each do |manifest|
9
12
  require manifest
10
13
  end
data/spec/test_spec.rb CHANGED
@@ -1,5 +1,3 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
1
  describe "ShadowPuppet's test helpers" do
4
2
 
5
3
  it "should be created when register_puppet_types_for_testing is called" do
@@ -19,24 +17,19 @@ describe "ShadowPuppet's test helpers" do
19
17
  end
20
18
 
21
19
  it "should allow simple resource lookup" do
22
- @manifest.execs.should == @manifest.puppet_resources[Puppet::Type::Exec]
23
- @manifest.packages.should == @manifest.puppet_resources[Puppet::Type::Package]
24
- @manifest.files.should == @manifest.puppet_resources[Puppet::Type::File]
20
+ @manifest.execs.keys.should == ['foo']
21
+ @manifest.packages.keys.should == ['bar']
22
+ @manifest.files.keys.should == ['/tmp/baz']
23
+ @manifest.crons.keys.should == []
25
24
  end
26
25
 
27
26
  # making sure that properties such as, e.g the :onlyif condition of Exec[foo]
28
27
  # can be accessed simply as manifest.execs['foo'].onlyif rather than via the
29
28
  # param hash
30
29
  it "should allow referencing params directly" do
31
- %w(execs files packages).each do |type|
32
- @manifest.send(type.to_sym).each do |name,resource|
33
- resource.params.keys.each do |param|
34
- resource.send(param.to_sym).should == resource.params[param.to_sym].value
35
- end
36
- end
37
- end
30
+ @manifest.execs['foo'].command.should == 'true'
38
31
  end
39
32
 
40
33
  end
41
34
 
42
- end
35
+ end
data/spec/type_spec.rb CHANGED
@@ -1,5 +1,3 @@
1
- require File.dirname(__FILE__) + '/spec_helper.rb'
2
-
3
1
  describe "ShadowPuppet's type loading mechanism" do
4
2
  it "should create a new type helper methods when register_puppet_types is called" do
5
3
  Puppet::Type.newtype(:dummy_1){ }
@@ -9,4 +7,4 @@ describe "ShadowPuppet's type loading mechanism" do
9
7
  ShadowPuppet::Manifest.register_puppet_types
10
8
  BlankManifest.new.respond_to?(:dummy_1).should == true
11
9
  end
12
- end
10
+ end
metadata CHANGED
@@ -1,68 +1,52 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shadow_puppet
3
3
  version: !ruby/object:Gem::Version
4
- hash: 13
4
+ hash: 15
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 4
9
- - 1
10
- version: 0.4.1
8
+ - 5
9
+ - 2
10
+ version: 0.5.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Jesse Newland
14
14
  - Josh Nichols
15
15
  - Eric Lindvall
16
16
  - Lee Jones
17
+ - Will Farrington
17
18
  - dreamcat4
18
19
  - Patrick Schless
19
20
  - Ches Martin
20
21
  - Rob Lingle
21
22
  - Scott Fleckenstein
22
- - Will Farrington
23
23
  autorequire:
24
24
  bindir: bin
25
25
  cert_chain: []
26
26
 
27
- date: 2011-08-12 00:00:00 -04:00
27
+ date: 2011-09-20 00:00:00 -04:00
28
28
  default_executable: shadow_puppet
29
29
  dependencies:
30
30
  - !ruby/object:Gem::Dependency
31
+ type: :runtime
31
32
  name: puppet
32
- prerelease: false
33
- requirement: &id001 !ruby/object:Gem::Requirement
33
+ version_requirements: &id001 !ruby/object:Gem::Requirement
34
34
  none: false
35
35
  requirements:
36
36
  - - "="
37
37
  - !ruby/object:Gem::Version
38
- hash: 111
38
+ hash: 21
39
39
  segments:
40
- - 0
41
- - 24
42
- - 8
43
- version: 0.24.8
44
- type: :runtime
45
- version_requirements: *id001
46
- - !ruby/object:Gem::Dependency
47
- name: facter
40
+ - 2
41
+ - 7
42
+ - 3
43
+ version: 2.7.3
48
44
  prerelease: false
49
- requirement: &id002 !ruby/object:Gem::Requirement
50
- none: false
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- hash: 11
55
- segments:
56
- - 1
57
- - 5
58
- - 4
59
- version: 1.5.4
60
- type: :runtime
61
- version_requirements: *id002
45
+ requirement: *id001
62
46
  - !ruby/object:Gem::Dependency
47
+ type: :runtime
63
48
  name: highline
64
- prerelease: false
65
- requirement: &id003 !ruby/object:Gem::Requirement
49
+ version_requirements: &id002 !ruby/object:Gem::Requirement
66
50
  none: false
67
51
  requirements:
68
52
  - - ">="
@@ -73,12 +57,12 @@ dependencies:
73
57
  - 5
74
58
  - 0
75
59
  version: 1.5.0
76
- type: :runtime
77
- version_requirements: *id003
60
+ prerelease: false
61
+ requirement: *id002
78
62
  - !ruby/object:Gem::Dependency
63
+ type: :runtime
79
64
  name: builder
80
- prerelease: false
81
- requirement: &id004 !ruby/object:Gem::Requirement
65
+ version_requirements: &id003 !ruby/object:Gem::Requirement
82
66
  none: false
83
67
  requirements:
84
68
  - - ">="
@@ -89,12 +73,12 @@ dependencies:
89
73
  - 1
90
74
  - 2
91
75
  version: 2.1.2
92
- type: :runtime
93
- version_requirements: *id004
76
+ prerelease: false
77
+ requirement: *id003
94
78
  - !ruby/object:Gem::Dependency
79
+ type: :runtime
95
80
  name: activesupport
96
- prerelease: false
97
- requirement: &id005 !ruby/object:Gem::Requirement
81
+ version_requirements: &id004 !ruby/object:Gem::Requirement
98
82
  none: false
99
83
  requirements:
100
84
  - - ">="
@@ -105,12 +89,76 @@ dependencies:
105
89
  - 0
106
90
  - 0
107
91
  version: 2.0.0
92
+ prerelease: false
93
+ requirement: *id004
94
+ - !ruby/object:Gem::Dependency
108
95
  type: :runtime
109
- version_requirements: *id005
96
+ name: i18n
97
+ version_requirements: &id005 !ruby/object:Gem::Requirement
98
+ none: false
99
+ requirements:
100
+ - - ">="
101
+ - !ruby/object:Gem::Version
102
+ hash: 11
103
+ segments:
104
+ - 0
105
+ - 5
106
+ - 0
107
+ version: 0.5.0
108
+ prerelease: false
109
+ requirement: *id005
110
110
  - !ruby/object:Gem::Dependency
111
+ type: :development
111
112
  name: rspec
113
+ version_requirements: &id006 !ruby/object:Gem::Requirement
114
+ none: false
115
+ requirements:
116
+ - - ~>
117
+ - !ruby/object:Gem::Version
118
+ hash: 23
119
+ segments:
120
+ - 2
121
+ - 6
122
+ - 0
123
+ version: 2.6.0
124
+ prerelease: false
125
+ requirement: *id006
126
+ - !ruby/object:Gem::Dependency
127
+ type: :development
128
+ name: rspec-core
129
+ version_requirements: &id007 !ruby/object:Gem::Requirement
130
+ none: false
131
+ requirements:
132
+ - - ~>
133
+ - !ruby/object:Gem::Version
134
+ hash: 23
135
+ segments:
136
+ - 2
137
+ - 6
138
+ - 0
139
+ version: 2.6.0
112
140
  prerelease: false
113
- requirement: &id006 !ruby/object:Gem::Requirement
141
+ requirement: *id007
142
+ - !ruby/object:Gem::Dependency
143
+ type: :development
144
+ name: jeweler
145
+ version_requirements: &id008 !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ~>
149
+ - !ruby/object:Gem::Version
150
+ hash: 11
151
+ segments:
152
+ - 1
153
+ - 6
154
+ - 2
155
+ version: 1.6.2
156
+ prerelease: false
157
+ requirement: *id008
158
+ - !ruby/object:Gem::Dependency
159
+ type: :development
160
+ name: ruby-debug
161
+ version_requirements: &id009 !ruby/object:Gem::Requirement
114
162
  none: false
115
163
  requirements:
116
164
  - - ">="
@@ -119,12 +167,12 @@ dependencies:
119
167
  segments:
120
168
  - 0
121
169
  version: "0"
122
- type: :development
123
- version_requirements: *id006
124
- - !ruby/object:Gem::Dependency
125
- name: isolate-scenarios
126
170
  prerelease: false
127
- requirement: &id007 !ruby/object:Gem::Requirement
171
+ requirement: *id009
172
+ - !ruby/object:Gem::Dependency
173
+ type: :development
174
+ name: ruby-debug19
175
+ version_requirements: &id010 !ruby/object:Gem::Requirement
128
176
  none: false
129
177
  requirements:
130
178
  - - ">="
@@ -133,10 +181,10 @@ dependencies:
133
181
  segments:
134
182
  - 0
135
183
  version: "0"
136
- type: :development
137
- version_requirements: *id007
184
+ prerelease: false
185
+ requirement: *id010
138
186
  description: A Ruby Puppet DSL
139
- email: jesse@railsmachine.com
187
+ email: will@railsmachine.com
140
188
  executables:
141
189
  - shadow_puppet
142
190
  extensions: []
@@ -146,7 +194,9 @@ extra_rdoc_files:
146
194
  - README.rdoc
147
195
  files:
148
196
  - .gitmodules
149
- - IsolateScenarios
197
+ - .rspec
198
+ - Gemfile
199
+ - Gemfile.lock
150
200
  - LICENSE
151
201
  - README.rdoc
152
202
  - Rakefile
@@ -157,9 +207,10 @@ files:
157
207
  - lib/shadow_puppet/manifest.rb
158
208
  - lib/shadow_puppet/test.rb
159
209
  - shadow_puppet.gemspec
210
+ - spec/cli_spec.rb
211
+ - spec/fixtures/cli_spec_manifest.rb
160
212
  - spec/fixtures/manifests.rb
161
213
  - spec/manifest_spec.rb
162
- - spec/spec.opts
163
214
  - spec/spec_helper.rb
164
215
  - spec/test_spec.rb
165
216
  - spec/type_spec.rb
@@ -194,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
194
245
  requirements: []
195
246
 
196
247
  rubyforge_project: moonshine
197
- rubygems_version: 1.6.2
248
+ rubygems_version: 1.4.2
198
249
  signing_key:
199
250
  specification_version: 3
200
251
  summary: A Ruby Puppet DSL
data/IsolateScenarios DELETED
@@ -1,11 +0,0 @@
1
- baseline do
2
- gem 'rspec', '~> 1.3.0'
3
- end
4
-
5
- gem_version_scenario 'activesupport',
6
- '3.0.0',
7
- '3.0.0.rc',
8
- '3.0.0.beta4',
9
- '2.2.3',
10
- '2.3.5',
11
- '2.3.8'
data/spec/spec.opts DELETED
@@ -1,4 +0,0 @@
1
- --colour
2
- --format s
3
- --loadby mtime
4
- --reverse