jrun-rstack 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.
Files changed (47) hide show
  1. data/CHANGELOG.txt +0 -0
  2. data/LICENSE.txt +20 -0
  3. data/README.textile +57 -0
  4. data/Rakefile +13 -0
  5. data/bin/rstack +18 -0
  6. data/lib/rstack/configuration.rb +67 -0
  7. data/lib/rstack/generator.rb +58 -0
  8. data/lib/rstack/tasks/doc.rb +15 -0
  9. data/lib/rstack/tasks/gem.rb +52 -0
  10. data/lib/rstack/tasks/rspec.rb +24 -0
  11. data/lib/rstack/version.rb +9 -0
  12. data/lib/rstack.rb +25 -0
  13. data/spec/configuration_spec.rb +49 -0
  14. data/spec/generator_spec.rb +76 -0
  15. data/spec/spec_helper.rb +20 -0
  16. data/spec/tasks/doc_spec.rb +13 -0
  17. data/templates/README.txt +1 -0
  18. data/templates/Rakefile +11 -0
  19. data/templates/cruise_config.rb +10 -0
  20. data/templates/main.rb +1 -0
  21. data/templates/spec_helper.rb +14 -0
  22. data/templates/version.rb +8 -0
  23. data/vendor/allison-2.0.2/CHANGELOG +16 -0
  24. data/vendor/allison-2.0.2/LICENSE +184 -0
  25. data/vendor/allison-2.0.2/Manifest +23 -0
  26. data/vendor/allison-2.0.2/README +66 -0
  27. data/vendor/allison-2.0.2/allison.gemspec +45 -0
  28. data/vendor/allison-2.0.2/bin/allison +9 -0
  29. data/vendor/allison-2.0.2/cache/BODY +571 -0
  30. data/vendor/allison-2.0.2/cache/CLASS_INDEX +4 -0
  31. data/vendor/allison-2.0.2/cache/CLASS_PAGE +1 -0
  32. data/vendor/allison-2.0.2/cache/FILE_INDEX +4 -0
  33. data/vendor/allison-2.0.2/cache/FILE_PAGE +1 -0
  34. data/vendor/allison-2.0.2/cache/FONTS +1 -0
  35. data/vendor/allison-2.0.2/cache/FR_INDEX_BODY +1 -0
  36. data/vendor/allison-2.0.2/cache/INDEX +1 -0
  37. data/vendor/allison-2.0.2/cache/JAVASCRIPT +317 -0
  38. data/vendor/allison-2.0.2/cache/METHOD_INDEX +4 -0
  39. data/vendor/allison-2.0.2/cache/METHOD_LIST +1 -0
  40. data/vendor/allison-2.0.2/cache/PROJECT +1 -0
  41. data/vendor/allison-2.0.2/cache/SRC_PAGE +1 -0
  42. data/vendor/allison-2.0.2/cache/STYLE +321 -0
  43. data/vendor/allison-2.0.2/contrib/Rakefile +147 -0
  44. data/vendor/allison-2.0.2/lib/allison.css +315 -0
  45. data/vendor/allison-2.0.2/lib/allison.js +317 -0
  46. data/vendor/allison-2.0.2/lib/allison.rb +276 -0
  47. metadata +157 -0
@@ -0,0 +1,317 @@
1
+
2
+ // Allison template
3
+ // Copyright 2007 Cloudburst LLC, all rights reserved
4
+ // Redistribution or modification prohibited
5
+
6
+ var href_base = '%style_url%'.replace(/(.*\/).*/, '$1'); // inline js is good for something
7
+
8
+ function $(id) {
9
+ if (document.getElementById)
10
+ elem = document.getElementById(id);
11
+ else if ( document.all )
12
+ elem = eval("document.all." + id);
13
+ else
14
+ return false;
15
+ return elem;
16
+ }
17
+
18
+ function toggle(id) {
19
+ elem = $(id);
20
+ elemStyle = elem.style;
21
+ if (elemStyle.display == "block") {
22
+ elemStyle.display = "none"
23
+ } else {
24
+ elemStyle.display = "block"
25
+ }
26
+ return true;
27
+ }
28
+
29
+ function toggleText(id) {
30
+ elem = $(id)
31
+ if (m = elem.innerHTML.match(/(Hide)(.*)/)) {
32
+ elem.innerHTML = "Show" + m[2];
33
+ } else if (m = elem.innerHTML.match(/(Show)(.*)/)) {
34
+ elem.innerHTML = "Hide" + m[2];
35
+ }
36
+ return true;
37
+ }
38
+
39
+ function span(s, klass) {
40
+ return '<span class="' + klass + '">' + s + '</span>';
41
+ }
42
+
43
+ function highlightSymbols() {
44
+ pres = document.getElementsByTagName('pre');
45
+ for(var i = 0; i < pres.length; i++) {
46
+ pre = pres[i];
47
+ spans = pre.getElementsByTagName('span');
48
+ for(var k = 0; k < spans.length; k++) {
49
+ span = spans[k];
50
+ if (span.className.match(/ruby-identifier/)) {
51
+ if (span.innerHTML.match(/^:/)) {
52
+ span.className += " ruby-symbol";
53
+ }
54
+ }
55
+ }
56
+ }
57
+ }
58
+
59
+ function hasClass(obj) {
60
+ var result = false;
61
+ if (obj.getAttributeNode("class") != null) {
62
+ result = obj.getAttributeNode("class").value;
63
+ }
64
+ return result;
65
+ }
66
+
67
+ function stripe() {
68
+ var even = true;
69
+ var color = "#e4ebed";
70
+ var tables = document.getElementsByTagName('table');
71
+ if (tables.length == 0) { return; }
72
+ for (var h = 0; h < tables.length; h++) {
73
+ var trs = tables[h].getElementsByTagName("tr");
74
+ for (var i = 0; i < trs.length; i++) {
75
+ var tds = trs[i].getElementsByTagName("td");
76
+ for (var j = 0; j < tds.length; j++) {
77
+ if (hasClass(tds[j]) != "first") {
78
+ var mytd = tds[j];
79
+ if (even) {
80
+ mytd.style.backgroundColor = color;
81
+ }
82
+ }
83
+ }
84
+ even = ! even;
85
+ }
86
+ }
87
+ }
88
+
89
+ function ajaxGet(url) {
90
+ url = (href_base + url).replace('/./', '/')
91
+ var req = false;
92
+
93
+ if (window.ActiveXObject) {
94
+ try {
95
+ // stupid hack because IE7 disables local Ajax with the native xmlhttprequest object
96
+ // for security purposes. Yet ActiveX still works. Thanks, Microsoft. I hate you. Die.
97
+ req = new ActiveXObject("MSXML2.XMLHTTP.3.0");
98
+ } catch (e) {
99
+ try {
100
+ /* IE 6 and maybe 5, don't know, don't care */
101
+ req = new ActiveXObject("Msxml2.XMLHTTP");
102
+ } catch (e) {
103
+ try {
104
+ req = new ActiveXObject("Microsoft.XMLHTTP");
105
+ } catch (e) {
106
+ req = false;
107
+ }
108
+ }
109
+ }
110
+ }
111
+
112
+ /* real browsers */
113
+ if (!req && window.XMLHttpRequest) {
114
+ try {
115
+ req = new XMLHttpRequest();
116
+ } catch (e) {
117
+ req = false;
118
+ }
119
+ }
120
+
121
+ if (req) {
122
+ req.open('GET', url, false);
123
+ req.send(null);
124
+ return req.responseText;
125
+ } else {
126
+ return "Ajax error";
127
+ }
128
+ }
129
+
130
+
131
+ function addEvent(elm, evType, fn, useCapture) {
132
+ if (elm.addEventListener) {
133
+ elm.addEventListener(evType, fn, useCapture);
134
+ return true;
135
+ } else if (elm.attachEvent) {
136
+ var r = elm.attachEvent('on' + evType, fn);
137
+ return r;
138
+ } else {
139
+ elm['on' + evType] = fn;
140
+ }
141
+ }
142
+
143
+ function insertIndices() {
144
+ pages = ["class", "file", "method"]
145
+ for (x in pages) {
146
+ $(pages[x]).innerHTML += ajaxGet('fr_' + pages[x] + '_index.html').replace(/(href=")/g, '$1' + href_base);
147
+ }
148
+ /* mouseoverify method links */
149
+ links = $('method').getElementsByTagName('a');
150
+ for (var x = 0; x < links.length; x++) {
151
+ if (m = links[x].innerHTML.match(/(.*)\s\((.*)\)/)) {
152
+ links[x].innerHTML = m[1] + '<br>';
153
+ links[x].title = m[2];
154
+ }
155
+ }
156
+ /* this is stupid */
157
+ $('class').style.display = "block";
158
+ $('file').style.display = "block";
159
+
160
+ /* has to be here because IE7 does not guarantee the onLoad callback order */
161
+ abbreviateIndicesInner(["class", "file"], 25, "a");
162
+ /* same, linkTitle() depends on the class link list */
163
+ linkTitle();
164
+ }
165
+
166
+ function abbreviateIndices() {
167
+ var ids = ["defined_in", "child_of", "includes", "requires", "method", "methods"];
168
+ abbreviateIndicesInner(ids, 25, 'a');
169
+ abbreviateIndicesInner(ids, 25, 'span');
170
+ }
171
+
172
+ function abbreviateIndicesInner(indices, amount, tag) {
173
+ for (var x = 0; x < indices.length; x++) {
174
+ var the_index = $(indices[x]);
175
+ if (the_index) {
176
+ links = the_index.getElementsByTagName(tag);
177
+ for (var y = 0; y < links.length; y++) {
178
+ var link = links[y];
179
+ if (link.getElementsByTagName('span').length == 0 && link.getElementsByTagName('a').length == 0) {
180
+ // avoid nesting
181
+ link.innerHTML = link.innerHTML.replace(/<br>|\n/gi, '');
182
+ link.title = link.innerHTML;
183
+ link.innerHTML = abbreviate(link.innerHTML, amount) + '<br>';
184
+ }
185
+ }
186
+ }
187
+ }
188
+ }
189
+
190
+ function linkTitle() {
191
+
192
+ /* grab the correct title element from the index */
193
+ var index_page = ajaxGet('index.html');
194
+ title_text = index_page.match(/<title>(.*)<\/title>/m)[1];
195
+ document.title = title_text + " - " + document.title;
196
+ var p = $('header').getElementsByTagName('p')[0]
197
+ if (p.innerHTML.match(/^\s*$/)) {
198
+ p.innerHTML = title_text;
199
+ } else {
200
+ p.innerHTML = title_text + ": " + p.innerHTML;
201
+ }
202
+
203
+ /* set the link properly */
204
+ title_link = index_page.match(/<a\s+href="(.*?)"/)[1];
205
+ var element = $('title');
206
+ var item_type = "";
207
+ var item_name = "";
208
+ if (m = element.innerHTML.match(/(Class:|Module:|File:)\s*(.*)/)) {
209
+ item_type = m[1];
210
+ item_name = m[2];
211
+ } else {
212
+ item_name = element.innerHTML;
213
+ }
214
+ element.innerHTML = '<a href="' + href_base + title_link + '">' + item_type + " " + abbreviate(item_name, 45) + '</a>';
215
+ element.getElementsByTagName('a')[0].title = item_name
216
+
217
+ /* breadcrumb navigation */
218
+ items = item_name.split("::");
219
+ items_new = item_name.split("::");
220
+ file_links = $('class').getElementsByTagName('a');
221
+ for (var x = 0; x < items.length - 1; x++ ){
222
+ var item = items[x];
223
+ link = ("/classes/" + items.slice(0,x).join("/") + "/" + item + ".html").replace('//', '/');
224
+ regex = new RegExp(RegExp.escape(link) + '$');
225
+ for (var y = 0; y < file_links.length; y++) {
226
+ if (file_links[y].href.match(regex)) {
227
+ items_new[x] = '<a href="' + href_base + link + '">' + item + '</a>';
228
+ break;
229
+ }
230
+ }
231
+ }
232
+ $('item_name').innerHTML = item_type + ' ' + items_new.join(" :: ");
233
+ }
234
+
235
+ function abbreviate(s, size) {
236
+ while (s.length > size) {
237
+ var old_s = s;
238
+ s = s.replace(/\s|\n/mg, '');
239
+ s = s.replace(/([A-Z])[a-z]+/m, '$1');
240
+ if (!s || old_s == s) {
241
+ return "..." + s.substring(s.length - size, s.length);
242
+ }
243
+ }
244
+ return s;
245
+ }
246
+
247
+ function disableSubmit(event) {
248
+ var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
249
+ if (keyCode == 13) {
250
+ return false;
251
+ } else {
252
+ return true;
253
+ }
254
+ }
255
+
256
+ function filterList(id, s, event) {
257
+
258
+ /* some weak escaping */
259
+ s = s.replace(/[^\w\d\.\_\-\/\:\=\[\]\?\!]/g, '');
260
+ s = RegExp.escape(s);
261
+
262
+ var show_all = false;
263
+ if (s.match(/^\s*$/)) {
264
+ show_all = true;
265
+ }
266
+
267
+ links = $(id).getElementsByTagName('a')
268
+ regex = new RegExp(s, 'i');
269
+
270
+ for (var x = 0; x < links.length; x++) {
271
+ var link = links[x];
272
+ if (show_all) {
273
+ link.style.display = 'inline';
274
+ } else {
275
+ if (link.innerHTML.match(regex)) {
276
+ link.style.display = 'inline';
277
+ } else {
278
+ link.style.display = 'none';
279
+ }
280
+ }
281
+ }
282
+ return true;
283
+ }
284
+
285
+ RegExp.escape = function(text) {
286
+ if (!arguments.callee.sRE) {
287
+ var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\\\'];
288
+ arguments.callee.sRE = new RegExp(
289
+ '(\\\\' + specials.join('|\\\\') + ')', 'g'
290
+ );
291
+ }
292
+ return text.replace(arguments.callee.sRE, '\\\\$1');
293
+ }
294
+
295
+ function hacks() {
296
+ // show the spacer if necessary,
297
+ divs = document.getElementsByTagName('div');
298
+ for(var x = 0; x < divs.length; x++) {
299
+ if (divs[x].className && divs[x].className.match(/top/)) {
300
+ document.getElementById('spacer').style.display = 'block';
301
+ }
302
+ }
303
+ // remove extra colons from tables
304
+ tds = document.getElementsByTagName('td');
305
+ for(var x = 0; x < tds.length; x++) {
306
+ str = tds[x].innerHTML
307
+ if (str.charAt(str.length - 1) == ":") {
308
+ tds[x].innerHTML = str.slice(0, str.length - 1)
309
+ }
310
+ }
311
+ }
312
+
313
+ addEvent(window, 'load', insertIndices, false);
314
+ addEvent(window, 'load', abbreviateIndices, false);
315
+ addEvent(window, 'load', stripe, false);
316
+ addEvent(window, 'load', highlightSymbols, false);
317
+ addEvent(window, 'load', hacks, false);
@@ -0,0 +1,276 @@
1
+
2
+ # RDoc workarounds
3
+ class String
4
+ def if_exists (item = nil)
5
+ unless item
6
+ self unless self =~ /(%(\w+)%)/
7
+ "\nIF:#{$2}\n#{self}\nENDIF:#{$2}\n"
8
+ else
9
+ "\nIF:#{item}\n#{self}\nENDIF:#{item}\n"
10
+ end
11
+ end
12
+ def loop(item)
13
+ "\nSTART:#{item}\n#{self}\nEND:#{item}\n"
14
+ end
15
+ end
16
+
17
+ module RDoc
18
+ module Page
19
+
20
+ puts "Allison 2 template (c) 2007 Cloudburst, LLC"
21
+
22
+ require 'pathname'
23
+ CACHE_DIR = File.expand_path(File.dirname(__FILE__) + "/../cache")
24
+ Dir.mkdir(CACHE_DIR) unless File.exist?(CACHE_DIR)
25
+
26
+ begin
27
+ require 'rubygems'
28
+ gem 'markaby', '>= 0.5'
29
+ require 'markaby'
30
+ require 'base64'
31
+
32
+ # Markaby page says Markaby is better in its own module
33
+ module Allison
34
+
35
+ FONTS = METHOD_LIST = SRC_PAGE = FILE_PAGE = CLASS_PAGE = ""
36
+
37
+ FR_INDEX_BODY = "!INCLUDE!" # Who knows
38
+
39
+ STYLE, JAVASCRIPT = ["css", "js"].map do |extension|
40
+ s = File.open(File.dirname(__FILE__) + "/allison.#{extension}").read
41
+ # Programmatic CSS
42
+ if extension == "css"
43
+ s_lines = s.split("\n")
44
+ meths = []
45
+ s_lines.collect! do |line|
46
+ line = line.squeeze(" ").strip
47
+ if line =~ /(\w+)/ and meths.include? $1
48
+ line = instance_eval line
49
+ # puts "Called method #{$1}"
50
+ elsif line !~ /\*\/|\/\*/ and line =~ /(@.*|^def (\w+).*)/
51
+ # printf "Evalled #{$1}"
52
+ result = instance_eval $1
53
+ # puts " to #{result.inspect}"
54
+ result = (result.is_a?(Fixnum) ? result.to_s + "px" : result.to_s)
55
+ line = (line == $1 ? "" : line.gsub($1, result))
56
+ meths.push $2 if $2
57
+ end
58
+ line !~ /^\s*$|\s*^\/\*.*\*\/\s*$|\{|\}/ ? line + ";" : line
59
+ end
60
+ s = s_lines.join("\n")
61
+ else
62
+ # Do nothing; the Javascript is already fine
63
+ end
64
+ s
65
+ end
66
+
67
+ INDEX = Markaby::Builder.new.xhtml_strict do
68
+ head do
69
+ title '%title%'
70
+ link :rel => 'stylesheet', :type => 'text/css', :href => 'rdoc-style.css', :media => 'screen'
71
+ tag! :meta, 'http-equiv' => 'refresh', 'content' => '0;url=%initial_page%'
72
+ end
73
+ body do
74
+ div.container! do
75
+ 6.times {|n| div('', :class => "curve", :id => "preheader_curve_#{n}") }
76
+ div.header! do
77
+ span.title! do
78
+ p { '&nbsp;' }
79
+ h1 "Ruby Documentation"
80
+ end
81
+ end
82
+ div.clear {}
83
+ div.redirect! do
84
+ a :href => '%initial_page%' do
85
+ h1 "Redirect"
86
+ end
87
+ end
88
+ end
89
+ end
90
+ end.to_s
91
+
92
+ FILE_INDEX = METHOD_INDEX = CLASS_INDEX = Markaby::Builder.new.capture do
93
+ a :href => '%href%' do
94
+ self << '%name%'
95
+ br
96
+ end
97
+ end.loop('entries')
98
+
99
+ BODY = Markaby::Builder.new.xhtml_strict do
100
+ head do
101
+ title "%title%"
102
+ link :rel => 'stylesheet', :type => 'text/css', :href => '%style_url%', :media => 'screen'
103
+ script :type => 'text/javascript' do
104
+ JAVASCRIPT
105
+ end
106
+ end
107
+ body do
108
+ div.container! do
109
+ 6.times {|n| div('', :class => "curve", :id => "preheader_curve_#{n}") }
110
+ div.header! do
111
+ p {'%full_path%'.if_exists}
112
+ span do
113
+ h1.title! '%title%'.if_exists
114
+ end
115
+ self << "!INCLUDE!" # Always empty
116
+ end
117
+ div.clear {}
118
+ div.left! do
119
+ self << (div.navigation.darker.top.child_of! do
120
+ # Ugh
121
+ h3 "Child of"
122
+ self << "<span>\n#{"<a href='%par_url%'>".if_exists}%parent%#{"</a>".if_exists('par_url')}</span>"
123
+ end).if_exists('parent')
124
+
125
+ self << div.navigation.darker.top.defined_in! do
126
+ h3('Defined in')
127
+ self << a('%full_path%', :href => '%full_path_url%').if_exists.loop('infiles')
128
+ end.if_exists('infiles')
129
+
130
+ ['includes', 'requires', 'methods'].each do |item|
131
+ self << div.navigation.top(:id => item) do
132
+ self << h3(item.capitalize)
133
+ self << "#{"<a href='%aref%'>".if_exists}%name%#{br}#{"</a>".if_exists('aref')}".if_exists('name').loop(item)
134
+ end.if_exists(item)
135
+ end
136
+
137
+ div.spacer! ''
138
+
139
+ # For the local AJAX includes
140
+ ['class', 'file', 'method'].each do |item|
141
+ div.navigation.darker.index :id => "#{item}_wrapper" do
142
+ div.list_header do
143
+ h3 'All ' + (item == 'class' ? 'classes' : item + 's')
144
+ end
145
+ div.list_header_link do
146
+ a((item == 'method' ? 'Show...' : 'Hide...'),
147
+ :id => "#{item}_link", :href => "#",
148
+ :onclick=> "toggle('#{item}'); toggleText('#{item}_link'); return false;")
149
+ end
150
+ div.clear {}
151
+ div(:id => item) do
152
+ form do
153
+ label(:for => "filter_#{item}") { 'Filter:' + '&nbsp;' * 2 }
154
+ input '', :type => 'text', :id => "filter_#{item}",
155
+ :onKeyUp => "return filterList('#{item}', this.value, event);",
156
+ :onKeyPress => "return disableSubmit(event);"
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
162
+
163
+ div.content! do
164
+
165
+ self << capture do
166
+ h1.item_name! '%title%'
167
+ end.if_exists('title')
168
+
169
+ self << capture do
170
+ div.description! do
171
+ '%description%'
172
+ end
173
+ end.if_exists('description')
174
+
175
+ self << capture do
176
+ self << h1 {a '%sectitle%', :name => '%secsequence%'}.if_exists('sectitle')
177
+ self << p {'%seccomment%'}.if_exists
178
+
179
+ self << capture do
180
+ h1 "Child modules and classes"
181
+ p '%classlist%'
182
+ end.if_exists('classlist')
183
+
184
+ ['constants', 'aliases', 'attributes'].each do |item|
185
+ self << capture do
186
+ h1(item.capitalize)
187
+ p do
188
+ table do
189
+ fields = %w[name value old_name new_name rw]
190
+ self << tr do
191
+ # Header row
192
+ if item == 'constants'
193
+ th 'Name'
194
+ th 'Value'
195
+ elsif item == 'aliases'
196
+ th 'Old name'
197
+ th 'New name'
198
+ elsif item == 'attributes'
199
+ th 'Name'
200
+ th 'Read/write?'
201
+ end
202
+ end
203
+ self << tr do
204
+ # Looped item rows
205
+ fields.each do |field|
206
+ if field !~ /desc/
207
+ self << td('%' + field + '%', :class => field =~ /^old|^name/ ? "highlight" : "normal").if_exists
208
+ else
209
+ self << td(('%' + field+ '%').if_exists)
210
+ end
211
+ end
212
+ end.loop(item)
213
+ end
214
+ end
215
+ end.if_exists(item)
216
+ end
217
+
218
+ self << capture do
219
+ h1('%type% %category% Methods')
220
+ self << capture do
221
+ self << a.small(:name => '%aref%') {br}.if_exists
222
+ div.method_block do
223
+ h3 { "<a href='#%aref%'>".if_exists + '%callseq%'.if_exists + '%name%'.if_exists + '%params%'.if_exists + "</a>".if_exists('aref')}
224
+ self << '%m_desc%'.if_exists
225
+
226
+ self << capture do
227
+ p.source_link :id => '%aref%-show-link' do
228
+ a "Show source...", :id => '%aref%-link', :href => "#",
229
+ :onclick=> "toggle('%aref%-source'); toggleText('%aref%-link'); return false;"
230
+ end
231
+ div.source :id => '%aref%-source' do
232
+ pre { '%sourcecode%' }
233
+ end
234
+ end.if_exists('sourcecode')
235
+ end
236
+
237
+ end.loop('methods').if_exists('methods')
238
+ end.loop('method_list').if_exists('method_list')
239
+
240
+ end.loop('sections').if_exists('sections')
241
+
242
+ end
243
+
244
+ div.footer!.clear do
245
+ self << Time.now.strftime("Generated on %b %d, %Y").gsub(' 0', ' ')
246
+ self << " / Allison 2 &copy; 2007 "
247
+ a "Cloudburst, LLC", :href => "http://cloudbur.st"
248
+ end
249
+ end
250
+ end
251
+
252
+ end.to_s
253
+ end
254
+
255
+ Allison.constants.each do |c|
256
+ eval "#{c} = Allison::#{c}" # Jump out of the namespace
257
+ begin
258
+ File.open("#{CACHE_DIR}/#{c}", 'w') do |f|
259
+ f.puts eval(c) # Write cache
260
+ end
261
+ rescue Errno::EACCES => e
262
+ end
263
+ end
264
+
265
+ rescue LoadError => e
266
+ # We don't have some dependency
267
+ lib = (e.to_s[/(.*)\(/, 1] or e.to_s).split(" ").last.capitalize
268
+ puts "Using cache (couldn't load '#{lib}')"
269
+ Dir[CACHE_DIR + '/*'].each do |filename|
270
+ eval("#{filename.split("/").last} = File.open(filename) {|s| s.read}")
271
+ end
272
+ end
273
+
274
+ end
275
+
276
+ end