lib/appengine-tools/bundler.rb in appengine-tools-0.0.4 vs lib/appengine-tools/bundler.rb in appengine-tools-0.0.5

- old
+ new

@@ -15,10 +15,11 @@ # See the License for the specific language governing permissions and # limitations under the License. require 'appengine-rack' require 'appengine-tools/boot' +require 'appengine-tools/gem_bundler' require 'appengine-tools/web-xml' require 'appengine-tools/xml-formatter' require 'fileutils' require 'yaml' @@ -33,74 +34,100 @@ end def path(*pieces) File.join(@root, *pieces) end - + def webinf path('WEB-INF') end - + def webinf_lib path('WEB-INF', 'lib') end - + + def gems_jar + path('WEB-INF', 'lib', 'gems.jar') + end + def generation_dir path('WEB-INF', 'appengine-generated') end + def gems_dir + path('.gems') + end + + def gemfile + path('Gemfile') + end + def config_ru path('config.ru') end - + def web_xml path('WEB-INF', 'web.xml') end - + def aeweb_xml path('WEB-INF', 'appengine-web.xml') end - + def build_status path('WEB-INF', 'appengine-generated', 'build_status.yaml') end - + def public_root path(AppEngine::Rack.app.public_root) if AppEngine::Rack.app.public_root end - + + def favicon_ico + File.join(public_root ? public_root : @root, 'favicon.ico') + end + + def robots_txt + File.join(public_root ? public_root : @root, 'robots.txt') + end + def rack_app AppEngine::Rack.app end - + end class AppBundler EXISTING_JRUBY = /^(jruby-abridged|appengine-jruby)-.*jar$/ EXISTING_RACK = /jruby-rack.*jar$/ EXISTING_APIS = /^appengine-api.*jar$/ JRUBY_RACK = 'jruby-rack-0.9.5.jar' - JRUBY_RACK_URL = 'http://kenai.com/projects/jruby-rack/' + - "downloads/download/#{JRUBY_RACK}" + JRUBY_RACK_URL = "http://kenai.com/downloads/jruby-rack/#{JRUBY_RACK}" RACKUP = %q{Dir.chdir('..') if Dir.pwd =~ /WEB-INF$/;} + %q{eval IO.read('config.ru'), nil, 'config.ru', 1} def initialize(root_path) @app = Application.new(root_path) end - def bundle - bundle_deps + def bundle(args=[]) + bundle_deps(args) convert_config_ru end - def bundle_deps + def bundle_deps(args=[]) create_webinf + bundle_gems(args) copy_jruby copy_rack copy_sdk end + + def bundle_gems(args) + return if defined? JRUBY_VERSION + gem_bundler = AppEngine::Admin::GemBundler.new(app.root) + gem_bundler.bundle(args) + end def app @app end @@ -109,38 +136,40 @@ Dir.mkdir(app.webinf_lib) unless File.exists?(app.webinf_lib) Dir.mkdir(app.generation_dir) unless File.exists?(app.generation_dir) end def create_public - return if app.public_root.nil? - Dir.mkdir(app.public_root) unless File.exists?(app.public_root) + return unless defined? JRUBY_VERSION + if app.public_root and !File.exists?(app.public_root) + Dir.mkdir(app.public_root) + end + FileUtils.touch(app.favicon_ico) unless File.exists?(app.favicon_ico) + FileUtils.touch(app.robots_txt) unless File.exists?(app.robots_txt) end def convert_config_ru if !File.exists?(app.config_ru) if File.exists?(app.web_xml) unless File.exists?(app.aeweb_xml) - puts "!! Error: you either need a #{app.config_ru} or " + puts "Error: you either need a #{app.config_ru} or " puts " #{app.aeweb_xml}." exit 1 end else # TODO auto generate a config.ru - puts "!! Error: you need to create #{app.config_ru}." + puts "Error: you need to create #{app.config_ru}." exit 1 end else generate_xml create_public end end def copy_jruby require 'appengine-jruby-jars' - update_jars( - "JRuby", EXISTING_JRUBY, [AppEngine::JRubyJars.jruby_jar], - /rubygems/, [AppEngine::JRubyJars.rubygems_jar]) + update_jars("JRuby", EXISTING_JRUBY, [AppEngine::JRubyJars.jruby_jar]) end def copy_rack update_jars('jruby-rack', EXISTING_RACK, [JRUBY_RACK]) do require 'open-uri' @@ -171,20 +200,20 @@ end def update_jars(name, regex, jars, opt_regex=nil, opt_jars=[]) existing = find_jars(regex) if existing.empty? - message = "Installing #{name}" + message = "=> Installing #{name}" jars_to_install = jars + opt_jars else has_optional_jars = existing.any? {|j| j =~ opt_regex} expected_jars = jars expected_jars.concat(opt_jars) if has_optional_jars expected = expected_jars.map {|path| File.basename(path)} if existing.size != expected.size || (expected & existing) != expected - message = "Updating #{name}" + message = "=> Updating #{name}" jars_to_install = expected_jars end end if jars_to_install puts message @@ -223,18 +252,18 @@ Dir.glob("#{app.webinf_lib}/*.jar").each do |path| $: << path end app_root = app.root builder = WebXmlBuilder.new do - # First configure the basic jruby-rack settings. - add_jruby_rack_defaults(RACKUP) - - # Now read the user's rackup file + # First read the user's rackup file # TODO generate a skeleton if it's missing Dir.chdir(app_root) do eval IO.read('config.ru'), nil, 'config.ru', 1 end + + # Now configure the basic jruby-rack settings. + add_jruby_rack_defaults(RACKUP) end open(app.web_xml, 'w') do |webxml| xml = AppEngine::Rack::XmlFormatter.format(builder.to_xml) webxml.write(xml) end @@ -253,15 +282,15 @@ :exec => false) end end end - def self.bundle_app(root_path) - AppBundler.new(root_path).bundle + def self.bundle_app(*args) + AppBundler.new(args.pop).bundle(args) end - def self.bundle_deps(root_path) - AppBundler.new(root_path).bundle_deps + def self.bundle_deps(*args) + AppBundler.new(args.pop).bundle(args) end end end