cook 2.0.3 → 2.0.4

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.
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