cook 2.0.3 → 2.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. data/lib/cook.rb +1 -1
  2. data/lib/rake/config.rb +141 -1
  3. metadata +2 -2
data/lib/cook.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  class Cook
2
- VERSION = '2.0.3'
2
+ VERSION = '2.0.4'
3
3
  end
data/lib/rake/config.rb CHANGED
@@ -11,6 +11,107 @@ require 'fileutils';
11
11
  require 'cook';
12
12
  #require 'regexp';
13
13
 
14
+ class ConfStack
15
+
16
+ def initialize(object, method, *args)
17
+ @confStack = Array.new;
18
+ calling(object, method, args);
19
+ end
20
+
21
+ def calling(object, method, where, *args)
22
+ @confStack.push([object, method, where, args]) unless
23
+ !@confStack.empty? &&
24
+ @confStack.last[0] == object &&
25
+ @confStack.last[1] == method;
26
+ end
27
+
28
+ def reportNoMethodError(errorObject)
29
+
30
+ # Take off the base object (Conf) so that we can use it later to
31
+ # get the missingKey messages
32
+ #
33
+ confObj = @confStack.shift()[0];
34
+
35
+ # Take of the top of the configure stack so we can treat it as the
36
+ # message which was not found.
37
+ #
38
+ top = @confStack.pop();
39
+
40
+ # Compute the full configuration path to report to the user
41
+ #
42
+ confPath = "Conf";
43
+ @confStack.each do | aStackLevel |
44
+ confPath << '.' + aStackLevel[1].to_s;
45
+ end
46
+
47
+ # Start by dumping the problem together with the FULL backtrace for
48
+ # any experienced user.
49
+ #
50
+ Rake::Application.mesg ""
51
+ Rake::Application.mesg "Could not find the key [#{top[1].to_s}]";
52
+ Rake::Application.mesg "in the configuration path [#{confPath}]\n\n";
53
+
54
+ Rake::Application.mesg errorObject.backtrace.join("\n");
55
+
56
+ # Now construct a more user friendly discussion of the problem for
57
+ # novice users.
58
+ #
59
+ # Start with the problem...
60
+ #
61
+ Rake::Application.mesg ""
62
+ Rake::Application.mesg "=================================================================";
63
+ Rake::Application.mesg ""
64
+ Rake::Application.mesg "Could not find the key [#{top[1].to_s}]";
65
+ Rake::Application.mesg "in the configuration path [#{confPath}]\n\n";
66
+
67
+ # Now collect the parameter lines they will need to specify
68
+ # together with any missingKey messages (in reverse order) that the
69
+ # configuration might have specified.
70
+ #
71
+ missingKey = confObj.missingKey;
72
+ messages = Array.new;
73
+ parameterLines = Array.new;
74
+ indent = "";
75
+ @confStack.each do | aStackLevel |
76
+ parameterLines.push(indent + aStackLevel[1].to_s + ':');
77
+ indent += " ";
78
+ missingKey = missingKey[aStackLevel[1]] if missingKey.has_key?(aStackLevel[1]);
79
+ messages.unshift(missingKey.delete(:message)) if missingKey.has_key?(:message);
80
+ end
81
+
82
+ # Start by printing out any missingKey messages for the missing key
83
+ # itself.
84
+ #
85
+ missingKey = missingKey[top[1]] if missingKey.has_key?(top[1]);
86
+ Rake::Application.mesg missingKey[:message] if missingKey.has_key?(:message);
87
+
88
+ # Now provide a template of the configuration path that seems to be
89
+ # missing together with any specific valueMessage associated with
90
+ # the missing key.
91
+ #
92
+ Rake::Application.mesg ""
93
+ Rake::Application.mesg "Please ensure your configuration contains the following lines"
94
+ parameterLines.push(indent + top[1].to_s + ': <<value>>');
95
+ Rake::Application.mesg "-----------------------------------------------------------------";
96
+ Rake::Application.mesg parameterLines.join("\n");
97
+ Rake::Application.mesg "-----------------------------------------------------------------";
98
+ Rake::Application.mesg missingKey[:valueMessage] if missingKey.has_key?(:valueMessage);
99
+
100
+ # Now provide any additional configuration messages found most
101
+ # specific first.
102
+ #
103
+ Rake::Application.mesg ""
104
+ Rake::Application.mesg messages.join("\n\n");
105
+ Rake::Application.mesg ""
106
+
107
+ # Now exit since there is nothing else we can usefully do to
108
+ # recover
109
+ #
110
+ exit(-1);
111
+ end
112
+
113
+ end
114
+
14
115
  class Construct
15
116
 
16
117
  def empty?()
@@ -29,6 +130,23 @@ class Construct
29
130
  @data.each_key(*args, &block)
30
131
  end
31
132
 
133
+ alias_method :orig_method_missing, :method_missing;
134
+ def method_missing(meth, *args)
135
+ Thread.current[:confStack].calling(self, meth, :method_missing, args);
136
+ begin
137
+ resultObject = orig_method_missing(meth, *args);
138
+ rescue NoMethodError => errorObject
139
+ Thread.current[:confStack].reportNoMethodError(errorObject);
140
+ end
141
+ resultObject
142
+ end
143
+
144
+ alias_method :orig_key_lookup, :[] ;
145
+ def [](key)
146
+ Thread.current[:confStack].calling(self, key, :key_lookup);
147
+ orig_key_lookup(key)
148
+ end
149
+
32
150
  alias_method :orig_key_value_assignment, :[]= ;
33
151
  def []=(key, value)
34
152
  value = Hash.new() if value.nil?;
@@ -114,10 +232,14 @@ class Conf
114
232
  end
115
233
 
116
234
  def self.data
235
+ Thread.current[:confStack] = ConfStack.new(self, :Conf);
236
+ Thread.current[:confStack].calling(@@data, :data, :data);
117
237
  return @@data;
118
238
  end
119
239
 
120
240
  def self.encryptedData
241
+ Thread.current[:confStack] = ConfStack.new(self, :Conf);
242
+ Thread.current[:confStack].calling(@@encryptedData, :encryptedData, :encryptedData);
121
243
  return @@encryptedData;
122
244
  end
123
245
 
@@ -175,6 +297,7 @@ class Conf
175
297
  end
176
298
 
177
299
  def self.method_missing(meth, *args)
300
+ Thread.current[:confStack] = ConfStack.new(self, :Conf, args);
178
301
  meth_s = meth.to_s
179
302
  if @@data.respond_to?(meth) ||
180
303
  @@data.data.has_key?(meth) ||
@@ -182,7 +305,8 @@ class Conf
182
305
  meth_s[-1..-1] == '='then
183
306
  @@data.method_missing(meth, *args);
184
307
  else
185
- raise ConfigurationError, "No configuation value specified for Conf[#{meth.to_s}]";
308
+ self.reportNoMethodError();
309
+ #raise ConfigurationError, "No configuation value specified for Conf[#{meth.to_s}]";
186
310
  end
187
311
  end
188
312
 
@@ -650,6 +774,22 @@ self.extend Rake::DSL
650
774
  #Conf.rsync.cmdOptions = Array.new;
651
775
  set_command_options(:all);
652
776
 
777
+ # Ensure we have the basic missingKey error messages
778
+ Conf.missingKey = Hash.new;
779
+ Conf.missingKey.global = Hash.new;
780
+ Conf.missingKey.global.message = <<END_OF_MESSAGE
781
+ Global parameters are usually set in the cookbook.conf YAML file
782
+ contained in the .cookbook directory in your home directory.
783
+ END_OF_MESSAGE
784
+ Conf.missingKey.global.cookbook = Hash.new;
785
+ Conf.missingKey.global.cookbook.message = <<END_OF_MESSAGE
786
+ The cookbook configuration parameter needs to be set to the location of
787
+ the appropriate cookbook.
788
+ END_OF_MESSAGE
789
+ Conf.missingKey.global.cookbook.valueMessage = <<END_OF_MESSAGE
790
+ where <<value>> is the full path to the approprate cookbook directory.
791
+ END_OF_MESSAGE
792
+
653
793
  # Ensure the gpg hash exists (but may be empty)
654
794
  Conf.gpg = Hash.new;
655
795
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cook
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.3
4
+ version: 2.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2014-02-15 00:00:00.000000000 Z
12
+ date: 2014-02-17 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake