appengine-tools 0.0.4 → 0.0.5

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.
data/Rakefile CHANGED
@@ -5,7 +5,7 @@ require 'date'
5
5
  require 'spec/rake/spectask'
6
6
 
7
7
  GEM = "appengine-tools"
8
- GEM_VERSION = "0.0.4"
8
+ GEM_VERSION = "0.0.5"
9
9
  AUTHOR = "Ryan Brown"
10
10
  EMAIL = "ribrdb@gmail.com"
11
11
  HOMEPAGE = "http://code.google.com/p/appengine-jruby"
@@ -29,6 +29,8 @@ spec = Gem::Specification.new do |s|
29
29
  s.add_dependency('appengine-rack')
30
30
  s.add_dependency('appengine-sdk')
31
31
  s.add_dependency('appengine-jruby-jars')
32
+ s.add_dependency('bundler', ["0.6.0"])
33
+ s.add_dependency('rubyzip')
32
34
  end
33
35
 
34
36
  task :default => :spec
@@ -27,9 +27,6 @@ module AppEngine
27
27
  import Java.ComGoogleAppengineToolsAdmin.AppAdminFactory
28
28
  import Java.ComGoogleAppengineToolsAdmin.AppVersionUpload
29
29
  import Java.ComGoogleAppengineToolsUtil.Logging
30
- import java.io.FileOutputStream
31
- import java.util.jar.JarOutputStream
32
- import java.util.zip.ZipEntry
33
30
 
34
31
  class JRubyAppVersionUpload < AppVersionUpload
35
32
  def initialize(connection, app)
@@ -76,13 +73,12 @@ module AppEngine
76
73
  end
77
74
 
78
75
  class JRubyAppCfg
79
- NO_XML_COMMANDS = [ 'version' ]
80
- RUBY_COMMANDS = ['bundle', 'gem', 'help', 'run']
76
+ NO_XML_COMMANDS = %w{version}
77
+ RUBY_COMMANDS = %w{gem bundle help run}
81
78
  COMMAND_SUMMARY = <<EOF
82
79
  run: run jruby in your application environment.
83
- gem: run rubygems for your application.
84
80
  bundle: package your application for deployment.
85
- The 'gem' and 'run' commands assume the app directory is the current directory.
81
+ The 'run' command assumes the app directory is the current directory.
86
82
  EOF
87
83
  class << self
88
84
  def main(args)
@@ -91,7 +87,7 @@ EOF
91
87
  send(command, *parsed_args)
92
88
  return
93
89
  end
94
- if command && ! NO_XML_COMMANDS.include?(command)
90
+ if command && !NO_XML_COMMANDS.include?(command)
95
91
  path = parsed_args[0]
96
92
  AppEngine::Admin.bundle_app(path)
97
93
  AppEngine::Development.boot_jruby
@@ -100,7 +96,7 @@ EOF
100
96
  else
101
97
  AppEngine::Development.boot_jruby
102
98
  end
103
- puts "running AppCfg"
99
+ puts "=> Running AppCfg"
104
100
  run_appcfg(args)
105
101
  end
106
102
 
@@ -111,98 +107,38 @@ EOF
111
107
  AppCfg.new(factory, args.to_java(java.lang.String))
112
108
  end
113
109
 
114
- def bundle(path)
115
- AppEngine::Admin.bundle_app(path)
110
+ def bundle(*args)
111
+ if File.directory?(args[-1] || '')
112
+ AppEngine::Admin.bundle_app(*args)
113
+ else
114
+ bundle_help
115
+ end
116
116
  end
117
117
 
118
118
  def bundle_help
119
119
  help = <<EOF
120
- #{$0} bundle app_dir
120
+ #{$0} bundle [gem bundle options] app_dir
121
121
 
122
- Generates files necessary to run an application as a Java Servlet.
123
- This is run automatically when necessary, so you should not
124
- need to run it manually.
122
+ Bundles the gems listed in Gemfile and generates files necessary
123
+ to run an application as a servlet. This runs automatically for you,
124
+ but you need to run it manually to update gems if you don't specify
125
+ a version number. Pass --update to refresh bundled gems.
125
126
 
126
127
  EOF
127
128
  end
128
-
129
+
129
130
  def gem(*args)
130
- AppEngine::Admin.bundle_deps('.')
131
- AppEngine::Development.boot_jruby
132
- puts "=> Running RubyGems"
133
- require 'rubygems'
134
- require 'rubygems/command_manager'
135
- Gem.configuration = Gem::ConfigFile.new(args)
136
- Gem.use_paths('.gems')
137
- Gem::Command.add_specific_extra_args(
138
- 'install', %w(--no-rdoc --no-ri))
139
- saved_gems = all_gem_specs
140
- begin
141
- Gem::CommandManager.instance.run(Gem.configuration.args)
142
- rescue Gem::SystemExitException => e
143
- exit e.exit_code unless e.exit_code == 0
144
- end
145
- unless ((all_gem_specs == saved_gems) &&
146
- File.exist?('WEB-INF/lib/gems.jar'))
147
- Dir.mkdir 'WEB-INF' unless File.exists? 'WEB-INF'
148
- Dir.mkdir 'WEB-INF/lib' unless File.exists? 'WEB-INF/lib'
149
- Dir.chdir '.gems'
150
- puts '=> Packaging gems'
151
- write_jar('../WEB-INF/lib/gems.jar') do |jar|
152
- add_to_jar('gems', jar)
153
- add_to_jar('specifications', jar)
154
- end
155
- puts 'If you upgraded any gems, please run `appcfg.rb gem cleanup`'
156
- puts 'to remove the old versions.'
157
- end
131
+ gem_help
158
132
  end
159
133
 
160
134
  def gem_help
161
135
  help = <<EOF
162
- #{$0} gem [rubygems arguments]
163
-
164
136
 
165
- Configures rubygems for this application and bundles the gems into a .jar file.
166
- Must be run from the application directory.
137
+ Sorry, the 'appcfg.rb gem' option is deprecated.
138
+ Simply update the 'Gemfile' and run 'appcfg.rb bundle .' instead.
167
139
 
168
140
  EOF
169
- end
170
-
171
- def all_gem_specs
172
- Gem.source_index.map do |_, spec|
173
- spec
174
- end
175
- end
176
-
177
- def write_jar(filename)
178
- filename = File.expand_path(filename)
179
- jar = JarOutputStream.new(FileOutputStream.new(filename))
180
- begin
181
- yield jar
182
- ensure
183
- jar.close
184
- end
185
- end
186
-
187
- def add_to_jar(path, jar)
188
- directory = File.directory?(path)
189
- if directory
190
- path << '/'
191
- end
192
- entry = ZipEntry.new(path)
193
- jar.put_next_entry(entry)
194
- unless directory
195
- data = IO.read(path)
196
- jar.write(data.to_java_bytes, 0, data.size)
197
- end
198
- jar.close_entry
199
- if directory
200
- Dir.entries(path).each do |filename|
201
- unless ['.', '..'].include?(filename)
202
- add_to_jar(path + filename, jar)
203
- end
204
- end
205
- end
141
+ puts help
206
142
  end
207
143
 
208
144
  def run(*args)
@@ -214,7 +150,6 @@ EOF
214
150
  help = <<EOF
215
151
  #{$0} run [ruby args]
216
152
 
217
-
218
153
  Starts the jruby interpreter within your application's environment.
219
154
  Use `#{$0} run -S command` to run a command such as rake or irb.
220
155
  Must be run from the application directory, after running bundle.
@@ -265,4 +200,4 @@ EOF
265
200
  end
266
201
  end
267
202
  end
268
- end
203
+ end
@@ -22,7 +22,6 @@ module AppEngine
22
22
  class << self
23
23
  def boot_jruby(root=nil, options={})
24
24
  unless defined?(JRUBY_VERSION)
25
- require 'rubygems'
26
25
  require 'appengine-jruby-jars'
27
26
 
28
27
  jars = [
@@ -83,4 +82,4 @@ module AppEngine
83
82
  end
84
83
  end
85
84
  end
86
- end
85
+ end
@@ -17,6 +17,7 @@
17
17
 
18
18
  require 'appengine-rack'
19
19
  require 'appengine-tools/boot'
20
+ require 'appengine-tools/gem_bundler'
20
21
  require 'appengine-tools/web-xml'
21
22
  require 'appengine-tools/xml-formatter'
22
23
  require 'fileutils'
@@ -35,43 +36,63 @@ module AppEngine
35
36
  def path(*pieces)
36
37
  File.join(@root, *pieces)
37
38
  end
38
-
39
+
39
40
  def webinf
40
41
  path('WEB-INF')
41
42
  end
42
-
43
+
43
44
  def webinf_lib
44
45
  path('WEB-INF', 'lib')
45
46
  end
46
-
47
+
48
+ def gems_jar
49
+ path('WEB-INF', 'lib', 'gems.jar')
50
+ end
51
+
47
52
  def generation_dir
48
53
  path('WEB-INF', 'appengine-generated')
49
54
  end
50
55
 
56
+ def gems_dir
57
+ path('.gems')
58
+ end
59
+
60
+ def gemfile
61
+ path('Gemfile')
62
+ end
63
+
51
64
  def config_ru
52
65
  path('config.ru')
53
66
  end
54
-
67
+
55
68
  def web_xml
56
69
  path('WEB-INF', 'web.xml')
57
70
  end
58
-
71
+
59
72
  def aeweb_xml
60
73
  path('WEB-INF', 'appengine-web.xml')
61
74
  end
62
-
75
+
63
76
  def build_status
64
77
  path('WEB-INF', 'appengine-generated', 'build_status.yaml')
65
78
  end
66
-
79
+
67
80
  def public_root
68
81
  path(AppEngine::Rack.app.public_root) if AppEngine::Rack.app.public_root
69
82
  end
70
-
83
+
84
+ def favicon_ico
85
+ File.join(public_root ? public_root : @root, 'favicon.ico')
86
+ end
87
+
88
+ def robots_txt
89
+ File.join(public_root ? public_root : @root, 'robots.txt')
90
+ end
91
+
71
92
  def rack_app
72
93
  AppEngine::Rack.app
73
94
  end
74
-
95
+
75
96
  end
76
97
 
77
98
  class AppBundler
@@ -79,8 +100,7 @@ module AppEngine
79
100
  EXISTING_RACK = /jruby-rack.*jar$/
80
101
  EXISTING_APIS = /^appengine-api.*jar$/
81
102
  JRUBY_RACK = 'jruby-rack-0.9.5.jar'
82
- JRUBY_RACK_URL = 'http://kenai.com/projects/jruby-rack/' +
83
- "downloads/download/#{JRUBY_RACK}"
103
+ JRUBY_RACK_URL = "http://kenai.com/downloads/jruby-rack/#{JRUBY_RACK}"
84
104
  RACKUP = %q{Dir.chdir('..') if Dir.pwd =~ /WEB-INF$/;} +
85
105
  %q{eval IO.read('config.ru'), nil, 'config.ru', 1}
86
106
 
@@ -88,17 +108,24 @@ module AppEngine
88
108
  @app = Application.new(root_path)
89
109
  end
90
110
 
91
- def bundle
92
- bundle_deps
111
+ def bundle(args=[])
112
+ bundle_deps(args)
93
113
  convert_config_ru
94
114
  end
95
115
 
96
- def bundle_deps
116
+ def bundle_deps(args=[])
97
117
  create_webinf
118
+ bundle_gems(args)
98
119
  copy_jruby
99
120
  copy_rack
100
121
  copy_sdk
101
122
  end
123
+
124
+ def bundle_gems(args)
125
+ return if defined? JRUBY_VERSION
126
+ gem_bundler = AppEngine::Admin::GemBundler.new(app.root)
127
+ gem_bundler.bundle(args)
128
+ end
102
129
 
103
130
  def app
104
131
  @app
@@ -111,21 +138,25 @@ module AppEngine
111
138
  end
112
139
 
113
140
  def create_public
114
- return if app.public_root.nil?
115
- Dir.mkdir(app.public_root) unless File.exists?(app.public_root)
141
+ return unless defined? JRUBY_VERSION
142
+ if app.public_root and !File.exists?(app.public_root)
143
+ Dir.mkdir(app.public_root)
144
+ end
145
+ FileUtils.touch(app.favicon_ico) unless File.exists?(app.favicon_ico)
146
+ FileUtils.touch(app.robots_txt) unless File.exists?(app.robots_txt)
116
147
  end
117
148
 
118
149
  def convert_config_ru
119
150
  if !File.exists?(app.config_ru)
120
151
  if File.exists?(app.web_xml)
121
152
  unless File.exists?(app.aeweb_xml)
122
- puts "!! Error: you either need a #{app.config_ru} or "
153
+ puts "Error: you either need a #{app.config_ru} or "
123
154
  puts " #{app.aeweb_xml}."
124
155
  exit 1
125
156
  end
126
157
  else
127
158
  # TODO auto generate a config.ru
128
- puts "!! Error: you need to create #{app.config_ru}."
159
+ puts "Error: you need to create #{app.config_ru}."
129
160
  exit 1
130
161
  end
131
162
  else
@@ -136,9 +167,7 @@ module AppEngine
136
167
 
137
168
  def copy_jruby
138
169
  require 'appengine-jruby-jars'
139
- update_jars(
140
- "JRuby", EXISTING_JRUBY, [AppEngine::JRubyJars.jruby_jar],
141
- /rubygems/, [AppEngine::JRubyJars.rubygems_jar])
170
+ update_jars("JRuby", EXISTING_JRUBY, [AppEngine::JRubyJars.jruby_jar])
142
171
  end
143
172
 
144
173
  def copy_rack
@@ -173,7 +202,7 @@ module AppEngine
173
202
  def update_jars(name, regex, jars, opt_regex=nil, opt_jars=[])
174
203
  existing = find_jars(regex)
175
204
  if existing.empty?
176
- message = "Installing #{name}"
205
+ message = "=> Installing #{name}"
177
206
  jars_to_install = jars + opt_jars
178
207
  else
179
208
  has_optional_jars = existing.any? {|j| j =~ opt_regex}
@@ -182,7 +211,7 @@ module AppEngine
182
211
  expected = expected_jars.map {|path| File.basename(path)}
183
212
  if existing.size != expected.size ||
184
213
  (expected & existing) != expected
185
- message = "Updating #{name}"
214
+ message = "=> Updating #{name}"
186
215
  jars_to_install = expected_jars
187
216
  end
188
217
  end
@@ -225,14 +254,14 @@ module AppEngine
225
254
  end
226
255
  app_root = app.root
227
256
  builder = WebXmlBuilder.new do
228
- # First configure the basic jruby-rack settings.
229
- add_jruby_rack_defaults(RACKUP)
230
-
231
- # Now read the user's rackup file
257
+ # First read the user's rackup file
232
258
  # TODO generate a skeleton if it's missing
233
259
  Dir.chdir(app_root) do
234
260
  eval IO.read('config.ru'), nil, 'config.ru', 1
235
261
  end
262
+
263
+ # Now configure the basic jruby-rack settings.
264
+ add_jruby_rack_defaults(RACKUP)
236
265
  end
237
266
  open(app.web_xml, 'w') do |webxml|
238
267
  xml = AppEngine::Rack::XmlFormatter.format(builder.to_xml)
@@ -255,12 +284,12 @@ module AppEngine
255
284
  end
256
285
  end
257
286
 
258
- def self.bundle_app(root_path)
259
- AppBundler.new(root_path).bundle
287
+ def self.bundle_app(*args)
288
+ AppBundler.new(args.pop).bundle(args)
260
289
  end
261
290
 
262
- def self.bundle_deps(root_path)
263
- AppBundler.new(root_path).bundle_deps
291
+ def self.bundle_deps(*args)
292
+ AppBundler.new(args.pop).bundle(args)
264
293
  end
265
294
 
266
295
  end
@@ -72,6 +72,11 @@ module AppEngine
72
72
  ENV.delete 'GEM_PATH'
73
73
  java_args << '-classpath'
74
74
  java_args << AppEngine::SDK::TOOLS_JAR
75
+ java_args << '-Djava.util.logging.config.file=' +
76
+ AppEngine::SDK::SDK_ROOT + '/config/sdk/logging.properties'
77
+ if defined? AppEngine::SDK::AGENT_JAR
78
+ java_args << '-javaagent:' + AppEngine::SDK::AGENT_JAR
79
+ end
75
80
  command = ['java'] + java_args + DEV_APPSERVER + server_args
76
81
  if ENV['VERBOSE']
77
82
  puts "exec #{command.map{|x| x.inspect}.join(' ')}"
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/ruby1.8 -w
2
+ #
3
+ # Copyright:: Copyright 2009 Google Inc.
4
+ # Original Author:: John Woodell (mailto:woodie@google.com)
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'rubygems'
19
+ require 'fileutils'
20
+ require 'zip/zip'
21
+ require 'zip/zipfilesystem'
22
+ require 'rubygems/command_manager'
23
+ require 'appengine-tools/bundler'
24
+
25
+ module AppEngine
26
+ module Admin
27
+
28
+ class GemBundler
29
+
30
+ def initialize(root)
31
+ @root = root
32
+ @app = Application.new(root)
33
+ end
34
+
35
+ def bundle(args)
36
+ verify_gemfile
37
+ gem_bundle(args)
38
+ end
39
+
40
+ private
41
+
42
+ def app
43
+ @app
44
+ end
45
+
46
+ def gems_out_of_date
47
+ if File.exists?(app.gems_jar) and
48
+ File.stat(app.gems_jar).mtime > File.stat(app.gemfile).mtime
49
+ return false
50
+ end
51
+ return true
52
+ end
53
+
54
+ def gem_bundle(args)
55
+ return unless args.include?('--update') || gems_out_of_date
56
+ Gem.platforms = [Gem::Platform::RUBY,
57
+ Gem::Platform.new('universal-java')]
58
+ Gem.configuration = Gem::ConfigFile.new(args.unshift('bundle'))
59
+ puts "=> Bundling gems"
60
+ begin
61
+ Dir.chdir(@root) do
62
+ Gem::CommandManager.instance.run(Gem.configuration.args)
63
+ end
64
+ rescue Gem::SystemExitException => e
65
+ exit e.exit_code unless e.exit_code == 0
66
+ end
67
+ bundler_dir = "#{app.gems_dir}/bundler_gems"
68
+ # TODO: this temporary hack should be fixed properly
69
+ gem_patch = <<MOD
70
+ # Injected by appengine-tools to patch bundler 0.6.0 for Sinatra 0.9.4
71
+ module Gem
72
+ def self.dir; ENV['GEM_HOME']; end
73
+ RubyGemsVersion = "0.0.0" unless defined? RubyGemsVersion
74
+ end
75
+ MOD
76
+ File.open("#{bundler_dir}/environment.rb",'a') {|f| f << gem_patch }
77
+ FileUtils.rm app.gems_jar, :force => true # blow away the old jar
78
+ puts "=> Installing gems"
79
+ gem_files = Dir["#{bundler_dir}/gems/**/**"] +
80
+ Dir["#{bundler_dir}/environment.rb"]
81
+ Zip::ZipFile.open(app.gems_jar, 'w') do |jar|
82
+ gem_files.reject {|f| f == app.gems_jar}.each do |file|
83
+ jar.add(file.sub("#{app.gems_dir}/",''), file)
84
+ end
85
+ end
86
+ end
87
+
88
+ def verify_gemfile
89
+ return if File.exists?(app.gemfile)
90
+ puts "=> Generating gemfile"
91
+
92
+ # TODO: Maybe we should include the latest
93
+ # versions from updatecheck here?
94
+ stock_gemfile = <<EOF
95
+ # Critical default settings:
96
+ disable_system_gems
97
+ disable_rubygems
98
+ bundle_path ".gems/bundler_gems"
99
+
100
+ # List gems to bundle here:
101
+ #gem "rack", "1.0.0"
102
+ #gem "dm-appengine"
103
+ #gem "sinatra"
104
+ EOF
105
+ File.open(app.gemfile,'w') {|f| f.write(stock_gemfile) }
106
+ end
107
+ end
108
+ end
109
+ end
110
+
@@ -46,13 +46,12 @@ module AppEngine
46
46
  end
47
47
 
48
48
  def find_gem_version(name)
49
- specs = Dir.glob("#{@approot}/.gems/specifications/#{name}-*.gemspec")
50
- versions = specs.map do |filename|
51
- if filename =~ /-(\w+\.\w+.\w+).gemspec$/
52
- Gem::Version.new($1)
49
+ IO.foreach("#{@approot}/.gems/bundler_gems/environment.rb") do |line|
50
+ if line =~ %r(/gems/#{name}-(\w+\.\w+.\w+)[/"])
51
+ return Gem::Version.new($1)
53
52
  end
54
- end
55
- versions.sort[-1]
53
+ end rescue nil
54
+ nil
56
55
  end
57
56
 
58
57
  def remote_versions
@@ -66,7 +65,7 @@ module AppEngine
66
65
  def check_for_updates
67
66
  local = local_versions
68
67
  unless local['google-appengine']
69
- puts 'Skipping update check'
68
+ puts '=> Skipping update check'
70
69
  return
71
70
  end
72
71
  latest = remote_versions
@@ -74,13 +73,13 @@ module AppEngine
74
73
  current = latest[name]
75
74
  if version && version < current
76
75
  prefix = if name == 'google-appengine'
77
- "sudo"
76
+ update_msg = "=> Please run sudo gem update google-appengine."
78
77
  else
79
- "appcfg.rb"
78
+ update_msg = "=> Please update your Gemfile."
80
79
  end
81
- puts "There is a new version of #{name}: #{current} " +
80
+ puts "=> There is a new version of #{name}: #{current} " +
82
81
  "(You have #{version})"
83
- puts "Please run #{prefix} gem update #{name}."
82
+ puts update_msg
84
83
  end
85
84
  end
86
85
  end
@@ -115,4 +114,4 @@ module AppEngine
115
114
  end
116
115
  end
117
116
  end
118
- end
117
+ end
@@ -27,14 +27,21 @@ class WebXmlBuilder < Rack::Builder
27
27
  def initialize(&block)
28
28
  @path = "/"
29
29
  @paths = Hash.new {|h, k| h[k] = []}
30
+ @skip_defaults = false
30
31
  instance_eval(&block) if block_given?
31
32
  end
32
33
 
34
+ def skip_rack_servlet
35
+ @skip_defaults = true
36
+ end
37
+
33
38
  def add_jruby_rack_defaults(rackup)
34
39
  use JavaContextParams, :rackup => rackup
35
- use JavaServletFilter, 'org.jruby.rack.RackFilter',
36
- { :name => 'RackFilter', :wildcard => true }
37
- use JavaContextListener, 'org.jruby.rack.RackServletContextListener'
40
+ unless @skip_defaults
41
+ use JavaServletFilter, 'org.jruby.rack.RackFilter',
42
+ { :name => 'RackFilter', :wildcard => true }
43
+ end
44
+ use JavaContextListener, 'com.google.appengine.jruby.LazyContextListener'
38
45
  end
39
46
 
40
47
  def use(middleware, *args, &block)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appengine-tools
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Brown
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-09-15 00:00:00 -07:00
12
+ date: 2009-11-02 00:00:00 -08:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -42,6 +42,26 @@ dependencies:
42
42
  - !ruby/object:Gem::Version
43
43
  version: "0"
44
44
  version:
45
+ - !ruby/object:Gem::Dependency
46
+ name: bundler
47
+ type: :runtime
48
+ version_requirement:
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "="
52
+ - !ruby/object:Gem::Version
53
+ version: 0.6.0
54
+ version:
55
+ - !ruby/object:Gem::Dependency
56
+ name: rubyzip
57
+ type: :runtime
58
+ version_requirement:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
45
65
  description: Tools for developing and deploying apps to Google App Engine
46
66
  email: ribrdb@gmail.com
47
67
  executables:
@@ -56,21 +76,22 @@ files:
56
76
  - LICENSE
57
77
  - README.rdoc
58
78
  - Rakefile
79
+ - lib/appengine-tools/update_check.rb
59
80
  - lib/appengine-tools/appcfg.rb
60
- - lib/appengine-tools/boot.rb
61
81
  - lib/appengine-tools/bundler.rb
62
- - lib/appengine-tools/dev_appserver.rb
63
- - lib/appengine-tools/update_check.rb
64
- - lib/appengine-tools/web-xml.rb
82
+ - lib/appengine-tools/gem_bundler.rb
65
83
  - lib/appengine-tools/xml-formatter.rb
84
+ - lib/appengine-tools/boot.rb
85
+ - lib/appengine-tools/web-xml.rb
86
+ - lib/appengine-tools/dev_appserver.rb
66
87
  - spec/appengine-web.xml
88
+ - spec/web.xml
67
89
  - spec/config.ru
68
- - spec/rack_spec.rb
69
90
  - spec/spec.opts
70
- - spec/spec_helper.rb
91
+ - spec/rack_spec.rb
71
92
  - spec/update_check_spec.rb
93
+ - spec/spec_helper.rb
72
94
  - spec/web-xml_spec.rb
73
- - spec/web.xml
74
95
  has_rdoc: true
75
96
  homepage: http://code.google.com/p/appengine-jruby
76
97
  licenses: []