rdmopensource-warbler 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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