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 +84 -64
- data/Manifest.txt +1 -0
- data/README.txt +39 -10
- data/Rakefile +1 -1
- data/ext/Main.java +110 -0
- data/lib/warbler/application.rb +11 -29
- data/lib/warbler/config.rb +9 -10
- data/lib/warbler/task.rb +101 -16
- data/lib/warbler/version.rb +1 -1
- data/lib/warbler/war.rb +11 -5
- data/lib/warbler.rb +1 -1
- data/lib/warbler_war.jar +0 -0
- data/spec/warbler/application_spec.rb +6 -1
- data/spec/warbler/task_spec.rb +18 -2
- data/spec/warbler/war_spec.rb +8 -2
- data/warble.rb +12 -0
- metadata +143 -142
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
|
-
|
23
|
+
- Tracking recent Bundler changes - handle locked Gemfiles differently
|
4
24
|
than unlocked ones
|
5
|
-
|
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
|
-
|
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
|
-
|
36
|
+
- Fix careless bug where Warbler doesn't work with JRuby 1.4
|
17
37
|
|
18
38
|
== 1.0
|
19
39
|
|
20
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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
|
-
|
56
|
+
- So, jruby-rack is bundled for one more release. 1.0 will not contain
|
37
57
|
any jar files, I promise!
|
38
|
-
|
39
|
-
|
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
|
-
|
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
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
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
|
-
|
56
|
-
`Warbler.framework_detection = false
|
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
|
-
|
59
|
-
|
60
|
-
|
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
|
-
|
66
|
-
|
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
|
-
|
69
|
-
|
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
|
-
|
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
|
-
|
80
|
-
|
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
|
-
|
83
|
-
|
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
|
-
|
86
|
-
|
87
|
-
|
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
|
-
|
92
|
-
|
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
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
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
|
-
|
103
|
-
|
104
|
-
|
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
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
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
|
-
|
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
|
-
|
136
|
+
- Upgrade to JRuby 1.1 final and Goldspike 1.6.1
|
117
137
|
|
118
138
|
== 0.9.4
|
119
139
|
|
120
|
-
|
121
|
-
|
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
|
-
|
126
|
-
|
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
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
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
|
-
|
138
|
-
|
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
|
-
|
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
|
-
|
147
|
-
|
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
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
|
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
|
25
|
-
warble
|
26
|
-
warble
|
27
|
-
warble
|
28
|
-
warble
|
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
|
66
|
-
|
67
|
-
|
68
|
-
|
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.
|
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
|
+
|
data/lib/warbler/application.rb
CHANGED
@@ -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
|
30
|
-
task :config
|
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
|
43
|
-
task :pluginize
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
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
|
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
|
data/lib/warbler/config.rb
CHANGED
@@ -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
|
-
@
|
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
|
data/lib/warbler/version.rb
CHANGED
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
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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
|
data/spec/warbler/task_spec.rb
CHANGED
@@ -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
|
44
|
-
silence { Rake::Task["warble:
|
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
|
data/spec/warbler/war_spec.rb
CHANGED
@@ -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
|
294
|
-
@config.
|
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
|
-
|
7
|
-
|
8
|
-
|
9
|
-
version: 1.0
|
6
|
+
- 1
|
7
|
+
- 1
|
8
|
+
- 0
|
9
|
+
version: 1.1.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
|
-
|
12
|
+
- Nick Sieger
|
13
13
|
autorequire:
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-05-
|
17
|
+
date: 2010-05-13 00:00:00 -05:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
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
|
-
|
97
|
+
- warble
|
98
98
|
extensions: []
|
99
99
|
|
100
100
|
extra_rdoc_files:
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
101
|
+
- History.txt
|
102
|
+
- LICENSE.txt
|
103
|
+
- Manifest.txt
|
104
|
+
- README.txt
|
105
105
|
files:
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
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
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
158
|
+
- --main
|
159
|
+
- README.txt
|
160
|
+
- -SHN
|
161
|
+
- -f
|
162
|
+
- darkfish
|
162
163
|
require_paths:
|
163
|
-
|
164
|
+
- lib
|
164
165
|
required_ruby_version: !ruby/object:Gem::Requirement
|
165
166
|
requirements:
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
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
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
174
|
+
- - ">="
|
175
|
+
- !ruby/object:Gem::Version
|
176
|
+
segments:
|
177
|
+
- 0
|
178
|
+
version: "0"
|
178
179
|
requirements: []
|
179
180
|
|
180
181
|
rubyforge_project: caldersphere
|