lucidimagination-warbler 1.3.2.dev
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/Gemfile +16 -0
- data/History.txt +217 -0
- data/LICENSE.txt +26 -0
- data/Manifest.txt +92 -0
- data/README.txt +255 -0
- data/Rakefile +103 -0
- data/bin/warble +11 -0
- data/ext/JarMain.java +148 -0
- data/ext/WarMain.java +112 -0
- data/ext/WarblerJar.java +182 -0
- data/ext/WarblerJarService.java +18 -0
- data/lib/warbler.rb +33 -0
- data/lib/warbler/application.rb +86 -0
- data/lib/warbler/config.rb +223 -0
- data/lib/warbler/gems.rb +37 -0
- data/lib/warbler/jar.rb +253 -0
- data/lib/warbler/task.rb +183 -0
- data/lib/warbler/templates/bundler.erb +3 -0
- data/lib/warbler/templates/config.erb +1 -0
- data/lib/warbler/templates/jar.erb +5 -0
- data/lib/warbler/templates/rack.erb +1 -0
- data/lib/warbler/templates/rails.erb +1 -0
- data/lib/warbler/templates/war.erb +1 -0
- data/lib/warbler/traits.rb +107 -0
- data/lib/warbler/traits/bundler.rb +104 -0
- data/lib/warbler/traits/gemspec.rb +59 -0
- data/lib/warbler/traits/jar.rb +56 -0
- data/lib/warbler/traits/merb.rb +35 -0
- data/lib/warbler/traits/nogemspec.rb +42 -0
- data/lib/warbler/traits/rack.rb +33 -0
- data/lib/warbler/traits/rails.rb +62 -0
- data/lib/warbler/traits/war.rb +197 -0
- data/lib/warbler/version.rb +10 -0
- data/lib/warbler/war.rb +8 -0
- data/lib/warbler_jar.jar +0 -0
- data/spec/drb_helper.rb +41 -0
- data/spec/sample_bundler/Gemfile.lock +10 -0
- data/spec/sample_bundler/config.ru +0 -0
- data/spec/sample_jar/History.txt +6 -0
- data/spec/sample_jar/Manifest.txt +8 -0
- data/spec/sample_jar/README.txt +30 -0
- data/spec/sample_jar/lib/sample_jar.rb +6 -0
- data/spec/sample_jar/sample_jar.gemspec +40 -0
- data/spec/sample_jar/test/test_sample_jar.rb +8 -0
- data/spec/sample_war/app/controllers/application.rb +15 -0
- data/spec/sample_war/app/helpers/application_helper.rb +3 -0
- data/spec/sample_war/config/boot.rb +109 -0
- data/spec/sample_war/config/database.yml +19 -0
- data/spec/sample_war/config/environment.rb +67 -0
- data/spec/sample_war/config/environments/development.rb +17 -0
- data/spec/sample_war/config/environments/production.rb +25 -0
- data/spec/sample_war/config/environments/test.rb +22 -0
- data/spec/sample_war/config/initializers/inflections.rb +10 -0
- data/spec/sample_war/config/initializers/mime_types.rb +5 -0
- data/spec/sample_war/config/initializers/new_rails_defaults.rb +15 -0
- data/spec/sample_war/config/routes.rb +41 -0
- data/spec/sample_war/lib/tasks/utils.rake +0 -0
- data/spec/sample_war/public/404.html +30 -0
- data/spec/sample_war/public/422.html +30 -0
- data/spec/sample_war/public/500.html +30 -0
- data/spec/sample_war/public/favicon.ico +0 -0
- data/spec/sample_war/public/index.html +274 -0
- data/spec/sample_war/public/robots.txt +5 -0
- data/spec/spec_helper.rb +112 -0
- data/spec/warbler/application_spec.rb +95 -0
- data/spec/warbler/bundler_spec.rb +136 -0
- data/spec/warbler/config_spec.rb +130 -0
- data/spec/warbler/gems_spec.rb +40 -0
- data/spec/warbler/jar_spec.rb +718 -0
- data/spec/warbler/task_spec.rb +170 -0
- data/spec/warbler/traits_spec.rb +17 -0
- data/spec/warbler/war_spec.rb +14 -0
- data/warble.rb +142 -0
- data/web.xml.erb +32 -0
- metadata +198 -0
@@ -0,0 +1,40 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2010-2011 Engine Yard, Inc.
|
3
|
+
# Copyright (c) 2007-2009 Sun Microsystems, Inc.
|
4
|
+
# This source code is available under the MIT license.
|
5
|
+
# See the file LICENSE.txt for details.
|
6
|
+
#++
|
7
|
+
|
8
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
9
|
+
|
10
|
+
describe Warbler::Gems do
|
11
|
+
it "should accept a hash for initialization" do
|
12
|
+
gems = Warbler::Gems.new({"actionpack" => "1.2.3"})
|
13
|
+
gems.should have_key("actionpack")
|
14
|
+
gems["actionpack"].should == "1.2.3"
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should accept an array for initialization" do
|
18
|
+
gems = Warbler::Gems.new ["activerecord"]
|
19
|
+
gems.should have_key("activerecord")
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should allow gems with a version" do
|
23
|
+
gems = Warbler::Gems.new
|
24
|
+
gems["actionpack"] = "> 1.2.3"
|
25
|
+
gems["actionpack"].should == "> 1.2.3"
|
26
|
+
end
|
27
|
+
|
28
|
+
it "should allow gems without an explicit version" do
|
29
|
+
gems = Warbler::Gems.new
|
30
|
+
gems << "actionpack"
|
31
|
+
gems.should have_key("actionpack")
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should allow to add gems" do
|
35
|
+
gems = Warbler::Gems.new
|
36
|
+
gems << "rails"
|
37
|
+
gems += ["activerecord-jdbcmysql-adapter", "jdbc-mysql", "jruby-openssl"]
|
38
|
+
["rails", "activerecord-jdbcmysql-adapter", "jdbc-mysql", "jruby-openssl"].each {|g| gems.should have_key(g)}
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,718 @@
|
|
1
|
+
#--
|
2
|
+
# Copyright (c) 2010-2011 Engine Yard, Inc.
|
3
|
+
# Copyright (c) 2007-2009 Sun Microsystems, Inc.
|
4
|
+
# This source code is available under the MIT license.
|
5
|
+
# See the file LICENSE.txt for details.
|
6
|
+
#++
|
7
|
+
|
8
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
9
|
+
|
10
|
+
describe Warbler::Jar do
|
11
|
+
use_fresh_rake_application
|
12
|
+
use_fresh_environment
|
13
|
+
|
14
|
+
def file_list(regex)
|
15
|
+
jar.files.keys.select {|f| f =~ regex }
|
16
|
+
end
|
17
|
+
|
18
|
+
def use_config(&block)
|
19
|
+
@extra_config = block
|
20
|
+
end
|
21
|
+
|
22
|
+
def apply_extra_config(config)
|
23
|
+
@extra_config.call(config) if @extra_config
|
24
|
+
end
|
25
|
+
|
26
|
+
let(:config) { Warbler::Config.new {|c| apply_extra_config(c) } }
|
27
|
+
let(:jar) { Warbler::Jar.new }
|
28
|
+
|
29
|
+
context "in a jar project" do
|
30
|
+
run_in_directory "spec/sample_jar"
|
31
|
+
cleanup_temp_files
|
32
|
+
|
33
|
+
it "detects a Jar trait" do
|
34
|
+
config.traits.should include(Warbler::Traits::Jar)
|
35
|
+
end
|
36
|
+
|
37
|
+
it "collects java libraries" do
|
38
|
+
jar.apply(config)
|
39
|
+
file_list(%r{^META-INF/lib/jruby-.*\.jar$}).should_not be_empty
|
40
|
+
end
|
41
|
+
|
42
|
+
it "adds a JarMain class" do
|
43
|
+
jar.apply(config)
|
44
|
+
file_list(%r{^JarMain\.class$}).should_not be_empty
|
45
|
+
end
|
46
|
+
|
47
|
+
it "adds an init.rb" do
|
48
|
+
jar.apply(config)
|
49
|
+
file_list(%r{^META-INF/init.rb$}).should_not be_empty
|
50
|
+
end
|
51
|
+
|
52
|
+
it "requires 'rubygems' in init.rb" do
|
53
|
+
jar.add_init_file(config)
|
54
|
+
contents = jar.contents('META-INF/init.rb')
|
55
|
+
contents.split("\n").grep(/require 'rubygems'/).should_not be_empty
|
56
|
+
end
|
57
|
+
|
58
|
+
it "adds ENV['GEM_HOME'] to init.rb" do
|
59
|
+
jar.add_init_file(config)
|
60
|
+
contents = jar.contents('META-INF/init.rb')
|
61
|
+
contents.should =~ /ENV\['GEM_HOME'\]/
|
62
|
+
end
|
63
|
+
|
64
|
+
it "adds a main.rb" do
|
65
|
+
jar.apply(config)
|
66
|
+
file_list(%r{^META-INF/main.rb$}).should_not be_empty
|
67
|
+
end
|
68
|
+
|
69
|
+
it "accepts a custom manifest file" do
|
70
|
+
touch 'manifest'
|
71
|
+
use_config do |config|
|
72
|
+
config.manifest_file = 'manifest'
|
73
|
+
end
|
74
|
+
jar.apply(config)
|
75
|
+
jar.files['META-INF/MANIFEST.MF'].should == "manifest"
|
76
|
+
end
|
77
|
+
|
78
|
+
it "accepts a MANIFEST.MF file if it exists in the project root" do
|
79
|
+
touch 'MANIFEST.MF'
|
80
|
+
jar.apply(config)
|
81
|
+
jar.files['META-INF/MANIFEST.MF'].should == "MANIFEST.MF"
|
82
|
+
end
|
83
|
+
|
84
|
+
it "does not add a manifest if one already exists" do
|
85
|
+
jar.files['META-INF/MANIFEST.MF'] = 'manifest'
|
86
|
+
jar.add_manifest(config)
|
87
|
+
jar.files['META-INF/MANIFEST.MF'].should == "manifest"
|
88
|
+
end
|
89
|
+
|
90
|
+
context "with a .gemspec" do
|
91
|
+
it "detects a Gemspec trait" do
|
92
|
+
config.traits.should include(Warbler::Traits::Gemspec)
|
93
|
+
end
|
94
|
+
|
95
|
+
it "detects gem dependencies" do
|
96
|
+
jar.apply(config)
|
97
|
+
file_list(%r{^gems/rubyzip.*/lib/zip/zip.rb}).should_not be_empty
|
98
|
+
file_list(%r{^specifications/rubyzip.*\.gemspec}).should_not be_empty
|
99
|
+
end
|
100
|
+
|
101
|
+
it "sets load paths in init.rb" do
|
102
|
+
jar.add_init_file(config)
|
103
|
+
contents = jar.contents('META-INF/init.rb')
|
104
|
+
contents.split("\n").grep(/LOAD_PATH\.unshift.*sample_jar\/lib/).should_not be_empty
|
105
|
+
end
|
106
|
+
|
107
|
+
it "loads the default executable in main.rb" do
|
108
|
+
jar.apply(config)
|
109
|
+
contents = jar.contents('META-INF/main.rb')
|
110
|
+
contents.split("\n").grep(/load.*sample_jar\/bin\/sample_jar/).should_not be_empty
|
111
|
+
end
|
112
|
+
|
113
|
+
it "includes compiled .rb and .class files" do
|
114
|
+
config.compiled_ruby_files = %w(lib/sample_jar.rb)
|
115
|
+
jar.compile(config)
|
116
|
+
jar.apply(config)
|
117
|
+
file_list(%r{^sample_jar/lib/sample_jar\.class$}).should_not be_empty
|
118
|
+
jar.contents('sample_jar/lib/sample_jar.rb').should =~ /require __FILE__\.sub/
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
context "with a gemspec without a default executable" do
|
123
|
+
before :each do
|
124
|
+
Dir['*.gemspec'].each do |f|
|
125
|
+
cp f, "#{f}.tmp"
|
126
|
+
lines = IO.readlines(f)
|
127
|
+
File.open(f, 'w') do |io|
|
128
|
+
lines.each do |line|
|
129
|
+
next if line =~ /executable/
|
130
|
+
io << line
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
after :each do
|
137
|
+
Dir['*.gemspec.tmp'].each {|f| mv f, "#{f.sub /\.tmp$/, ''}"}
|
138
|
+
end
|
139
|
+
|
140
|
+
it "loads the first bin/executable in main.rb" do
|
141
|
+
silence { jar.apply(config) }
|
142
|
+
contents = jar.contents('META-INF/main.rb')
|
143
|
+
contents.split("\n").grep(/load.*sample_jar\/bin\/sample_jar/).should_not be_empty
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
context "without a .gemspec" do
|
148
|
+
before :each do
|
149
|
+
Dir['*.gemspec'].each {|f| mv f, "#{f}.tmp"}
|
150
|
+
end
|
151
|
+
|
152
|
+
after :each do
|
153
|
+
Dir['*.gemspec.tmp'].each {|f| mv f, "#{f.sub /\.tmp$/, ''}"}
|
154
|
+
end
|
155
|
+
|
156
|
+
it "detects a NoGemspec trait" do
|
157
|
+
config.traits.should include(Warbler::Traits::NoGemspec)
|
158
|
+
end
|
159
|
+
|
160
|
+
it "collects gem files from configuration" do
|
161
|
+
use_config do |config|
|
162
|
+
config.gems << "rake"
|
163
|
+
end
|
164
|
+
jar.apply(config)
|
165
|
+
file_list(%r{^gems/rake.*/lib/rake.rb}).should_not be_empty
|
166
|
+
file_list(%r{^specifications/rake.*\.gemspec}).should_not be_empty
|
167
|
+
end
|
168
|
+
|
169
|
+
it "collects all project files in the directory" do
|
170
|
+
touch "extra.foobar"
|
171
|
+
jar.apply(config)
|
172
|
+
file_list(%r{^sample_jar/bin$}).should_not be_empty
|
173
|
+
file_list(%r{^sample_jar/test$}).should_not be_empty
|
174
|
+
file_list(%r{^sample_jar/lib/sample_jar.rb$}).should_not be_empty
|
175
|
+
file_list(%r{^sample_jar/extra\.foobar$}).should_not be_empty
|
176
|
+
end
|
177
|
+
|
178
|
+
it "sets load paths in init.rb" do
|
179
|
+
jar.add_init_file(config)
|
180
|
+
contents = jar.contents('META-INF/init.rb')
|
181
|
+
contents.split("\n").grep(/LOAD_PATH\.unshift.*sample_jar\/lib/).should_not be_empty
|
182
|
+
end
|
183
|
+
|
184
|
+
it "loads the first bin/executable in main.rb" do
|
185
|
+
jar.apply(config)
|
186
|
+
contents = jar.contents('META-INF/main.rb')
|
187
|
+
contents.split("\n").grep(/load.*sample_jar\/bin\/sample_jar/).should_not be_empty
|
188
|
+
end
|
189
|
+
end
|
190
|
+
end
|
191
|
+
|
192
|
+
context "in a war project" do
|
193
|
+
run_in_directory "spec/sample_war"
|
194
|
+
cleanup_temp_files
|
195
|
+
|
196
|
+
before(:each) do
|
197
|
+
mkdir_p "log"
|
198
|
+
touch "log/test.log"
|
199
|
+
end
|
200
|
+
|
201
|
+
it "detects a War trait" do
|
202
|
+
config.traits.should include(Warbler::Traits::War)
|
203
|
+
end
|
204
|
+
|
205
|
+
it "collects files in public" do
|
206
|
+
jar.apply(config)
|
207
|
+
file_list(%r{^index\.html}).should_not be_empty
|
208
|
+
end
|
209
|
+
|
210
|
+
it "collects gem files" do
|
211
|
+
use_config do |config|
|
212
|
+
config.gems << "rake"
|
213
|
+
end
|
214
|
+
jar.apply(config)
|
215
|
+
file_list(%r{WEB-INF/gems/gems/rake.*/lib/rake.rb}).should_not be_empty
|
216
|
+
file_list(%r{WEB-INF/gems/specifications/rake.*\.gemspec}).should_not be_empty
|
217
|
+
end
|
218
|
+
|
219
|
+
it "adds ENV['GEM_HOME'] to init.rb" do
|
220
|
+
jar.add_init_file(config)
|
221
|
+
contents = jar.contents('META-INF/init.rb')
|
222
|
+
contents.should =~ /ENV\['GEM_HOME'\]/
|
223
|
+
contents.should =~ /WEB-INF\/gems/
|
224
|
+
end
|
225
|
+
|
226
|
+
it "does not include log files by default" do
|
227
|
+
jar.apply(config)
|
228
|
+
file_list(%r{WEB-INF/log}).should_not be_empty
|
229
|
+
file_list(%r{WEB-INF/log/.*\.log}).should be_empty
|
230
|
+
end
|
231
|
+
|
232
|
+
def expand_webxml
|
233
|
+
jar.apply(config)
|
234
|
+
jar.files.should include("WEB-INF/web.xml")
|
235
|
+
require 'rexml/document'
|
236
|
+
REXML::Document.new(jar.files["WEB-INF/web.xml"]).root.elements
|
237
|
+
end
|
238
|
+
|
239
|
+
it "creates a web.xml file" do
|
240
|
+
use_config do |config|
|
241
|
+
config.webxml.jruby.max.runtimes = 5
|
242
|
+
end
|
243
|
+
elements = expand_webxml
|
244
|
+
elements.to_a(
|
245
|
+
"context-param/param-name[text()='jruby.max.runtimes']"
|
246
|
+
).should_not be_empty
|
247
|
+
elements.to_a(
|
248
|
+
"context-param/param-name[text()='jruby.max.runtimes']/../param-value"
|
249
|
+
).first.text.should == "5"
|
250
|
+
end
|
251
|
+
|
252
|
+
it "includes custom context parameters in web.xml" do
|
253
|
+
use_config do |config|
|
254
|
+
config.webxml.some.custom.config = "myconfig"
|
255
|
+
end
|
256
|
+
elements = expand_webxml
|
257
|
+
elements.to_a(
|
258
|
+
"context-param/param-name[text()='some.custom.config']"
|
259
|
+
).should_not be_empty
|
260
|
+
elements.to_a(
|
261
|
+
"context-param/param-name[text()='some.custom.config']/../param-value"
|
262
|
+
).first.text.should == "myconfig"
|
263
|
+
end
|
264
|
+
|
265
|
+
it "allows one jndi resource to be included" do
|
266
|
+
use_config do |config|
|
267
|
+
config.webxml.jndi = 'jndi/rails'
|
268
|
+
end
|
269
|
+
elements = expand_webxml
|
270
|
+
elements.to_a(
|
271
|
+
"resource-ref/res-ref-name[text()='jndi/rails']"
|
272
|
+
).should_not be_empty
|
273
|
+
end
|
274
|
+
|
275
|
+
it "allows multiple jndi resources to be included" do
|
276
|
+
use_config do |config|
|
277
|
+
config.webxml.jndi = ['jndi/rails1', 'jndi/rails2']
|
278
|
+
end
|
279
|
+
elements = expand_webxml
|
280
|
+
elements.to_a(
|
281
|
+
"resource-ref/res-ref-name[text()='jndi/rails1']"
|
282
|
+
).should_not be_empty
|
283
|
+
elements.to_a(
|
284
|
+
"resource-ref/res-ref-name[text()='jndi/rails2']"
|
285
|
+
).should_not be_empty
|
286
|
+
end
|
287
|
+
|
288
|
+
it "does not include any ignored context parameters" do
|
289
|
+
use_config do |config|
|
290
|
+
config.webxml.foo = "bar"
|
291
|
+
config.webxml.ignored << "foo"
|
292
|
+
end
|
293
|
+
elements = expand_webxml
|
294
|
+
elements.to_a(
|
295
|
+
"context-param/param-name[text()='foo']"
|
296
|
+
).should be_empty
|
297
|
+
elements.to_a(
|
298
|
+
"context-param/param-name[text()='ignored']"
|
299
|
+
).should be_empty
|
300
|
+
elements.to_a(
|
301
|
+
"context-param/param-name[text()='jndi']"
|
302
|
+
).should be_empty
|
303
|
+
end
|
304
|
+
|
305
|
+
it "uses a config/web.xml if it exists" do
|
306
|
+
mkdir_p "config"
|
307
|
+
touch "config/web.xml"
|
308
|
+
jar.apply(config)
|
309
|
+
jar.files["WEB-INF/web.xml"].should == "config/web.xml"
|
310
|
+
end
|
311
|
+
|
312
|
+
it "uses a config/web.xml.erb if it exists" do
|
313
|
+
mkdir_p "config"
|
314
|
+
File.open("config/web.xml.erb", "w") {|f| f << "Hi <%= webxml.public.root %>" }
|
315
|
+
jar.apply(config)
|
316
|
+
jar.files["WEB-INF/web.xml"].should_not be_nil
|
317
|
+
jar.files["WEB-INF/web.xml"].read.should == "Hi /"
|
318
|
+
end
|
319
|
+
|
320
|
+
it "collects java libraries" do
|
321
|
+
jar.apply(config)
|
322
|
+
file_list(%r{WEB-INF/lib/jruby-.*\.jar$}).should_not be_empty
|
323
|
+
end
|
324
|
+
|
325
|
+
it "collects application files" do
|
326
|
+
jar.apply(config)
|
327
|
+
file_list(%r{WEB-INF/app$}).should_not be_empty
|
328
|
+
file_list(%r{WEB-INF/config$}).should_not be_empty
|
329
|
+
file_list(%r{WEB-INF/lib$}).should_not be_empty
|
330
|
+
end
|
331
|
+
|
332
|
+
it "accepts an autodeploy directory where the war should be created" do
|
333
|
+
require 'tmpdir'
|
334
|
+
use_config do |config|
|
335
|
+
config.jar_name = 'warbler'
|
336
|
+
config.autodeploy_dir = Dir::tmpdir
|
337
|
+
end
|
338
|
+
touch "file.txt"
|
339
|
+
jar.files["file.txt"] = "file.txt"
|
340
|
+
silence { jar.create(config) }
|
341
|
+
File.exist?(File.join("#{Dir::tmpdir}","warbler.war")).should == true
|
342
|
+
end
|
343
|
+
|
344
|
+
it "allows the jar extension to be customized" do
|
345
|
+
use_config do |config|
|
346
|
+
config.jar_name = 'warbler'
|
347
|
+
config.jar_extension = 'foobar'
|
348
|
+
end
|
349
|
+
touch "file.txt"
|
350
|
+
jar.files["file.txt"] = "file.txt"
|
351
|
+
silence { jar.create(config) }
|
352
|
+
File.exist?("warbler.foobar").should == true
|
353
|
+
end
|
354
|
+
|
355
|
+
it "can exclude files from the .war" do
|
356
|
+
use_config do |config|
|
357
|
+
config.excludes += FileList['lib/tasks/utils.rake']
|
358
|
+
end
|
359
|
+
jar.apply(config)
|
360
|
+
file_list(%r{lib/tasks/utils.rake}).should be_empty
|
361
|
+
end
|
362
|
+
|
363
|
+
it "can exclude public files from the .war" do
|
364
|
+
use_config do |config|
|
365
|
+
config.excludes += FileList['public/robots.txt']
|
366
|
+
end
|
367
|
+
jar.apply(config)
|
368
|
+
file_list(%r{robots.txt}).should be_empty
|
369
|
+
end
|
370
|
+
|
371
|
+
it "reads configuration from #{Warbler::Config::FILE}" do
|
372
|
+
mkdir_p "config"
|
373
|
+
File.open(Warbler::Config::FILE, "w") do |dest|
|
374
|
+
contents =
|
375
|
+
File.open("#{Warbler::WARBLER_HOME}/warble.rb") do |src|
|
376
|
+
src.read
|
377
|
+
end
|
378
|
+
dest << contents.sub(/# config\.jar_name/, 'config.jar_name'
|
379
|
+
).sub(/# config.gems << "tzinfo"/, 'config.gems = []')
|
380
|
+
end
|
381
|
+
t = Warbler::Task.new "warble"
|
382
|
+
t.config.jar_name.should == "mywar"
|
383
|
+
end
|
384
|
+
|
385
|
+
it "fails if a gem is requested that is not installed" do
|
386
|
+
use_config do |config|
|
387
|
+
config.gems = ["nonexistent-gem"]
|
388
|
+
end
|
389
|
+
lambda {
|
390
|
+
Warbler::Task.new "warble", config
|
391
|
+
jar.apply(config)
|
392
|
+
}.should raise_error
|
393
|
+
end
|
394
|
+
|
395
|
+
it "allows specification of dependency by Gem::Dependency" do
|
396
|
+
spec = mock "gem spec"
|
397
|
+
spec.stub!(:name).and_return "hpricot"
|
398
|
+
spec.stub!(:full_name).and_return "hpricot-0.6.157"
|
399
|
+
spec.stub!(:full_gem_path).and_return "hpricot-0.6.157"
|
400
|
+
spec.stub!(:loaded_from).and_return "hpricot.gemspec"
|
401
|
+
spec.stub!(:files).and_return ["Rakefile"]
|
402
|
+
spec.stub!(:dependencies).and_return []
|
403
|
+
Gem.source_index.should_receive(:search).and_return do |gem|
|
404
|
+
gem.name.should == "hpricot"
|
405
|
+
[spec]
|
406
|
+
end
|
407
|
+
use_config do |config|
|
408
|
+
config.gems = [Gem::Dependency.new("hpricot", "> 0.6")]
|
409
|
+
end
|
410
|
+
silence { jar.apply(config) }
|
411
|
+
end
|
412
|
+
|
413
|
+
it "copies loose java classes to WEB-INF/classes" do
|
414
|
+
use_config do |config|
|
415
|
+
config.java_classes = FileList["Rakefile"]
|
416
|
+
end
|
417
|
+
jar.apply(config)
|
418
|
+
file_list(%r{WEB-INF/classes/Rakefile$}).should_not be_empty
|
419
|
+
end
|
420
|
+
|
421
|
+
it "does not try to autodetect frameworks when Warbler.framework_detection is false" do
|
422
|
+
begin
|
423
|
+
Warbler.framework_detection = false
|
424
|
+
task :environment
|
425
|
+
config.webxml.booter.should_not == :rails
|
426
|
+
t = Rake::Task['environment']
|
427
|
+
class << t; public :instance_variable_get; end
|
428
|
+
t.instance_variable_get("@already_invoked").should == false
|
429
|
+
ensure
|
430
|
+
Warbler.framework_detection = true
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
context "with the executable feature" do
|
435
|
+
it "adds a WarMain class" do
|
436
|
+
use_config do |config|
|
437
|
+
config.features << "executable"
|
438
|
+
end
|
439
|
+
jar.apply(config)
|
440
|
+
file_list(%r{^WarMain\.class$}).should_not be_empty
|
441
|
+
end
|
442
|
+
end
|
443
|
+
|
444
|
+
context "in a Rails application" do
|
445
|
+
before :each do
|
446
|
+
@rails = nil
|
447
|
+
task :environment do
|
448
|
+
@rails = mock_rails_module
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
def mock_rails_module
|
453
|
+
rails = Module.new
|
454
|
+
Object.const_set("Rails", rails)
|
455
|
+
version = Module.new
|
456
|
+
rails.const_set("VERSION", version)
|
457
|
+
version.const_set("STRING", "2.1.0")
|
458
|
+
rails
|
459
|
+
end
|
460
|
+
|
461
|
+
it "detects a Rails trait" do
|
462
|
+
config.traits.should include(Warbler::Traits::Rails)
|
463
|
+
end
|
464
|
+
|
465
|
+
it "auto-detects a Rails application" do
|
466
|
+
config.webxml.booter.should == :rails
|
467
|
+
config.gems["rails"].should == "2.1.0"
|
468
|
+
end
|
469
|
+
|
470
|
+
it "provides Rails gems by default, unless vendor/rails is present" do
|
471
|
+
config.gems.should have_key("rails")
|
472
|
+
|
473
|
+
mkdir_p "vendor/rails"
|
474
|
+
config = Warbler::Config.new
|
475
|
+
config.gems.should be_empty
|
476
|
+
|
477
|
+
rm_rf "vendor/rails"
|
478
|
+
@rails.stub!(:vendor_rails?).and_return true
|
479
|
+
config = Warbler::Config.new
|
480
|
+
config.gems.should be_empty
|
481
|
+
end
|
482
|
+
|
483
|
+
it "automatically adds Rails.configuration.gems to the list of gems" do
|
484
|
+
task :environment do
|
485
|
+
config = mock "config"
|
486
|
+
@rails.stub!(:configuration).and_return(config)
|
487
|
+
gem = mock "gem"
|
488
|
+
gem.stub!(:name).and_return "hpricot"
|
489
|
+
gem.stub!(:requirement).and_return Gem::Requirement.new("=0.6")
|
490
|
+
config.stub!(:gems).and_return [gem]
|
491
|
+
end
|
492
|
+
|
493
|
+
config.webxml.booter.should == :rails
|
494
|
+
config.gems.keys.should include(Gem::Dependency.new("hpricot", Gem::Requirement.new("=0.6")))
|
495
|
+
end
|
496
|
+
|
497
|
+
context "with threadsafe! enabled" do
|
498
|
+
before :each do
|
499
|
+
cp "config/environments/production.rb", "config/environments/production.rb.orig"
|
500
|
+
File.open("config/environments/production.rb", "a") {|f| f.puts "", "config.threadsafe!" }
|
501
|
+
end
|
502
|
+
|
503
|
+
after :each do
|
504
|
+
mv "config/environments/production.rb.orig", "config/environments/production.rb"
|
505
|
+
end
|
506
|
+
|
507
|
+
it "sets the jruby min and max runtimes to 1" do
|
508
|
+
config.webxml.booter.should == :rails
|
509
|
+
config.webxml.jruby.min.runtimes.should == 1
|
510
|
+
config.webxml.jruby.max.runtimes.should == 1
|
511
|
+
end
|
512
|
+
|
513
|
+
it "doesn't override already configured runtime numbers" do
|
514
|
+
use_config do |config|
|
515
|
+
config.webxml.jruby.min.runtimes = 2
|
516
|
+
config.webxml.jruby.max.runtimes = 2
|
517
|
+
end
|
518
|
+
config.webxml.jruby.min.runtimes.should == 2
|
519
|
+
config.webxml.jruby.max.runtimes.should == 2
|
520
|
+
end
|
521
|
+
end
|
522
|
+
|
523
|
+
it "adds RAILS_ENV to init.rb" do
|
524
|
+
use_config do |config|
|
525
|
+
config.webxml.booter = :rails
|
526
|
+
end
|
527
|
+
jar.add_init_file(config)
|
528
|
+
contents = jar.contents('META-INF/init.rb')
|
529
|
+
contents.should =~ /ENV\['RAILS_ENV'\]/
|
530
|
+
contents.should =~ /'production'/
|
531
|
+
end
|
532
|
+
end
|
533
|
+
|
534
|
+
context "in a Merb application" do
|
535
|
+
before :each do
|
536
|
+
touch "config/init.rb"
|
537
|
+
@merb = nil
|
538
|
+
task :merb_env do
|
539
|
+
@merb = mock_merb_module
|
540
|
+
end
|
541
|
+
end
|
542
|
+
|
543
|
+
after :each do
|
544
|
+
rm_f "config/init.rb"
|
545
|
+
end
|
546
|
+
|
547
|
+
def mock_merb_module
|
548
|
+
merb = Module.new
|
549
|
+
silence { Object.const_set("Merb", merb) }
|
550
|
+
boot_loader = Module.new
|
551
|
+
merb.const_set("BootLoader", boot_loader)
|
552
|
+
merb.const_set("VERSION", "1.0")
|
553
|
+
dependencies = Class.new do
|
554
|
+
@dependencies = []
|
555
|
+
def self.dependencies
|
556
|
+
@dependencies
|
557
|
+
end
|
558
|
+
def self.dependencies=(deps)
|
559
|
+
@dependencies = deps
|
560
|
+
end
|
561
|
+
end
|
562
|
+
boot_loader.const_set("Dependencies", dependencies)
|
563
|
+
dependencies
|
564
|
+
end
|
565
|
+
|
566
|
+
it "detects a Merb trait" do
|
567
|
+
config.traits.should include(Warbler::Traits::Merb)
|
568
|
+
end
|
569
|
+
|
570
|
+
it "auto-detects a Merb application" do
|
571
|
+
config.webxml.booter.should == :merb
|
572
|
+
config.gems.keys.should_not include("rails")
|
573
|
+
end
|
574
|
+
|
575
|
+
it "automatically adds Merb::BootLoader::Dependencies.dependencies to the list of gems" do
|
576
|
+
task :merb_env do
|
577
|
+
@merb.dependencies = [Gem::Dependency.new("merb-core", ">= 1.0.6.1")]
|
578
|
+
end
|
579
|
+
config.gems.keys.should include(Gem::Dependency.new("merb-core", ">= 1.0.6.1"))
|
580
|
+
end
|
581
|
+
|
582
|
+
it "skips Merb development dependencies" do
|
583
|
+
task :merb_env do
|
584
|
+
@merb.dependencies = [Gem::Dependency.new("rake", "= #{RAKEVERSION}", :development)]
|
585
|
+
end
|
586
|
+
jar.apply(config)
|
587
|
+
file_list(/rake-#{RAKEVERSION}/).should be_empty
|
588
|
+
end
|
589
|
+
|
590
|
+
it "warns about using Merb < 1.0" do
|
591
|
+
task :merb_env do
|
592
|
+
silence { Object.const_set("Merb", Module.new) }
|
593
|
+
end
|
594
|
+
silence { config.webxml.booter.should == :merb }
|
595
|
+
end
|
596
|
+
end
|
597
|
+
|
598
|
+
context "in a Rack application" do
|
599
|
+
before :each do
|
600
|
+
Dir.chdir('tmp')
|
601
|
+
rackup = "run Proc.new {|env| [200, {}, ['Hello World']]}"
|
602
|
+
File.open("config.ru", "w") {|f| f << rackup }
|
603
|
+
end
|
604
|
+
|
605
|
+
it "detects a Rack trait" do
|
606
|
+
config.traits.should include(Warbler::Traits::Rack)
|
607
|
+
end
|
608
|
+
|
609
|
+
it "auto-detects a Rack application with a config.ru file" do
|
610
|
+
jar.apply(config)
|
611
|
+
jar.files['WEB-INF/config.ru'].should == 'config.ru'
|
612
|
+
end
|
613
|
+
|
614
|
+
it "adds RACK_ENV to init.rb" do
|
615
|
+
jar.add_init_file(config)
|
616
|
+
contents = jar.contents('META-INF/init.rb')
|
617
|
+
contents.should =~ /ENV\['RACK_ENV'\]/
|
618
|
+
contents.should =~ /'production'/
|
619
|
+
end
|
620
|
+
end
|
621
|
+
|
622
|
+
it "skips directories that don't exist in config.dirs and print a warning" do
|
623
|
+
use_config do |config|
|
624
|
+
config.dirs = %w(lib notexist)
|
625
|
+
end
|
626
|
+
silence { jar.apply(config) }
|
627
|
+
file_list(%r{WEB-INF/lib}).should_not be_empty
|
628
|
+
file_list(%r{WEB-INF/notexist}).should be_empty
|
629
|
+
end
|
630
|
+
|
631
|
+
it "excludes Warbler's old tmp/war directory by default" do
|
632
|
+
mkdir_p "tmp/war"
|
633
|
+
touch "tmp/war/index.html"
|
634
|
+
use_config do |config|
|
635
|
+
config.dirs += ["tmp"]
|
636
|
+
end
|
637
|
+
jar.apply(config)
|
638
|
+
file_list(%r{WEB-INF/tmp/war/index\.html}).should be_empty
|
639
|
+
end
|
640
|
+
|
641
|
+
it "writes gems to location specified by gem_path" do
|
642
|
+
use_config do |config|
|
643
|
+
config.gem_path = "/WEB-INF/jewels"
|
644
|
+
config.gems << 'rake'
|
645
|
+
end
|
646
|
+
elements = expand_webxml
|
647
|
+
file_list(%r{WEB-INF/jewels}).should_not be_empty
|
648
|
+
elements.to_a(
|
649
|
+
"context-param/param-name[text()='gem.path']"
|
650
|
+
).should_not be_empty
|
651
|
+
elements.to_a(
|
652
|
+
"context-param/param-name[text()='gem.path']/../param-value"
|
653
|
+
).first.text.should == "/WEB-INF/jewels"
|
654
|
+
end
|
655
|
+
|
656
|
+
it "allows adding additional WEB-INF files via config.webinf_files" do
|
657
|
+
File.open("myserver-web.xml", "w") do |f|
|
658
|
+
f << "<web-app></web-app>"
|
659
|
+
end
|
660
|
+
use_config do |config|
|
661
|
+
config.webinf_files = FileList['myserver-web.xml']
|
662
|
+
end
|
663
|
+
jar.apply(config)
|
664
|
+
file_list(%r{WEB-INF/myserver-web.xml}).should_not be_empty
|
665
|
+
end
|
666
|
+
|
667
|
+
it "allows expanding of additional WEB-INF files via config.webinf_files" do
|
668
|
+
File.open("myserver-web.xml.erb", "w") do |f|
|
669
|
+
f << "<web-app><%= webxml.rails.env %></web-app>"
|
670
|
+
end
|
671
|
+
use_config do |config|
|
672
|
+
config.webinf_files = FileList['myserver-web.xml.erb']
|
673
|
+
end
|
674
|
+
jar.apply(config)
|
675
|
+
file_list(%r{WEB-INF/myserver-web.xml}).should_not be_empty
|
676
|
+
jar.contents('WEB-INF/myserver-web.xml').should =~ /web-app.*production/
|
677
|
+
end
|
678
|
+
|
679
|
+
it "excludes test files in gems according to config.gem_excludes" do
|
680
|
+
use_config do |config|
|
681
|
+
config.gem_excludes += [/^(test|spec)\//]
|
682
|
+
end
|
683
|
+
jar.apply(config)
|
684
|
+
file_list(%r{WEB-INF/gems/gems/rake([^/]+)/test/test_rake.rb}).should be_empty
|
685
|
+
end
|
686
|
+
|
687
|
+
it "creates a META-INF/init.rb file with startup config" do
|
688
|
+
jar.apply(config)
|
689
|
+
file_list(%r{META-INF/init.rb}).should_not be_empty
|
690
|
+
end
|
691
|
+
|
692
|
+
it "allows adjusting the init file location in the war" do
|
693
|
+
use_config do |config|
|
694
|
+
config.init_filename = 'WEB-INF/init.rb'
|
695
|
+
end
|
696
|
+
jar.add_init_file(config)
|
697
|
+
file_list(%r{WEB-INF/init.rb}).should_not be_empty
|
698
|
+
end
|
699
|
+
|
700
|
+
it "allows adding custom files' contents to init.rb" do
|
701
|
+
use_config do |config|
|
702
|
+
config.init_contents << "Rakefile"
|
703
|
+
end
|
704
|
+
jar.add_init_file(config)
|
705
|
+
contents = jar.contents('META-INF/init.rb')
|
706
|
+
contents.should =~ /require 'rake'/
|
707
|
+
end
|
708
|
+
|
709
|
+
it "does not have escaped HTML in WARBLER_CONFIG" do
|
710
|
+
use_config do |config|
|
711
|
+
config.webxml.dummy = '<dummy/>'
|
712
|
+
end
|
713
|
+
jar.apply(config)
|
714
|
+
jar.contents('META-INF/init.rb').should =~ /<dummy\/>/
|
715
|
+
end
|
716
|
+
end
|
717
|
+
end
|
718
|
+
|