warbler_updated 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +10 -0
  3. data/History.txt +411 -0
  4. data/LICENSE.txt +27 -0
  5. data/Mavenfile +32 -0
  6. data/README.rdoc +280 -0
  7. data/Rakefile +63 -0
  8. data/bin/warble +11 -0
  9. data/ext/JarMain.java +334 -0
  10. data/ext/WarMain.java +375 -0
  11. data/ext/WarblerJar.java +199 -0
  12. data/ext/WarblerJarService.java +18 -0
  13. data/lib/warbler/application.rb +104 -0
  14. data/lib/warbler/bundler_helper.rb +22 -0
  15. data/lib/warbler/config.rb +265 -0
  16. data/lib/warbler/executable_helper.rb +25 -0
  17. data/lib/warbler/gems.rb +77 -0
  18. data/lib/warbler/jar.rb +348 -0
  19. data/lib/warbler/pathmap_helper.rb +20 -0
  20. data/lib/warbler/platform_helper.rb +26 -0
  21. data/lib/warbler/rake_helper.rb +30 -0
  22. data/lib/warbler/scripts/rails.rb +5 -0
  23. data/lib/warbler/task.rb +185 -0
  24. data/lib/warbler/templates/bundler.erb +19 -0
  25. data/lib/warbler/templates/config.erb +1 -0
  26. data/lib/warbler/templates/jar.erb +11 -0
  27. data/lib/warbler/templates/jbundler.erb +2 -0
  28. data/lib/warbler/templates/rack.erb +5 -0
  29. data/lib/warbler/templates/rails.erb +1 -0
  30. data/lib/warbler/templates/war.erb +19 -0
  31. data/lib/warbler/traits/bundler.rb +157 -0
  32. data/lib/warbler/traits/gemspec.rb +79 -0
  33. data/lib/warbler/traits/jar.rb +58 -0
  34. data/lib/warbler/traits/jbundler.rb +48 -0
  35. data/lib/warbler/traits/nogemspec.rb +47 -0
  36. data/lib/warbler/traits/rack.rb +33 -0
  37. data/lib/warbler/traits/rails.rb +91 -0
  38. data/lib/warbler/traits/war.rb +260 -0
  39. data/lib/warbler/traits.rb +124 -0
  40. data/lib/warbler/version.rb +10 -0
  41. data/lib/warbler/war.rb +8 -0
  42. data/lib/warbler/web_server.rb +125 -0
  43. data/lib/warbler/zip_support.rb +13 -0
  44. data/lib/warbler.rb +40 -0
  45. data/lib/warbler_jar.jar +0 -0
  46. data/warble.rb +188 -0
  47. data/warbler.gemspec +37 -0
  48. data/web.xml.erb +57 -0
  49. metadata +188 -0
@@ -0,0 +1,260 @@
1
+ #--
2
+ # Copyright (c) 2010-2012 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
+ require 'ostruct'
9
+
10
+ module Warbler
11
+ module Traits
12
+ # The War trait sets up the layout and generates web.xml for the war project.
13
+ class War
14
+ include Trait
15
+ include RakeHelper
16
+ include PathmapHelper
17
+
18
+ DEFAULT_GEM_PATH = '/WEB-INF/gems'
19
+
20
+ def self.detect?
21
+ Traits::Rails.detect? || Traits::Rack.detect?
22
+ end
23
+
24
+ def before_configure
25
+ config.gem_path = DEFAULT_GEM_PATH
26
+ config.pathmaps = default_pathmaps
27
+ config.webxml = default_webxml_config
28
+ config.webinf_files = default_webinf_files
29
+ config.java_libs = default_jar_files
30
+ config.public_html = FileList["public/**/{.[!.],.??*,*}"] # include dotfiles
31
+ config.jar_extension = 'war'
32
+ config.init_contents << "#{config.warbler_templates}/war.erb"
33
+ end
34
+
35
+ def after_configure
36
+ update_gem_path(DEFAULT_GEM_PATH)
37
+ end
38
+
39
+ def default_pathmaps
40
+ p = OpenStruct.new
41
+ p.public_html = ["%{public/,}p"]
42
+ p.java_libs = ["WEB-INF/lib/%f"]
43
+ p.java_classes = ["WEB-INF/classes/%p"]
44
+ p.application = ["WEB-INF/%p"]
45
+ p.webinf = ["WEB-INF/%{.erb$,}f"]
46
+ p.gemspecs = ["#{config.relative_gem_path}/specifications/%f"]
47
+ p.gems = ["#{config.relative_gem_path}/gems/%p"]
48
+ p
49
+ end
50
+
51
+ def default_webxml_config
52
+ c = WebxmlOpenStruct.new
53
+ c.public.root = '/'
54
+ c.jndi = nil
55
+ c.ignored = %w(jndi booter)
56
+ c
57
+ end
58
+
59
+ def default_webinf_files
60
+ webxml = if File.exist?("config/web.xml")
61
+ "config/web.xml"
62
+ elsif File.exist?("config/web.xml.erb")
63
+ "config/web.xml.erb"
64
+ else
65
+ "#{WARBLER_HOME}/web.xml.erb"
66
+ end
67
+ FileList[webxml]
68
+ end
69
+
70
+ def default_jar_files
71
+ require 'jruby-jars' unless defined? JRubyJars.core_jar_path
72
+ require 'jruby-rack' unless defined? JRubyJars.jruby_rack_jar_path
73
+ FileList[JRubyJars.core_jar_path, JRubyJars.stdlib_jar_path, JRubyJars.jruby_rack_jar_path]
74
+ end
75
+
76
+ def update_archive(jar)
77
+ add_public_files(jar)
78
+ add_webxml(jar)
79
+ move_jars_to_webinf_lib(jar, config.move_jars_to_webinf_lib)
80
+ add_runnables(jar) if config.features.include?("runnable")
81
+ add_executables(jar) if config.features.include?("executable")
82
+ add_gemjar(jar) if config.features.include?("gemjar")
83
+ end
84
+
85
+ # Add public/static assets to the root of the war file.
86
+ def add_public_files(jar)
87
+ config.public_html.exclude( *(config.excludes.to_a) )
88
+ config.public_html.map {|f| jar.add_with_pathmaps(config, f, :public_html) }
89
+ end
90
+
91
+ # Add web.xml and other WEB-INF configuration files from
92
+ # config.webinf_files to the war file.
93
+ def add_webxml(jar)
94
+ config.webinf_files.each do |wf|
95
+ if wf =~ /\.erb$/
96
+ jar.files[apply_pathmaps(config, wf, :webinf)] = jar.expand_erb(wf, config)
97
+ else
98
+ jar.files[apply_pathmaps(config, wf, :webinf)] = wf
99
+ end
100
+ end
101
+ end
102
+
103
+ def add_runnables(jar, main_class = 'WarMain')
104
+ main_class = main_class.sub('.class', '') # handles WarMain.class
105
+ unless config.manifest_file
106
+ manifest = Warbler::Jar::DEFAULT_MANIFEST.chomp + "Main-Class: #{main_class}\n"
107
+ jar.files['META-INF/MANIFEST.MF'] = StringIO.new(manifest)
108
+ end
109
+ [ 'JarMain', 'WarMain', main_class ].uniq.each do |klass|
110
+ jar.files["#{klass}.class"] = jar.entry_in_jar(WARBLER_JAR, "#{klass}.class")
111
+ end
112
+ end
113
+
114
+ def add_executables(jar)
115
+ webserver = WEB_SERVERS[config.webserver.to_s]
116
+ webserver.add(jar)
117
+ add_runnables jar, webserver.main_class || 'WarMain'
118
+ end
119
+
120
+ def add_gemjar(jar)
121
+ gem_jar = Warbler::Jar.new
122
+ gem_path = Regexp::quote(config.relative_gem_path)
123
+ gems = jar.files.select{|k,v| k =~ %r{#{gem_path}/} }
124
+ gems.each do |k,v|
125
+ gem_jar.files[k.sub(%r{#{gem_path}/}, '')] = v
126
+ end
127
+ jar.files["WEB-INF/lib/gems.jar"] = "tmp/gems.jar"
128
+ jar.files.reject!{|k,v| k =~ /#{gem_path}/ || k == "WEB-INF/tmp/gems.jar"}
129
+ mkdir_p "tmp"
130
+ gem_jar.add_manifest
131
+ gem_jar.create("tmp/gems.jar")
132
+ end
133
+
134
+ def move_jars_to_webinf_lib(jar, selector = nil)
135
+ return unless selector # default is false
136
+ selector = /.*/ if selector == true # move all if not a RegExp given
137
+ default_jar_paths = default_jar_files
138
+ default_jars = default_jar_paths.map { |file| File.basename(file) }
139
+ jar.files.keys.select { |k| k =~ /^WEB-INF\/.*\.jar$/ }.each do |k|
140
+ if k.start_with?('WEB-INF/lib/') # .jar already in WEB-INF/lib
141
+ if default_jars.include? k.sub('WEB-INF/lib/', '')
142
+ # exclude default jar (if it's not matched by selector) :
143
+ jar.files.delete(k) unless selector =~ File.basename(k)
144
+ end
145
+ next
146
+ end
147
+ next unless selector =~ File.basename(k)
148
+ # default jars might end up mapped twice as they're part of gems
149
+ next if default_jar_paths.include?(jar.files[k])
150
+ name = k.sub('WEB-INF', '')[1..-1].gsub(/[\/\\]/, '-')
151
+ jar.files["WEB-INF/lib/#{name}"] = jar.files[k]
152
+ jar.files[k] = empty_jar
153
+ end
154
+ end
155
+
156
+ def empty_jar
157
+ @empty_jar ||= begin
158
+ t = Tempfile.new(["empty", "jar"])
159
+ path = t.path
160
+ t.close!
161
+ ZipSupport.create(path) do |zipfile|
162
+ zipfile.mkdir("META-INF")
163
+ zipfile.get_output_stream("META-INF/MANIFEST.MF") {|f| f << ::Warbler::Jar::DEFAULT_MANIFEST }
164
+ end
165
+ at_exit { File.delete(path) }
166
+ path
167
+ end
168
+ end
169
+
170
+ # Helper class for holding arbitrary config.webxml values for injecting into +web.xml+.
171
+ class WebxmlOpenStruct < OpenStruct
172
+
173
+ %w(java com org javax gem).each do |name|
174
+ class_eval "def #{name}; method_missing(:#{name}); end"
175
+ end
176
+
177
+ def initialize(key = 'webxml')
178
+ @key = key
179
+ @table = Hash.new { |h, k|
180
+ new_ostruct_member!(k)
181
+ h[k] = WebxmlOpenStruct.new(k)
182
+ }
183
+
184
+ @servlet_filter_async = nil # true/false
185
+ end
186
+
187
+ def servlet_filter; @servlet_filter ||= 'org.jruby.rack.RackFilter' end
188
+ attr_writer :servlet_filter
189
+
190
+ def servlet_filter_name; @servlet_filter_name ||= 'RackFilter' end
191
+ attr_writer :servlet_filter_name
192
+
193
+ def servlet_filter_url_pattern; @servlet_filter_url_pattern ||= '/*' end
194
+ attr_writer :servlet_filter_url_pattern
195
+
196
+ attr_accessor :servlet_filter_async
197
+
198
+ def servlet_context_listener
199
+ case booter
200
+ when :rack
201
+ 'org.jruby.rack.RackServletContextListener'
202
+ when :rails
203
+ 'org.jruby.rack.rails.RailsServletContextListener'
204
+ else # default (due compatibility)
205
+ 'org.jruby.rack.rails.RailsServletContextListener'
206
+ end
207
+ end
208
+
209
+ def servlet_context_listeners
210
+ @servlet_context_listeners ||= [ servlet_context_listener ]
211
+ end
212
+
213
+ def servlet_context_params(escape = true)
214
+ require 'cgi'; params = {}
215
+ @table.each do |k,v|
216
+ case v
217
+ when WebxmlOpenStruct
218
+ v.context_params.each do |nk,nv|
219
+ params["#{escape ? CGI::escapeHTML(k.to_s) : k.to_s}.#{nk}"] = nv
220
+ end
221
+ else
222
+ params[escape ? CGI::escapeHTML(k.to_s) : k.to_s] = escape ? CGI::escapeHTML(v.to_s) : v.to_s
223
+ end
224
+ end
225
+ extra_ignored = Array === ignored ? ignored : []
226
+ params.delete_if { |k,_| ['ignored', *extra_ignored].include?(k.to_s) }
227
+ params
228
+ end
229
+ # @deprecated
230
+ alias_method :context_params, :servlet_context_params
231
+
232
+ def to_s
233
+ "No value for '#@key' found"
234
+ end
235
+
236
+ private
237
+
238
+ def method_missing(mid, *args)
239
+ len = args.length
240
+ if mname = mid[/.*(?==\z)/m]
241
+ if len != 1
242
+ raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
243
+ end
244
+ self[mname] = args[0]
245
+ elsif len == 0
246
+ @table[mid]
247
+ else
248
+ err = NoMethodError.new "undefined method `#{mid}' for #{self}", mid, args
249
+ err.set_backtrace caller(1)
250
+ raise err
251
+ end
252
+ end
253
+
254
+ def respond_to_missing?(mid, include_private = false)
255
+ @table.key?(mid.to_s.chomp('=').to_sym) || super
256
+ end
257
+ end
258
+ end
259
+ end
260
+ end
@@ -0,0 +1,124 @@
1
+ #--
2
+ # Copyright (c) 2010-2012 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
+ require 'stringio'
9
+ require 'tsort'
10
+
11
+ module Warbler
12
+ # Traits are project configuration characteristics that correspond
13
+ # to the framework or project layout. Each trait corresponds to a
14
+ # class in Warbler::Traits that contains baked-in knowledge about
15
+ # the kind of project and how it should be packed into the jar or
16
+ # war file.
17
+ module Traits
18
+ attr_accessor :traits
19
+
20
+ def initialize
21
+ @traits = auto_detect_traits
22
+ end
23
+
24
+ def auto_detect_traits
25
+ TraitsDependencyArray.new(Traits.constants.map {|t| Traits.const_get(t)}).tsort.select {|tc| tc.detect? }
26
+ end
27
+
28
+ def before_configure
29
+ trait_objects.each {|t| t.before_configure }
30
+ end
31
+
32
+ def after_configure
33
+ trait_objects.each {|t| t.after_configure }
34
+ end
35
+
36
+ def trait_objects
37
+ @trait_objects ||= @traits.map {|klass| klass.new(self) }
38
+ end
39
+
40
+ def update_archive(jar)
41
+ trait_objects.each {|t| t.update_archive(jar) }
42
+ end
43
+
44
+ def dump_traits
45
+ @trait_objects = nil
46
+ @traits.collect! {|t| t.name }
47
+ end
48
+ end
49
+
50
+ # Each trait class includes this module to receive shared functionality.
51
+ module Trait
52
+ module ClassMethods
53
+ def requirements
54
+ []
55
+ end
56
+ end
57
+
58
+ def self.included(base)
59
+ base.extend ClassMethods
60
+ end
61
+
62
+ attr_reader :config
63
+ def initialize(config)
64
+ @config = config
65
+ end
66
+
67
+ def before_configure
68
+ end
69
+
70
+ def after_configure
71
+ end
72
+
73
+ def update_archive(jar)
74
+ end
75
+
76
+ def add_init_load_path(path)
77
+ config.init_contents << StringIO.new("$LOAD_PATH.unshift File.expand_path(File.join('..', '..', '#{path}'), __FILE__)\n")
78
+ # with __FILE__ = "uri:classloader:/META-INF/init.rb"
79
+ # ... will end up as "uri:classloader://xxx-gem/lib"
80
+ end
81
+
82
+ def add_main_rb(jar, bin_path, params = nil)
83
+ binary = "".dup
84
+ binary << "ARGV.unshift('#{params}')\n" if params
85
+ binary << "load '#{bin_path}'"
86
+ jar.files['META-INF/main.rb'] = StringIO.new(binary)
87
+ end
88
+
89
+ def update_gem_path(default_gem_path)
90
+ if config.gem_path != default_gem_path
91
+ config.gem_path = "/#{config.gem_path}" unless config.gem_path =~ %r{^/}
92
+ sub_gem_path = config.gem_path[1..-1]
93
+ config.pathmaps.marshal_dump.keys.each do |pm|
94
+ config.pathmaps.send(pm).each {|p| p.sub!(default_gem_path[1..-1], sub_gem_path)}
95
+ end
96
+ config.webxml["gem"]["path"] = config.gem_path if config.webxml
97
+ end
98
+ end
99
+
100
+ def jruby_jars
101
+ require 'jruby-jars'
102
+ FileList[JRubyJars.core_jar_path, JRubyJars.stdlib_jar_path]
103
+ end
104
+ end
105
+
106
+ class TraitsDependencyArray < Array
107
+ include TSort
108
+
109
+ alias tsort_each_node each
110
+ def tsort_each_child(node, &block)
111
+ node.requirements.each(&block)
112
+ end
113
+ end
114
+
115
+ end
116
+
117
+ require 'warbler/traits/jar'
118
+ require 'warbler/traits/war'
119
+ require 'warbler/traits/rails'
120
+ require 'warbler/traits/rack'
121
+ require 'warbler/traits/bundler'
122
+ require 'warbler/traits/jbundler'
123
+ require 'warbler/traits/gemspec'
124
+ require 'warbler/traits/nogemspec'
@@ -0,0 +1,10 @@
1
+ #--
2
+ # Copyright (c) 2010-2012 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 = "2.1.0"
10
+ end
@@ -0,0 +1,8 @@
1
+ #--
2
+ # Copyright (c) 2010-2012 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
+ require 'warbler/jar'
@@ -0,0 +1,125 @@
1
+ module Warbler
2
+ class WebServer
3
+ class Artifact < Struct.new(:repo, :group_id, :artifact_id, :version)
4
+
5
+ def path_fragment
6
+ @path_fragment ||= "#{group_id.gsub('.', '/')}/#{artifact_id}/#{version}/#{artifact_id}-#{version}.jar"
7
+ end
8
+
9
+ def cached_path
10
+ @cached_path ||= File.join(local_repository, path_fragment)
11
+ end
12
+
13
+ def download_url
14
+ @download_url ||= "#{repo}/#{path_fragment}" #:nocov:
15
+ end
16
+
17
+ def local_path
18
+ unless File.exist?(cached_path)
19
+ puts "Downloading #{artifact_id}-#{version}.jar" #:nocov:
20
+ FileUtils.mkdir_p File.dirname(cached_path) #:nocov:
21
+ require 'open-uri' #:nocov:
22
+ begin
23
+ open(download_url) do |stream| #:nocov:
24
+ File.open(cached_path, "wb") do |f| #:nocov:
25
+ while buf = stream.read(4096) #:nocov:
26
+ f << buf #:nocov:
27
+ end #:nocov:
28
+ end #:nocov:
29
+ end #:nocov:
30
+ rescue => e
31
+ e.message.concat " - #{download_url}"
32
+ raise e
33
+ end
34
+ end
35
+ cached_path
36
+ end
37
+
38
+ @@local_repository = nil
39
+
40
+ def local_repository
41
+ @@local_repository ||= begin
42
+ m2_home = File.join(user_home, '.m2')
43
+ if File.exist?(settings = File.join(m2_home, 'settings.xml'))
44
+ local_repo = detect_local_repository(settings)
45
+ end
46
+ if local_repo.nil? && mvn_home = ENV['M2_HOME'] || ENV['MAVEN_HOME']
47
+ if File.exist?(settings = File.join(mvn_home, 'conf/settings.xml'))
48
+ local_repo = detect_local_repository(settings)
49
+ end
50
+ end
51
+ local_repo || File.join(m2_home, 'repository')
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def user_home
58
+ ENV[ 'HOME' ] || begin
59
+ user_home = Dir.home if Dir.respond_to?(:home)
60
+ unless user_home
61
+ user_home = ENV_JAVA[ 'user.home' ] if Object.const_defined?(:ENV_JAVA)
62
+ end
63
+ user_home
64
+ end
65
+ end
66
+
67
+ def detect_local_repository(settings); require 'rexml/document'
68
+ doc = REXML::Document.new( File.read( settings ) )
69
+ if local_repo = doc.root.elements['localRepository']
70
+ if ( local_repo = local_repo.first )
71
+ local_repo = local_repo.value
72
+ local_repo = nil if local_repo.empty?
73
+ end
74
+ end
75
+ local_repo
76
+ end
77
+
78
+ end
79
+
80
+ def add(jar)
81
+ jar.files["WEB-INF/webserver.jar"] = @artifact.local_path
82
+ end
83
+
84
+ def main_class
85
+ 'WarMain.class'
86
+ end
87
+ end
88
+
89
+ class JettyServer < WebServer
90
+ def initialize
91
+ @artifact = Artifact.new(ENV["MAVEN_REPO"] || "https://repo1.maven.org/maven2",
92
+ "org.eclipse.jetty", "jetty-runner",
93
+ ENV["WEBSERVER_VERSION"] || "9.2.9.v20150224")
94
+ end
95
+
96
+ def add(jar)
97
+ super
98
+ jar.files["WEB-INF/webserver.xml"] ||= StringIO.new(<<-CONFIG)
99
+ <?xml version="1.0"?>
100
+ <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd">
101
+
102
+ <Configure id="Server" class="org.eclipse.jetty.server.Server">
103
+ </Configure>
104
+ CONFIG
105
+
106
+ jar.files["WEB-INF/webserver.properties"] ||= StringIO.new(<<-PROPS)
107
+ mainclass = org.eclipse.jetty.runner.Runner
108
+ args = args0,args1,args2,args3,args4,args5,args6
109
+ props = jetty.home
110
+ args0 = --host
111
+ args1 = {{host}}
112
+ args2 = --port
113
+ args3 = {{port}}
114
+ args4 = --config
115
+ args5 = {{config}}
116
+ args6 = {{warfile}}
117
+ jetty.home = {{webroot}}
118
+ PROPS
119
+ end
120
+ end
121
+
122
+ WEB_SERVERS = Hash.new { |hash,_| hash['jetty'] }
123
+ WEB_SERVERS['jetty'] = JettyServer.new
124
+
125
+ end
@@ -0,0 +1,13 @@
1
+ require 'zip'
2
+
3
+ module Warbler
4
+ class ZipSupport
5
+ def self.create(filename, &blk)
6
+ Zip::File.open(filename, Zip::File::CREATE, &blk)
7
+ end
8
+
9
+ def self.open(filename, &blk)
10
+ Zip::File.open(filename, &blk)
11
+ end
12
+ end
13
+ end
data/lib/warbler.rb ADDED
@@ -0,0 +1,40 @@
1
+ #--
2
+ # Copyright (c) 2010-2012 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
+ # Warbler is a lightweight, flexible, Rake-based system for packaging
9
+ # your Ruby applications into .jar or .war files.
10
+ module Warbler
11
+ WARBLER_HOME = File.expand_path(File.dirname(__FILE__) + '/..') unless defined?(WARBLER_HOME)
12
+ WARBLER_JAR = "#{WARBLER_HOME}/lib/warbler_jar.jar" unless defined?(WARBLER_JAR)
13
+
14
+ class << self
15
+ # An instance of Warbler::Application used by the +warble+ command.
16
+ attr_accessor :application
17
+ # Set Warbler.framework_detection to false to disable
18
+ # auto-detection based on application configuration.
19
+ attr_accessor :framework_detection
20
+ attr_writer :project_application
21
+ end
22
+
23
+ # Warbler loads the project Rakefile in a separate Rake application
24
+ # from the one where the Warbler tasks are run.
25
+ def self.project_application
26
+ application.load_project_rakefile if application
27
+ @project_application || Rake.application
28
+ end
29
+ self.framework_detection = true
30
+ end
31
+
32
+ require 'warbler/version'
33
+ require 'warbler/executable_helper'
34
+ require 'warbler/rake_helper'
35
+ require 'warbler/pathmap_helper'
36
+ require 'warbler/platform_helper'
37
+ require 'warbler/bundler_helper'
38
+ require 'warbler/task'
39
+ require 'warbler/application'
40
+ require 'warbler/web_server'
Binary file