strelka 0.0.1pre4 → 0.0.1.pre129
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/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
|