warbler 0.9.14 → 1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile ADDED
@@ -0,0 +1,10 @@
1
+ source "http://rubygems.org/"
2
+
3
+ gem "rake", ">= 0.8.7"
4
+ gem "rubyzip"
5
+ gem "jruby-jars"
6
+ gem "jruby-rack"
7
+ gem "rspec"
8
+ gem "diff-lcs"
9
+ gem "rcov", ">= 0.9.8"
10
+ gem "hoe", ">= 2.3.2"
data/History.txt CHANGED
@@ -1,3 +1,19 @@
1
+ == 1.0
2
+
3
+ * Warbler hits 1.0! There are enough structural changes in Warbler
4
+ that I feel it's time to roll the major version over to 1.0.
5
+ * Add support for Bundler. Detect Gemfiles, make sure gems are
6
+ included in the war file and rewrite .bundle/environment.rb inside
7
+ the war file.
8
+ * Warbler now uses RubyZip to create the war file in-place, without
9
+ copying files to a tmp/war staging area. When run in JRuby it uses a
10
+ Java ZipOutputStream for a modest performance boost.
11
+ * Add config option to allow override of gem_home (Daniel Harrington).
12
+ * Stop bundling jruby-rack, as promised.
13
+ * WARBLER-3: don't add from Rails config.gems if they are frozen
14
+ * WARBLER-7: Add config.webinf_files option with more support for
15
+ custom web.xml files
16
+
1
17
  == 0.9.14
2
18
 
3
19
  * So, jruby-rack is bundled for one more release. 1.0 will not contain
@@ -2,7 +2,8 @@
2
2
 
3
3
  Warbler is provided under the terms of the MIT license.
4
4
 
5
- (c) Copyright 2007-2008 Sun Microsystems, Inc.
5
+ Warbler (c) 2010 Engine Yard, Inc.
6
+ Warbler (c) 2007-2009 Sun Microsystems, Inc.
6
7
 
7
8
  Permission is hereby granted, free of charge, to any person
8
9
  obtaining a copy of this software and associated documentation files
@@ -23,15 +24,3 @@ BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
23
24
  ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
24
25
  CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25
26
  SOFTWARE.
26
-
27
- = Additional Bundled Software
28
-
29
- JRuby-Rack (jruby-rack-*.jar) is distributed under the terms of the MIT license.
30
- See http://svn.codehaus.org/jruby-contrib/trunk/rack/LICENSE.txt
31
- for details.
32
-
33
- JRuby (jruby-complete-*.jar) is distrubuted under the terms of the Common
34
- Public License. See http://www.eclipse.org/legal/cpl-v10.html for details. At
35
- your option, JRuby is also available under the GPL or LGPL licenses. See the
36
- file COPYING in the JRuby distribution for details
37
- (http://svn.codehaus.org/jruby/trunk/jruby/COPYING).
data/Manifest.txt CHANGED
@@ -1,24 +1,26 @@
1
+ Gemfile
1
2
  History.txt
3
+ LICENSE.txt
2
4
  Manifest.txt
3
5
  README.txt
4
- LICENSES.txt
5
6
  Rakefile
6
- web.xml.erb
7
7
  bin/warble
8
- generators/warble
9
- generators/warble/templates
10
- generators/warble/templates/warble.rb
11
- generators/warble/warble_generator.rb
12
- lib/jruby-rack-0.9.5.jar
8
+ ext/WarblerWar.java
9
+ ext/WarblerWarService.java
13
10
  lib/warbler
11
+ lib/warbler.rb
12
+ lib/warbler/application.rb
14
13
  lib/warbler/config.rb
15
14
  lib/warbler/gems.rb
15
+ lib/warbler/runtime.rb
16
16
  lib/warbler/task.rb
17
17
  lib/warbler/version.rb
18
- lib/warbler.rb
18
+ lib/warbler/war.rb
19
+ lib/warbler_war.jar
19
20
  spec/sample/app/controllers/application.rb
20
21
  spec/sample/app/helpers/application_helper.rb
21
22
  spec/sample/config/boot.rb
23
+ spec/sample/config/database.yml
22
24
  spec/sample/config/environment.rb
23
25
  spec/sample/config/environments/development.rb
24
26
  spec/sample/config/environments/production.rb
@@ -27,8 +29,18 @@ spec/sample/config/initializers/inflections.rb
27
29
  spec/sample/config/initializers/mime_types.rb
28
30
  spec/sample/config/initializers/new_rails_defaults.rb
29
31
  spec/sample/config/routes.rb
32
+ spec/sample/lib/tasks/utils.rake
33
+ spec/sample/public/404.html
34
+ spec/sample/public/422.html
35
+ spec/sample/public/500.html
36
+ spec/sample/public/favicon.ico
37
+ spec/sample/public/index.html
38
+ spec/sample/public/robots.txt
30
39
  spec/spec_helper.rb
40
+ spec/warbler/application_spec.rb
31
41
  spec/warbler/config_spec.rb
32
42
  spec/warbler/gems_spec.rb
33
43
  spec/warbler/task_spec.rb
34
- tasks/warbler.rake
44
+ spec/warbler/war_spec.rb
45
+ warble.rb
46
+ web.xml.erb
data/README.txt CHANGED
@@ -9,11 +9,6 @@ Warbler provides a sane set of out-of-the box defaults that should allow most
9
9
  Rails applications without external gem dependencies (aside from Rails itself)
10
10
  to assemble and Just Work.
11
11
 
12
- Warbler bundles JRuby and the JRuby-Rack servlet adapter for dispatching
13
- requests to your application inside the java application server, and assembles
14
- all jar files in WARBLER_HOME/lib/*.jar into your application. No external
15
- dependencies are downloaded.
16
-
17
12
  == Getting Started
18
13
 
19
14
  1. Install the gem: <tt>gem install warbler</tt>.
@@ -23,26 +18,32 @@ dependencies are downloaded.
23
18
  == Usage
24
19
 
25
20
  Warbler's +warble+ command is just a small wrapper around Rake with internally
26
- defined tasks. (Notice "rake" still prints out in the message, but you should
27
- substitute "warble" for "rake" on the command line when running this way.)
28
-
29
- $ warble -T
30
- rake config # Generate a configuration file to customize your war assembly
31
- rake pluginize # Unpack warbler as a plugin in your Rails application
32
- rake war # Create trunk.war
33
- rake war:app # Copy all application files into the .war
34
- rake war:clean # Clean up the .war file and the staging area
35
- rake war:gems # Unpack all gems into WEB-INF/gems
36
- rake war:jar # Run the jar command to create the .war
37
- rake war:java_libs # Copy all java libraries into the .war
38
- rake war:public # Copy all public HTML files to the root of the .war
39
- rake war:webxml # Generate a web.xml file for the webapp
40
-
41
- Warbler makes heavy use of Rake's file and directory tasks, so only recently
42
- updated files will be copied, making repeated assemblies much faster.
21
+ defined tasks.
22
+
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
29
+
30
+ If you'd like to control Warbler from your own project's Rakefile,
31
+ simply add the following code somewhere in the Rakefile:
32
+
33
+ require 'warbler'
34
+ Warbler::Task.new
35
+
36
+ Now you should be able to invoke "rake war" to create your war file.
43
37
 
44
38
  == Configuration
45
39
 
40
+ === Bundler
41
+
42
+ Applications that use Bundler (http://gembundler.com/), detected via
43
+ presence of a +Gemfile+, will have the gems packaged up into the war
44
+ file. The .bundle/environment.rb file will be included for you, and
45
+ rewritten to use the paths to the gems inside the war.
46
+
46
47
  === Rails applications
47
48
 
48
49
  Rails applications are detected automatically and configured appropriately.
@@ -50,7 +51,7 @@ The following items are set up for you:
50
51
 
51
52
  * The Rails gem is packaged if you haven't vendored Rails.
52
53
  * Other gems configured in Rails.configuration.gems are packaged
53
- (Rails 2.1 or later)
54
+ (Rails 2.1 - 2.3)
54
55
  * Multi-thread-safe execution (as introduced in Rails 2.2) is detected
55
56
  and runtime pooling is disabled.
56
57
 
@@ -98,25 +99,9 @@ doing this. With the gem, simply run
98
99
 
99
100
  warble config
100
101
 
101
- If you have Warbler installed as a plugin, use the generator:
102
-
103
- script/generate warble
104
-
105
- Finally, edit the config/warble.rb to your taste. If you install the gem but
106
- later decide you'd like to have it as a plugin, use the +pluginize+ command:
107
-
108
- warble pluginize
109
-
110
- If you wish to upgrade or switch one or more java libraries from what's
111
- bundled in the Warbler gem, simply change the jars in WARBLER_HOME/lib, or
112
- modify the +java_libs+ attribute of Warbler::Config to include the files you
113
- need.
114
-
115
- Once Warbler is installed as a plugin, you can use +rake+ to build the war
116
- (with the same set of tasks as above).
117
-
118
- The generated config/warble.rb file is fully-documented with the available
119
- options and default values.
102
+ Finally, edit the config/warble.rb to your taste. The generated
103
+ config/warble.rb file is fully-documented with the available options
104
+ and default values.
120
105
 
121
106
  === Web.xml
122
107
 
@@ -140,13 +125,8 @@ For more information on configuration, see Warbler::Config.
140
125
 
141
126
  === Troubleshooting
142
127
 
143
- If Warbler isn't packaging the files you were expecting, there are several
144
- debug tasks available to give you more insight into what's going on.
145
-
146
- * <tt>war:debug</tt> prints a YAML dump of the current configuration
147
- * <tt>war:debug:X</tt> prints a list of files that Warbler will
148
- include during that stage of assembly. Valid values of <tt>X</tt>
149
- are <tt>app, java_libs, gems, public, includes, excludes</tt>.
128
+ If Warbler isn't packaging the files you were expecting, use the
129
+ war:debug task to give you more insight into what's going on.
150
130
 
151
131
  == Source
152
132
 
@@ -159,12 +139,17 @@ You can get the Warbler source using Git, in any of the following ways:
159
139
  You can also download a tarball of Warbler source at
160
140
  http://github.com/nicksieger/warbler/tree/master.
161
141
 
142
+ == Development
143
+
144
+ You can develop Warbler with any implementation of Ruby. To write
145
+ Warbler code and run specs, you need to have Bundler installed
146
+ and run "bundle install" once.
147
+
148
+ After that, simply run "rake".
149
+
162
150
  == License
163
151
 
164
152
  Warbler is provided under the terms of the MIT license.
165
153
 
154
+ Warbler (c) 2010 Engine Yard, Inc.
166
155
  Warbler (c) 2007-2009 Sun Microsystems, Inc.
167
-
168
- Warbler also bundles several other pieces of software for convenience.
169
- Please read the file LICENSES.txt to ensure that you agree with the
170
- terms of all the components.
data/Rakefile CHANGED
@@ -1,8 +1,24 @@
1
+ #--
2
+ # Copyright (c) 2010 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
+ begin
9
+ require 'bundler'
10
+ Bundler.setup
11
+ rescue LoadError
12
+ puts "Please install Bundler and run 'bundle install' to ensure you have all dependencies"
13
+ end
14
+
1
15
  require 'spec/rake/spectask'
2
16
  require 'spec/rake/verify_rcov'
3
17
 
4
- MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt", "LICENSES.txt", "Rakefile",
5
- "*.erb", "bin/*", "generators/**/*", "lib/**/*", "spec/**/*.rb", "tasks/**/*.rake"]
18
+ MANIFEST = FileList["History.txt", "Manifest.txt", "README.txt", "Gemfile",
19
+ "LICENSE.txt", "Rakefile", "*.erb", "*.rb", "bin/*",
20
+ "ext/**/*", "lib/**/*", "spec/**/*.rb", "spec/sample/**/*.*"
21
+ ].to_a.reject{|f| f=~%r{spec/sample/(MANIFEST|web.xml)}}.sort.uniq
6
22
 
7
23
  begin
8
24
  File.open("Manifest.txt", "w") {|f| MANIFEST.each {|n| f << "#{n}\n"} }
@@ -17,8 +33,8 @@ begin
17
33
  p.summary = "Warbler chirpily constructs .war files of your Rails applications."
18
34
  p.changes = p.paragraphs_of('History.txt', 0..1).join("\n\n")
19
35
  p.description = p.paragraphs_of('README.txt', 1...2).join("\n\n")
20
- p.extra_deps += [['rake', '>= 0.7.3'], ['jruby-jars', '>= 1.3.1']]
21
- p.test_globs = ["spec/**/*_spec.rb"]
36
+ p.extra_deps += [['rake', '>= 0.8.7'], ['jruby-jars', '>= 1.4.0'], ['jruby-rack', '>= 0.9.7'], ['rubyzip', '>= 0.9.4']]
37
+ p.clean_globs += ['spec/sample/MANIFEST*', 'spec/sample/web.xml*']
22
38
  end
23
39
  hoe.spec.files = MANIFEST
24
40
  hoe.spec.dependencies.delete_if { |dep| dep.name == "hoe" }
@@ -31,15 +47,10 @@ rescue LoadError
31
47
  puts "You really need Hoe installed to be able to package this gem"
32
48
  end
33
49
 
34
- # Hoe insists on setting task :default => :test
35
- # !@#$ no easy way to empty the default list of prerequisites
36
- Rake::Task['default'].send :instance_variable_set, "@prerequisites", FileList[]
37
- Rake::Task['default'].send :instance_variable_set, "@actions", []
38
-
39
- if defined?(JRUBY_VERSION)
40
- task :default => :spec
41
- else
42
- task :default => :rcov_verify
50
+ # Leave my tasks alone, Hoe
51
+ %w(default spec rcov).each do |task|
52
+ Rake::Task[task].prerequisites.clear
53
+ Rake::Task[task].actions.clear
43
54
  end
44
55
 
45
56
  Spec::Rake::SpecTask.new do |t|
@@ -48,12 +59,33 @@ Spec::Rake::SpecTask.new do |t|
48
59
  end
49
60
 
50
61
  Spec::Rake::SpecTask.new("spec:rcov") do |t|
62
+ t.spec_opts ||= []
63
+ t.spec_opts << "--options" << "spec/spec.opts"
51
64
  t.rcov = true
52
65
  end
53
66
 
54
- # so we don't confuse autotest
55
- RCov::VerifyTask.new(:rcov_verify) do |t|
67
+ RCov::VerifyTask.new(:rcov => "spec:rcov") do |t|
56
68
  t.threshold = 100
57
69
  end
58
70
 
59
- task :rcov_verify => "spec:rcov"
71
+ task :default => :spec
72
+
73
+ begin
74
+ require 'ant'
75
+ directory "pkg/classes"
76
+ task :compile => "pkg/classes" do |t|
77
+ ant.javac :srcdir => "ext", :destdir => t.prerequisites.first,
78
+ :source => "1.5", :target => "1.5", :debug => true,
79
+ :classpath => "${java.class.path}:${sun.boot.class.path}"
80
+ end
81
+
82
+ task :jar => :compile do
83
+ ant.jar :basedir => "pkg/classes", :destfile => "lib/warbler_war.jar", :includes => "*.class"
84
+ end
85
+ rescue LoadError
86
+ task :jar do
87
+ puts "Run 'jar' with JRuby >= 1.5 to re-compile the java war booster"
88
+ end
89
+ end
90
+
91
+ task :package => :jar
data/bin/warble CHANGED
@@ -1,68 +1,11 @@
1
1
  #!/usr/bin/env ruby
2
2
  #
3
3
  #--
4
- # (c) Copyright 2007-2008 Sun Microsystems, Inc.
5
- # See the file LICENSES.txt included with the distribution for
6
- # software license details.
4
+ # Copyright (c) 2010 Engine Yard, Inc.
5
+ # Copyright (c) 2007-2009 Sun Microsystems, Inc.
6
+ # This source code is available under the MIT license.
7
+ # See the file LICENSE.txt for details.
7
8
  #++
8
9
 
9
- require 'rubygems'
10
- require 'rake'
11
10
  require 'warbler'
12
-
13
- application = Rake.application
14
-
15
- # Load any application rakefiles to aid in autodetecting applications
16
- Warbler.project_application = Rake::Application.new
17
- Rake.application = Warbler.project_application
18
- Rake::Application::DEFAULT_RAKEFILES.each do |rf|
19
- if File.exist?(rf)
20
- load rf
21
- break
22
- end
23
- end
24
-
25
- Rake.application = application
26
- application.standard_exception_handling do
27
- application.init
28
-
29
- # Load the main warbler tasks
30
- Warbler::Task.new
31
-
32
- task :default => :war
33
-
34
- desc "Generate a configuration file to customize your war assembly"
35
- task :config do
36
- if File.exists?(Warbler::Config::FILE) && ENV["FORCE"].nil?
37
- puts "There's another bird sitting on my favorite branch"
38
- puts "(file '#{Warbler::Config::FILE}' already exists. Pass argument FORCE=1 to override)"
39
- elsif !File.directory?("config")
40
- puts "I'm confused; my favorite branch is missing"
41
- puts "(directory 'config' is missing)"
42
- else
43
- cp "#{Warbler::WARBLER_HOME}/generators/warble/templates/warble.rb", Warbler::Config::FILE
44
- end
45
- end
46
-
47
- desc "Unpack warbler as a plugin in your Rails application"
48
- task :pluginize do
49
- if !Dir["vendor/plugins/warbler*"].empty?
50
- puts "I found an old nest in vendor/plugins; please trash it so I can make a new one"
51
- puts "(directory vendor/plugins/warbler* exists)"
52
- elsif !File.directory?("vendor/plugins")
53
- puts "I can't find a place to build my nest"
54
- puts "(directory 'vendor/plugins' is missing)"
55
- else
56
- Dir.chdir("vendor/plugins") do
57
- ruby "-S", "gem", "unpack", "warbler"
58
- end
59
- end
60
- end
61
-
62
- desc "Display version of warbler"
63
- task :version do
64
- puts "Warbler version #{Warbler::VERSION}"
65
- end
66
-
67
- application.top_level
68
- end
11
+ Warbler::Application.new.run
@@ -0,0 +1,113 @@
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.io.Closeable;
8
+ import java.io.File;
9
+ import java.io.FileInputStream;
10
+ import java.io.FileOutputStream;
11
+ import java.io.IOException;
12
+ import java.util.zip.ZipEntry;
13
+ import java.util.zip.ZipOutputStream;
14
+
15
+ import org.jruby.Ruby;
16
+ import org.jruby.RubyArray;
17
+ import org.jruby.RubyHash;
18
+ import org.jruby.RubyModule;
19
+ import org.jruby.RubyString;
20
+ import org.jruby.anno.JRubyMethod;
21
+ import org.jruby.runtime.Block;
22
+ import org.jruby.runtime.ThreadContext;
23
+ import org.jruby.runtime.builtin.IRubyObject;
24
+ import org.jruby.util.JRubyFile;
25
+
26
+ public class WarblerWar {
27
+ public static void create(Ruby runtime) {
28
+ RubyModule task = runtime.getClassFromPath("Warbler::War");
29
+ task.defineAnnotatedMethods(WarblerWar.class);
30
+ }
31
+
32
+ @JRubyMethod
33
+ public static IRubyObject create_war(ThreadContext context, IRubyObject recv, IRubyObject war_path, IRubyObject entries) {
34
+ final Ruby runtime = recv.getRuntime();
35
+
36
+ if (!(entries instanceof RubyHash)) {
37
+ throw runtime.newArgumentError("expected a hash for the second argument");
38
+ }
39
+
40
+ RubyHash hash = (RubyHash) entries;
41
+ try {
42
+ FileOutputStream file = newFile(war_path);
43
+ try {
44
+ ZipOutputStream zip = new ZipOutputStream(file);
45
+ addEntries(context, zip, hash);
46
+ zip.finish();
47
+ } finally {
48
+ close(file);
49
+ }
50
+ } catch (IOException e) {
51
+ e.printStackTrace();
52
+ throw runtime.newIOErrorFromException(e);
53
+ }
54
+
55
+ return runtime.getNil();
56
+ }
57
+
58
+ private static void addEntries(ThreadContext context, ZipOutputStream zip, RubyHash entries) throws IOException {
59
+ RubyArray keys = entries.keys().sort(context, Block.NULL_BLOCK);
60
+ for (int i = 0; i < keys.getLength(); i++) {
61
+ IRubyObject key = keys.entry(i);
62
+ IRubyObject value = entries.op_aref(context, key);
63
+ addEntry(context, zip, key.convertToString().getUnicodeValue(), value);
64
+ }
65
+ }
66
+
67
+ private static void addEntry(ThreadContext context, ZipOutputStream zip, String entryName, IRubyObject value) throws IOException {
68
+ if (value.respondsTo("read")) {
69
+ RubyString str = (RubyString) value.callMethod(context, "read").checkStringType();
70
+ byte[] contents = str.getByteList().getUnsafeBytes();
71
+ zip.putNextEntry(new ZipEntry(entryName));
72
+ zip.write(contents);
73
+ } else {
74
+ File f;
75
+ if (value.isNil() || (f = getFile(value)).isDirectory()) {
76
+ zip.putNextEntry(new ZipEntry(entryName + "/"));
77
+ } else {
78
+ FileInputStream inFile = openFile(f);
79
+ try {
80
+ zip.putNextEntry(new ZipEntry(entryName));
81
+ byte[] buf = new byte[16384];
82
+ int bytesRead = -1;
83
+ while ((bytesRead = inFile.read(buf)) != -1) {
84
+ zip.write(buf, 0, bytesRead);
85
+ }
86
+ } finally {
87
+ close(inFile);
88
+ }
89
+ }
90
+ }
91
+ }
92
+
93
+ private static FileOutputStream newFile(IRubyObject war_path) throws IOException {
94
+ return new FileOutputStream(getFile(war_path));
95
+ }
96
+
97
+ private static FileInputStream openFile(File file) throws IOException {
98
+ return new FileInputStream(file);
99
+ }
100
+
101
+ private static File getFile(IRubyObject path) {
102
+ return JRubyFile.create(path.getRuntime().getCurrentDirectory(),
103
+ path.convertToString().getUnicodeValue());
104
+ }
105
+
106
+ private static void close(Closeable c) {
107
+ try {
108
+ c.close();
109
+ } catch (IOException e) {
110
+ }
111
+ }
112
+
113
+ }