appengine-tools 0.0.14 → 0.0.15.pre
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +18 -2
- data/lib/appengine-tools/app_yaml.jar +0 -0
- data/lib/appengine-tools/appcfg.rb +14 -71
- data/lib/appengine-tools/boot.rb +3 -38
- data/lib/appengine-tools/bundler.rb +28 -86
- data/lib/appengine-tools/dev_appserver.rb +8 -6
- data/lib/appengine-tools/gem_bundler.rb +1 -1
- data/lib/appengine-tools/update_check.rb +8 -8
- data/spec/update_check_spec.rb +29 -36
- metadata +10 -13
- data/lib/appengine-tools/com/google/appengine/jruby/AppVersionUploadDelegate.class +0 -0
- data/lib/appengine-tools/com/google/appengine/jruby/JRubyAppVersionUpload.class +0 -0
- data/lib/appengine-tools/web-xml.rb +0 -98
- data/lib/appengine-tools/xml-formatter.rb +0 -40
- data/lib/jruby-rack-jar.rb +0 -26
- data/spec/rack_spec.rb +0 -31
- data/spec/web-xml_spec.rb +0 -30
data/Rakefile
CHANGED
@@ -3,11 +3,15 @@ require 'rake/gempackagetask'
|
|
3
3
|
require 'rubygems/specification'
|
4
4
|
require 'date'
|
5
5
|
require 'spec/rake/spectask'
|
6
|
+
require 'appengine-sdk'
|
6
7
|
|
7
8
|
GEM = "appengine-tools"
|
8
|
-
GEM_VERSION = "0.0.
|
9
|
+
GEM_VERSION = "0.0.15.pre"
|
9
10
|
HOMEPAGE = "http://code.google.com/p/appengine-jruby"
|
10
11
|
|
12
|
+
PLUGIN_SOURCE = 'src/com/google/appengine/jruby/JRubyYamlPlugin.java'
|
13
|
+
JAR_FILE = 'lib/appengine-tools/app_yaml.jar'
|
14
|
+
|
11
15
|
spec = Gem::Specification.new do |s|
|
12
16
|
s.name = GEM
|
13
17
|
s.version = GEM_VERSION
|
@@ -25,7 +29,7 @@ EOF
|
|
25
29
|
|
26
30
|
s.require_path = 'lib'
|
27
31
|
s.files = %w(COPYING LICENSE README.rdoc Rakefile) +
|
28
|
-
Dir.glob("{lib,spec}/**/*.{rb,class}")
|
32
|
+
Dir.glob("{lib,spec}/**/*.{rb,class}") + [JAR_FILE]
|
29
33
|
s.executables = [ 'appcfg.rb', 'dev_appserver.rb' ]
|
30
34
|
s.add_dependency('appengine-rack')
|
31
35
|
s.add_dependency('appengine-sdk')
|
@@ -56,3 +60,15 @@ task :make_spec do
|
|
56
60
|
file.puts spec.to_ruby
|
57
61
|
end
|
58
62
|
end
|
63
|
+
|
64
|
+
def sh!(*args)
|
65
|
+
sh(*args) do |ok, res|
|
66
|
+
raise "Error #{res} from `#{args.join ' '}`" unless ok
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
file JAR_FILE => PLUGIN_SOURCE do
|
71
|
+
path = AppEngine::SDK::TOOLS_JAR
|
72
|
+
sh! "javac -cp #{path} #{PLUGIN_SOURCE}"
|
73
|
+
sh! "jar cf #{JAR_FILE} META-INF -C src com"
|
74
|
+
end
|
Binary file
|
@@ -22,61 +22,6 @@ require 'yaml'
|
|
22
22
|
|
23
23
|
module AppEngine
|
24
24
|
module Admin
|
25
|
-
if defined? Java
|
26
|
-
AppCfg = AppEngine::SDK.load_appcfg
|
27
|
-
import Java.ComGoogleAppengineToolsAdmin.AppAdminFactory
|
28
|
-
import Java.ComGoogleAppengineToolsUtil.Logging
|
29
|
-
|
30
|
-
$CLASSPATH << File.dirname(__FILE__)
|
31
|
-
import Java.ComGoogleAppengineJruby.AppVersionUploadDelegate
|
32
|
-
import Java.ComGoogleAppengineJruby.JRubyAppVersionUpload
|
33
|
-
|
34
|
-
class UploadDelegate
|
35
|
-
include AppVersionUploadDelegate
|
36
|
-
|
37
|
-
def index_yaml(app)
|
38
|
-
indexes = merge_indexes(app)
|
39
|
-
if indexes
|
40
|
-
return indexes.to_yaml
|
41
|
-
end
|
42
|
-
''
|
43
|
-
end
|
44
|
-
|
45
|
-
def cron_yaml(app)
|
46
|
-
cron = File.join(app.path, 'cron.yaml')
|
47
|
-
if File.exists?(cron)
|
48
|
-
return IO.read(cron)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
|
-
def queue_yaml(app)
|
53
|
-
queue = File.join(app.path, 'queue.yaml')
|
54
|
-
if File.exists?(queue)
|
55
|
-
return IO.read(queue)
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def merge_indexes(app)
|
60
|
-
if app.indexes_xml
|
61
|
-
indexes = YAML.load(app.indexes_xml.to_yaml)['indexes']
|
62
|
-
end
|
63
|
-
indexes ||= []
|
64
|
-
index_yaml = File.join(app.path, 'index.yaml')
|
65
|
-
if File.exist?(index_yaml)
|
66
|
-
manual_indexes = YAML.load_file(index_yaml)['indexes'] || []
|
67
|
-
manual_indexes.each do |index|
|
68
|
-
indexes << index unless indexes.include?(index)
|
69
|
-
end
|
70
|
-
end
|
71
|
-
if indexes.size > 0
|
72
|
-
{'indexes' => indexes}
|
73
|
-
else
|
74
|
-
nil
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
25
|
class JRubyAppCfg
|
81
26
|
NO_XML_COMMANDS = %w{version}
|
82
27
|
RUBY_COMMANDS = %w{gem bundle help run generate_app}
|
@@ -95,22 +40,15 @@ EOF
|
|
95
40
|
if command && !NO_XML_COMMANDS.include?(command)
|
96
41
|
path = parsed_args[0]
|
97
42
|
AppEngine::Admin.bundle_app(path)
|
98
|
-
AppEngine::Development.boot_jruby
|
99
43
|
updater = AppEngine::Admin::UpdateCheck.new(path)
|
100
44
|
updater.nag
|
101
|
-
else
|
102
|
-
AppEngine::Development.boot_jruby
|
103
45
|
end
|
104
46
|
puts "=> Running AppCfg"
|
105
47
|
run_appcfg(args)
|
106
48
|
end
|
107
|
-
|
49
|
+
|
108
50
|
def run_appcfg(args)
|
109
|
-
|
110
|
-
factory = AppAdminFactory.new
|
111
|
-
factory.setAppVersionUploadClass(JRubyAppVersionUpload.java_class)
|
112
|
-
Logging.initializeLogging
|
113
|
-
AppCfg.new(factory, args.to_java(java.lang.String))
|
51
|
+
exec *(appcfg_command + args)
|
114
52
|
end
|
115
53
|
|
116
54
|
def generate_app(*args)
|
@@ -158,7 +96,7 @@ EOF
|
|
158
96
|
def gem(*args)
|
159
97
|
gem_help
|
160
98
|
end
|
161
|
-
|
99
|
+
|
162
100
|
def gem_help
|
163
101
|
help = <<EOF
|
164
102
|
|
@@ -168,12 +106,12 @@ Simply update the 'Gemfile' and run 'appcfg.rb bundle .' instead.
|
|
168
106
|
EOF
|
169
107
|
puts help
|
170
108
|
end
|
171
|
-
|
109
|
+
|
172
110
|
def run(*args)
|
173
111
|
AppEngine::Admin.bundle_deps('.')
|
174
112
|
AppEngine::Development.boot_app('.', args)
|
175
113
|
end
|
176
|
-
|
114
|
+
|
177
115
|
def run_help
|
178
116
|
help = <<EOF
|
179
117
|
#{$0} run [ruby args]
|
@@ -185,19 +123,24 @@ Must be run from the application directory, after running bundle.
|
|
185
123
|
EOF
|
186
124
|
end
|
187
125
|
|
126
|
+
def appcfg_command
|
127
|
+
plugin_jar = File.join(File.dirname(__FILE__), 'app_yaml.jar')
|
128
|
+
command = %W(java -cp #{AppEngine::SDK::TOOLS_JAR})
|
129
|
+
command << "-Dcom.google.appengine.plugin.path=#{plugin_jar}"
|
130
|
+
command << 'com.google.appengine.tools.admin.AppCfg'
|
131
|
+
end
|
132
|
+
|
188
133
|
def help(command=nil)
|
189
134
|
puts
|
190
135
|
if command != 'help' && RUBY_COMMANDS.include?(command)
|
191
136
|
puts send("#{command}_help")
|
192
137
|
else
|
193
|
-
java_args =
|
194
|
-
java_args << 'com.google.appengine.tools.admin.AppCfg'
|
195
|
-
java_args << 'help'
|
138
|
+
java_args = appcfg_command << 'help'
|
196
139
|
java_args << command if command
|
197
140
|
print_help(%x{#{java_args.map{|x| x.inspect}.join(' ')}}, !command)
|
198
141
|
end
|
199
142
|
end
|
200
|
-
|
143
|
+
|
201
144
|
def print_help(help, summary)
|
202
145
|
help.gsub!('AppCfg', $0)
|
203
146
|
count = 0
|
data/lib/appengine-tools/boot.rb
CHANGED
@@ -18,38 +18,10 @@ require 'appengine-sdk'
|
|
18
18
|
|
19
19
|
module AppEngine
|
20
20
|
module Development
|
21
|
-
|
21
|
+
|
22
22
|
BOOT_APP_RB = File.join(File.dirname(__FILE__), 'boot_app.rb')
|
23
23
|
|
24
24
|
class << self
|
25
|
-
def boot_jruby(root=nil, options={})
|
26
|
-
unless defined?(JRUBY_VERSION)
|
27
|
-
require 'jruby-jars'
|
28
|
-
|
29
|
-
jars = [
|
30
|
-
JRubyJars.core_jar_path,
|
31
|
-
JRubyJars.stdlib_jar_path,
|
32
|
-
AppEngine::SDK::TOOLS_JAR,
|
33
|
-
]
|
34
|
-
|
35
|
-
args = options[:args] || ARGV
|
36
|
-
should_exec = options[:exec]
|
37
|
-
should_exec ||= should_exec.nil?
|
38
|
-
|
39
|
-
# TODO This is really ugly. We should just be using -I
|
40
|
-
# for the paths we need (appengine-tools and it's deps)
|
41
|
-
ENV['GEM_HOME'] = Gem.dir
|
42
|
-
ENV['GEM_PATH'] = Gem.path.compact.join(File::SEPARATOR)
|
43
|
-
appcfg = [File.expand_path(File.join(File.dirname($0),
|
44
|
-
'appcfg.rb'))]
|
45
|
-
if should_exec
|
46
|
-
exec_jruby(root, jars, appcfg + args)
|
47
|
-
else
|
48
|
-
run_jruby(root, jars, appcfg + args)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
25
|
def boot_app(root, args)
|
54
26
|
root = File.expand_path(root)
|
55
27
|
|
@@ -61,7 +33,7 @@ module AppEngine
|
|
61
33
|
ENV.delete 'GEM_HOME'
|
62
34
|
exec_jruby(root, jars, jruby_args)
|
63
35
|
end
|
64
|
-
|
36
|
+
|
65
37
|
def build_command(root, jars, args)
|
66
38
|
app_jars = root ? Dir.glob("#{root}/WEB-INF/lib/*.jar") : []
|
67
39
|
classpath = (app_jars + jars).join(File::PATH_SEPARATOR)
|
@@ -72,18 +44,11 @@ module AppEngine
|
|
72
44
|
end
|
73
45
|
command
|
74
46
|
end
|
75
|
-
|
47
|
+
|
76
48
|
def exec_jruby(root, jars, args)
|
77
49
|
java_command = build_command(root, jars, args)
|
78
50
|
exec *java_command
|
79
51
|
end
|
80
|
-
|
81
|
-
def run_jruby(root, jars, args)
|
82
|
-
java_command = build_command(root, jars, args)
|
83
|
-
if !system(*java_command)
|
84
|
-
puts 'Error executing jruby'
|
85
|
-
end
|
86
|
-
end
|
87
52
|
end
|
88
53
|
end
|
89
54
|
end
|
@@ -18,8 +18,6 @@
|
|
18
18
|
require 'appengine-rack'
|
19
19
|
require 'appengine-tools/boot'
|
20
20
|
require 'appengine-tools/gem_bundler'
|
21
|
-
require 'appengine-tools/web-xml'
|
22
|
-
require 'appengine-tools/xml-formatter'
|
23
21
|
require 'fileutils'
|
24
22
|
require 'yaml'
|
25
23
|
|
@@ -65,16 +63,8 @@ module AppEngine
|
|
65
63
|
path('config.ru')
|
66
64
|
end
|
67
65
|
|
68
|
-
def
|
69
|
-
path('
|
70
|
-
end
|
71
|
-
|
72
|
-
def aeweb_xml
|
73
|
-
path('WEB-INF', 'appengine-web.xml')
|
74
|
-
end
|
75
|
-
|
76
|
-
def build_status
|
77
|
-
path('WEB-INF', 'appengine-generated', 'build_status.yaml')
|
66
|
+
def app_yaml
|
67
|
+
path('app.yaml')
|
78
68
|
end
|
79
69
|
|
80
70
|
def bundled_jars
|
@@ -82,7 +72,13 @@ module AppEngine
|
|
82
72
|
end
|
83
73
|
|
84
74
|
def public_root
|
85
|
-
|
75
|
+
@public_root ||= begin
|
76
|
+
if File.exist?(app_yaml)
|
77
|
+
app = YAML.load(IO.read(app_yaml))
|
78
|
+
return path(app['public_root']) if app['public_root']
|
79
|
+
end
|
80
|
+
path('public')
|
81
|
+
end
|
86
82
|
end
|
87
83
|
|
88
84
|
def favicon_ico
|
@@ -92,11 +88,6 @@ module AppEngine
|
|
92
88
|
def robots_txt
|
93
89
|
File.join(public_root ? public_root : @root, 'robots.txt')
|
94
90
|
end
|
95
|
-
|
96
|
-
def rack_app
|
97
|
-
AppEngine::Rack.app
|
98
|
-
end
|
99
|
-
|
100
91
|
end
|
101
92
|
|
102
93
|
class AppBundler
|
@@ -108,7 +99,9 @@ module AppEngine
|
|
108
99
|
|
109
100
|
def bundle(args=[])
|
110
101
|
bundle_deps(args)
|
111
|
-
|
102
|
+
generate_config_ru
|
103
|
+
generate_app_yaml
|
104
|
+
create_public
|
112
105
|
end
|
113
106
|
|
114
107
|
def bundle_deps(args=[])
|
@@ -118,7 +111,6 @@ module AppEngine
|
|
118
111
|
end
|
119
112
|
|
120
113
|
def bundle_gems(args)
|
121
|
-
return if defined? JRUBY_VERSION
|
122
114
|
gem_bundler = AppEngine::Admin::GemBundler.new(app.root)
|
123
115
|
gem_bundler.bundle(args)
|
124
116
|
end
|
@@ -128,11 +120,10 @@ module AppEngine
|
|
128
120
|
end
|
129
121
|
|
130
122
|
def confirm_appdir
|
131
|
-
unless File.exists?(app.
|
132
|
-
File.exists?(app.gemfile) or File.exists?(app.webinf)
|
123
|
+
unless File.exists?(app.app_yaml)or File.exists?(app.webinf)
|
133
124
|
puts ""
|
134
125
|
puts "Oops, this does not look like an application directory."
|
135
|
-
puts "You need
|
126
|
+
puts "You need to create #{app.app_yaml}."
|
136
127
|
puts ""
|
137
128
|
puts "Run 'appcfg.rb generate_app #{app.path}'"
|
138
129
|
puts "to generate a skeleton application."
|
@@ -147,7 +138,6 @@ module AppEngine
|
|
147
138
|
end
|
148
139
|
|
149
140
|
def create_public
|
150
|
-
return unless defined? JRUBY_VERSION
|
151
141
|
if app.public_root and !File.exists?(app.public_root)
|
152
142
|
Dir.mkdir(app.public_root)
|
153
143
|
end
|
@@ -155,23 +145,26 @@ module AppEngine
|
|
155
145
|
FileUtils.touch(app.robots_txt) unless File.exists?(app.robots_txt)
|
156
146
|
end
|
157
147
|
|
158
|
-
def
|
148
|
+
def generate_config_ru
|
159
149
|
unless File.exists?(app.config_ru)
|
160
150
|
puts "=> Generating rackup"
|
151
|
+
stock_rackup = "run lambda {Rack::Response.new('Hello').finish}\n"
|
152
|
+
File.open(app.config_ru, 'w') {|f| f.write(stock_rackup) }
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def generate_app_yaml
|
157
|
+
unless File.exists?(app.app_yaml)
|
158
|
+
puts "=> Generating app.yaml"
|
161
159
|
app_id = File.basename(File.expand_path(app.path)).
|
162
160
|
downcase.gsub('_', '-').gsub(/[^-a-z0-9]/, '')
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
:precompilation_enabled => true,
|
168
|
-
:version => "1")
|
169
|
-
run lambda { ::Rack::Response.new("Hello").finish }
|
161
|
+
stock_yaml = <<EOF
|
162
|
+
application: #{app_id}
|
163
|
+
version: 1
|
164
|
+
runtime: jruby
|
170
165
|
EOF
|
171
|
-
File.open(app.
|
166
|
+
File.open(app.app_yaml, 'w') {|f| f.write(stock_yaml)}
|
172
167
|
end
|
173
|
-
generate_xml
|
174
|
-
create_public
|
175
168
|
end
|
176
169
|
|
177
170
|
private
|
@@ -213,57 +206,6 @@ EOF
|
|
213
206
|
end
|
214
207
|
FileUtils.rm_f(paths)
|
215
208
|
end
|
216
|
-
|
217
|
-
def valid_build
|
218
|
-
return false unless File.exists? app.build_status
|
219
|
-
return false unless File.exists? app.web_xml
|
220
|
-
return false unless File.exists? app.aeweb_xml
|
221
|
-
yaml = YAML.load_file app.build_status
|
222
|
-
return false unless yaml.is_a? Hash
|
223
|
-
return false unless File.stat(app.config_ru).mtime.eql? yaml[:config_ru]
|
224
|
-
return false unless File.stat(app.web_xml).mtime.eql? yaml[:web_xml]
|
225
|
-
return false unless File.stat(app.aeweb_xml).mtime.eql? yaml[:aeweb_xml]
|
226
|
-
true
|
227
|
-
end
|
228
|
-
|
229
|
-
def generate_xml
|
230
|
-
return if valid_build
|
231
|
-
if defined? JRUBY_VERSION
|
232
|
-
puts "=> Generating configuration files"
|
233
|
-
Dir.glob("#{app.webinf_lib}/*.jar").each do |path|
|
234
|
-
$: << path
|
235
|
-
end
|
236
|
-
app_root = app.root
|
237
|
-
builder = WebXmlBuilder.new do
|
238
|
-
# First read the user's rackup file
|
239
|
-
Dir.chdir(app_root) do
|
240
|
-
require File.join(".gems", "bundler_gems",
|
241
|
-
TARGET_ENGINE, TARGET_VERSION, "environment")
|
242
|
-
eval IO.read('config.ru'), nil, 'config.ru', 1
|
243
|
-
end
|
244
|
-
|
245
|
-
# Now configure the basic jruby-rack settings.
|
246
|
-
add_jruby_rack_defaults
|
247
|
-
end
|
248
|
-
open(app.web_xml, 'w') do |webxml|
|
249
|
-
xml = AppEngine::Rack::XmlFormatter.format(builder.to_xml)
|
250
|
-
webxml.write(xml)
|
251
|
-
end
|
252
|
-
open(app.aeweb_xml, 'w') do |aeweb|
|
253
|
-
xml = AppEngine::Rack::XmlFormatter.format(app.rack_app.to_xml)
|
254
|
-
aeweb.write(xml)
|
255
|
-
end
|
256
|
-
yaml = {
|
257
|
-
:config_ru => File.stat(app.config_ru).mtime,
|
258
|
-
:aeweb_xml => File.stat(app.aeweb_xml).mtime,
|
259
|
-
:web_xml => File.stat(app.web_xml).mtime }
|
260
|
-
open(app.build_status, 'w') { |f| YAML.dump(yaml, f) }
|
261
|
-
else
|
262
|
-
AppEngine::Development.boot_jruby(app.root,
|
263
|
-
:args => ['bundle', app.root],
|
264
|
-
:exec => false)
|
265
|
-
end
|
266
|
-
end
|
267
209
|
end
|
268
210
|
|
269
211
|
def self.bundle_app(*args)
|
@@ -15,7 +15,6 @@
|
|
15
15
|
# limitations under the License.
|
16
16
|
|
17
17
|
require 'appengine-sdk'
|
18
|
-
require 'appengine-tools/boot'
|
19
18
|
require 'appengine-tools/bundler'
|
20
19
|
require 'appengine-tools/update_check'
|
21
20
|
|
@@ -27,15 +26,15 @@ module AppEngine
|
|
27
26
|
def run(args)
|
28
27
|
path, java_args, server_args = parse_argv(ARGV)
|
29
28
|
if path and File::directory?(path)
|
30
|
-
puts "=> Booting DevAppServer"
|
31
|
-
puts "=> Press Ctrl-C to shutdown server"
|
32
29
|
AppEngine::Admin.bundle_app(path)
|
33
30
|
updater = AppEngine::Admin::UpdateCheck.new(path)
|
34
31
|
updater.nag if updater.can_nag?
|
32
|
+
puts "=> Booting DevAppServer"
|
33
|
+
puts "=> Press Ctrl-C to shutdown server"
|
35
34
|
end
|
36
35
|
start_java(path, java_args, server_args)
|
37
36
|
end
|
38
|
-
|
37
|
+
|
39
38
|
def parse_argv(argv)
|
40
39
|
java_args = []
|
41
40
|
server_args = []
|
@@ -59,7 +58,7 @@ module AppEngine
|
|
59
58
|
end
|
60
59
|
return server_args[-1], java_args, server_args
|
61
60
|
end
|
62
|
-
|
61
|
+
|
63
62
|
def start_java(path, java_args, server_args)
|
64
63
|
if path
|
65
64
|
jruby_home = get_jruby_home(path)
|
@@ -70,10 +69,13 @@ module AppEngine
|
|
70
69
|
server_args.unshift '--disable_update_check'
|
71
70
|
ENV.delete 'GEM_HOME'
|
72
71
|
ENV.delete 'GEM_PATH'
|
72
|
+
plugin_jar = File.join(File.dirname(__FILE__), 'app_yaml.jar')
|
73
|
+
|
73
74
|
java_args << '-classpath'
|
74
75
|
java_args << AppEngine::SDK::TOOLS_JAR
|
75
76
|
java_args << '-Djava.util.logging.config.file=' +
|
76
77
|
AppEngine::SDK::SDK_ROOT + '/config/sdk/logging.properties'
|
78
|
+
java_args << "-Dcom.google.appengine.plugin.path=#{plugin_jar}"
|
77
79
|
if defined? AppEngine::SDK::AGENT_JAR
|
78
80
|
java_args << '-javaagent:' + AppEngine::SDK::AGENT_JAR
|
79
81
|
end
|
@@ -83,7 +85,7 @@ module AppEngine
|
|
83
85
|
end
|
84
86
|
exec(*command)
|
85
87
|
end
|
86
|
-
|
88
|
+
|
87
89
|
def get_jruby_home(path)
|
88
90
|
return unless path
|
89
91
|
Dir.chdir("#{path}/WEB-INF/lib") do
|
@@ -29,13 +29,13 @@ module AppEngine
|
|
29
29
|
NAG_FILE = "~/.appcfg_rb_nag"
|
30
30
|
MAX_NAG_FREQUENCY = 60 * 60 * 24 * 7
|
31
31
|
DEFAULT_URL = 'http://appengine-jruby.googlecode.com/hg/updatecheck'
|
32
|
-
|
32
|
+
|
33
33
|
def initialize(approot, url=nil, nag_file=nil)
|
34
34
|
@url = url || DEFAULT_URL
|
35
35
|
@approot = approot
|
36
36
|
@nag_file = nag_file || File.expand_path(NAG_FILE)
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
def local_versions
|
40
40
|
sdk_version = Gem::Version.new(AppEngine::VERSION) rescue nil
|
41
41
|
{
|
@@ -44,7 +44,7 @@ module AppEngine
|
|
44
44
|
'dm-appengine' => find_gem_version('dm-appengine'),
|
45
45
|
}
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def find_gem_version(name)
|
49
49
|
IO.foreach("#{@approot}/.gems/bundler_gems/environment.rb") do |line|
|
50
50
|
if line =~ %r(/gems/#{name}-(\w+\.\w+.\w+)[/"])
|
@@ -53,7 +53,7 @@ module AppEngine
|
|
53
53
|
end rescue nil
|
54
54
|
nil
|
55
55
|
end
|
56
|
-
|
56
|
+
|
57
57
|
def remote_versions
|
58
58
|
versions = YAML.load(open(@url).read)
|
59
59
|
versions.inject({}) do |versions, (name, version)|
|
@@ -83,7 +83,7 @@ module AppEngine
|
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
86
|
-
|
86
|
+
|
87
87
|
def parse_nag_file
|
88
88
|
@nag ||= if File.exist?(@nag_file)
|
89
89
|
YAML.load_file(@nag_file)
|
@@ -91,13 +91,13 @@ module AppEngine
|
|
91
91
|
{'opt_in' => true, 'timestamp' => 0}
|
92
92
|
end
|
93
93
|
end
|
94
|
-
|
94
|
+
|
95
95
|
def write_nag_file(options)
|
96
96
|
open(@nag_file, 'w') do |file|
|
97
97
|
file.write(YAML.dump(options))
|
98
98
|
end
|
99
99
|
end
|
100
|
-
|
100
|
+
|
101
101
|
def nag
|
102
102
|
nag = parse_nag_file
|
103
103
|
return if Time.now.to_i - nag['timestamp'] < MAX_NAG_FREQUENCY
|
@@ -108,7 +108,7 @@ module AppEngine
|
|
108
108
|
# check_for_updates will raise an error if we're not online
|
109
109
|
# just ignore it, and don't update the nag timestamp.
|
110
110
|
end
|
111
|
-
|
111
|
+
|
112
112
|
def can_nag?
|
113
113
|
parse_nag_file['opt_in']
|
114
114
|
end
|
data/spec/update_check_spec.rb
CHANGED
@@ -10,7 +10,7 @@ describe AppEngine::Admin::UpdateCheck do
|
|
10
10
|
before :each do
|
11
11
|
@update_check = AppEngine::Admin::UpdateCheck.new('approot', 'url', 'nag')
|
12
12
|
end
|
13
|
-
|
13
|
+
|
14
14
|
def versions(sdk, apis, dm)
|
15
15
|
keys = ['google-appengine', 'appengine-apis', 'dm-appengine']
|
16
16
|
hash = {}
|
@@ -19,27 +19,20 @@ describe AppEngine::Admin::UpdateCheck do
|
|
19
19
|
end
|
20
20
|
hash
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it 'should expand path' do
|
24
24
|
File.should_receive(:expand_path).with(
|
25
25
|
AppEngine::Admin::UpdateCheck::NAG_FILE)
|
26
26
|
uc = AppEngine::Admin::UpdateCheck.new('/')
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
it 'should support local_versions' do
|
30
30
|
expected = versions('3.2.1', '1.2.3', nil)
|
31
31
|
@update_check.should_receive(:find_gem_version).twice.and_return(
|
32
32
|
Gem::Version.new("1.2.3"), nil)
|
33
33
|
@update_check.local_versions.should == expected
|
34
34
|
end
|
35
|
-
|
36
|
-
it 'should support find_gem_version' do
|
37
|
-
Dir.should_receive(:glob).and_return(
|
38
|
-
['appengine-apis-0.0.20.gemspec','appengine-apis-0.0.3.gemspec'])
|
39
|
-
@update_check.find_gem_version("appengine-apis").should ==
|
40
|
-
Gem::Version.new('0.0.20')
|
41
|
-
end
|
42
|
-
|
35
|
+
|
43
36
|
it 'should support remote_versions' do
|
44
37
|
expected = versions('3.2.2', '1.2.4', '2.3.4')
|
45
38
|
io = StringIO.new(YAML.dump(expected))
|
@@ -47,13 +40,13 @@ describe AppEngine::Admin::UpdateCheck do
|
|
47
40
|
@update_check.should_receive(:open).with("url").and_return(io)
|
48
41
|
@update_check.remote_versions.should == expected
|
49
42
|
end
|
50
|
-
|
43
|
+
|
51
44
|
describe 'check_for_updates' do
|
52
45
|
before :each do
|
53
46
|
@update_check.stub!(:puts)
|
54
47
|
end
|
55
|
-
|
56
|
-
|
48
|
+
|
49
|
+
|
57
50
|
def expect_puts(*messages)
|
58
51
|
length = messages.length
|
59
52
|
@update_check.should_receive(:puts) do |arg|
|
@@ -64,62 +57,62 @@ describe AppEngine::Admin::UpdateCheck do
|
|
64
57
|
it 'should skip check if no sdk version' do
|
65
58
|
@update_check.should_receive(:local_versions).and_return(
|
66
59
|
versions(nil, nil, nil))
|
67
|
-
expect_puts("Skipping update check")
|
60
|
+
expect_puts("=> Skipping update check")
|
68
61
|
@update_check.check_for_updates
|
69
62
|
end
|
70
|
-
|
63
|
+
|
71
64
|
it 'should warn about old sdk' do
|
72
65
|
@update_check.should_receive(:local_versions).and_return(
|
73
66
|
versions('0.0.1', nil, nil))
|
74
67
|
@update_check.should_receive(:remote_versions).and_return(
|
75
68
|
versions('0.0.2', '0.0.2', '0.0.2'))
|
76
69
|
expect_puts(
|
77
|
-
"There is a new version of google-appengine: 0.0.2 (You have 0.0.1)",
|
78
|
-
"Please run sudo gem update google-appengine."
|
70
|
+
"=> There is a new version of google-appengine: 0.0.2 (You have 0.0.1)",
|
71
|
+
"=> Please run sudo gem update google-appengine."
|
79
72
|
)
|
80
73
|
@update_check.check_for_updates
|
81
74
|
end
|
82
|
-
|
75
|
+
|
83
76
|
it 'should warn about old apis' do
|
84
77
|
@update_check.should_receive(:local_versions).and_return(
|
85
78
|
versions('0.0.2', '0.0.2', '0.0.2'))
|
86
79
|
@update_check.should_receive(:remote_versions).and_return(
|
87
80
|
versions('0.0.2', '0.0.4', '0.0.2'))
|
88
81
|
expect_puts(
|
89
|
-
"There is a new version of appengine-apis: 0.0.4 (You have 0.0.2)",
|
90
|
-
"Please
|
82
|
+
"=> There is a new version of appengine-apis: 0.0.4 (You have 0.0.2)",
|
83
|
+
"=> Please update your Gemfile."
|
91
84
|
)
|
92
85
|
@update_check.check_for_updates
|
93
86
|
end
|
94
|
-
|
87
|
+
|
95
88
|
it 'should warn about old dm adapter' do
|
96
89
|
@update_check.should_receive(:local_versions).and_return(
|
97
90
|
versions('0.0.2', '0.0.2', '0.0.2'))
|
98
91
|
@update_check.should_receive(:remote_versions).and_return(
|
99
92
|
versions('0.0.2', '0.0.2', '0.0.3'))
|
100
93
|
expect_puts(
|
101
|
-
"There is a new version of dm-appengine: 0.0.3 (You have 0.0.2)",
|
102
|
-
"Please
|
94
|
+
"=> There is a new version of dm-appengine: 0.0.3 (You have 0.0.2)",
|
95
|
+
"=> Please update your Gemfile."
|
103
96
|
)
|
104
|
-
@update_check.check_for_updates
|
97
|
+
@update_check.check_for_updates
|
105
98
|
end
|
106
99
|
|
107
|
-
|
100
|
+
|
108
101
|
it 'should warn about multiple old gems' do
|
109
102
|
@update_check.should_receive(:local_versions).and_return(
|
110
103
|
versions('0.0.1', '0.0.3', '0.0.5'))
|
111
104
|
@update_check.should_receive(:remote_versions).and_return(
|
112
105
|
versions('0.0.2', '0.0.4', '0.0.5'))
|
113
106
|
expect_puts(
|
114
|
-
"There is a new version of google-appengine: 0.0.2 (You have 0.0.1)",
|
115
|
-
"Please run sudo gem update google-appengine.",
|
116
|
-
"There is a new version of appengine-apis: 0.0.4 (You have 0.0.3)",
|
117
|
-
"Please
|
107
|
+
"=> There is a new version of google-appengine: 0.0.2 (You have 0.0.1)",
|
108
|
+
"=> Please run sudo gem update google-appengine.",
|
109
|
+
"=> There is a new version of appengine-apis: 0.0.4 (You have 0.0.3)",
|
110
|
+
"=> Please update your Gemfile."
|
118
111
|
)
|
119
|
-
@update_check.check_for_updates
|
112
|
+
@update_check.check_for_updates
|
120
113
|
end
|
121
114
|
end
|
122
|
-
|
115
|
+
|
123
116
|
describe 'parse_nag_file' do
|
124
117
|
it 'should support missing file' do
|
125
118
|
File.should_receive(:exist?).with('nag').and_return(false)
|
@@ -128,14 +121,14 @@ describe AppEngine::Admin::UpdateCheck do
|
|
128
121
|
'timestamp' => 0
|
129
122
|
}
|
130
123
|
end
|
131
|
-
|
124
|
+
|
132
125
|
it 'should parse existing file' do
|
133
126
|
File.should_receive(:exist?).with('nag').and_return(true)
|
134
127
|
YAML.should_receive(:load_file).with('nag').and_return("parsed_yaml")
|
135
128
|
@update_check.parse_nag_file.should == "parsed_yaml"
|
136
129
|
end
|
137
130
|
end
|
138
|
-
|
131
|
+
|
139
132
|
describe 'nag' do
|
140
133
|
it 'should nag if old timestamp' do
|
141
134
|
@update_check.should_receive(:parse_nag_file).and_return({
|
@@ -146,7 +139,7 @@ describe AppEngine::Admin::UpdateCheck do
|
|
146
139
|
@update_check.should_receive(:write_nag_file)
|
147
140
|
@update_check.nag
|
148
141
|
end
|
149
|
-
|
142
|
+
|
150
143
|
it 'should not nag if new timestamp' do
|
151
144
|
@update_check.should_receive(:parse_nag_file).and_return({
|
152
145
|
'opt_in' => true,
|
@@ -155,7 +148,7 @@ describe AppEngine::Admin::UpdateCheck do
|
|
155
148
|
@update_check.nag
|
156
149
|
end
|
157
150
|
end
|
158
|
-
|
151
|
+
|
159
152
|
describe 'can_nag?' do
|
160
153
|
it 'should return true of opted in' do
|
161
154
|
@update_check.should_receive(:parse_nag_file).and_return({
|
metadata
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: appengine-tools
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
prerelease:
|
4
|
+
prerelease: true
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
|
8
|
+
- 15
|
9
|
+
- pre
|
10
|
+
version: 0.0.15.pre
|
10
11
|
platform: ruby
|
11
12
|
authors:
|
12
13
|
- Ryan Brown
|
@@ -95,15 +96,9 @@ files:
|
|
95
96
|
- lib/appengine-tools/dev_appserver.rb
|
96
97
|
- lib/appengine-tools/gem_bundler.rb
|
97
98
|
- lib/appengine-tools/update_check.rb
|
98
|
-
- lib/appengine-tools/web-xml.rb
|
99
|
-
- lib/appengine-tools/xml-formatter.rb
|
100
|
-
- lib/jruby-rack-jar.rb
|
101
|
-
- lib/appengine-tools/com/google/appengine/jruby/AppVersionUploadDelegate.class
|
102
|
-
- lib/appengine-tools/com/google/appengine/jruby/JRubyAppVersionUpload.class
|
103
|
-
- spec/rack_spec.rb
|
104
99
|
- spec/spec_helper.rb
|
105
100
|
- spec/update_check_spec.rb
|
106
|
-
-
|
101
|
+
- lib/appengine-tools/app_yaml.jar
|
107
102
|
has_rdoc: true
|
108
103
|
homepage: http://code.google.com/p/appengine-jruby
|
109
104
|
licenses: []
|
@@ -122,11 +117,13 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
122
117
|
version: "0"
|
123
118
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
124
119
|
requirements:
|
125
|
-
- - "
|
120
|
+
- - ">"
|
126
121
|
- !ruby/object:Gem::Version
|
127
122
|
segments:
|
128
|
-
-
|
129
|
-
|
123
|
+
- 1
|
124
|
+
- 3
|
125
|
+
- 1
|
126
|
+
version: 1.3.1
|
130
127
|
requirements: []
|
131
128
|
|
132
129
|
rubyforge_project:
|
Binary file
|
Binary file
|
@@ -1,98 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby1.8 -w
|
2
|
-
#
|
3
|
-
# Copyright:: Copyright 2009 Google Inc.
|
4
|
-
# Original Author:: Ryan Brown (mailto:ribrdb@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 'rack'
|
19
|
-
require 'rexml/document'
|
20
|
-
require 'uri'
|
21
|
-
|
22
|
-
require 'appengine-rack/java'
|
23
|
-
|
24
|
-
class WebXmlBuilder < Rack::Builder
|
25
|
-
DUMMY_APP = Proc.new{|env|}
|
26
|
-
|
27
|
-
def initialize(&block)
|
28
|
-
@path = "/"
|
29
|
-
@paths = Hash.new {|h, k| h[k] = []}
|
30
|
-
@skip_defaults = false
|
31
|
-
@mime_mapping = {}
|
32
|
-
instance_eval(&block) if block_given?
|
33
|
-
end
|
34
|
-
|
35
|
-
def add_mime_mapping(doc)
|
36
|
-
@mime_mapping.each_pair do |key,val|
|
37
|
-
mime = doc.add_element('mime-mapping')
|
38
|
-
mime.add_element('extension').add_text(key.to_s)
|
39
|
-
mime.add_element('mime-type').add_text(val)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def add_jruby_rack_defaults
|
44
|
-
unless @skip_defaults
|
45
|
-
use JavaServletFilter, 'org.jruby.rack.RackFilter',
|
46
|
-
{ :name => 'RackFilter', :wildcard => true }
|
47
|
-
end
|
48
|
-
use JavaContextListener, 'com.google.appengine.jruby.LazyContextListener'
|
49
|
-
end
|
50
|
-
|
51
|
-
def use(middleware, *args, &block)
|
52
|
-
if middleware.respond_to? :append_xml
|
53
|
-
@paths[@path] << [middleware, args, block]
|
54
|
-
else
|
55
|
-
@paths[@path] << [middleware.new(DUMMY_APP, *args, &block)]
|
56
|
-
end
|
57
|
-
end
|
58
|
-
|
59
|
-
def map(path, &block)
|
60
|
-
if URI.parse(path).scheme.nil? # we can only natively support path matching
|
61
|
-
saved_path = @path
|
62
|
-
@path = [@path, path].join('/').squeeze('/')
|
63
|
-
begin
|
64
|
-
instance_eval(&block) if block_given?
|
65
|
-
ensure
|
66
|
-
@path = saved_path
|
67
|
-
end
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
def run(app)
|
72
|
-
@paths[@path] << [app, [], nil]
|
73
|
-
end
|
74
|
-
|
75
|
-
def to_xml
|
76
|
-
doc = REXML::Document.new.add_element('web-app')
|
77
|
-
doc.add_attribute("xmlns", "http://java.sun.com/xml/ns/javaee")
|
78
|
-
doc.add_attribute("version", "2.5")
|
79
|
-
each_path do |path, objects|
|
80
|
-
pattern = path.chomp('/')
|
81
|
-
pattern = '/' if pattern.empty?
|
82
|
-
objects.each do |object, args, block|
|
83
|
-
if object.respond_to? :append_xml
|
84
|
-
object.append_xml(doc, pattern, *args, &block)
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
add_mime_mapping(doc)
|
89
|
-
doc
|
90
|
-
end
|
91
|
-
|
92
|
-
private
|
93
|
-
def each_path
|
94
|
-
@paths.sort {|a, b| b[0].length - a[0].length}.each do |path, value|
|
95
|
-
yield path, value
|
96
|
-
end
|
97
|
-
end
|
98
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby1.8 -w
|
2
|
-
#
|
3
|
-
# Copyright:: Copyright 2009 Google Inc.
|
4
|
-
# Original Author:: Ryan Brown (mailto:ribrdb@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 'rexml/formatters/pretty'
|
19
|
-
|
20
|
-
module AppEngine
|
21
|
-
module Rack
|
22
|
-
class XmlFormatter < REXML::Formatters::Pretty
|
23
|
-
def initialize
|
24
|
-
@compact = true
|
25
|
-
super
|
26
|
-
end
|
27
|
-
|
28
|
-
def write_text( node, output )
|
29
|
-
output << node.to_s()
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.format(xml)
|
33
|
-
@formatter ||= XmlFormatter.new
|
34
|
-
output = ''
|
35
|
-
@formatter.write(xml, output)
|
36
|
-
return output
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
data/lib/jruby-rack-jar.rb
DELETED
@@ -1,26 +0,0 @@
|
|
1
|
-
#!/usr/bin/ruby
|
2
|
-
# Copyright:: Copyright 2010 Google Inc.
|
3
|
-
# Original Author:: John Woodell (mailto:woodie@google.com)
|
4
|
-
#
|
5
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
6
|
-
# you may not use this file except in compliance with the License.
|
7
|
-
# You may obtain a copy of the License at
|
8
|
-
#
|
9
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
10
|
-
#
|
11
|
-
# Unless required by applicable law or agreed to in writing, software
|
12
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
13
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
14
|
-
# See the License for the specific language governing permissions and
|
15
|
-
# limitations under the License.
|
16
|
-
|
17
|
-
module AppEngine
|
18
|
-
module JRubyJars
|
19
|
-
JRUBYRACK_VERSION = '0.9.6'
|
20
|
-
|
21
|
-
def self.jrubyrack_jar
|
22
|
-
File.join(File.dirname(__FILE__), "jruby-rack-#{JRUBYRACK_VERSION}.jar")
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
26
|
-
end
|
data/spec/rack_spec.rb
DELETED
@@ -1,31 +0,0 @@
|
|
1
|
-
# Copyright:: Copyright 2009 Google Inc.
|
2
|
-
# Original Author:: Ryan Brown (mailto:ribrdb@google.com)
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
|
16
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
17
|
-
require 'appengine-rack'
|
18
|
-
require 'appengine-tools/web-xml'
|
19
|
-
require 'appengine-tools/xml-formatter'
|
20
|
-
|
21
|
-
describe AppEngine::Rack do
|
22
|
-
it "should generate correct xml" do
|
23
|
-
rackup = IO.read("#{File.dirname(__FILE__)}/config.ru")
|
24
|
-
builder = WebXmlBuilder.new do
|
25
|
-
add_jruby_rack_defaults
|
26
|
-
eval rackup, nil, "#{File.dirname(__FILE__)}/config.ru", 1
|
27
|
-
end
|
28
|
-
xml = AppEngine::Rack::XmlFormatter.format(AppEngine::Rack.app.to_xml)
|
29
|
-
xml.should == IO.read("#{File.dirname(__FILE__)}/appengine-web.xml")
|
30
|
-
end
|
31
|
-
end
|
data/spec/web-xml_spec.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
# Copyright:: Copyright 2009 Google Inc.
|
2
|
-
# Original Author:: Ryan Brown (mailto:ribrdb@google.com)
|
3
|
-
#
|
4
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
-
# you may not use this file except in compliance with the License.
|
6
|
-
# You may obtain a copy of the License at
|
7
|
-
#
|
8
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
-
#
|
10
|
-
# Unless required by applicable law or agreed to in writing, software
|
11
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
-
# See the License for the specific language governing permissions and
|
14
|
-
# limitations under the License.
|
15
|
-
|
16
|
-
require File.dirname(__FILE__) + '/spec_helper.rb'
|
17
|
-
require 'appengine-tools/web-xml'
|
18
|
-
require 'appengine-tools/xml-formatter'
|
19
|
-
|
20
|
-
describe WebXmlBuilder do
|
21
|
-
it "should generate correct xml" do
|
22
|
-
rackup = IO.read("#{File.dirname(__FILE__)}/config.ru")
|
23
|
-
builder = WebXmlBuilder.new do
|
24
|
-
add_jruby_rack_defaults
|
25
|
-
eval rackup, nil, "#{File.dirname(__FILE__)}/config.ru", 1
|
26
|
-
end
|
27
|
-
xml = AppEngine::Rack::XmlFormatter.format(builder.to_xml)
|
28
|
-
xml.should == IO.read("#{File.dirname(__FILE__)}/web.xml")
|
29
|
-
end
|
30
|
-
end
|