strelka 0.0.1pre4 → 0.0.1.pre129
Sign up to get free protection for your applications and to get access to all the features.
- data/History.rdoc +1 -1
- data/IDEAS.rdoc +62 -0
- data/Manifest.txt +38 -7
- data/README.rdoc +124 -5
- data/Rakefile +22 -6
- data/bin/leash +102 -157
- data/contrib/hoetemplate/.autotest.erb +23 -0
- data/contrib/hoetemplate/History.rdoc.erb +4 -0
- data/contrib/hoetemplate/Manifest.txt.erb +8 -0
- data/contrib/hoetemplate/README.rdoc.erb +17 -0
- data/contrib/hoetemplate/Rakefile.erb +24 -0
- data/contrib/hoetemplate/data/file_name/apps/file_name_app +36 -0
- data/contrib/hoetemplate/data/file_name/templates/layout.tmpl.erb +13 -0
- data/contrib/hoetemplate/data/file_name/templates/top.tmpl.erb +8 -0
- data/contrib/hoetemplate/lib/file_name.rb.erb +18 -0
- data/contrib/hoetemplate/spec/file_name_spec.rb.erb +21 -0
- data/data/strelka/apps/hello-world +30 -0
- data/lib/strelka/app/defaultrouter.rb +49 -30
- data/lib/strelka/app/errors.rb +121 -0
- data/lib/strelka/app/exclusiverouter.rb +40 -0
- data/lib/strelka/app/filters.rb +18 -7
- data/lib/strelka/app/negotiation.rb +122 -0
- data/lib/strelka/app/parameters.rb +171 -14
- data/lib/strelka/app/paramvalidator.rb +751 -0
- data/lib/strelka/app/plugins.rb +66 -46
- data/lib/strelka/app/restresources.rb +499 -0
- data/lib/strelka/app/router.rb +73 -0
- data/lib/strelka/app/routing.rb +140 -18
- data/lib/strelka/app/templating.rb +12 -3
- data/lib/strelka/app.rb +174 -24
- data/lib/strelka/constants.rb +0 -20
- data/lib/strelka/exceptions.rb +29 -0
- data/lib/strelka/httprequest/acceptparams.rb +377 -0
- data/lib/strelka/httprequest/negotiation.rb +257 -0
- data/lib/strelka/httprequest.rb +155 -7
- data/lib/strelka/httpresponse/negotiation.rb +579 -0
- data/lib/strelka/httpresponse.rb +140 -0
- data/lib/strelka/logging.rb +4 -1
- data/lib/strelka/mixins.rb +53 -0
- data/lib/strelka.rb +22 -1
- data/spec/data/error.tmpl +1 -0
- data/spec/lib/constants.rb +0 -1
- data/spec/lib/helpers.rb +21 -0
- data/spec/strelka/app/defaultrouter_spec.rb +41 -35
- data/spec/strelka/app/errors_spec.rb +212 -0
- data/spec/strelka/app/exclusiverouter_spec.rb +220 -0
- data/spec/strelka/app/filters_spec.rb +196 -0
- data/spec/strelka/app/negotiation_spec.rb +73 -0
- data/spec/strelka/app/parameters_spec.rb +149 -0
- data/spec/strelka/app/paramvalidator_spec.rb +1059 -0
- data/spec/strelka/app/plugins_spec.rb +26 -19
- data/spec/strelka/app/restresources_spec.rb +393 -0
- data/spec/strelka/app/router_spec.rb +63 -0
- data/spec/strelka/app/routing_spec.rb +183 -9
- data/spec/strelka/app/templating_spec.rb +1 -2
- data/spec/strelka/app_spec.rb +265 -32
- data/spec/strelka/exceptions_spec.rb +53 -0
- data/spec/strelka/httprequest/acceptparams_spec.rb +282 -0
- data/spec/strelka/httprequest/negotiation_spec.rb +246 -0
- data/spec/strelka/httprequest_spec.rb +204 -14
- data/spec/strelka/httpresponse/negotiation_spec.rb +464 -0
- data/spec/strelka/httpresponse_spec.rb +114 -0
- data/spec/strelka/mixins_spec.rb +99 -0
- data.tar.gz.sig +1 -0
- metadata +175 -79
- metadata.gz.sig +2 -0
- data/IDEAS.textile +0 -174
- data/data/strelka/apps/strelka-admin +0 -65
- data/data/strelka/apps/strelka-setup +0 -26
- data/data/strelka/bootstrap-config.rb +0 -34
- data/data/strelka/templates/admin/console.tmpl +0 -21
- data/data/strelka/templates/layout.tmpl +0 -30
- data/lib/strelka/process.rb +0 -19
data/bin/leash
CHANGED
@@ -1,14 +1,6 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
require 'mongrel2'
|
4
|
-
require 'mongrel2/config'
|
5
3
|
require 'strelka'
|
6
|
-
|
7
|
-
require 'pp'
|
8
|
-
require 'fileutils'
|
9
|
-
require 'shellwords'
|
10
|
-
require 'tnetstring'
|
11
|
-
|
12
4
|
require 'trollop'
|
13
5
|
require 'highline'
|
14
6
|
|
@@ -26,74 +18,21 @@ class Strelka::LeashCommand
|
|
26
18
|
|
27
19
|
# Make a HighLine color scheme
|
28
20
|
COLOR_SCHEME = HighLine::ColorScheme.new do |scheme|
|
29
|
-
scheme[:header]
|
21
|
+
scheme[:header] = [ :bold, :yellow ]
|
30
22
|
scheme[:subheader] = [ :bold, :white ]
|
31
|
-
scheme[:key]
|
32
|
-
scheme[:value]
|
33
|
-
scheme[:error]
|
23
|
+
scheme[:key] = [ :white ]
|
24
|
+
scheme[:value] = [ :bold, :white ]
|
25
|
+
scheme[:error] = [ :red ]
|
34
26
|
scheme[:warning] = [ :yellow ]
|
35
27
|
scheme[:message] = [ :reset ]
|
36
28
|
end
|
37
29
|
|
38
30
|
|
39
|
-
# Path to the default history file for 'shell' mode
|
40
|
-
HISTORY_FILE = Pathname( "~/.leash.history" )
|
41
|
-
|
42
|
-
# Number of items to store in history by default
|
43
|
-
DEFAULT_HISTORY_SIZE = 100
|
44
|
-
|
45
|
-
# The prompt the 'shell' mode should show
|
46
|
-
PROMPT = 'leash> '
|
47
|
-
|
48
|
-
# The data directory in the project if that exists, otherwise the gem datadir
|
49
|
-
DATADIR = if File.directory?( 'data/strelka' )
|
50
|
-
Pathname( 'data/strelka' )
|
51
|
-
elsif path = Gem.datadir('strelka')
|
52
|
-
Pathname( path )
|
53
|
-
else
|
54
|
-
raise ScriptError, "can't find the data directory!"
|
55
|
-
end
|
56
|
-
|
57
|
-
|
58
31
|
# Class instance variables
|
59
32
|
@command_help = Hash.new {|h,k| h[k] = { :desc => nil, :usage => ''} }
|
60
33
|
@prompt = @option_parser = nil
|
61
34
|
|
62
35
|
|
63
|
-
### Add a help string for the given +command+.
|
64
|
-
def self::help( command, helpstring=nil )
|
65
|
-
if helpstring
|
66
|
-
@command_help[ command.to_sym ][:desc] = helpstring
|
67
|
-
end
|
68
|
-
|
69
|
-
return @command_help[ command.to_sym ][:desc]
|
70
|
-
end
|
71
|
-
|
72
|
-
|
73
|
-
### Add/fetch the +usagestring+ for +command+.
|
74
|
-
def self::usage( command, usagestring=nil )
|
75
|
-
if usagestring
|
76
|
-
prefix = usagestring[ /\A(\s+)/, 1 ]
|
77
|
-
usagestring.gsub!( /^#{prefix}/m, '' ) if prefix
|
78
|
-
|
79
|
-
@command_help[ command.to_sym ][:usage] = usagestring
|
80
|
-
end
|
81
|
-
|
82
|
-
return @command_help[ command.to_sym ][:usage]
|
83
|
-
end
|
84
|
-
|
85
|
-
|
86
|
-
### Return the global Highline prompt object, creating it if necessary.
|
87
|
-
def self::prompt
|
88
|
-
unless @prompt
|
89
|
-
@prompt = HighLine.new
|
90
|
-
@prompt.wrap_at = @prompt.output_cols - 10
|
91
|
-
end
|
92
|
-
|
93
|
-
return @prompt
|
94
|
-
end
|
95
|
-
|
96
|
-
|
97
36
|
### Run the utility with the given +args+.
|
98
37
|
def self::run( args )
|
99
38
|
HighLine.color_scheme = COLOR_SCHEME
|
@@ -147,7 +86,6 @@ class Strelka::LeashCommand
|
|
147
86
|
def self::make_option_parser
|
148
87
|
unless @option_parser
|
149
88
|
progname = File.basename( $0 )
|
150
|
-
default_configdb = Mongrel2::DEFAULT_CONFIG_URI
|
151
89
|
|
152
90
|
# Make a list of the log level names and the available commands
|
153
91
|
loglevels = Strelka::Logging::LOG_LEVELS.
|
@@ -157,15 +95,14 @@ class Strelka::LeashCommand
|
|
157
95
|
command_table = self.make_command_table
|
158
96
|
|
159
97
|
@option_parser = Trollop::Parser.new do
|
160
|
-
banner "
|
98
|
+
banner "Manage Strelka apps"
|
161
99
|
|
162
100
|
text ''
|
163
101
|
command_table.each {|line| text(line) }
|
164
102
|
text ''
|
165
103
|
|
166
104
|
text 'Global Options'
|
167
|
-
opt :config, "Specify the
|
168
|
-
:default => DEFAULT_CONFIG_URI
|
105
|
+
opt :config, "Specify the config file to load."
|
169
106
|
text ''
|
170
107
|
|
171
108
|
text 'Other Options:'
|
@@ -179,6 +116,45 @@ class Strelka::LeashCommand
|
|
179
116
|
end
|
180
117
|
|
181
118
|
|
119
|
+
### Add a help string for the given +command+.
|
120
|
+
def self::help( command, helpstring=nil )
|
121
|
+
if helpstring
|
122
|
+
@command_help[ command.to_sym ][:desc] = helpstring
|
123
|
+
end
|
124
|
+
|
125
|
+
return @command_help[ command.to_sym ][:desc]
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
### Add/fetch the +usagestring+ for +command+.
|
130
|
+
def self::usage( command, usagestring=nil )
|
131
|
+
if usagestring
|
132
|
+
prefix = usagestring[ /\A(\s+)/, 1 ]
|
133
|
+
usagestring.gsub!( /^#{prefix}/m, '' ) if prefix
|
134
|
+
|
135
|
+
@command_help[ command.to_sym ][:usage] = usagestring
|
136
|
+
end
|
137
|
+
|
138
|
+
return @command_help[ command.to_sym ][:usage]
|
139
|
+
end
|
140
|
+
|
141
|
+
|
142
|
+
### Return the global Highline prompt object, creating it if necessary.
|
143
|
+
def self::prompt
|
144
|
+
unless @prompt
|
145
|
+
@prompt = HighLine.new
|
146
|
+
|
147
|
+
columns = @prompt.output_cols.nonzero? || 80
|
148
|
+
rows = @prompt.output_rows.nonzero? || 1000
|
149
|
+
|
150
|
+
@prompt.page_at = rows - 5
|
151
|
+
@prompt.wrap_at = columns - 2
|
152
|
+
end
|
153
|
+
|
154
|
+
return @prompt
|
155
|
+
end
|
156
|
+
|
157
|
+
|
182
158
|
#################################################################
|
183
159
|
### I N S T A N C E M E T H O D S
|
184
160
|
#################################################################
|
@@ -188,7 +164,6 @@ class Strelka::LeashCommand
|
|
188
164
|
def initialize( options )
|
189
165
|
Strelka.logger.formatter = Strelka::Logging::ColorFormatter.new( Strelka.logger )
|
190
166
|
@options = options
|
191
|
-
@shellmode = false
|
192
167
|
|
193
168
|
if @options.debug
|
194
169
|
$DEBUG = true
|
@@ -198,7 +173,6 @@ class Strelka::LeashCommand
|
|
198
173
|
Strelka.logger.level = Strelka::Logging::LOG_LEVELS[ @options.loglevel ]
|
199
174
|
end
|
200
175
|
|
201
|
-
Mongrel2::Config.configure( :configdb => @options.config )
|
202
176
|
end
|
203
177
|
|
204
178
|
|
@@ -209,9 +183,6 @@ class Strelka::LeashCommand
|
|
209
183
|
# The Trollop options hash the command will read its configuration from
|
210
184
|
attr_reader :options
|
211
185
|
|
212
|
-
# True if running in shell mode
|
213
|
-
attr_reader :shellmode
|
214
|
-
|
215
186
|
|
216
187
|
# Delegate the instance #prompt method to the class method instead
|
217
188
|
define_method( :prompt, &self.method(:prompt) )
|
@@ -264,84 +235,77 @@ class Strelka::LeashCommand
|
|
264
235
|
usage :help, "[COMMAND]"
|
265
236
|
|
266
237
|
|
267
|
-
### The '
|
268
|
-
def
|
269
|
-
|
270
|
-
self.setup_bootstrap_config( port )
|
271
|
-
m2pid = self.start_admin_mongrel2
|
272
|
-
apppid = self.start_admin_app
|
238
|
+
### The 'discover' command
|
239
|
+
def discover_command( *args )
|
240
|
+
header "Searching for Strelka applications..."
|
273
241
|
|
274
|
-
|
242
|
+
paths = Strelka::App.discover_paths
|
243
|
+
if paths.empty?
|
244
|
+
message "None found."
|
245
|
+
else
|
246
|
+
paths.each do |gemname, paths|
|
247
|
+
message "Found:"
|
275
248
|
|
276
|
-
|
277
|
-
|
278
|
-
|
249
|
+
subheader "#{gemname}:"
|
250
|
+
filenames = paths.map {|path| path.basename.to_s }
|
251
|
+
list( filenames )
|
252
|
+
end
|
253
|
+
end
|
254
|
+
end
|
255
|
+
help :discover, "Show available Strelka applications installed as gems."
|
279
256
|
|
280
|
-
message "Killing admin app..."
|
281
|
-
Process.kill( apppid, :TERM ) if apppid
|
282
257
|
|
283
|
-
|
284
|
-
|
285
|
-
message "Done: %p" % [ results ]
|
258
|
+
### The 'setup' command
|
259
|
+
def setup_command( *args )
|
286
260
|
end
|
287
261
|
help :setup, "Set up a new Strelka environment and start the admin server."
|
288
|
-
usage :setup, "[PORT]"
|
289
262
|
|
290
263
|
|
291
|
-
###
|
292
|
-
|
293
|
-
def setup_bootstrap_config( port )
|
294
|
-
configfile = DATADIR + 'bootstrap-config.rb'
|
295
|
-
runspace = Module.new do
|
296
|
-
extend Mongrel2::Config::DSL, FileUtils::Verbose
|
297
|
-
end
|
298
|
-
|
299
|
-
header "Loading config from #{configfile}"
|
300
|
-
source = configfile.read
|
301
|
-
Mongrel2::Config.init_database!
|
302
|
-
runspace.module_eval( source, configfile.to_s, 0 )
|
264
|
+
### The 'start' command
|
265
|
+
def start_command( *args )
|
303
266
|
end
|
267
|
+
help :start, "Start the web adminstration app"
|
304
268
|
|
305
269
|
|
306
|
-
###
|
307
|
-
def
|
308
|
-
|
309
|
-
raise ScriptError, "Ack! No server named 'adminserver' in #{Mongrel2::Config.pathname}"
|
310
|
-
|
311
|
-
message "Starting mongrel2..."
|
312
|
-
cmd = [ 'mongrel2', 'mongrel2 (Strelka Admin)' ]
|
313
|
-
args = [ Mongrel2::Config.pathname.to_s, server.uuid ]
|
314
|
-
|
315
|
-
return spawn( cmd, *args )
|
270
|
+
### The 'version' command
|
271
|
+
def version_command( *args )
|
272
|
+
message( "<%= color 'Version:', :header %> " + Mongrel2.version_string(true) )
|
316
273
|
end
|
274
|
+
help :version, "Prints the Ruby-Mongrel2 version."
|
317
275
|
|
318
276
|
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
pid = fork do
|
324
|
-
appsdir = DATADIR + 'apps'
|
325
|
-
templatedir = DATADIR + 'templates'
|
326
|
-
strelka_admin = appsdir + 'strelka-admin'
|
277
|
+
#
|
278
|
+
# Command functions
|
279
|
+
#
|
327
280
|
|
328
|
-
|
281
|
+
### Install a bootstrap config database for the admin server.
|
282
|
+
def setup_bootstrap_config
|
283
|
+
Mongrel2::Config.init_database
|
329
284
|
|
330
|
-
|
331
|
-
|
285
|
+
if Mongrel2::Config::Server.by_uuid( ADMINSERVER_ID ).first
|
286
|
+
message "Admin server is already configured"
|
287
|
+
if !self.prompt.agree( "Replace the existing config? ", true )
|
288
|
+
message "Okay, keeping the existing config."
|
289
|
+
return
|
290
|
+
end
|
291
|
+
end
|
332
292
|
|
333
|
-
|
293
|
+
configfile = DATADIR + 'bootstrap-config.rb'
|
294
|
+
runspace = Module.new do
|
295
|
+
extend Mongrel2::Config::DSL, FileUtils::Verbose
|
334
296
|
end
|
335
297
|
|
336
|
-
|
298
|
+
header "Installing admin server config from #{configfile}"
|
299
|
+
source = configfile.read
|
300
|
+
runspace.module_eval( source, configfile.to_s, 1 )
|
337
301
|
end
|
338
302
|
|
339
303
|
|
340
|
-
###
|
341
|
-
|
342
|
-
|
304
|
+
### Set up the mongrel2 chroot directory for Strelka's adminserver by copying static
|
305
|
+
### files, and creating the necessary directories. This depends on the configuration
|
306
|
+
### being installed.
|
307
|
+
def setup_runtime_directory
|
343
308
|
end
|
344
|
-
help :version, "Prints the Ruby-Mongrel2 version."
|
345
309
|
|
346
310
|
|
347
311
|
#
|
@@ -360,42 +324,23 @@ class Strelka::LeashCommand
|
|
360
324
|
end
|
361
325
|
|
362
326
|
|
363
|
-
### Output the given +text+ highlighted as
|
364
|
-
def
|
365
|
-
message( self.prompt.color(text, :
|
327
|
+
### Output the given +text+ highlighted as a subheader.
|
328
|
+
def subheader( text )
|
329
|
+
message( self.prompt.color(text, :subheader) )
|
366
330
|
end
|
367
331
|
|
368
332
|
|
369
|
-
###
|
370
|
-
def
|
371
|
-
|
372
|
-
|
373
|
-
if histfile.exist?
|
374
|
-
lines = histfile.readlines.collect {|line| line.chomp }
|
375
|
-
self.log.debug "Read %d saved history commands from %s." % [ lines.length, histfile ]
|
376
|
-
Readline::HISTORY.push( *lines )
|
377
|
-
else
|
378
|
-
self.log.debug "History file '%s' was empty or non-existant." % [ histfile ]
|
379
|
-
end
|
333
|
+
### Output the given +text+ highlighted as an error.
|
334
|
+
def error( text )
|
335
|
+
message( self.prompt.color(text, :error) )
|
380
336
|
end
|
381
337
|
|
382
338
|
|
383
|
-
###
|
384
|
-
def
|
385
|
-
|
386
|
-
|
387
|
-
lines = Readline::HISTORY.to_a.reverse.uniq.reverse
|
388
|
-
lines = lines[ -DEFAULT_HISTORY_SIZE, DEFAULT_HISTORY_SIZE ] if
|
389
|
-
lines.length > DEFAULT_HISTORY_SIZE
|
390
|
-
|
391
|
-
self.log.debug "Saving %d history lines to %s." % [ lines.length, histfile ]
|
392
|
-
|
393
|
-
histfile.open( File::WRONLY|File::CREAT|File::TRUNC ) do |ofh|
|
394
|
-
ofh.puts( *lines )
|
395
|
-
end
|
339
|
+
### Output the given +items+ as a columnar list.
|
340
|
+
def list( *items )
|
341
|
+
message( self.prompt.list(items.flatten.compact.map(&:to_s), :columns_down) )
|
396
342
|
end
|
397
343
|
|
398
|
-
|
399
344
|
end # class Strelka::LeashCommand
|
400
345
|
|
401
346
|
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
|
3
|
+
require 'autotest/restart'
|
4
|
+
|
5
|
+
# Autotest.add_hook :initialize do |at|
|
6
|
+
# at.extra_files << "../some/external/dependency.rb"
|
7
|
+
#
|
8
|
+
# at.libs << ":../some/external"
|
9
|
+
#
|
10
|
+
# at.add_exception 'vendor'
|
11
|
+
#
|
12
|
+
# at.add_mapping(/dependency.rb/) do |f, _|
|
13
|
+
# at.files_matching(/test_.*rb$/)
|
14
|
+
# end
|
15
|
+
#
|
16
|
+
# %w(TestA TestB).each do |klass|
|
17
|
+
# at.extra_class_map[klass] = "test/test_misc.rb"
|
18
|
+
# end
|
19
|
+
# end
|
20
|
+
|
21
|
+
# Autotest.add_hook :run_command do |at|
|
22
|
+
# system "rake build"
|
23
|
+
# end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
= <%= project %>
|
2
|
+
|
3
|
+
* <%= XIF %> (url)
|
4
|
+
|
5
|
+
== Description
|
6
|
+
|
7
|
+
<%= XIF %> (describe your package)
|
8
|
+
|
9
|
+
== Installation
|
10
|
+
|
11
|
+
gem install <%= project %>
|
12
|
+
|
13
|
+
== License
|
14
|
+
|
15
|
+
Copyright (c) <%= Time.now.strftime("%Y") %>, <%= XIF %>
|
16
|
+
All rights reserved.
|
17
|
+
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'hoe'
|
5
|
+
rescue LoadError
|
6
|
+
abort "This Rakefile requires 'hoe' (gem install hoe)"
|
7
|
+
end
|
8
|
+
|
9
|
+
# Sign gems
|
10
|
+
Hoe.plugin :signing
|
11
|
+
|
12
|
+
Hoe.spec '<%= project %>' do
|
13
|
+
self.readme_file = 'README.rdoc'
|
14
|
+
self.history_file = 'History.rdoc'
|
15
|
+
self.extra_rdoc_files = FileList[ '*.rdoc' ]
|
16
|
+
|
17
|
+
self.developer '<%= XIF %>', '<%= XIF %>' # (name, email)
|
18
|
+
|
19
|
+
self.dependency 'strelka', '~> 0.1'
|
20
|
+
self.dependency 'rspec', '~> 2.7', :developer
|
21
|
+
|
22
|
+
self.require_ruby_version( '~> 1.9' )
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'strelka'
|
4
|
+
|
5
|
+
|
6
|
+
# The main <%= project %> application
|
7
|
+
class <%= klass %>::Application < Strelka::App
|
8
|
+
|
9
|
+
# Uncomment this if you need an appid other than
|
10
|
+
# '<%= klass.gsub(/[^[:alnum:]]+/, '-').downcase %>-application'.
|
11
|
+
#ID = '<%= XIF %>' # (set the app id of the main application)
|
12
|
+
|
13
|
+
# Load some plugins
|
14
|
+
plugins :templating, :routing
|
15
|
+
|
16
|
+
# By default, responses are HTML
|
17
|
+
default_type 'text/html'
|
18
|
+
|
19
|
+
# Templating -- wrap everything in the layout
|
20
|
+
layout 'layout.tmpl'
|
21
|
+
templates \
|
22
|
+
:top => 'top.tmpl'
|
23
|
+
|
24
|
+
|
25
|
+
# GET request handler -- handles all GET requests
|
26
|
+
get do |req|
|
27
|
+
# Use the 'top' template for the body, wrapped in the 'layout' template
|
28
|
+
return :top
|
29
|
+
end
|
30
|
+
|
31
|
+
|
32
|
+
end # class <%= klass %>::Application
|
33
|
+
|
34
|
+
|
35
|
+
<%= klass %>::Application.run if __FILE__ == $0
|
36
|
+
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
# <%= XIF %> (top-level documentation)
|
4
|
+
#
|
5
|
+
# == Author/s
|
6
|
+
#
|
7
|
+
# * Michael Granger <ged@FaerieMUD.org>
|
8
|
+
#
|
9
|
+
module <%= klass %>
|
10
|
+
|
11
|
+
# Library version constant
|
12
|
+
VERSION = '0.0.1'
|
13
|
+
|
14
|
+
# Version-control revision constant
|
15
|
+
REVISION = %q$Revision: c21afe9776d3 $
|
16
|
+
|
17
|
+
end # module <%= klass %>
|
18
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
#!/usr/bin/env rspec -cfd -b
|
2
|
+
|
3
|
+
BEGIN {
|
4
|
+
require 'pathname'
|
5
|
+
basedir = Pathname( __FILE__ ).dirname.parent
|
6
|
+
libdir = basedir + 'lib'
|
7
|
+
|
8
|
+
$LOAD_PATH.unshift( libdir.to_s ) unless $LOAD_PATH.include?( libdir.to_s )
|
9
|
+
}
|
10
|
+
|
11
|
+
require 'rspec'
|
12
|
+
require '<%= file_name %>'
|
13
|
+
|
14
|
+
describe <%= klass %> do
|
15
|
+
|
16
|
+
it "is well-tested" do
|
17
|
+
fail "it isn't"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'strelka'
|
4
|
+
|
5
|
+
# The Strelka admin web console.
|
6
|
+
class HelloWorldApp < Strelka::App
|
7
|
+
|
8
|
+
# The route appid that will configure this app if no appid is specified
|
9
|
+
ID = 'hello-world'
|
10
|
+
|
11
|
+
|
12
|
+
# Use Sinatra-like routing
|
13
|
+
plugins :routing
|
14
|
+
|
15
|
+
# Set responses to plaintext if they don't specify differently
|
16
|
+
default_type 'text/plain'
|
17
|
+
|
18
|
+
# Handle all GET requests the same way
|
19
|
+
get do |req|
|
20
|
+
res = req.response
|
21
|
+
res.status = HTTP::OK
|
22
|
+
res << 'Hello, world!'
|
23
|
+
return res
|
24
|
+
end
|
25
|
+
|
26
|
+
end # class HelloWorldApp
|
27
|
+
|
28
|
+
|
29
|
+
# Run the app
|
30
|
+
HelloWorldApp.run if __FILE__ == $0
|