jruby-enginize 0.8
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +135 -0
- data/bin/jruby-enginize +6 -0
- data/lib/generator.rb +212 -0
- data/lib/script.rb +90 -0
- data/templates/merb/.gitignore +21 -0
- data/templates/merb/app.rb +31 -0
- data/templates/merb/config/framework.rb +7 -0
- data/templates/merb/config/init.rb +37 -0
- data/templates/merb/config.ru +19 -0
- data/templates/merb/lib/tasks/merb.rake +44 -0
- data/templates/merb/public/images/merb_logo.png +0 -0
- data/templates/merb/public/stylesheets/default.css +55 -0
- data/templates/merb/spec/spec_helper.rb +24 -0
- data/templates/merb/views/index.html.erb +27 -0
- data/templates/merb/views/layout.engine_app.html.erb +9 -0
- data/templates/shared/README +71 -0
- data/templates/shared/Rakefile +87 -0
- data/templates/shared/public/favicon.ico +0 -0
- data/templates/shared/public/images/appengine_logo.png +0 -0
- data/templates/shared/public/robots.txt +5 -0
- data/templates/sinatra/.gitignore +14 -0
- data/templates/sinatra/app.rb +51 -0
- data/templates/sinatra/config.ru +13 -0
- data/templates/sinatra/lib/tasks/haml-2_2_2-util.patch +5 -0
- data/templates/sinatra/lib/tasks/sinatra.rake +19 -0
- data/templates/sinatra/public/images/sinatra_logo.png +0 -0
- data/templates/sinatra/views/index.haml +19 -0
- data/templates/sinatra/views/layout.haml +6 -0
- data/templates/sinatra/views/stylesheet.sass +44 -0
- metadata +91 -0
data/README.rdoc
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
= JRuby-Enginize
|
2
|
+
|
3
|
+
== About
|
4
|
+
|
5
|
+
JRuby-Enginize is a generator for Google AppEngine compliant JRuby
|
6
|
+
applications. The generator currently supports Sinatra and Merb with more
|
7
|
+
frameworks to come in the future. If you want to learn more about Google
|
8
|
+
AppEngine, go to http://code.google.com/appengine and have a look at the
|
9
|
+
tutorials. For more about JRuby, please go to http://www.codehaus.org and see
|
10
|
+
what's up running Ruby applications on a Java VM.
|
11
|
+
|
12
|
+
== Prerequisites
|
13
|
+
|
14
|
+
JRuby-Enginize needs a proper JRuby installation including rake and the
|
15
|
+
Google AppEngine SDK (http://code.google.com/appengine/downloads.html) for
|
16
|
+
Java. Make sure that the AppEngine configuration tool "appcfg.sh" is in your
|
17
|
+
PATH as that's what parts of the software are wrapping.
|
18
|
+
|
19
|
+
More dependencies depend on the framework template to generate an application
|
20
|
+
for, but installation of additional gems is done with tools provided by
|
21
|
+
Google (so below).
|
22
|
+
|
23
|
+
== Installation
|
24
|
+
|
25
|
+
The Google people worked hard to make JRuby easier to deploy than it was at
|
26
|
+
the beginning, so don't blindly trust all those blog posts and samples you'll
|
27
|
+
find but use the newest version of jruby-enginize and have a look at the Wiki
|
28
|
+
page of the Google AppEngine JRuby tools
|
29
|
+
(http://code.google.com/p/appengine-jruby/wiki/GettingStarted)
|
30
|
+
to learn about the details beyond.
|
31
|
+
|
32
|
+
These are the steps for installing the Google tools plus JRuby-Enginize
|
33
|
+
running on top of it to streamline your first steps:
|
34
|
+
|
35
|
+
sudo gem sources -a http://gems.github.com # Only needed once!
|
36
|
+
sudo gem install google-appengine
|
37
|
+
sudo gem install ulbrich-jruby-enginize
|
38
|
+
|
39
|
+
You also need an Google AppEngine account to actually publish your code.
|
40
|
+
Without account you can still play around with the tools and run applications
|
41
|
+
locally.
|
42
|
+
|
43
|
+
== Using jruby-enginize
|
44
|
+
|
45
|
+
JRuby-Enginize includes is a single executable named <tt>jruby-enginize</tt>
|
46
|
+
which is inspired by the <tt>rails</tt> tool for generating Rails applications.
|
47
|
+
So just call
|
48
|
+
|
49
|
+
jruby-enginize
|
50
|
+
|
51
|
+
and have a look at the options.
|
52
|
+
|
53
|
+
Here are the steps for creating and deploying a new Sinatra application:
|
54
|
+
|
55
|
+
* Register with Google AppEngine and create a new application ID.
|
56
|
+
|
57
|
+
* Generate your application with that new ID as directory name. Sample:
|
58
|
+
|
59
|
+
<tt>jruby-enginize --template sinatra jruby-enginize</tt>
|
60
|
+
|
61
|
+
* Go to the new directory and install the missing gems first (depends on the
|
62
|
+
template you have chosen):
|
63
|
+
|
64
|
+
<tt>rake template:gems</tt>
|
65
|
+
|
66
|
+
!!Attention: Whenever you want to install additional gems, be sure
|
67
|
+
to use <tt>appcfg.rb gem</tt> provided by the Google AppEngine JRuby tools
|
68
|
+
and not <tt>jgem</tt> as Google maintains a local repository per project and
|
69
|
+
bundles the files to upload from that information. You will run into missing
|
70
|
+
gems on the server if you bypass this! Best approach is to use a separate
|
71
|
+
JRuby installation for AppEngine development to run into missing gems when
|
72
|
+
running the application locally, too.
|
73
|
+
|
74
|
+
* Learn about the available rake tasks
|
75
|
+
|
76
|
+
<tt>rake --tasks</tt>
|
77
|
+
|
78
|
+
* Try out your application locally:
|
79
|
+
|
80
|
+
<tt>sudo rake appengine:run</tt>
|
81
|
+
|
82
|
+
* Deploy the application:
|
83
|
+
|
84
|
+
<tt>rake appengine:deploy</tt>
|
85
|
+
|
86
|
+
The first time you deploy your application, you will be asked for e-mail and
|
87
|
+
password to confirm your upload to the server.
|
88
|
+
|
89
|
+
You can repeat the deployment whenever you want. Be sure to set the version
|
90
|
+
number in the AppEngine::Rack.configure_app part of "config.ru" to a new
|
91
|
+
value, when you are experimenting with an unstable version and don't want to
|
92
|
+
risk your users getting exceptions.
|
93
|
+
|
94
|
+
You can try the new version by opening e.g.
|
95
|
+
|
96
|
+
<tt>http://3.latest.jruby-enginize.appspot.com</tt>
|
97
|
+
|
98
|
+
and replacing "3" with the version number you want to run.
|
99
|
+
|
100
|
+
Switch the application to the new version as default (stable version) by
|
101
|
+
opening
|
102
|
+
|
103
|
+
<tt>http://appengine.google.com/deployment?&app_id=jruby-enginize</tt>
|
104
|
+
|
105
|
+
and setting a new default available at
|
106
|
+
|
107
|
+
<tt>http://jruby-enginize.appspot.com</tt>
|
108
|
+
|
109
|
+
A small README with these and a few more application specific hints is
|
110
|
+
generated along with the source code. Have fun.
|
111
|
+
|
112
|
+
== Copyright & License
|
113
|
+
|
114
|
+
Copyright (c) 2009 Holtzbrinck Digital GmbH, Jan Ulbrich
|
115
|
+
|
116
|
+
Permission is hereby granted, free of charge, to any person
|
117
|
+
obtaining a copy of this software and associated documentation
|
118
|
+
files (the "Software"), to deal in the Software without
|
119
|
+
restriction, including without limitation the rights to use,
|
120
|
+
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
121
|
+
copies of the Software, and to permit persons to whom the
|
122
|
+
Software is furnished to do so, subject to the following
|
123
|
+
conditions:
|
124
|
+
|
125
|
+
The above copyright notice and this permission notice shall be
|
126
|
+
included in all copies or substantial portions of the Software.
|
127
|
+
|
128
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
129
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
130
|
+
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
131
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
132
|
+
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
133
|
+
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
134
|
+
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
135
|
+
OTHER DEALINGS IN THE SOFTWARE.
|
data/bin/jruby-enginize
ADDED
data/lib/generator.rb
ADDED
@@ -0,0 +1,212 @@
|
|
1
|
+
# JRuby-Enginize, a generator for Google AppEngine compliant JRuby apps.
|
2
|
+
#
|
3
|
+
# This file contains the JRubyEnginize::Generator class creating a new
|
4
|
+
# directory tree of files drawn from a set of shared and specific templates.
|
5
|
+
|
6
|
+
require 'ftools'
|
7
|
+
require 'find'
|
8
|
+
require 'digest/md5'
|
9
|
+
|
10
|
+
module JRubyEnginize # :nodoc:
|
11
|
+
|
12
|
+
# Code for generating a directory tree created from a shared and a template
|
13
|
+
# specific set of template files.
|
14
|
+
|
15
|
+
class Generator
|
16
|
+
attr_reader :email, :template, :name, :path, :dryrun
|
17
|
+
|
18
|
+
# Constructor of the generator needing at least email, path and template
|
19
|
+
# to run.
|
20
|
+
#
|
21
|
+
# Parameters:
|
22
|
+
#
|
23
|
+
# [email] Mail address of the Google AppEngine account to publish with
|
24
|
+
# [path] Path of the directory to create
|
25
|
+
# [template] Name of the set of templates to generate from
|
26
|
+
# [options] Additional options
|
27
|
+
#
|
28
|
+
# Options:
|
29
|
+
#
|
30
|
+
# [:name] Optional app name defaulting to name of directory
|
31
|
+
# [:dryrun] Flag to enable
|
32
|
+
|
33
|
+
def initialize(email, path, template, options = {})
|
34
|
+
@email = email
|
35
|
+
@path = path
|
36
|
+
@template = template
|
37
|
+
|
38
|
+
options = options.dup
|
39
|
+
|
40
|
+
@name = options.delete(:name)
|
41
|
+
@name = File.basename(path) if @name.nil? or @name.empty?
|
42
|
+
|
43
|
+
@dryrun = options.delete(:dryrun)
|
44
|
+
|
45
|
+
raise ArgumentError, "Unknown option(s) #{options.keys.join(', ')}" unless options.empty?
|
46
|
+
end
|
47
|
+
|
48
|
+
# Runs the generator. Starts with setting up a map of files to create
|
49
|
+
# and overriding shared ones with template specific stuff. Runs through
|
50
|
+
# the collected files and calls process_file to render new files in the
|
51
|
+
# target path.
|
52
|
+
|
53
|
+
def run
|
54
|
+
templatesdir = Generator::templates_directory
|
55
|
+
|
56
|
+
shareddir = File.join(templatesdir, 'shared')
|
57
|
+
templatedir = File.join(templatesdir, template)
|
58
|
+
|
59
|
+
raise ArgumentError, 'Missing shared templates' unless File.stat(shareddir).directory?
|
60
|
+
raise ArgumentError, "Template \"#{template}\" missing" unless File.stat(templatedir).directory?
|
61
|
+
|
62
|
+
if dryrun
|
63
|
+
puts "Dry run which would generate the following files from template \"#{template}\":"
|
64
|
+
else
|
65
|
+
puts "Generating files from template \"#{template}\"."
|
66
|
+
end
|
67
|
+
|
68
|
+
template_files(shareddir, templatedir).each do |key, path|
|
69
|
+
target = File.join(self.path, key)
|
70
|
+
|
71
|
+
if dryrun
|
72
|
+
puts " Creating \"#{target}\" from template\n file \"#{path}\""
|
73
|
+
else
|
74
|
+
process_file(path, target)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
if not dryrun
|
79
|
+
puts "Done with directory \"#{self.path}\"."
|
80
|
+
|
81
|
+
puts "\nYour next steps:\n cd #{self.path}\n\n rake template:gems"
|
82
|
+
puts "\n rake\n rake --tasks"
|
83
|
+
puts "\n sudo rake appengine:run # First call may fail: Just retry!"
|
84
|
+
puts "\n rake appengine:deploy"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
# Returns an Array with the available template names.
|
89
|
+
|
90
|
+
def self.templates
|
91
|
+
return Dir[File.join(Generator::templates_directory, '*')].collect { |path|
|
92
|
+
(name = File.basename(path)) == 'shared' ? nil : name }.compact
|
93
|
+
end
|
94
|
+
|
95
|
+
protected
|
96
|
+
|
97
|
+
# Returns a Hash with relative paths of files as keys and the whole
|
98
|
+
# paths as values. Runs through all paths in the order as provided and
|
99
|
+
# overrides keys with files found in later paths.
|
100
|
+
#
|
101
|
+
# Sample:
|
102
|
+
#
|
103
|
+
# + templates
|
104
|
+
# + shared
|
105
|
+
# | + foo
|
106
|
+
# | + lib
|
107
|
+
# | + bar # Will be overridden with file found in specific
|
108
|
+
# |
|
109
|
+
# + specific
|
110
|
+
# + lib
|
111
|
+
# | + bar
|
112
|
+
# |
|
113
|
+
# + other
|
114
|
+
#
|
115
|
+
# => { 'foo' => '/path/templates/shared/foo',
|
116
|
+
# 'lib/bar' => '/path/templates/specific/bar',
|
117
|
+
# 'other' => '/path/templates/specific/other' }
|
118
|
+
#
|
119
|
+
# Parameters:
|
120
|
+
#
|
121
|
+
# [*paths] Paths to directories to gather files from
|
122
|
+
|
123
|
+
def template_files(*paths)
|
124
|
+
files = {}
|
125
|
+
|
126
|
+
Find.find(*paths) do |path|
|
127
|
+
Find.prune if path[-1].chr == '.'
|
128
|
+
|
129
|
+
next if File.stat(path).directory?
|
130
|
+
next if (key = path.gsub(/.*\/templates\/[^\/]+\//, '')) == ''
|
131
|
+
|
132
|
+
files[key] = path
|
133
|
+
end
|
134
|
+
|
135
|
+
return files
|
136
|
+
end
|
137
|
+
|
138
|
+
# Creates the target file from the source including some substitution
|
139
|
+
# of variables. The target path needs not to exist, as directories are
|
140
|
+
# added on the fly. If the source is an executable, the target file will
|
141
|
+
# be set executable, too.
|
142
|
+
#
|
143
|
+
# Parameters:
|
144
|
+
#
|
145
|
+
# [source] Source file
|
146
|
+
# [target] Target file
|
147
|
+
#
|
148
|
+
# The source files may contain some variables which are replaced on the
|
149
|
+
# fly. All variables are set in double curly brackets and are let passed
|
150
|
+
# without modification if they ar not recognized.
|
151
|
+
#
|
152
|
+
# Supported variables:
|
153
|
+
#
|
154
|
+
# [{{email}}] E-mail address of the Google AppEngine account
|
155
|
+
# [{{name}}] Name of the application
|
156
|
+
# [{{template}}] Name of the template (e.g. "sinatra")
|
157
|
+
# [{{hexrand-xx}}] Hexadecimal random string with xx characters
|
158
|
+
# [{{numrand-xx}}] Random number with xx digits
|
159
|
+
|
160
|
+
def process_file(source, target)
|
161
|
+
content = File.read(source).gsub(/\{\{[^}]*\}\}/) do |variable|
|
162
|
+
case variable
|
163
|
+
when '{{email}}'
|
164
|
+
raise 'missing e-mail address' if email.nil? or email.empty?
|
165
|
+
email
|
166
|
+
when '{{name}}'
|
167
|
+
name
|
168
|
+
else
|
169
|
+
if hexrand = variable.match(/\{\{hexrand-([0-9]+)\}\}/) and
|
170
|
+
hexrand.length == 2 and (len = hexrand[1].to_i) > 0
|
171
|
+
then
|
172
|
+
str = ''
|
173
|
+
|
174
|
+
while str.length < len do
|
175
|
+
str << Digest::MD5.hexdigest("#{rand}-#{Time.now}-#{rand}")
|
176
|
+
end
|
177
|
+
|
178
|
+
str[0, len]
|
179
|
+
elsif numrand = variable.match(/\{\{numrand-([0-9]+)\}\}/) and
|
180
|
+
numrand.length == 2 and (len = numrand[1].to_i) > 0
|
181
|
+
then
|
182
|
+
str = ''
|
183
|
+
|
184
|
+
while str.length < len do
|
185
|
+
str << rand.to_s.sub(/^.*\.0*/, '')
|
186
|
+
end
|
187
|
+
|
188
|
+
str[0, len]
|
189
|
+
else
|
190
|
+
variable
|
191
|
+
end
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
File.makedirs(File.dirname(target))
|
196
|
+
|
197
|
+
File.open(target, 'wb') do |file|
|
198
|
+
stat = File.stat(source)
|
199
|
+
|
200
|
+
file.write(content)
|
201
|
+
file.chmod(stat.mode | 0x111) if stat.executable?
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
# Returns the directory where the template files reside (located
|
206
|
+
# relative to the source file of class JRubyEnginize::Generator).
|
207
|
+
|
208
|
+
def self.templates_directory
|
209
|
+
return File.join(File.dirname(File.dirname(__FILE__)), 'templates')
|
210
|
+
end
|
211
|
+
end
|
212
|
+
end
|
data/lib/script.rb
ADDED
@@ -0,0 +1,90 @@
|
|
1
|
+
# JRuby-Enginize, a generator for Google AppEngine compliant JRuby apps.
|
2
|
+
#
|
3
|
+
# This file contains the JRubyEnginize::Script class refactored to keep the
|
4
|
+
# executables lean.
|
5
|
+
|
6
|
+
require 'optparse'
|
7
|
+
require 'rubygems'
|
8
|
+
|
9
|
+
require 'lib/generator'
|
10
|
+
|
11
|
+
module JRubyEnginize # :nodoc:
|
12
|
+
|
13
|
+
# Commandline code refactored to keep the executables lean.
|
14
|
+
|
15
|
+
module Script
|
16
|
+
|
17
|
+
# Command line code for the <tt>"jruby-enginize"</tt> executable. Call
|
18
|
+
# with <tt>"--help"</tt> to learn more. Checks for running on JRuby and
|
19
|
+
# having the Google AppEngine SDK around and forwards work to
|
20
|
+
# JRubyEnginize::Generator.
|
21
|
+
|
22
|
+
def self.enginize
|
23
|
+
email = nil
|
24
|
+
template = 'sinatra'
|
25
|
+
path = nil
|
26
|
+
|
27
|
+
prog = File.basename($0)
|
28
|
+
|
29
|
+
=begin
|
30
|
+
# Check for running with JRuby: The whole generator makes no sense if not
|
31
|
+
# running with or at least for JRuby...
|
32
|
+
|
33
|
+
begin
|
34
|
+
java.lang.String
|
35
|
+
rescue
|
36
|
+
$stderr.puts "!!#{prog} makes only sense on JRuby systems. Please try again."
|
37
|
+
exit(1)
|
38
|
+
end
|
39
|
+
=end
|
40
|
+
|
41
|
+
# The AppEngine SDK has to be around, too.
|
42
|
+
|
43
|
+
begin
|
44
|
+
raise ArgumentError if not File.stat(`which appcfg.sh`.chop).executable?
|
45
|
+
rescue Exception
|
46
|
+
$stderr.puts "!!AppEngine SDK missing. Please retry after installing and make sure that"
|
47
|
+
$stderr.puts "AppEngine configuration tool \"appcfg.sh\" is in your PATH."
|
48
|
+
|
49
|
+
exit(2)
|
50
|
+
end
|
51
|
+
|
52
|
+
options = { :name => nil, :dryrun => false }
|
53
|
+
|
54
|
+
OptionParser.new do |opt|
|
55
|
+
opt.banner = "Usage: #{prog} [options] --email address dirname"
|
56
|
+
|
57
|
+
opt.on('-e', '--email address', 'E-Mail address to publish app with') { |email| }
|
58
|
+
opt.on('-t', '--template name', "Name of the template (defaults to #{template})") { |template| }
|
59
|
+
opt.on('-n', '--name appname', 'Name of the app (defaults to dir basename)') { |name|
|
60
|
+
options[:name] = name }
|
61
|
+
opt.on('-d', '--dry', 'Test run not really creating files') {
|
62
|
+
options[:dryrun] = true }
|
63
|
+
opt.on('-T', '--templates', 'List available templates') {
|
64
|
+
puts 'Supported templates:'
|
65
|
+
JRubyEnginize::Generator.templates.each { |name| puts " #{name}" }
|
66
|
+
exit(0) }
|
67
|
+
|
68
|
+
begin
|
69
|
+
opt.parse!(ARGV)
|
70
|
+
|
71
|
+
raise 'missing directory name' if (path = ARGV.first).nil? or path.empty?
|
72
|
+
raise 'directory already exists' if FileTest.exists? path
|
73
|
+
raise 'unknown template' if not JRubyEnginize::Generator.templates.include? template
|
74
|
+
|
75
|
+
raise 'missing e-mail address' if email.nil? or email.empty?
|
76
|
+
rescue SystemExit
|
77
|
+
exit(1)
|
78
|
+
rescue Exception => exception
|
79
|
+
$stderr.puts "!!#{exception}\n\n"
|
80
|
+
|
81
|
+
opt.parse!(['--help'])
|
82
|
+
|
83
|
+
exit(3)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
JRubyEnginize::Generator.new(email, path, template, options).run
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
.DS_Store
|
2
|
+
log/*
|
3
|
+
tmp/*
|
4
|
+
TAGS
|
5
|
+
*~
|
6
|
+
.#*
|
7
|
+
schema/schema.rb
|
8
|
+
schema/*_structure.sql
|
9
|
+
schema/*.sqlite3
|
10
|
+
schema/*.sqlite
|
11
|
+
schema/*.db
|
12
|
+
*.sqlite
|
13
|
+
*.sqlite3
|
14
|
+
*.db
|
15
|
+
src/*
|
16
|
+
.hgignore
|
17
|
+
.hg/*
|
18
|
+
.svn/*
|
19
|
+
gems/gems/*
|
20
|
+
gems/specifications/*
|
21
|
+
merb_profile_results
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# This application file was generated by jruby-enginize.
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'appengine-apis/merb-logger'
|
5
|
+
rescue Exception
|
6
|
+
end
|
7
|
+
|
8
|
+
# Class EngineApp implements the only controller of this application.
|
9
|
+
|
10
|
+
class EngineApp < Merb::Controller
|
11
|
+
layout :engine_app
|
12
|
+
|
13
|
+
# Returns the location of the template depending on controller and action.
|
14
|
+
# Modified to match our flat world.
|
15
|
+
#
|
16
|
+
# Parameters:
|
17
|
+
#
|
18
|
+
# [action] Name of the action
|
19
|
+
# [type] Requested format
|
20
|
+
# [controller] Name of the controller
|
21
|
+
|
22
|
+
def _template_location(action, type = nil, controller = controller_name)
|
23
|
+
(controller == 'layout' ? "layout.#{action}.#{type}" : "#{action}.#{type}")
|
24
|
+
end
|
25
|
+
|
26
|
+
# GET /
|
27
|
+
|
28
|
+
def index
|
29
|
+
render
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# Go to http://wiki.merbivore.com/pages/init-rb
|
2
|
+
|
3
|
+
# use_orm :none
|
4
|
+
use_test :rspec
|
5
|
+
use_template_engine :erb
|
6
|
+
|
7
|
+
# Specify a specific version of a dependency
|
8
|
+
# dependency "RedCloth", "> 3.0"
|
9
|
+
|
10
|
+
Merb::BootLoader.before_app_loads do
|
11
|
+
# This will get executed after dependencies have been loaded but before your app's classes have loaded.
|
12
|
+
end
|
13
|
+
|
14
|
+
Merb::BootLoader.after_app_loads do
|
15
|
+
# This will get executed after your app's classes have been loaded.
|
16
|
+
end
|
17
|
+
|
18
|
+
# Move this to app.rb if you want it to be reloadable in dev mode.
|
19
|
+
Merb::Router.prepare do
|
20
|
+
match('/').to(:controller => 'engine_app', :action =>'index')
|
21
|
+
|
22
|
+
default_routes
|
23
|
+
end
|
24
|
+
|
25
|
+
Merb::Config.use { |c|
|
26
|
+
c[:environment] = 'production',
|
27
|
+
c[:framework] = {},
|
28
|
+
c[:log_level] = :debug,
|
29
|
+
c[:log_stream] = STDOUT,
|
30
|
+
c[:use_mutex] = false,
|
31
|
+
c[:session_store] = 'cookie',
|
32
|
+
c[:session_id_key] = '_{{name}}_session_id',
|
33
|
+
c[:session_secret_key] = '{{hexrand-41}}',
|
34
|
+
c[:exception_details] = false,
|
35
|
+
c[:reload_classes] = false,
|
36
|
+
c[:reload_templates] = false
|
37
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'rubygems'
|
2
|
+
require 'appengine-rack'
|
3
|
+
|
4
|
+
require 'merb-core'
|
5
|
+
|
6
|
+
AppEngine::Rack.configure_app(
|
7
|
+
# :ssl_enabled => true,
|
8
|
+
:application => '{{name}}',
|
9
|
+
:version => 1)
|
10
|
+
|
11
|
+
Merb::Config.setup(:merb_root => File.dirname(__FILE__),
|
12
|
+
:environment => ENV['RACK_ENV'])
|
13
|
+
|
14
|
+
Merb.environment = Merb::Config[:environment]
|
15
|
+
Merb.root = Merb::Config[:merb_root]
|
16
|
+
|
17
|
+
Merb::BootLoader.run
|
18
|
+
|
19
|
+
run Merb::Rack::Application.new
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Tasks provided by Merb are guarded with a rescue block as we need this file
|
2
|
+
# to work prior to installation of Merb.
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'merb-core'
|
6
|
+
require 'merb-core/tasks/merb'
|
7
|
+
|
8
|
+
include FileUtils
|
9
|
+
|
10
|
+
# Load the basic runtime dependencies; this will include
|
11
|
+
# any plugins and therefore plugin rake tasks.
|
12
|
+
init_env = ENV['MERB_ENV'] || 'rake'
|
13
|
+
Merb.load_dependencies(:environment => init_env)
|
14
|
+
|
15
|
+
# Get Merb plugins and dependencies
|
16
|
+
Merb::Plugins.rakefiles.each { |r| require r }
|
17
|
+
|
18
|
+
# Load any app level custom rakefile extensions from lib/tasks
|
19
|
+
tasks_path = File.join(File.dirname(__FILE__), "lib", "tasks")
|
20
|
+
rake_files = Dir["#{tasks_path}/*.rake"]
|
21
|
+
rake_files.each{|rake_file| load rake_file }
|
22
|
+
|
23
|
+
require 'spec/rake/spectask'
|
24
|
+
require 'merb-core/test/tasks/spectasks'
|
25
|
+
rescue Exception
|
26
|
+
end
|
27
|
+
|
28
|
+
# Task for loading gems needed by this template. Bootstrap to get installed...
|
29
|
+
|
30
|
+
namespace :template do
|
31
|
+
desc 'Load missing gems to local gem repository'
|
32
|
+
task :gems do
|
33
|
+
appcfg = which_executable('appcfg.rb')
|
34
|
+
|
35
|
+
puts 'Load missing gems to local gem repository'
|
36
|
+
`(sudo #{appcfg} gem install appengine-apis extlib merb-core) 1>&2`
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# Add your own tasks...
|
41
|
+
|
42
|
+
namespace :merb do
|
43
|
+
end
|
44
|
+
|
Binary file
|
@@ -0,0 +1,55 @@
|
|
1
|
+
body {
|
2
|
+
background: #bbbbbb;
|
3
|
+
color: #000000;
|
4
|
+
font-family: helvetica;
|
5
|
+
font-size: 12pt;
|
6
|
+
}
|
7
|
+
|
8
|
+
h1, h2, h3, h4, h5, h6 {
|
9
|
+
font-family: helvetica;
|
10
|
+
}
|
11
|
+
|
12
|
+
h1 {
|
13
|
+
font-size: 18pt;
|
14
|
+
}
|
15
|
+
|
16
|
+
h2 {
|
17
|
+
font-size: 16pt;
|
18
|
+
}
|
19
|
+
|
20
|
+
h3 {
|
21
|
+
font-size: 14pt;
|
22
|
+
}
|
23
|
+
|
24
|
+
h4, h5, h6 {
|
25
|
+
font-size: 12pt;
|
26
|
+
}
|
27
|
+
|
28
|
+
a {
|
29
|
+
color: inherit;
|
30
|
+
text-decoration: none;
|
31
|
+
border-bottom: 1px dotted;
|
32
|
+
}
|
33
|
+
|
34
|
+
a:hover {
|
35
|
+
border-bottom: 1px solid;
|
36
|
+
}
|
37
|
+
|
38
|
+
div {
|
39
|
+
width: 580px;
|
40
|
+
padding: 3px 5px;
|
41
|
+
text-align: left;
|
42
|
+
}
|
43
|
+
|
44
|
+
#main {
|
45
|
+
background: #ffffff;
|
46
|
+
margin-top: 50px;
|
47
|
+
height: auto;
|
48
|
+
border: 1px solid #808080;
|
49
|
+
}
|
50
|
+
|
51
|
+
#footer {
|
52
|
+
padding-left: 0px;
|
53
|
+
font-size: 9pt;
|
54
|
+
color: #404040;
|
55
|
+
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require "rubygems"
|
2
|
+
|
3
|
+
# Add the local gems dir if found within the app root; any dependencies loaded
|
4
|
+
# hereafter will try to load from the local gems before loading system gems.
|
5
|
+
if (local_gem_dir = File.join(File.dirname(__FILE__), '..', 'gems')) && $BUNDLE.nil?
|
6
|
+
$BUNDLE = true; Gem.clear_paths; Gem.path.unshift(local_gem_dir)
|
7
|
+
end
|
8
|
+
|
9
|
+
require "spec"
|
10
|
+
require "merb-core"
|
11
|
+
|
12
|
+
Merb::Config.use do |c|
|
13
|
+
c[:session_store] = "memory"
|
14
|
+
end
|
15
|
+
|
16
|
+
Merb.start_environment(:testing => true,
|
17
|
+
:adapter => 'runner',
|
18
|
+
:environment => ENV['MERB_ENV'] || 'test')
|
19
|
+
|
20
|
+
Spec::Runner.configure do |config|
|
21
|
+
config.include(Merb::Test::ViewHelper)
|
22
|
+
config.include(Merb::Test::RouteHelper)
|
23
|
+
config.include(Merb::Test::ControllerHelper)
|
24
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
<center>
|
2
|
+
<div id='main'>
|
3
|
+
<center>
|
4
|
+
<p>
|
5
|
+
<img src='/images/appengine_logo.png' />
|
6
|
+
</p>
|
7
|
+
<h1>
|
8
|
+
Hi folks! Nice to meet you here!
|
9
|
+
</h1>
|
10
|
+
<p>
|
11
|
+
This is
|
12
|
+
<a href='http://code.google.com/appengine'>Google AppEngine</a>
|
13
|
+
running the
|
14
|
+
<a href='http://www.merbivore.com'>Merb</a>
|
15
|
+
framework.
|
16
|
+
</p>
|
17
|
+
<p>
|
18
|
+
<img src='/images/merb_logo.png' />
|
19
|
+
</p>
|
20
|
+
</center>
|
21
|
+
</div>
|
22
|
+
<div id='footer'>
|
23
|
+
This tiny app was generated by
|
24
|
+
<a href='http://github.com/ulbrich/jruby-enginize'>JRuby-Enginize</a>
|
25
|
+
to streamline Google AppEngine development.
|
26
|
+
</div>
|
27
|
+
</center>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<link href='/stylesheets/default.css' rel='stylesheet' type='text/css' />
|
5
|
+
</head>
|
6
|
+
<body>
|
7
|
+
<%= catch_content :for_layout %>
|
8
|
+
</body>
|
9
|
+
</html>
|
@@ -0,0 +1,71 @@
|
|
1
|
+
README
|
2
|
+
|
3
|
+
This is a generic README generated by jruby-enginize. Please replace with
|
4
|
+
something more meaningful... ;-)
|
5
|
+
|
6
|
+
INSTALL MISSING GEMS
|
7
|
+
|
8
|
+
As a basic requirement, you have to install missing gems required by the
|
9
|
+
template (this task is implemented individually for each template):
|
10
|
+
|
11
|
+
rake template:gems
|
12
|
+
|
13
|
+
!!Attention: Whenever you want to install additional gems, be sure to use
|
14
|
+
"appcfg.rb gem" provided by the Google AppEngine JRuby tools and not "jgem" as
|
15
|
+
Google maintains a local repository per project and bundles the files to
|
16
|
+
upload from that information. You will run into missing gems on the server if
|
17
|
+
you bypass this!
|
18
|
+
|
19
|
+
GOOGLE APPENGINE DEPLOYMENT
|
20
|
+
|
21
|
+
Deploy the application with
|
22
|
+
|
23
|
+
rake appengine:deploy
|
24
|
+
|
25
|
+
and open
|
26
|
+
|
27
|
+
http://{{name}}.appspot.com
|
28
|
+
|
29
|
+
to have a first test.
|
30
|
+
|
31
|
+
Be sure to set the version number in the AppEngine::Rack.configure_app part
|
32
|
+
of "config.ru" to a new value, when you are experimenting with an unstable
|
33
|
+
version and don't want to risk your users getting exceptions.
|
34
|
+
|
35
|
+
You can try the new version by opening e.g.
|
36
|
+
|
37
|
+
http://3.latest.{{name}}.appspot.com
|
38
|
+
|
39
|
+
and replacing "3" with the version number you want to run.
|
40
|
+
|
41
|
+
Switch the application to the new version as default (stable version) by
|
42
|
+
opening
|
43
|
+
|
44
|
+
http://appengine.google.com/deployment?&app_id={{name}}
|
45
|
+
|
46
|
+
and setting a new default.
|
47
|
+
|
48
|
+
SOME MORE INFO
|
49
|
+
|
50
|
+
- Gems installed with "appcfg.rb gem" reside in directory ".gems". Again: Do
|
51
|
+
not use "jgem" at all!
|
52
|
+
|
53
|
+
- Some gems will throw exceptions during bundling: Have a look for paths
|
54
|
+
assembled using ".." to reach the parent directory and replace with
|
55
|
+
File.dirname(...). Retry and be a good citizen and send in the patch the
|
56
|
+
developer of that gem... ;-)
|
57
|
+
|
58
|
+
- Data uploaded to the server is gathered in directory "WEB-INF" as with any
|
59
|
+
Java project. The first time "rake appengine:run" or "rake appengine:deploy"
|
60
|
+
is called, this directory will be created and "jruby-rack-xx.jar" is
|
61
|
+
downloaded from its homepage.
|
62
|
+
|
63
|
+
The first call to "rake appengine:run" or "rake appengine:deploy" with
|
64
|
+
downloading the rack jar will fail. Just ignore and retry.
|
65
|
+
|
66
|
+
- "WEB-INF/lib/gems.jar" is only created or updated after a call to
|
67
|
+
"appcfg.rb gem". This is enforced by "rake appengine:deploy" but not by
|
68
|
+
"rake appengine:update".
|
69
|
+
|
70
|
+
- Sometimes the local test server keeps running after Ctrl-C, so have a look
|
71
|
+
at "ps" and manually kill the process if needed.
|
@@ -0,0 +1,87 @@
|
|
1
|
+
require 'rake'
|
2
|
+
require 'rake/testtask'
|
3
|
+
require 'rake/rdoctask'
|
4
|
+
|
5
|
+
require 'net/http'
|
6
|
+
|
7
|
+
Dir[File.join(File.dirname(__FILE__), 'lib', 'tasks', '*.rake')].each do |ext|
|
8
|
+
load ext
|
9
|
+
end
|
10
|
+
|
11
|
+
# Helper for retrieving HTML files. Only used to check or trigger things so
|
12
|
+
# no highclass implementation...
|
13
|
+
|
14
|
+
def fetch(uri, limit = 10)
|
15
|
+
raise ArgumentError, 'HTTP redirect too deep' if limit == 0
|
16
|
+
|
17
|
+
response = Net::HTTP.get_response(URI.parse(uri))
|
18
|
+
|
19
|
+
case response
|
20
|
+
when Net::HTTPSuccess then
|
21
|
+
return response
|
22
|
+
when Net::HTTPRedirection then
|
23
|
+
return fetch(response['location'], limit - 1)
|
24
|
+
else
|
25
|
+
return response.error!
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns an absolute path for the requested executable. Falls back to
|
30
|
+
# returning only the executable if an exception is raised.
|
31
|
+
|
32
|
+
def which_executable(executable)
|
33
|
+
begin
|
34
|
+
if (path = `which #{executable}`.chomp).empty?
|
35
|
+
$stderr.puts "!!Error: Could not find \"#{executable}\""
|
36
|
+
exit
|
37
|
+
end
|
38
|
+
rescue Exception
|
39
|
+
path = executable
|
40
|
+
end
|
41
|
+
|
42
|
+
return path
|
43
|
+
end
|
44
|
+
|
45
|
+
desc 'Display some help and the README'
|
46
|
+
task :help do
|
47
|
+
puts 'Call "rake --tasks" to learn what tasks are available...'
|
48
|
+
puts
|
49
|
+
puts File.read('README')
|
50
|
+
end
|
51
|
+
|
52
|
+
task :default => [:help]
|
53
|
+
|
54
|
+
namespace :appengine do
|
55
|
+
desc 'Start a local test server'
|
56
|
+
task :run do
|
57
|
+
puts 'Start a local test server'
|
58
|
+
`(dev_appserver.rb .) 1>&2`
|
59
|
+
end
|
60
|
+
|
61
|
+
desc 'Force rebuilding "WEB-INF/lib/gems.jar"'
|
62
|
+
task :rebuildgems do
|
63
|
+
puts 'Force rebuilding "WEB-INF/lib/gems.jar"'
|
64
|
+
`(appcfg.rb gem help install) 2> /dev/null 1>&2`
|
65
|
+
end
|
66
|
+
|
67
|
+
desc 'Build the application package'
|
68
|
+
task :bundle do
|
69
|
+
puts 'Build the application package.'
|
70
|
+
`(appcfg.rb --email={{email}} --enable_jar_splitting bundle .) 1>&2`
|
71
|
+
end
|
72
|
+
|
73
|
+
desc 'Upload the application code to the server'
|
74
|
+
task :update do
|
75
|
+
puts 'Upload the new application code (this may take a while).'
|
76
|
+
`(appcfg.rb --email={{email}} --enable_jar_splitting update .) 1>&2`
|
77
|
+
end
|
78
|
+
|
79
|
+
desc 'Roll back a blocked and halfway broken deploy'
|
80
|
+
task :rollback do
|
81
|
+
puts 'Roll back a blocked and halfway broken deploy.'
|
82
|
+
`(appcfg.rb --email={{email}} rollback .) 1>&2`
|
83
|
+
end
|
84
|
+
|
85
|
+
desc 'Deploy the application (build package and upload application code)'
|
86
|
+
task :deploy => [:rebuildgems, :bundle, :update]
|
87
|
+
end
|
Binary file
|
Binary file
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# This application file was generated by jruby-enginize.
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
|
5
|
+
require 'haml'
|
6
|
+
require 'sass'
|
7
|
+
require 'sinatra'
|
8
|
+
|
9
|
+
# Use AppEngine::URLFetch.fetch() for loading remote files.
|
10
|
+
|
11
|
+
require 'appengine-apis/urlfetch'
|
12
|
+
|
13
|
+
# Set to true if you need sessions.
|
14
|
+
|
15
|
+
set :sessions, false
|
16
|
+
|
17
|
+
# Configure Sinatra to reload during development.
|
18
|
+
|
19
|
+
class Sinatra::Reloader < Rack::Reloader
|
20
|
+
def safe_load(file, mtime, stderr = $stderr)
|
21
|
+
::Sinatra::Application.reset!
|
22
|
+
stderr.puts "#{self.class}: reseting routes"
|
23
|
+
super
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
configure :development do
|
28
|
+
use Sinatra::Reloader
|
29
|
+
end
|
30
|
+
|
31
|
+
# Helpers to include...
|
32
|
+
|
33
|
+
helpers do
|
34
|
+
include Rack::Utils
|
35
|
+
|
36
|
+
alias_method :h, :escape_html
|
37
|
+
end
|
38
|
+
|
39
|
+
# GET /
|
40
|
+
|
41
|
+
get '/' do
|
42
|
+
haml :index
|
43
|
+
end
|
44
|
+
|
45
|
+
# GET /stylesheet.css
|
46
|
+
|
47
|
+
get '/stylesheet.css' do
|
48
|
+
content_type 'text/css', :charset => 'utf-8'
|
49
|
+
|
50
|
+
sass :stylesheet
|
51
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# Task for loading gems needed by this template. Bootstrap to get installed...
|
2
|
+
|
3
|
+
namespace :template do
|
4
|
+
desc 'Load missing gems to local gem repository'
|
5
|
+
task :gems do
|
6
|
+
appcfg = which_executable('appcfg.rb')
|
7
|
+
patch = which_executable('patch')
|
8
|
+
|
9
|
+
puts 'Load missing gems to local gem repository'
|
10
|
+
`(sudo #{appcfg} gem install appengine-apis haml sinatra) 1>&2`
|
11
|
+
puts 'Add patch for Haml 2.2.2 if needed'
|
12
|
+
`(sudo #{patch} --batch --silent .gems/gems/haml-2.2.2/lib/haml/util.rb < lib/tasks/haml-2_2_2-util.patch) 2> /dev/null 1>&2`
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
# Add your own tasks...
|
17
|
+
|
18
|
+
namespace :sinatra do
|
19
|
+
end
|
Binary file
|
@@ -0,0 +1,19 @@
|
|
1
|
+
%center
|
2
|
+
%div{ :id => 'main' }
|
3
|
+
%center
|
4
|
+
%p
|
5
|
+
%img{ :src => '/images/appengine_logo.png' }
|
6
|
+
%h1
|
7
|
+
Hi folks! Nice to meet you here!
|
8
|
+
%p
|
9
|
+
This is
|
10
|
+
%a{ :href => 'http://code.google.com/appengine' } Google AppEngine
|
11
|
+
running the
|
12
|
+
%a{ :href => 'http://www.sinatrarb.com' } Sinatra
|
13
|
+
framework.
|
14
|
+
%p
|
15
|
+
%img{ :src => '/images/sinatra_logo.png' }
|
16
|
+
%div{ :id => 'footer' }
|
17
|
+
This tiny app was generated by
|
18
|
+
%a{ :href => 'http://github.com/ulbrich/jruby-enginize' } JRuby-Enginize
|
19
|
+
to streamline Google AppEngine development.
|
@@ -0,0 +1,44 @@
|
|
1
|
+
body
|
2
|
+
:background #bbbbbb
|
3
|
+
:color #000000
|
4
|
+
:font-family helvetica
|
5
|
+
:font-size 12pt
|
6
|
+
|
7
|
+
h1, h2, h3, h4, h5, h6
|
8
|
+
:font-family helvetica
|
9
|
+
|
10
|
+
h1
|
11
|
+
:font-size 18pt
|
12
|
+
|
13
|
+
h2
|
14
|
+
:font-size 16pt
|
15
|
+
|
16
|
+
h3
|
17
|
+
:font-size 14pt
|
18
|
+
|
19
|
+
h4, h5, h6
|
20
|
+
:font-size 12pt
|
21
|
+
|
22
|
+
a
|
23
|
+
:color inherit
|
24
|
+
:text-decoration none
|
25
|
+
:border-bottom 1px dotted
|
26
|
+
|
27
|
+
a:hover
|
28
|
+
:border-bottom 1px solid
|
29
|
+
|
30
|
+
div
|
31
|
+
:width 580px
|
32
|
+
:padding 3px 5px
|
33
|
+
:text-align left
|
34
|
+
|
35
|
+
#main
|
36
|
+
:background #ffffff
|
37
|
+
:margin-top 50px
|
38
|
+
:height auto
|
39
|
+
:border 1px solid #808080
|
40
|
+
|
41
|
+
#footer
|
42
|
+
:padding-left 0px
|
43
|
+
:font-size 9pt
|
44
|
+
:color #404040
|
metadata
ADDED
@@ -0,0 +1,91 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: jruby-enginize
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: "0.8"
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Jan Ulbrich
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2009-11-04 00:00:00 +01:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description:
|
17
|
+
email: jan.ulbrich @nospam@ holtzbrinck.com
|
18
|
+
executables:
|
19
|
+
- jruby-enginize
|
20
|
+
extensions: []
|
21
|
+
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README.rdoc
|
24
|
+
files:
|
25
|
+
- bin/jruby-enginize
|
26
|
+
- lib/generator.rb
|
27
|
+
- lib/script.rb
|
28
|
+
- templates/sinatra/views/stylesheet.sass
|
29
|
+
- templates/sinatra/views/layout.haml
|
30
|
+
- templates/sinatra/views/index.haml
|
31
|
+
- templates/sinatra/public/images/sinatra_logo.png
|
32
|
+
- templates/sinatra/lib/tasks/sinatra.rake
|
33
|
+
- templates/sinatra/lib/tasks/haml-2_2_2-util.patch
|
34
|
+
- templates/sinatra/config.ru
|
35
|
+
- templates/sinatra/app.rb
|
36
|
+
- templates/sinatra/.gitignore
|
37
|
+
- templates/shared/README
|
38
|
+
- templates/shared/Rakefile
|
39
|
+
- templates/shared/public/robots.txt
|
40
|
+
- templates/shared/public/images/appengine_logo.png
|
41
|
+
- templates/shared/public/favicon.ico
|
42
|
+
- templates/merb/views/layout.engine_app.html.erb
|
43
|
+
- templates/merb/views/index.html.erb
|
44
|
+
- templates/merb/spec/spec_helper.rb
|
45
|
+
- templates/merb/public/stylesheets/default.css
|
46
|
+
- templates/merb/public/images/merb_logo.png
|
47
|
+
- templates/merb/lib/tasks/merb.rake
|
48
|
+
- templates/merb/config.ru
|
49
|
+
- templates/merb/config/init.rb
|
50
|
+
- templates/merb/config/framework.rb
|
51
|
+
- templates/merb/app.rb
|
52
|
+
- templates/merb/.gitignore
|
53
|
+
- README.rdoc
|
54
|
+
has_rdoc: true
|
55
|
+
homepage: http://github.com/ulbrich/jruby-enginize
|
56
|
+
licenses: []
|
57
|
+
|
58
|
+
post_install_message:
|
59
|
+
rdoc_options:
|
60
|
+
- --exclude
|
61
|
+
- pkg
|
62
|
+
- --exclude
|
63
|
+
- templates
|
64
|
+
- --all
|
65
|
+
- --title
|
66
|
+
- JRuby-Enginize
|
67
|
+
- --main
|
68
|
+
- README.rdoc
|
69
|
+
require_paths:
|
70
|
+
- .
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: "0"
|
76
|
+
version:
|
77
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - ">="
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: "0"
|
82
|
+
version:
|
83
|
+
requirements: []
|
84
|
+
|
85
|
+
rubyforge_project:
|
86
|
+
rubygems_version: 1.3.5
|
87
|
+
signing_key:
|
88
|
+
specification_version: 3
|
89
|
+
summary: A package for generating Google AppEngine compliant JRuby projects.
|
90
|
+
test_files: []
|
91
|
+
|