shadow_puppet 0.1.17 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/bin/shadow_puppet CHANGED
@@ -88,8 +88,7 @@ begin
88
88
  klass = File.basename(filename, ".rb")
89
89
  require filename
90
90
  manifest = klass.classify.constantize.new
91
- execute = manifest.execute
92
- execute ? exit(0) : exit(1)
91
+ manifest.execute! && exit(0)
93
92
  rescue Errno::EACCES
94
93
  puts "Please run shadow_puppet as root"
95
94
  rescue Exception => e
@@ -2,4 +2,23 @@ require 'active_support/core_ext/class/attribute_accessors'
2
2
  require 'active_support/core_ext/array'
3
3
  require 'active_support/inflector'
4
4
  require 'active_support/core_ext/class/inheritable_attributes'
5
- require 'active_support/core_ext/duplicable'
5
+ require 'active_support/core_ext/duplicable'
6
+ class Hash #:nodoc:
7
+ def deep_merge(other_hash)
8
+ self.merge(other_hash) do |key, oldval, newval|
9
+ oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
10
+ newval = newval.to_hash if newval.respond_to?(:to_hash)
11
+ oldval.is_a?(Hash) && newval.is_a?(Hash) ? oldval.deep_merge(newval) : newval
12
+ end
13
+ end
14
+ def deep_merge!(other_hash)
15
+ replace(deep_merge(other_hash))
16
+ end
17
+ def deep_symbolize_keys
18
+ self.inject({}) { |result, (key, value)|
19
+ value = value.deep_symbolize_keys if value.is_a?(Hash)
20
+ result[(key.to_sym rescue key) || key] = value
21
+ result
22
+ }
23
+ end
24
+ end
@@ -76,6 +76,8 @@ module ShadowPuppet
76
76
  class_inheritable_accessor :recipes
77
77
  write_inheritable_attribute(:recipes, [])
78
78
  attr_reader :puppet_resources
79
+ class_inheritable_accessor :__config__
80
+ write_inheritable_attribute(:__config__, Hash.new)
79
81
 
80
82
  # Initialize a new instance of this manifest. This can take a
81
83
  # config hash, which is immediately passed on to the configure
@@ -111,7 +113,7 @@ module ShadowPuppet
111
113
  return nil if methods.nil? || methods == []
112
114
  options = methods.extract_options!
113
115
  methods.each do |meth|
114
- options = configatron.send(meth.to_sym) if options == {}
116
+ options = configuration[meth.to_sym] if options == {}
115
117
  options ||= {}
116
118
  recipes << [meth.to_sym, options]
117
119
  end
@@ -125,15 +127,24 @@ module ShadowPuppet
125
127
  # end
126
128
  #
127
129
  # >> SampleManifest.configuration
128
- # => {"name" => 'test'}
130
+ # => {:name => 'test'}
131
+ #
132
+ # All keys on this hash are coerced into symbols for ease of access.
129
133
  #
130
134
  # Subclasses of the Manifest class properly inherit the parent classes'
131
135
  # configuration.
132
136
  def self.configuration
133
- configatron.to_hash
137
+ __config__.deep_symbolize_keys
134
138
  end
135
139
 
136
- # Access to the configuration of the creating class.
140
+ # Access to the configuration of the class of this instance.
141
+ #
142
+ # class SampleManifest < ShadowPuppet::Manifest
143
+ # configure(:name => 'test')
144
+ # end
145
+ #
146
+ # @manifest = SampleManifest.new
147
+ # @manifest.configuration[:name] => "test"
137
148
  def configuration
138
149
  self.class.configuration
139
150
  end
@@ -141,24 +152,32 @@ module ShadowPuppet
141
152
  # Define configuration on this manifest. This is useful for storing things
142
153
  # such as hostnames, password, or usernames that may change between
143
154
  # different implementations of a shared manifest. Access this hash by
144
- # calling configuration:
155
+ # calling <tt>configuration</tt>:
145
156
  #
146
157
  # class SampleManifest < ShadowPuppet::Manifest
147
- # configure(:name => 'test')
158
+ # configure('name' => 'test')
148
159
  # end
149
160
  #
150
161
  # >> SampleManifest.configuration
151
- # => {"name" => 'test'}
162
+ # => {:name => 'test'}
163
+ #
164
+ # All keys on this hash are coerced into symbols for ease of access.
152
165
  #
153
- # Subsequent calls to configure perform a deep_merge of the
154
- # provided <tt>hash</tt> into the pre-existing configuration
166
+ # Subsequent calls to configure perform a deep_merge of the provided
167
+ # <tt>hash</tt> into the pre-existing configuration.
155
168
  def self.configure(hash)
156
- configatron.configure_from_hash(hash)
169
+ __config__.deep_merge!(hash)
157
170
  end
158
171
 
159
- # Define configuration on this manifest's creating class. This is useful
160
- # for storing things such as hostnames, password, or usernames that may
161
- # change between different implementations of a shared manifest.
172
+ # Update the configuration of this manifest instance's class.
173
+ #
174
+ # class SampleManifest < ShadowPuppet::Manifest
175
+ # configure({})
176
+ # end
177
+ #
178
+ # @manifest = SampleManifest.new
179
+ # @manifest.configure(:name => "test")
180
+ # @manifest.configuration[:name] => "test"
162
181
  def configure(hash)
163
182
  self.class.configure(hash)
164
183
  end
@@ -201,11 +220,34 @@ module ShadowPuppet
201
220
  true
202
221
  end
203
222
 
204
- # Execute this manifest, applying all resources defined. By default, this
205
- # will only execute a manifest that is executable?. The +force+ argument,
206
- # if true, removes this check.
223
+ def missing_recipes
224
+ missing = self.class.recipes.each do |meth,args|
225
+ !respond_to?(meth)
226
+ end
227
+ end
228
+
229
+ # Execute this manifest, applying all resources defined. Execute returns
230
+ # true if successfull, and false if unsucessfull. By default, this
231
+ # will only execute a manifest that has not already been executed?.
232
+ # The +force+ argument, if true, removes this check.
207
233
  def execute(force=false)
208
- return false unless executable? || force
234
+ return false if executed? && !force
235
+ evaluate_recipes
236
+ apply
237
+ rescue Exception => e
238
+ false
239
+ else
240
+ true
241
+ ensure
242
+ @executed = true
243
+ end
244
+
245
+ # Execute this manifest, applying all resources defined. Execute returns
246
+ # true if successfull, and raises an exception if not. By default, this
247
+ # will only execute a manifest that has not already been executed?.
248
+ # The +force+ argument, if true, removes this check.
249
+ def execute!(force=false)
250
+ return false if executed? && !force
209
251
  evaluate_recipes
210
252
  apply
211
253
  rescue Exception => e
data/lib/shadow_puppet.rb CHANGED
@@ -1,5 +1,4 @@
1
1
  require 'puppet'
2
- require 'configatron'
3
2
  require 'erb'
4
3
  require File.join(File.dirname(__FILE__) + '/shadow_puppet', 'core_ext.rb')
5
4
  require File.join(File.dirname(__FILE__) + '/shadow_puppet', 'manifest.rb')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shadow_puppet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.17
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jesse Newland
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-06 00:00:00 -05:00
12
+ date: 2009-03-12 00:00:00 -04:00
13
13
  default_executable: shadow_puppet
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -62,16 +62,6 @@ dependencies:
62
62
  - !ruby/object:Gem::Version
63
63
  version: 2.0.0
64
64
  version:
65
- - !ruby/object:Gem::Dependency
66
- name: configatron
67
- type: :runtime
68
- version_requirement:
69
- version_requirements: !ruby/object:Gem::Requirement
70
- requirements:
71
- - - ">="
72
- - !ruby/object:Gem::Version
73
- version: 2.2.2
74
- version:
75
65
  description: A Ruby Puppet DSL
76
66
  email:
77
67
  - jesse@railsmachine.com