rdmopensource-warbler 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. data/Gemfile +11 -0
  2. data/History.txt +167 -0
  3. data/LICENSE.txt +26 -0
  4. data/Manifest.txt +48 -0
  5. data/README.txt +194 -0
  6. data/Rakefile +92 -0
  7. data/bin/warble +11 -0
  8. data/ext/Main.java +110 -0
  9. data/ext/WarblerWar.java +115 -0
  10. data/ext/WarblerWarService.java +17 -0
  11. data/lib/warbler.rb +37 -0
  12. data/lib/warbler/application.rb +67 -0
  13. data/lib/warbler/config.rb +349 -0
  14. data/lib/warbler/gems.rb +37 -0
  15. data/lib/warbler/runtime.rb +44 -0
  16. data/lib/warbler/task.rb +224 -0
  17. data/lib/warbler/version.rb +10 -0
  18. data/lib/warbler/war.rb +226 -0
  19. data/lib/warbler_war.jar +0 -0
  20. data/spec/sample/app/controllers/application.rb +15 -0
  21. data/spec/sample/app/helpers/application_helper.rb +3 -0
  22. data/spec/sample/config/boot.rb +109 -0
  23. data/spec/sample/config/database.yml +19 -0
  24. data/spec/sample/config/environment.rb +67 -0
  25. data/spec/sample/config/environments/development.rb +17 -0
  26. data/spec/sample/config/environments/production.rb +22 -0
  27. data/spec/sample/config/environments/test.rb +22 -0
  28. data/spec/sample/config/initializers/inflections.rb +10 -0
  29. data/spec/sample/config/initializers/mime_types.rb +5 -0
  30. data/spec/sample/config/initializers/new_rails_defaults.rb +15 -0
  31. data/spec/sample/config/routes.rb +41 -0
  32. data/spec/sample/lib/tasks/utils.rake +0 -0
  33. data/spec/sample/public/404.html +30 -0
  34. data/spec/sample/public/422.html +30 -0
  35. data/spec/sample/public/500.html +30 -0
  36. data/spec/sample/public/favicon.ico +0 -0
  37. data/spec/sample/public/index.html +274 -0
  38. data/spec/sample/public/robots.txt +5 -0
  39. data/spec/spec_helper.rb +44 -0
  40. data/spec/warbler/application_spec.rb +93 -0
  41. data/spec/warbler/config_spec.rb +112 -0
  42. data/spec/warbler/gems_spec.rb +40 -0
  43. data/spec/warbler/task_spec.rb +146 -0
  44. data/spec/warbler/war_spec.rb +441 -0
  45. data/warble.rb +121 -0
  46. data/web.xml.erb +32 -0
  47. metadata +202 -0
@@ -0,0 +1,10 @@
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
+ module Warbler
9
+ VERSION = "1.1.0"
10
+ end
@@ -0,0 +1,226 @@
1
+ require 'zip/zip'
2
+
3
+ module Warbler
4
+ # Class that holds the files that will be stored in the war file.
5
+ # The #files attribute contains a hash of pathnames inside the war
6
+ # file to their contents. Contents can be one of:
7
+ # * +nil+ representing a directory entry
8
+ # * Any object responding to +read+ representing an in-memory blob
9
+ # * A String filename pointing to a file on disk
10
+ class War
11
+ DEFAULT_MANIFEST = %{Manifest-Version: 1.0\nCreated-By: Warbler #{Warbler::VERSION}\n\n}
12
+
13
+ attr_reader :files
14
+ attr_reader :webinf_filelist
15
+
16
+ def initialize
17
+ @files = {}
18
+ end
19
+
20
+ def compile(config)
21
+ # Need to use the version of JRuby in the application to compile it
22
+ compiled_ruby_files = config.compiled_ruby_files.to_a
23
+
24
+ return if compiled_ruby_files.empty?
25
+
26
+ run_javac(config, compiled_ruby_files)
27
+ replace_compiled_ruby_files(config, compiled_ruby_files)
28
+ end
29
+
30
+ def run_javac(config, compiled_ruby_files)
31
+ %x{java -classpath #{config.java_libs.join(File::PATH_SEPARATOR)} org.jruby.Main -S jrubyc \"#{compiled_ruby_files.join('" "')}\"}
32
+ end
33
+
34
+ def replace_compiled_ruby_files(config, compiled_ruby_files)
35
+ # Exclude the rb files and recreate them. This
36
+ # prevents the original contents being used.
37
+ config.excludes += compiled_ruby_files
38
+
39
+ compiled_ruby_files.each do |ruby_source|
40
+ files[apply_pathmaps(config, ruby_source, :application)] = StringIO.new("require __FILE__.sub(/\.rb$/, '.class')")
41
+ end
42
+ end
43
+
44
+ # Apply the information in a Warbler::Config object in order to
45
+ # look for files to put into this war file.
46
+ def apply(config)
47
+ find_webinf_files(config)
48
+ find_java_libs(config)
49
+ find_java_classes(config)
50
+ find_gems_files(config)
51
+ find_public_files(config)
52
+ add_webxml(config)
53
+ add_manifest(config)
54
+ add_bundler_files(config)
55
+ end
56
+
57
+ # Create the war file. The single argument can either be a
58
+ # Warbler::Config or a filename of the war file to create.
59
+ def create(config_or_path)
60
+ war_path = config_or_path
61
+ if Warbler::Config === config_or_path
62
+ war_path = "#{config_or_path.war_name}.war"
63
+ war_path = File.join(config_or_path.autodeploy_dir, war_path) if config_or_path.autodeploy_dir
64
+ end
65
+ rm_f war_path
66
+ ensure_directory_entries
67
+ puts "Creating #{war_path}"
68
+ create_war war_path, @files
69
+ end
70
+
71
+ # Add web.xml and other WEB-INF configuration files from
72
+ # config.webinf_files to the war file.
73
+ def add_webxml(config)
74
+ config.webinf_files.each do |wf|
75
+ if wf =~ /\.erb$/
76
+ require 'erb'
77
+ erb = ERB.new(File.open(wf) {|f| f.read })
78
+ contents = StringIO.new(erb.result(erb_binding(config.webxml)))
79
+ @files[apply_pathmaps(config, wf, :webinf)] = contents
80
+ else
81
+ @files[apply_pathmaps(config, wf, :webinf)] = wf
82
+ end
83
+ end
84
+ end
85
+
86
+ # Add a manifest file either from config or by making a default manifest.
87
+ def add_manifest(config = nil)
88
+ unless @files.keys.detect{|k| k =~ /^META-INF\/MANIFEST\.MF$/i}
89
+ if config && config.manifest_file
90
+ @files['META-INF/MANIFEST.MF'] = config.manifest_file
91
+ else
92
+ @files['META-INF/MANIFEST.MF'] = StringIO.new(DEFAULT_MANIFEST)
93
+ end
94
+ end
95
+ end
96
+
97
+ # Add java libraries to WEB-INF/lib.
98
+ def find_java_libs(config)
99
+ config.java_libs.map {|lib| add_with_pathmaps(config, lib, :java_libs) }
100
+ end
101
+
102
+ # Add java classes to WEB-INF/classes.
103
+ def find_java_classes(config)
104
+ config.java_classes.map {|f| add_with_pathmaps(config, f, :java_classes) }
105
+ end
106
+
107
+ # Add public/static assets to the root of the war file.
108
+ def find_public_files(config)
109
+ config.public_html.map {|f| add_with_pathmaps(config, f, :public_html) }
110
+ end
111
+
112
+ # Add gems to WEB-INF/gems
113
+ def find_gems_files(config)
114
+ config.gems.each {|gem, version| find_single_gem_files(config, gem, version) }
115
+ end
116
+
117
+ # Add a single gem to WEB-INF/gems
118
+ def find_single_gem_files(config, gem_pattern, version = nil)
119
+ if Gem::Specification === gem_pattern
120
+ spec = gem_pattern
121
+ else
122
+ gem = case gem_pattern
123
+ when Gem::Dependency
124
+ gem_pattern
125
+ else
126
+ Gem::Dependency.new(gem_pattern, Gem::Requirement.create(version))
127
+ end
128
+
129
+ # skip development dependencies
130
+ return if gem.respond_to?(:type) and gem.type != :runtime
131
+
132
+ matched = Gem.source_index.search(gem)
133
+ fail "gem '#{gem}' not installed" if matched.empty?
134
+ spec = matched.last
135
+ end
136
+
137
+ # skip gems with no load path
138
+ return if spec.loaded_from == ""
139
+
140
+ add_with_pathmaps(config, spec.loaded_from, :gemspecs)
141
+ spec.files.each do |f|
142
+ src = File.join(spec.full_gem_path, f)
143
+ # some gemspecs may have incorrect file listings
144
+ next unless File.exist?(src)
145
+ @files[apply_pathmaps(config, File.join(spec.full_name, f), :gems)] = src
146
+ end
147
+
148
+ spec.dependencies.each {|dep| find_single_gem_files(config, dep) } if config.gem_dependencies
149
+ end
150
+
151
+ # Add all application directories and files to WEB-INF.
152
+ def find_webinf_files(config)
153
+ config.dirs.select do |d|
154
+ exists = File.directory?(d)
155
+ warn "warning: application directory `#{d}' does not exist or is not a directory; skipping" unless exists
156
+ exists
157
+ end.each do |d|
158
+ @files[apply_pathmaps(config, d, :application)] = nil
159
+ end
160
+ @webinf_filelist = FileList[*(config.dirs.map{|d| "#{d}/**/*"})]
161
+ @webinf_filelist.include *(config.includes.to_a)
162
+ @webinf_filelist.exclude *(config.excludes.to_a)
163
+ @webinf_filelist.map {|f| add_with_pathmaps(config, f, :application) }
164
+ end
165
+
166
+ # Add Bundler Gemfile and .bundle/environment.rb to the war file.
167
+ def add_bundler_files(config)
168
+ if config.bundler
169
+ @files[apply_pathmaps(config, 'Gemfile', :application)] = 'Gemfile'
170
+ if File.exist?('Gemfile.lock')
171
+ @files[apply_pathmaps(config, 'Gemfile.lock', :application)] = 'Gemfile.lock'
172
+ @files[apply_pathmaps(config, '.bundle/environment.rb', :application)] = '.bundle/war-environment.rb'
173
+ end
174
+ end
175
+ end
176
+
177
+ private
178
+ def add_with_pathmaps(config, f, map_type)
179
+ @files[apply_pathmaps(config, f, map_type)] = f
180
+ end
181
+
182
+ def erb_binding(webxml)
183
+ binding
184
+ end
185
+
186
+ def apply_pathmaps(config, file, pathmaps)
187
+ pathmaps = config.pathmaps.send(pathmaps)
188
+ pathmaps.each do |p|
189
+ file = file.pathmap(p)
190
+ end if pathmaps
191
+ file
192
+ end
193
+
194
+ def ensure_directory_entries
195
+ files.select {|k,v| !v.nil? }.each do |k,v|
196
+ dir = File.dirname(k)
197
+ while dir != "." && !files.has_key?(dir)
198
+ files[dir] = nil
199
+ dir = File.dirname(dir)
200
+ end
201
+ end
202
+ end
203
+
204
+ def create_war(war_file, entries)
205
+ Zip::ZipFile.open(war_file, Zip::ZipFile::CREATE) do |zipfile|
206
+ entries.keys.sort.each do |entry|
207
+ src = entries[entry]
208
+ if src.respond_to?(:read)
209
+ zipfile.get_output_stream(entry) {|f| f << src.read }
210
+ elsif src.nil? || File.directory?(src)
211
+ warn "directory symlinks are not followed unless using JRuby; #{entry} contents not in archive" \
212
+ if File.symlink?(entry) && !defined?(JRUBY_VERSION)
213
+ zipfile.mkdir(entry)
214
+ elsif File.symlink?(src)
215
+ zipfile.get_output_stream(entry) {|f| f << File.read(src) }
216
+ else
217
+ zipfile.add(entry, src)
218
+ end
219
+ end
220
+ end
221
+ end
222
+
223
+ # Java-boosted war creation for JRuby; replaces #create_war with Java version
224
+ require 'warbler_war' if defined?(JRUBY_VERSION) && JRUBY_VERSION >= "1.5"
225
+ end
226
+ end
Binary file
@@ -0,0 +1,15 @@
1
+ # Filters added to this controller apply to all controllers in the application.
2
+ # Likewise, all the methods added will be available for all controllers.
3
+
4
+ class ApplicationController < ActionController::Base
5
+ helper :all # include all helpers, all the time
6
+
7
+ # See ActionController::RequestForgeryProtection for details
8
+ # Uncomment the :secret if you're not using the cookie session store
9
+ protect_from_forgery # :secret => '9eae08a7d153857faa33c1101e411ce1'
10
+
11
+ # See ActionController::Base for details
12
+ # Uncomment this to filter the contents of submitted sensitive data parameters
13
+ # from your application log (in this case, all fields with names like "password").
14
+ # filter_parameter_logging :password
15
+ end
@@ -0,0 +1,3 @@
1
+ # Methods added to this helper will be available to all templates in the application.
2
+ module ApplicationHelper
3
+ end
@@ -0,0 +1,109 @@
1
+ # Don't change this file!
2
+ # Configure your app in config/environment.rb and config/environments/*.rb
3
+
4
+ RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
5
+
6
+ module Rails
7
+ class << self
8
+ def boot!
9
+ unless booted?
10
+ preinitialize
11
+ pick_boot.run
12
+ end
13
+ end
14
+
15
+ def booted?
16
+ defined? Rails::Initializer
17
+ end
18
+
19
+ def pick_boot
20
+ (vendor_rails? ? VendorBoot : GemBoot).new
21
+ end
22
+
23
+ def vendor_rails?
24
+ File.exist?("#{RAILS_ROOT}/vendor/rails")
25
+ end
26
+
27
+ def preinitialize
28
+ load(preinitializer_path) if File.exist?(preinitializer_path)
29
+ end
30
+
31
+ def preinitializer_path
32
+ "#{RAILS_ROOT}/config/preinitializer.rb"
33
+ end
34
+ end
35
+
36
+ class Boot
37
+ def run
38
+ load_initializer
39
+ Rails::Initializer.run(:set_load_path)
40
+ end
41
+ end
42
+
43
+ class VendorBoot < Boot
44
+ def load_initializer
45
+ require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
46
+ Rails::Initializer.run(:install_gem_spec_stubs)
47
+ end
48
+ end
49
+
50
+ class GemBoot < Boot
51
+ def load_initializer
52
+ self.class.load_rubygems
53
+ load_rails_gem
54
+ require 'initializer'
55
+ end
56
+
57
+ def load_rails_gem
58
+ if version = self.class.gem_version
59
+ gem 'rails', version
60
+ else
61
+ gem 'rails'
62
+ end
63
+ rescue Gem::LoadError => load_error
64
+ $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
65
+ exit 1
66
+ end
67
+
68
+ class << self
69
+ def rubygems_version
70
+ Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
71
+ end
72
+
73
+ def gem_version
74
+ if defined? RAILS_GEM_VERSION
75
+ RAILS_GEM_VERSION
76
+ elsif ENV.include?('RAILS_GEM_VERSION')
77
+ ENV['RAILS_GEM_VERSION']
78
+ else
79
+ parse_gem_version(read_environment_rb)
80
+ end
81
+ end
82
+
83
+ def load_rubygems
84
+ require 'rubygems'
85
+
86
+ unless rubygems_version >= '0.9.4'
87
+ $stderr.puts %(Rails requires RubyGems >= 0.9.4 (you have #{rubygems_version}). Please `gem update --system` and try again.)
88
+ exit 1
89
+ end
90
+
91
+ rescue LoadError
92
+ $stderr.puts %(Rails requires RubyGems >= 0.9.4. Please install RubyGems and try again: http://rubygems.rubyforge.org)
93
+ exit 1
94
+ end
95
+
96
+ def parse_gem_version(text)
97
+ $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
98
+ end
99
+
100
+ private
101
+ def read_environment_rb
102
+ File.read("#{RAILS_ROOT}/config/environment.rb")
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ # All that for this:
109
+ Rails.boot!
@@ -0,0 +1,19 @@
1
+ # SQLite version 3.x
2
+ # gem install sqlite3-ruby (not necessary on OS X Leopard)
3
+ development:
4
+ adapter: sqlite3
5
+ database: db/development.sqlite3
6
+ timeout: 5000
7
+
8
+ # Warning: The database defined as "test" will be erased and
9
+ # re-generated from your development database when you run "rake".
10
+ # Do not set this db to the same as development or production.
11
+ test:
12
+ adapter: sqlite3
13
+ database: db/test.sqlite3
14
+ timeout: 5000
15
+
16
+ production:
17
+ adapter: sqlite3
18
+ database: db/production.sqlite3
19
+ timeout: 5000
@@ -0,0 +1,67 @@
1
+ # Be sure to restart your server when you modify this file
2
+
3
+ # Uncomment below to force Rails into production mode when
4
+ # you don't control web/app server and can't set it the proper way
5
+ # ENV['RAILS_ENV'] ||= 'production'
6
+
7
+ # Specifies gem version of Rails to use when vendor/rails is not present
8
+ RAILS_GEM_VERSION = '2.1.0' unless defined? RAILS_GEM_VERSION
9
+
10
+ # Bootstrap the Rails environment, frameworks, and default configuration
11
+ require File.join(File.dirname(__FILE__), 'boot')
12
+
13
+ Rails::Initializer.run do |config|
14
+ # Settings in config/environments/* take precedence over those specified here.
15
+ # Application configuration should go into files in config/initializers
16
+ # -- all .rb files in that directory are automatically loaded.
17
+ # See Rails::Configuration for more options.
18
+
19
+ # Skip frameworks you're not going to use. To use Rails without a database
20
+ # you must remove the Active Record framework.
21
+ # config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
22
+
23
+ # Specify gems that this application depends on.
24
+ # They can then be installed with "rake gems:install" on new installations.
25
+ # config.gem "bj"
26
+ # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
27
+ # config.gem "aws-s3", :lib => "aws/s3"
28
+
29
+ # Only load the plugins named here, in the order given. By default, all plugins
30
+ # in vendor/plugins are loaded in alphabetical order.
31
+ # :all can be used as a placeholder for all plugins not explicitly named
32
+ # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
33
+
34
+ # Add additional load paths for your own custom dirs
35
+ # config.load_paths += %W( #{RAILS_ROOT}/extras )
36
+
37
+ # Force all environments to use the same logger level
38
+ # (by default production uses :info, the others :debug)
39
+ # config.log_level = :debug
40
+
41
+ # Make Time.zone default to the specified zone, and make Active Record store time values
42
+ # in the database in UTC, and return them converted to the specified local zone.
43
+ # Run "rake -D time" for a list of tasks for finding time zone names. Uncomment to use default local time.
44
+ config.time_zone = 'UTC'
45
+
46
+ # Your secret key for verifying cookie session data integrity.
47
+ # If you change this key, all old sessions will become invalid!
48
+ # Make sure the secret is at least 30 characters and all random,
49
+ # no regular words or you'll be exposed to dictionary attacks.
50
+ config.action_controller.session = {
51
+ :session_key => '_sample_session',
52
+ :secret => 'e747620fa6b20fae99c5fe0797091fe35a84dd367f4031d1a37cd61376ecce0537b5ae22c5d606e30be2a05ef303ee2aa39813080e6fdd6bb3bd932552313c5c'
53
+ }
54
+
55
+ # Use the database for sessions instead of the cookie-based default,
56
+ # which shouldn't be used to store highly confidential information
57
+ # (create the session table with "rake db:sessions:create")
58
+ # config.action_controller.session_store = :active_record_store
59
+
60
+ # Use SQL instead of Active Record's schema dumper when creating the test database.
61
+ # This is necessary if your schema can't be completely dumped by the schema dumper,
62
+ # like if you have constraints or database-specific column types
63
+ # config.active_record.schema_format = :sql
64
+
65
+ # Activate observers that should always be running
66
+ # config.active_record.observers = :cacher, :garbage_collector
67
+ end