warbler 1.0.3 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,147 +1,167 @@
1
+ == 1.1.0
2
+
3
+ - Add concept of "features" -- small Rake tasks that run before the
4
+ creation of the war file and make manipulations to the war file
5
+ structure.
6
+ - Add 'gemjar' feature: Bundle all gems into a gems.jar to reduce the
7
+ number of files in the archive (mostly useful for Google AppEngine).
8
+ Usage: run "warble gemjar war" or set config.features = %w(gemjar) in
9
+ warble.rb to use this feature.
10
+ - Add 'executable' feature: Bundle an embedded web server in the war
11
+ file so that the entire application can be run as
12
+ 'java -jar myapp.war'.
13
+ Usage: run "warble executable war" or set config.features = %w(executable)
14
+ in warble.rb to use this feature.
15
+ To see embedded webserver options, add '--help' to the 'java -jar'
16
+ command line.
17
+ - No longer embed config.ru in web.xml as 'rackup' parameter by
18
+ default. Instead, config.ru is included in the war file.
19
+ - Bump jruby-rack version requirement to 0.9.8.
20
+
1
21
  == 1.0.3
2
22
 
3
- * Tracking recent Bundler changes - handle locked Gemfiles differently
23
+ - Tracking recent Bundler changes - handle locked Gemfiles differently
4
24
  than unlocked ones
5
- * Handle file-based symlinks, and warn about inoperational directory
25
+ - Handle file-based symlinks, and warn about inoperational directory
6
26
  symlinks under non-JRuby versions of Ruby.
7
27
 
8
28
  == 1.0.2
9
29
 
10
- * Add 'warble pluginize' task back. This task now just creates a
30
+ - Add 'warble pluginize' task back. This task now just creates a
11
31
  vendor/plugins/warbler/tasks/warbler.rake file. There's no need to
12
32
  "vendor" all of Warbler into your application anymore.
13
33
 
14
34
  == 1.0.1
15
35
 
16
- * Fix careless bug where Warbler doesn't work with JRuby 1.4
36
+ - Fix careless bug where Warbler doesn't work with JRuby 1.4
17
37
 
18
38
  == 1.0
19
39
 
20
- * Warbler hits 1.0! There are enough structural changes in Warbler
40
+ - Warbler hits 1.0! There are enough structural changes in Warbler
21
41
  that I feel it's time to roll the major version over to 1.0.
22
- * Add support for Bundler. Detect Gemfiles, make sure gems are
42
+ - Add support for Bundler. Detect Gemfiles, make sure gems are
23
43
  included in the war file and rewrite .bundle/environment.rb inside
24
44
  the war file.
25
- * Warbler now uses RubyZip to create the war file in-place, without
45
+ - Warbler now uses RubyZip to create the war file in-place, without
26
46
  copying files to a tmp/war staging area. When run in JRuby it uses a
27
47
  Java ZipOutputStream for a modest performance boost.
28
- * Add config option to allow override of gem_home (Daniel Harrington).
29
- * Stop bundling jruby-rack, as promised.
30
- * WARBLER-3: don't add from Rails config.gems if they are frozen
31
- * WARBLER-7: Add config.webinf_files option with more support for
48
+ - Add config option to allow override of gem_home (Daniel Harrington).
49
+ - Stop bundling jruby-rack, as promised.
50
+ - WARBLER-3: don't add from Rails config.gems if they are frozen
51
+ - WARBLER-7: Add config.webinf_files option with more support for
32
52
  custom web.xml files
33
53
 
34
54
  == 0.9.14
35
55
 
36
- * So, jruby-rack is bundled for one more release. 1.0 will not contain
56
+ - So, jruby-rack is bundled for one more release. 1.0 will not contain
37
57
  any jar files, I promise!
38
- * Upgraded jruby-rack to 0.9.5.
39
- * Unbundled jruby-complete jar in favor of new jruby-jars gem, which
58
+ - Upgraded jruby-rack to 0.9.5.
59
+ - Unbundled jruby-complete jar in favor of new jruby-jars gem, which
40
60
  can be upgraded separately.
41
- * Skip gems which have no loaded_from attribute set
61
+ - Skip gems which have no loaded_from attribute set
42
62
  (this happened with the Authlogic gem on Edge Rails)
43
63
  (thanks Laszlo Bacsi)
44
64
 
45
65
  == 0.9.13
46
66
 
47
- * RailsConf 2009 edition.
48
- * Only bundled JRuby and JRuby-Rack upgrades. Bug fixes will have to come in 0.9.14.
49
- * This should also be the last release with bundled JRuby and JRuby-Rack.
50
- * Upgrade to JRuby 1.3.0RC1 and JRuby-Rack 0.9.4. The latter allows
67
+ - RailsConf 2009 edition.
68
+ - Only bundled JRuby and JRuby-Rack upgrades. Bug fixes will have to come in 0.9.14.
69
+ - This should also be the last release with bundled JRuby and JRuby-Rack.
70
+ - Upgrade to JRuby 1.3.0RC1 and JRuby-Rack 0.9.4. The latter allows
51
71
  Rails 2.3 to work with Warbler.
52
72
 
53
73
  == 0.9.12
54
74
 
55
- * Allow framework auto-detection to be disabled. Set
56
- `Warbler.framework_detection = false` at the top of config/warble.rb
75
+ - Allow framework auto-detection to be disabled. Set
76
+ `Warbler.framework_detection = false' at the top of config/warble.rb
57
77
  or uncomment the line from a newly generated config.
58
- * Add configuration option to set manifest file (thanks Tommy McGuire)
59
- * Mitigate RubyGems 1.3 compatibility issue (thanks Jens Norrgrann)
60
- * Add experimental `war:exploded` task. This allows you to deploy your
78
+ - Add configuration option to set manifest file (thanks Tommy McGuire)
79
+ - Mitigate RubyGems 1.3 compatibility issue (thanks Jens Norrgrann)
80
+ - Add experimental `war:exploded` task. This allows you to deploy your
61
81
  application in an exploded mode, thus allowing continual development
62
82
  without re-warring and re-deploying. Feedback is appreciated if you
63
83
  try this feature; it may not work in all application servers and for
64
84
  applications other than Rails.
65
- * Handle Rails gem dependencies better (thanks Laszlo Bacsi)
66
- * Auto-detect Merb dependencies (Merb >= 1.0 only). Please give
85
+ - Handle Rails gem dependencies better (thanks Laszlo Bacsi)
86
+ - Auto-detect Merb dependencies (Merb >= 1.0 only). Please give
67
87
  feedback if you try Warbler with a Merb 1.0 app.
68
- * Ignore gem development dependencies
69
- * Upgrade to JRuby 1.1.6 and JRuby-Rack 0.9.3
88
+ - Ignore gem development dependencies
89
+ - Upgrade to JRuby 1.1.6 and JRuby-Rack 0.9.3
70
90
 
71
91
  == 0.9.11
72
92
 
73
- * Auto-detect Rails and Merb and configure appropriately
93
+ - Auto-detect Rails and Merb and configure appropriately
74
94
  - For Rails, set rails booter, determine max runtimes based on Rails.configuration.threadsafe!,
75
95
  add Rails gem, detect Rails version, set gems to be packaged based on
76
96
  Rails.configuration.gems if available
77
97
  - Rails gems only added if Rails application detected
78
98
  - For Merb, set merb booter automatically
79
- * Auto-detect config.ru rackup script and pass it into config.webxml.rackup
80
- * rails.env now commented by default in config/warble.rb and internally default
99
+ - Auto-detect config.ru rackup script and pass it into config.webxml.rackup
100
+ - rails.env now commented by default in config/warble.rb and internally default
81
101
  the value to 'production'
82
- * Default directories in config.dirs to only those that are found to be present
83
- * Allow config.gems array to contain regexps and Gem::Dependency objects as well
102
+ - Default directories in config.dirs to only those that are found to be present
103
+ - Allow config.gems array to contain regexps and Gem::Dependency objects as well
84
104
  (assist from Jani Soila)
85
- * Fix bug ensuring you can += and -= for config.gems
86
- * Upgrade to JRuby 1.1.4 and JRuby-Rack 0.9.2
87
- * add [] as a way to specify non-identifier keys, example: config.webxml['!@#$%^'] = 'haha'
105
+ - Fix bug ensuring you can += and -= for config.gems
106
+ - Upgrade to JRuby 1.1.4 and JRuby-Rack 0.9.2
107
+ - add [] as a way to specify non-identifier keys, example: config.webxml['!@#$%^'] = 'haha'
88
108
 
89
109
  == 0.9.10
90
110
 
91
- * Upgraded to JRuby-Rack 0.9.1. Fixes JRUBY-2620, JRUBY-2594, JRUBY-2507.
92
- * Now verified to work with Camping and Sinatra. See
111
+ - Upgraded to JRuby-Rack 0.9.1. Fixes JRUBY-2620, JRUBY-2594, JRUBY-2507.
112
+ - Now verified to work with Camping and Sinatra. See
93
113
  http://github.com/nicksieger/jruby-rack/tree/master/examples for examples
94
114
  of how to configure Warbler to package your Camping and Sinatra apps.
95
- * Upgraded to JRuby 1.1.3.
96
- * Log files are no longer packaged in the .war file.
97
- * Fix #<Warbler::WebxmlOpenStruct ...> appearing in web.xml and document workarounds.
98
- * Add config.autodeploy_dir that, when specified, will create the war there.
115
+ - Upgraded to JRuby 1.1.3.
116
+ - Log files are no longer packaged in the .war file.
117
+ - Fix #<Warbler::WebxmlOpenStruct ...> appearing in web.xml and document workarounds.
118
+ - Add config.autodeploy_dir that, when specified, will create the war there.
99
119
 
100
120
  == 0.9.9
101
121
 
102
- * Now shipping with JRuby-Rack 0.9!
103
- * Upgrade to JRuby 1.1.1
104
- * warble.rb and web.xml.erb have changed as a result of the change to JRuby-Rack -- we
122
+ - Now shipping with JRuby-Rack 0.9!
123
+ - Upgrade to JRuby 1.1.1
124
+ - warble.rb and web.xml.erb have changed as a result of the change to JRuby-Rack -- we
105
125
  recommend comparing the new base copies with any existing configuration you have to
106
126
  make sure you pick up the differences.
107
- * Config changes:
108
- ** config.webxml.booter chooses what kind of application to use (:rails, :merb or plain :rack).
109
- ** config.webxml.pool.* have been replaced by config.webxml.jruby.(min|max).runtimes
110
- ** config.webxml.standalone and config.webxml.jruby_home no longer have any effect.
127
+ - Config changes:
128
+ -- config.webxml.booter chooses what kind of application to use (:rails, :merb or plain :rack).
129
+ -- config.webxml.pool.* have been replaced by config.webxml.jruby.(min|max).runtimes
130
+ -- config.webxml.standalone and config.webxml.jruby_home no longer have any effect.
111
131
 
112
132
  == 0.9.5
113
133
 
114
- * Fix bug in plugin warbler.rake task file that would favor loading warbler from gems before the version
134
+ - Fix bug in plugin warbler.rake task file that would favor loading warbler from gems before the version
115
135
  installed as a plugin
116
- * Upgrade to JRuby 1.1 final and Goldspike 1.6.1
136
+ - Upgrade to JRuby 1.1 final and Goldspike 1.6.1
117
137
 
118
138
  == 0.9.4
119
139
 
120
- * Update bundled JRuby to 1.1RC3 and Goldspike to 1.6.
121
- * Fix inclusion of gems with platform-specific bits (e.g., Hpricot)
140
+ - Update bundled JRuby to 1.1RC3 and Goldspike to 1.6.
141
+ - Fix inclusion of gems with platform-specific bits (e.g., Hpricot)
122
142
 
123
143
  == 0.9.3
124
144
 
125
- * Update bundled JRuby to 1.1RC2, and Goldspike to 1.5.
126
- * The bundled JRuby and Goldspike now require JDK 5 or greater. If you wish to use JDK 1.4, use Warbler 0.9.2.
145
+ - Update bundled JRuby to 1.1RC2, and Goldspike to 1.5.
146
+ - The bundled JRuby and Goldspike now require JDK 5 or greater. If you wish to use JDK 1.4, use Warbler 0.9.2.
127
147
 
128
148
  == 0.9.2
129
149
 
130
- * Update bundled JRuby to version 1.0.3 and Goldspike 1.4.
131
- * Add config.java_classes to allow you to copy loose Java classes into WEB-INF/classes.
132
- * Make jar command a single command string so that jar creation doesn't fail (works around bug in JRuby 1.0.2)
133
- * Use File.join to form staging directory, should produce the proper jar-command path in Windows
150
+ - Update bundled JRuby to version 1.0.3 and Goldspike 1.4.
151
+ - Add config.java_classes to allow you to copy loose Java classes into WEB-INF/classes.
152
+ - Make jar command a single command string so that jar creation doesn't fail (works around bug in JRuby 1.0.2)
153
+ - Use File.join to form staging directory, should produce the proper jar-command path in Windows
134
154
 
135
155
  == 0.9.1
136
156
 
137
- * Add rake >= 0.7.3 as a dependency in the gem specification.
138
- * Add debug tasks: war:debug, war:debug:gems, war:debug:public, war:debug:app, war:debug:includes,
157
+ - Add rake >= 0.7.3 as a dependency in the gem specification.
158
+ - Add debug tasks: war:debug, war:debug:gems, war:debug:public, war:debug:app, war:debug:includes,
139
159
  war:debug:excludes, war:debug:java_libs gives you a breakdown of what Warbler expects to package.
140
160
 
141
161
  == 0.9
142
162
 
143
- * Birthday! Warbler is a gem to make a .war file out of a Rails project. The intent is to provide a
163
+ - Birthday! Warbler is a gem to make a .war file out of a Rails project. The intent is to provide a
144
164
  minimal, flexible, ruby-like way to bundle up all of your application files for deployment to a
145
165
  Java application server.
146
- * Bundled versions: goldspike-1.4-SNAPSHOT and jruby-complete-1.0.1
147
- * Works as both a gem (rake application) or a plugin
166
+ - Bundled versions: goldspike-1.4-SNAPSHOT and jruby-complete-1.0.1
167
+ - Works as both a gem (rake application) or a plugin
data/Manifest.txt CHANGED
@@ -5,6 +5,7 @@ Manifest.txt
5
5
  README.txt
6
6
  Rakefile
7
7
  bin/warble
8
+ ext/Main.java
8
9
  ext/WarblerWar.java
9
10
  ext/WarblerWarService.java
10
11
  lib/warbler
data/README.txt CHANGED
@@ -13,7 +13,7 @@ to assemble and Just Work.
13
13
 
14
14
  1. Install the gem: <tt>gem install warbler</tt>.
15
15
  2. Run warbler in the top directory of your Rails application: <tt>warble</tt>.
16
- 3. Deploy your railsapp.war file to your favorite Java application server.
16
+ 3. Deploy your myapp.war file to your favorite Java application server.
17
17
 
18
18
  == Usage
19
19
 
@@ -21,11 +21,14 @@ Warbler's +warble+ command is just a small wrapper around Rake with internally
21
21
  defined tasks.
22
22
 
23
23
  $ warble -T
24
- warble config # Generate a configuration file to customize your war assembly
25
- warble version # Display version of warbler
26
- warble war # Create the project .war file
27
- warble war:clean # Remove the .war file
28
- warble war:debug # Dump diagnostic information
24
+ warble config # Generate a configuration file to customize your war
25
+ warble executable # Feature: make an executable archive
26
+ warble gemjar # Feature: package gem repository inside a jar
27
+ warble pluginize # Install Warbler tasks in your Rails application
28
+ warble version # Display version of Warbler
29
+ warble war # Create the project .war file
30
+ warble war:clean # Remove the .war file
31
+ warble war:debug # Dump diagnostic information
29
32
 
30
33
  If you'd like to control Warbler from your own project's Rakefile,
31
34
  simply add the following code somewhere in the Rakefile:
@@ -35,6 +38,31 @@ simply add the following code somewhere in the Rakefile:
35
38
 
36
39
  Now you should be able to invoke "rake war" to create your war file.
37
40
 
41
+ == Features
42
+
43
+ Warbler "features" are small Rake tasks that run before the creation
44
+ of the war file and make manipulations to the war file structure.
45
+
46
+ You can either add features to the warbler command line:
47
+
48
+ warble FEATURE war
49
+
50
+ or configure them in config/warble.rb to always be used.
51
+
52
+ config.features = %w(FEATURE)
53
+
54
+ Currently, two features are available.
55
+
56
+ * +gemjar+: This bundles all gems into a single gem file to reduce the
57
+ number of files in the .war. This is mostly useful for Google
58
+ AppEngine where the number of files per application has a limit.
59
+ * +executable+: This bundles an embedded web server into the .war so
60
+ that it can either be deployed into a traditional java web server or
61
+ run as a standalone application using 'java -jar myapp.war'.
62
+
63
+ Features may form the basis for a third-party plugin system in the
64
+ future if there is demand.
65
+
38
66
  == Configuration
39
67
 
40
68
  === Bundler
@@ -62,10 +90,11 @@ dependencies are packaged.
62
90
 
63
91
  === Other Rack-based applications
64
92
 
65
- If you have a 'config.ru' file in the top directory of your application, its
66
- contents will be used as the rackup script for your Rack-based application.
67
- You will probably need to specify framework and application gems in
68
- config/warble.rb.
93
+ If you have a 'config.ru' file in the top directory or one of the
94
+ immediate subdirectories of your application, it will be included and
95
+ used as the rackup script for your Rack-based application. You will
96
+ probably need to specify framework and application gems in
97
+ config/warble.rb unless you're using Bundler to manage your gems.
69
98
 
70
99
  See {the examples in the jruby-rack project}[http://github.com/nicksieger/jruby-rack/tree/master/examples/]
71
100
  of how to configure Warbler to package Camping and Sinatra apps.
data/Rakefile CHANGED
@@ -33,7 +33,7 @@ begin
33
33
  p.summary = "Warbler chirpily constructs .war files of your Rails applications."
34
34
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
35
35
  p.description = p.paragraphs_of('README.txt', 1...2).join("\n\n")
36
- p.extra_deps += [['rake', '>= 0.8.7'], ['jruby-jars', '>= 1.4.0'], ['jruby-rack', '>= 0.9.7'], ['rubyzip', '>= 0.9.4']]
36
+ p.extra_deps += [['rake', '>= 0.8.7'], ['jruby-jars', '>= 1.4.0'], ['jruby-rack', '>= 0.9.8'], ['rubyzip', '>= 0.9.4']]
37
37
  p.clean_globs += ['spec/sample/MANIFEST*', 'spec/sample/web.xml*']
38
38
  end
39
39
  hoe.spec.files = MANIFEST
data/ext/Main.java ADDED
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Copyright (c) 2010 Engine Yard, Inc.
3
+ * This source code is available under the MIT license.
4
+ * See the file LICENSE.txt for details.
5
+ */
6
+
7
+ import java.net.URLClassLoader;
8
+ import java.net.URL;
9
+ import java.lang.reflect.Method;
10
+ import java.io.IOException;
11
+ import java.io.InputStream;
12
+ import java.io.File;
13
+ import java.io.FileOutputStream;
14
+ import java.util.Arrays;
15
+
16
+ public class Main implements Runnable {
17
+ public static final String MAIN = "/" + Main.class.getName().replace('.', '/') + ".class";
18
+ public static final String WINSTONE_JAR = "/WEB-INF/winstone.jar";
19
+
20
+ private String[] args;
21
+ private String path, warfile;
22
+ private boolean debug;
23
+ private File webroot;
24
+
25
+ public Main(String[] args) throws Exception {
26
+ this.args = args;
27
+ URL mainClass = getClass().getResource(MAIN);
28
+ this.path = mainClass.toURI().getSchemeSpecificPart();
29
+ this.warfile = mainClass.getFile().replace("!" + MAIN, "").replace("file:", "");
30
+ this.debug = isDebug();
31
+ this.webroot = File.createTempFile("winstone", "webroot");
32
+ this.webroot.delete();
33
+ this.webroot.mkdirs();
34
+ this.webroot = new File(this.webroot, new File(warfile).getName());
35
+ Runtime.getRuntime().addShutdownHook(new Thread(this));
36
+ }
37
+
38
+ private URL extractWinstone() throws Exception {
39
+ InputStream jarStream = new URL("jar:" + path.replace(MAIN, WINSTONE_JAR)).openStream();
40
+ File jarFile = File.createTempFile("winstone", ".jar");
41
+ jarFile.deleteOnExit();
42
+ FileOutputStream outStream = new FileOutputStream(jarFile);
43
+ try {
44
+ byte[] buf = new byte[4096];
45
+ int bytesRead = 0;
46
+ while ((bytesRead = jarStream.read(buf)) != -1) {
47
+ outStream.write(buf, 0, bytesRead);
48
+ }
49
+ } finally {
50
+ jarStream.close();
51
+ outStream.close();
52
+ }
53
+ debug("winstone.jar extracted to " + jarFile.getPath());
54
+ return jarFile.toURI().toURL();
55
+ }
56
+
57
+ private void launchWinstone(URL jar) throws Exception {
58
+ URLClassLoader loader = new URLClassLoader(new URL[] {jar});
59
+ Class klass = Class.forName("winstone.Launcher", true, loader);
60
+ Method main = klass.getDeclaredMethod("main", new Class[] {String[].class});
61
+ String[] newargs = new String[args.length + 2];
62
+ newargs[0] = "--warfile=" + warfile;
63
+ newargs[1] = "--webroot=" + webroot;
64
+ System.arraycopy(args, 0, newargs, 2, args.length);
65
+ debug("invoking Winstone with: " + Arrays.deepToString(newargs));
66
+ main.invoke(null, new Object[] {newargs});
67
+ }
68
+
69
+ private void start() throws Exception {
70
+ URL u = extractWinstone();
71
+ launchWinstone(u);
72
+ }
73
+
74
+ private void debug(String msg) {
75
+ if (debug) {
76
+ System.out.println(msg);
77
+ }
78
+ }
79
+
80
+ private void delete(File f) {
81
+ if (f.isDirectory()) {
82
+ File[] children = f.listFiles();
83
+ for (int i = 0; i < children.length; i++) {
84
+ delete(children[i]);
85
+ }
86
+ }
87
+ f.delete();
88
+ }
89
+
90
+ public void run() {
91
+ delete(webroot.getParentFile());
92
+ }
93
+
94
+ public static void main(String[] args) {
95
+ try {
96
+ new Main(args).start();
97
+ } catch (Exception e) {
98
+ System.err.println("error: " + e.toString());
99
+ if (isDebug()) {
100
+ e.printStackTrace();
101
+ }
102
+ System.exit(1);
103
+ }
104
+ }
105
+
106
+ private static boolean isDebug() {
107
+ return System.getProperty("warbler.debug") != null;
108
+ }
109
+ }
110
+
@@ -26,38 +26,20 @@ class Warbler::Application < Rake::Application
26
26
 
27
27
  task :default => :war
28
28
 
29
- desc "Generate a configuration file to customize your war assembly"
30
- task :config do
31
- if File.exists?(Warbler::Config::FILE) && ENV["FORCE"].nil?
32
- puts "There's another bird sitting on my favorite branch"
33
- puts "(file '#{Warbler::Config::FILE}' already exists. Pass argument FORCE=1 to override)"
34
- elsif !File.directory?("config")
35
- puts "I'm confused; my favorite branch is missing"
36
- puts "(directory 'config' is missing)"
37
- else
38
- cp "#{Warbler::WARBLER_HOME}/warble.rb", Warbler::Config::FILE
39
- end
40
- end
29
+ desc "Generate a configuration file to customize your war"
30
+ task :config => "war:config"
41
31
 
42
- desc "Install Warbler tasks in your Rails application for use by Rake"
43
- task :pluginize do
44
- if !Dir["vendor/plugins/warbler*"].empty? && ENV["FORCE"].nil?
45
- puts "I found an old nest in vendor/plugins; please trash it so I can make a new one"
46
- puts "(directory vendor/plugins/warbler* exists)"
47
- else
48
- rm_rf FileList["vendor/plugins/warbler*"], :verbose => false
49
- mkdir_p "vendor/plugins/warbler/tasks"
50
- File.open("vendor/plugins/warbler/tasks/warbler.rake", "w") do |f|
51
- f.puts "require 'warbler'"
52
- f.puts "Warbler::Task.new"
53
- end
54
- end
55
- end
32
+ desc "Install Warbler tasks in your Rails application"
33
+ task :pluginize => "war:pluginize"
34
+
35
+ desc "Feature: package gem repository inside a jar"
36
+ task :gemjar => "war:gemjar"
37
+
38
+ desc "Feature: make an executable archive"
39
+ task :executable => "war:executable"
56
40
 
57
41
  desc "Display version of Warbler"
58
- task :version do
59
- puts "Warbler version #{Warbler::VERSION}"
60
- end
42
+ task :version => "war:version"
61
43
  end
62
44
 
63
45
  # Loads the project Rakefile in a separate application
@@ -15,17 +15,15 @@ module Warbler
15
15
  DEFAULT_GEM_PATH = '/WEB-INF/gems'
16
16
  BUILD_GEMS = %w(warbler rake rcov)
17
17
 
18
+ # Features: additional options controlling how the jar is built.
19
+ # Currently the following features are supported:
20
+ # - gemjar: package the gem repository in a jar file in WEB-INF/lib
21
+ # - executable: embed a web server and make the war executable
22
+ attr_accessor :features
23
+
18
24
  # Deprecated: No longer has any effect.
19
25
  attr_accessor :staging_dir
20
26
 
21
- # A hash of files that Warbler will build into the .war file. Keys
22
- # to the hash are filenames in the .war, values are either nil
23
- # (for a directory entry), the source filenames or IO objects for
24
- # temporary file contents. This will be filled with files by the
25
- # various Warbler tasks as they run. You can add arbitrary
26
- # filenames to this hash if you wish.
27
- attr_accessor :files
28
-
29
27
  # Directory where the war file will be written. Can be used to direct
30
28
  # Warbler to place your war file directly in your application server's
31
29
  # autodeploy directory. Defaults to the root of the Rails directory.
@@ -113,6 +111,7 @@ module Warbler
113
111
 
114
112
  def initialize(warbler_home = WARBLER_HOME)
115
113
  @warbler_home = warbler_home
114
+ @features = []
116
115
  @dirs = TOP_DIRS.select {|d| File.directory?(d)}
117
116
  @includes = FileList[]
118
117
  @excludes = FileList[]
@@ -284,9 +283,9 @@ module Warbler
284
283
  end
285
284
 
286
285
  def auto_detect_rackup
287
- return false unless File.exist?("config.ru")
286
+ return false unless File.exist?("config.ru") || !Dir['*/config.ru'].empty?
288
287
  @webxml.booter = :rack
289
- @webxml.rackup = File.read("config.ru")
288
+ @webinf_files += [FileList['config.ru', '*/config.ru'].detect {|f| File.exist?(f)}]
290
289
  true
291
290
  end
292
291
  end
data/lib/warbler/task.rb CHANGED
@@ -60,15 +60,29 @@ module Warbler
60
60
  namespace name do
61
61
  define_clean_task
62
62
  define_files_task
63
- define_gemjar_task
64
63
  define_jar_task
65
64
  define_debug_task
65
+ define_gemjar_task
66
+ define_config_task
67
+ define_pluginize_task
68
+ define_executable_task
69
+ define_version_task
66
70
  end
67
71
  end
68
72
 
69
73
  def define_main_task
70
74
  desc "Create the project .war file"
71
75
  task @name do
76
+ unless @config.features.empty?
77
+ @config.features.each do |feature|
78
+ t = "#@name:#{feature}"
79
+ unless Rake.application.lookup(t)
80
+ warn "unknown feature `#{feature}', ignoring"
81
+ next
82
+ end
83
+ Rake::Task[t].invoke
84
+ end
85
+ end
72
86
  # Invoke this way so custom dependencies can be defined before
73
87
  # the file find routine is run
74
88
  ["#{@name}:files", "#{@name}:jar"].each do |t|
@@ -91,21 +105,6 @@ module Warbler
91
105
  end
92
106
  end
93
107
 
94
- def define_gemjar_task
95
- gem_jar = Warbler::War.new
96
- task "gemjar" => "files" do
97
- gem_path = Regexp::quote(config.relative_gem_path)
98
- gems = war.files.select{|k,v| k =~ %r{#{gem_path}/} }
99
- gems.each do |k,v|
100
- gem_jar.files[k.sub(%r{#{gem_path}/}, '')] = v
101
- end
102
- war.files["WEB-INF/lib/gems.jar"] = "tmp/gems.jar"
103
- war.files.reject!{|k,v| k =~ /#{gem_path}/ }
104
- mkdir_p "tmp"
105
- gem_jar.create("tmp/gems.jar")
106
- end
107
- end
108
-
109
108
  def define_jar_task
110
109
  task "jar" do
111
110
  war.create(config)
@@ -128,5 +127,91 @@ module Warbler
128
127
  puts *war.webinf_filelist.exclude
129
128
  end
130
129
  end
130
+
131
+ def define_gemjar_task
132
+ task "gemjar" do
133
+ task "#@name:jar" => "#@name:make_gemjar"
134
+ end
135
+
136
+ gem_jar = Warbler::War.new
137
+ task "make_gemjar" => "files" do
138
+ gem_path = Regexp::quote(config.relative_gem_path)
139
+ gems = war.files.select{|k,v| k =~ %r{#{gem_path}/} }
140
+ gems.each do |k,v|
141
+ gem_jar.files[k.sub(%r{#{gem_path}/}, '')] = v
142
+ end
143
+ war.files["WEB-INF/lib/gems.jar"] = "tmp/gems.jar"
144
+ war.files.reject!{|k,v| k =~ /#{gem_path}/ }
145
+ mkdir_p "tmp"
146
+ gem_jar.add_manifest
147
+ gem_jar.create("tmp/gems.jar")
148
+ end
149
+ end
150
+
151
+ def define_config_task
152
+ task "config" do
153
+ if File.exists?(Warbler::Config::FILE) && ENV["FORCE"].nil?
154
+ puts "There's another bird sitting on my favorite branch"
155
+ puts "(file '#{Warbler::Config::FILE}' already exists. Pass argument FORCE=1 to override)"
156
+ elsif !File.directory?("config")
157
+ puts "I'm confused; my favorite branch is missing"
158
+ puts "(directory 'config' is missing)"
159
+ else
160
+ cp "#{Warbler::WARBLER_HOME}/warble.rb", Warbler::Config::FILE
161
+ end
162
+ end
163
+ end
164
+
165
+ def define_pluginize_task
166
+ task "pluginize" do
167
+ if !Dir["vendor/plugins/warbler*"].empty? && ENV["FORCE"].nil?
168
+ puts "I found an old nest in vendor/plugins; please trash it so I can make a new one"
169
+ puts "(directory vendor/plugins/warbler* exists)"
170
+ else
171
+ rm_rf FileList["vendor/plugins/warbler*"], :verbose => false
172
+ mkdir_p "vendor/plugins/warbler/tasks"
173
+ File.open("vendor/plugins/warbler/tasks/warbler.rake", "w") do |f|
174
+ f.puts "require 'warbler'"
175
+ f.puts "Warbler::Task.new"
176
+ end
177
+ end
178
+ end
179
+ end
180
+
181
+ def define_executable_task
182
+ winstone_type = ENV["WINSTONE"] || "winstone-lite"
183
+ winstone_version = ENV["WINSTONE_VERSION"] || "0.9.10"
184
+ winstone_path = "net/sourceforge/winstone/#{winstone_type}/#{winstone_version}/#{winstone_type}-#{winstone_version}.jar"
185
+ winstone_jar = File.expand_path("~/.m2/repository/#{winstone_path}")
186
+ file winstone_jar do |t|
187
+ # Not always covered in tests as these lines may not get
188
+ # executed every time if the jar is cached.
189
+ puts "Downloading #{winstone_type}.jar" #:nocov:
190
+ mkdir_p File.dirname(t.name) #:nocov:
191
+ require 'open-uri' #:nocov:
192
+ maven_repo = ENV["MAVEN_REPO"] || "http://repo2.maven.org/maven2" #:nocov:
193
+ open("#{maven_repo}/#{winstone_path}") do |stream| #:nocov:
194
+ File.open(t.name, "wb") do |f| #:nocov:
195
+ while buf = stream.read(4096) #:nocov:
196
+ f << buf #:nocov:
197
+ end #:nocov:
198
+ end #:nocov:
199
+ end #:nocov:
200
+ end
201
+
202
+ task "executable" => winstone_jar do
203
+ war.files['META-INF/MANIFEST.MF'] = StringIO.new(War::DEFAULT_MANIFEST.chomp + "Main-Class: Main\n")
204
+ war.files['Main.class'] = Zip::ZipFile.open("#{WARBLER_HOME}/lib/warbler_war.jar") do |zf|
205
+ zf.get_input_stream('Main.class') {|io| StringIO.new(io.read) }
206
+ end
207
+ war.files['WEB-INF/winstone.jar'] = winstone_jar
208
+ end
209
+ end
210
+
211
+ def define_version_task
212
+ task "version" do
213
+ puts "Warbler version #{Warbler::VERSION}"
214
+ end
215
+ end
131
216
  end
132
217
  end
@@ -6,5 +6,5 @@
6
6
  #++
7
7
 
8
8
  module Warbler
9
- VERSION = "1.0.3"
9
+ VERSION = "1.1.0"
10
10
  end
data/lib/warbler/war.rb CHANGED
@@ -1,3 +1,5 @@
1
+ require 'zip/zip'
2
+
1
3
  module Warbler
2
4
  # Class that holds the files that will be stored in the war file.
3
5
  # The #files attribute contains a hash of pathnames inside the war
@@ -6,6 +8,8 @@ module Warbler
6
8
  # * Any object responding to +read+ representing an in-memory blob
7
9
  # * A String filename pointing to a file on disk
8
10
  class War
11
+ DEFAULT_MANIFEST = %{Manifest-Version: 1.0\nCreated-By: Warbler #{Warbler::VERSION}\n\n}
12
+
9
13
  attr_reader :files
10
14
  attr_reader :webinf_filelist
11
15
 
@@ -56,11 +60,13 @@ module Warbler
56
60
  end
57
61
 
58
62
  # Add a manifest file either from config or by making a default manifest.
59
- def add_manifest(config)
60
- if config.manifest_file
61
- @files['META-INF/MANIFEST.MF'] = config.manifest_file
62
- else
63
- @files['META-INF/MANIFEST.MF'] = StringIO.new(%{Manifest-Version: 1.0\nCreated-By: Warbler #{VERSION}\n\n})
63
+ def add_manifest(config = nil)
64
+ unless @files.keys.detect{|k| k =~ /^META-INF\/MANIFEST\.MF$/i}
65
+ if config && config.manifest_file
66
+ @files['META-INF/MANIFEST.MF'] = config.manifest_file
67
+ else
68
+ @files['META-INF/MANIFEST.MF'] = StringIO.new(DEFAULT_MANIFEST)
69
+ end
64
70
  end
65
71
  end
66
72
 
data/lib/warbler.rb CHANGED
@@ -28,10 +28,10 @@ module Warbler
28
28
  self.framework_detection = true
29
29
  end
30
30
 
31
+ require 'warbler/version'
31
32
  require 'warbler/gems'
32
33
  require 'warbler/config'
33
34
  require 'warbler/war'
34
35
  require 'warbler/task'
35
36
  require 'warbler/application'
36
37
  require 'warbler/runtime'
37
- require 'warbler/version'
data/lib/warbler_war.jar CHANGED
Binary file
@@ -77,7 +77,6 @@ describe Warbler::Application do
77
77
 
78
78
  it "should define a pluginize task for adding the tasks to a Rails application" do
79
79
  ARGV.unshift "pluginize"
80
- # silence { Warbler::Application.new.run }
81
80
  Warbler::Application.new.run
82
81
  File.exist?("vendor/plugins/warbler/tasks/warbler.rake").should be_true
83
82
  end
@@ -85,4 +84,10 @@ describe Warbler::Application do
85
84
  it "should provide a means to load the project Rakefile" do
86
85
  Warbler::Application.new.load_project_rakefile
87
86
  end
87
+
88
+ it "should define a gemjar task for setting up gem packaging inside a jar" do
89
+ ARGV.unshift "gemjar"
90
+ Warbler::Application.new.run
91
+ Rake::Task['war:jar'].prerequisites.should include('war:make_gemjar')
92
+ end
88
93
  end
@@ -40,8 +40,8 @@ describe Warbler::Task do
40
40
  File.exist?(war_file).should == false
41
41
  end
42
42
 
43
- it "should define a gemjar task for storing gems in a jar file" do
44
- silence { Rake::Task["warble:gemjar"].invoke }
43
+ it "should define a make_gemjar task for storing gems in a jar file" do
44
+ silence { Rake::Task["warble:make_gemjar"].invoke }
45
45
  File.exist?("tmp/gems.jar").should == true
46
46
  @task.war.files.keys.should_not include(%r{WEB-INF\/gems})
47
47
  @task.war.files.keys.should include("WEB-INF/lib/gems.jar")
@@ -62,6 +62,22 @@ describe Warbler::Task do
62
62
  File.exist?("#{@config.war_name}.war").should == true
63
63
  end
64
64
 
65
+ it "should invoke feature tasks configured in config.features" do
66
+ @config.features << "gemjar"
67
+ silence { Rake::Task["warble"].invoke }
68
+ @task.war.files.keys.should include("WEB-INF/lib/gems.jar")
69
+ end
70
+
71
+ it "should warn and skip unknown features configured in config.features" do
72
+ @config.features << "bogus"
73
+ capture { Rake::Task["warble"].invoke }.should =~ /unknown feature `bogus'/
74
+ end
75
+
76
+ it "should define an executable task for embedding a server in the war file" do
77
+ silence { Rake::Task["warble:executable"].invoke }
78
+ @task.war.files.keys.should include('WEB-INF/winstone.jar')
79
+ end
80
+
65
81
  it "should be able to define all tasks successfully" do
66
82
  Warbler::Task.new "warble", @config
67
83
  end
@@ -158,6 +158,12 @@ describe Warbler::War do
158
158
  @war.files['META-INF/MANIFEST.MF'].should == "manifest"
159
159
  end
160
160
 
161
+ it "should not add a manifest if one already exists" do
162
+ @war.files['META-INF/MANIFEST.MF'] = 'manifest'
163
+ @war.add_manifest(@config)
164
+ @war.files['META-INF/MANIFEST.MF'].should == "manifest"
165
+ end
166
+
161
167
  it "should be able to exclude files from the .war" do
162
168
  @config.excludes += FileList['lib/tasks/utils.rake']
163
169
  @war.apply(@config)
@@ -290,8 +296,8 @@ describe Warbler::War do
290
296
  rackup = "run Proc.new {|env| [200, {}, ['Hello World']]}"
291
297
  File.open("config.ru", "w") {|f| f << rackup }
292
298
  @config = Warbler::Config.new
293
- @config.webxml.booter.should == :rack
294
- @config.webxml.rackup.should == rackup
299
+ @war.apply(@config)
300
+ @war.files['WEB-INF/config.ru'].should == 'config.ru'
295
301
  end
296
302
 
297
303
  it "should automatically add Rails.configuration.gems to the list of gems" do
data/warble.rb CHANGED
@@ -3,6 +3,11 @@
3
3
 
4
4
  # Warbler web application assembly configuration file
5
5
  Warbler::Config.new do |config|
6
+ # Features: additional options controlling how the jar is built.
7
+ # Currently the following features are supported:
8
+ # - gemjar: package the gem repository in a jar file in WEB-INF/lib
9
+ # config.features = %w(gemjar)
10
+
6
11
  # Application directories to be included in the webapp.
7
12
  config.dirs = %w(app config lib log vendor tmp)
8
13
 
@@ -93,8 +98,15 @@ Warbler::Config.new do |config|
93
98
  # config.webxml.booter = :rails
94
99
 
95
100
  # When using the :rack booter, "Rackup" script to use.
101
+ # - For 'rackup.path', the value points to the location of the rackup
102
+ # script in the web archive file. You need to make sure this file
103
+ # gets included in the war, possibly by adding it to config.includes
104
+ # or config.webinf_files above.
105
+ # - For 'rackup', the rackup script you provide as an inline string
106
+ # is simply embedded in web.xml.
96
107
  # The script is evaluated in a Rack::Builder to load the application.
97
108
  # Examples:
109
+ # config.webxml.rackup.path = 'WEB-INF/hello.ru'
98
110
  # config.webxml.rackup = %{require './lib/demo'; run Rack::Adapter::Camping.new(Demo)}
99
111
  # config.webxml.rackup = require 'cgi' && CGI::escapeHTML(File.read("config.ru"))
100
112
 
metadata CHANGED
@@ -3,90 +3,90 @@ name: warbler
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease: false
5
5
  segments:
6
- - 1
7
- - 0
8
- - 3
9
- version: 1.0.3
6
+ - 1
7
+ - 1
8
+ - 0
9
+ version: 1.1.0
10
10
  platform: ruby
11
11
  authors:
12
- - Nick Sieger
12
+ - Nick Sieger
13
13
  autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-05-11 00:00:00 -05:00
17
+ date: 2010-05-13 00:00:00 -05:00
18
18
  default_executable:
19
19
  dependencies:
20
- - !ruby/object:Gem::Dependency
21
- name: rake
22
- version_requirements: &id001 !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- segments:
27
- - 0
28
- - 8
29
- - 7
30
- version: 0.8.7
31
- prerelease: false
32
- type: :runtime
33
- requirement: *id001
34
- - !ruby/object:Gem::Dependency
35
- name: jruby-jars
36
- version_requirements: &id002 !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- segments:
41
- - 1
42
- - 4
43
- - 0
44
- version: 1.4.0
45
- prerelease: false
46
- type: :runtime
47
- requirement: *id002
48
- - !ruby/object:Gem::Dependency
49
- name: jruby-rack
50
- version_requirements: &id003 !ruby/object:Gem::Requirement
51
- requirements:
52
- - - ">="
53
- - !ruby/object:Gem::Version
54
- segments:
55
- - 0
56
- - 9
57
- - 7
58
- version: 0.9.7
59
- prerelease: false
60
- type: :runtime
61
- requirement: *id003
62
- - !ruby/object:Gem::Dependency
63
- name: rubyzip
64
- version_requirements: &id004 !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- segments:
69
- - 0
70
- - 9
71
- - 4
72
- version: 0.9.4
73
- prerelease: false
74
- type: :runtime
75
- requirement: *id004
76
- - !ruby/object:Gem::Dependency
77
- name: rubyforge
78
- version_requirements: &id005 !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- segments:
83
- - 2
84
- - 0
85
- - 4
86
- version: 2.0.4
87
- prerelease: false
88
- type: :development
89
- requirement: *id005
20
+ - !ruby/object:Gem::Dependency
21
+ requirement: &id001 !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ segments:
26
+ - 0
27
+ - 8
28
+ - 7
29
+ version: 0.8.7
30
+ prerelease: false
31
+ type: :runtime
32
+ name: rake
33
+ version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ requirement: &id002 !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ segments:
40
+ - 1
41
+ - 4
42
+ - 0
43
+ version: 1.4.0
44
+ prerelease: false
45
+ type: :runtime
46
+ name: jruby-jars
47
+ version_requirements: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ segments:
54
+ - 0
55
+ - 9
56
+ - 8
57
+ version: 0.9.8
58
+ prerelease: false
59
+ type: :runtime
60
+ name: jruby-rack
61
+ version_requirements: *id003
62
+ - !ruby/object:Gem::Dependency
63
+ requirement: &id004 !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - ">="
66
+ - !ruby/object:Gem::Version
67
+ segments:
68
+ - 0
69
+ - 9
70
+ - 4
71
+ version: 0.9.4
72
+ prerelease: false
73
+ type: :runtime
74
+ name: rubyzip
75
+ version_requirements: *id004
76
+ - !ruby/object:Gem::Dependency
77
+ requirement: &id005 !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ segments:
82
+ - 2
83
+ - 0
84
+ - 4
85
+ version: 2.0.4
86
+ prerelease: false
87
+ type: :development
88
+ name: rubyforge
89
+ version_requirements: *id005
90
90
  description: |-
91
91
  Warbler is a gem to make a .war file out of a Rails, Merb, or Rack-based
92
92
  application. The intent is to provide a minimal, flexible, ruby-like way to
@@ -94,87 +94,88 @@ description: |-
94
94
  server.
95
95
  email: nick@nicksieger.com
96
96
  executables:
97
- - warble
97
+ - warble
98
98
  extensions: []
99
99
 
100
100
  extra_rdoc_files:
101
- - History.txt
102
- - LICENSE.txt
103
- - Manifest.txt
104
- - README.txt
101
+ - History.txt
102
+ - LICENSE.txt
103
+ - Manifest.txt
104
+ - README.txt
105
105
  files:
106
- - Gemfile
107
- - History.txt
108
- - LICENSE.txt
109
- - Manifest.txt
110
- - README.txt
111
- - Rakefile
112
- - bin/warble
113
- - ext/WarblerWar.java
114
- - ext/WarblerWarService.java
115
- - lib/warbler.rb
116
- - lib/warbler/application.rb
117
- - lib/warbler/config.rb
118
- - lib/warbler/gems.rb
119
- - lib/warbler/runtime.rb
120
- - lib/warbler/task.rb
121
- - lib/warbler/version.rb
122
- - lib/warbler/war.rb
123
- - lib/warbler_war.jar
124
- - spec/sample/app/controllers/application.rb
125
- - spec/sample/app/helpers/application_helper.rb
126
- - spec/sample/config/boot.rb
127
- - spec/sample/config/database.yml
128
- - spec/sample/config/environment.rb
129
- - spec/sample/config/environments/development.rb
130
- - spec/sample/config/environments/production.rb
131
- - spec/sample/config/environments/test.rb
132
- - spec/sample/config/initializers/inflections.rb
133
- - spec/sample/config/initializers/mime_types.rb
134
- - spec/sample/config/initializers/new_rails_defaults.rb
135
- - spec/sample/config/routes.rb
136
- - spec/sample/lib/tasks/utils.rake
137
- - spec/sample/public/404.html
138
- - spec/sample/public/422.html
139
- - spec/sample/public/500.html
140
- - spec/sample/public/favicon.ico
141
- - spec/sample/public/index.html
142
- - spec/sample/public/robots.txt
143
- - spec/spec_helper.rb
144
- - spec/warbler/application_spec.rb
145
- - spec/warbler/config_spec.rb
146
- - spec/warbler/gems_spec.rb
147
- - spec/warbler/task_spec.rb
148
- - spec/warbler/war_spec.rb
149
- - warble.rb
150
- - web.xml.erb
106
+ - Gemfile
107
+ - History.txt
108
+ - LICENSE.txt
109
+ - Manifest.txt
110
+ - README.txt
111
+ - Rakefile
112
+ - bin/warble
113
+ - ext/Main.java
114
+ - ext/WarblerWar.java
115
+ - ext/WarblerWarService.java
116
+ - lib/warbler.rb
117
+ - lib/warbler/application.rb
118
+ - lib/warbler/config.rb
119
+ - lib/warbler/gems.rb
120
+ - lib/warbler/runtime.rb
121
+ - lib/warbler/task.rb
122
+ - lib/warbler/version.rb
123
+ - lib/warbler/war.rb
124
+ - lib/warbler_war.jar
125
+ - spec/sample/app/controllers/application.rb
126
+ - spec/sample/app/helpers/application_helper.rb
127
+ - spec/sample/config/boot.rb
128
+ - spec/sample/config/database.yml
129
+ - spec/sample/config/environment.rb
130
+ - spec/sample/config/environments/development.rb
131
+ - spec/sample/config/environments/production.rb
132
+ - spec/sample/config/environments/test.rb
133
+ - spec/sample/config/initializers/inflections.rb
134
+ - spec/sample/config/initializers/mime_types.rb
135
+ - spec/sample/config/initializers/new_rails_defaults.rb
136
+ - spec/sample/config/routes.rb
137
+ - spec/sample/lib/tasks/utils.rake
138
+ - spec/sample/public/404.html
139
+ - spec/sample/public/422.html
140
+ - spec/sample/public/500.html
141
+ - spec/sample/public/favicon.ico
142
+ - spec/sample/public/index.html
143
+ - spec/sample/public/robots.txt
144
+ - spec/spec_helper.rb
145
+ - spec/warbler/application_spec.rb
146
+ - spec/warbler/config_spec.rb
147
+ - spec/warbler/gems_spec.rb
148
+ - spec/warbler/task_spec.rb
149
+ - spec/warbler/war_spec.rb
150
+ - warble.rb
151
+ - web.xml.erb
151
152
  has_rdoc: true
152
153
  homepage: http://caldersphere.rubyforge.org/warbler
153
154
  licenses: []
154
155
 
155
156
  post_install_message:
156
157
  rdoc_options:
157
- - --main
158
- - README.txt
159
- - -SHN
160
- - -f
161
- - darkfish
158
+ - --main
159
+ - README.txt
160
+ - -SHN
161
+ - -f
162
+ - darkfish
162
163
  require_paths:
163
- - lib
164
+ - lib
164
165
  required_ruby_version: !ruby/object:Gem::Requirement
165
166
  requirements:
166
- - - ">="
167
- - !ruby/object:Gem::Version
168
- segments:
169
- - 0
170
- version: "0"
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ segments:
170
+ - 0
171
+ version: "0"
171
172
  required_rubygems_version: !ruby/object:Gem::Requirement
172
173
  requirements:
173
- - - ">="
174
- - !ruby/object:Gem::Version
175
- segments:
176
- - 0
177
- version: "0"
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ segments:
177
+ - 0
178
+ version: "0"
178
179
  requirements: []
179
180
 
180
181
  rubyforge_project: caldersphere