appengine-tools 0.0.14 → 0.0.15.pre
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 +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
|