strelka 0.0.1.pre.203 → 0.0.1.pre.214

Sign up to get free protection for your applications and to get access to all the features.
data.tar.gz.sig CHANGED
@@ -1,2 +1,6 @@
1
- *�,��Č�j|��̛Z��g ]�w��� �x\CW�b��_�ϕ�V�F�Ѫuqj�\����_����5i�N�@!�l��d$P{��"U}q�I
2
- 5Aq:�!�r>�y�4�s0\P��V��k"�ͽ�<�|X�-�Y�qۉ%��~�s>��7(H���R�����K%]�J�bF�gb_�W���J)
1
+ "�߾7jCW���Hk�~d
2
+ �n�Cf��V9w:
3
+ Z���B}V���b�7T����� mL��ewҲ��2^f{(��S���BmV
4
+ L�D�΀���(6�/L�>'?�b�?:�?�LÖ��o�@�;��i���4�s�z�T�E-��P�p�>¥BJE��Iȸ� �Z<�?�]�Q�ŋ�
5
+ X
6
+ ��Br +�R!
data/ChangeLog CHANGED
@@ -1,8 +1,89 @@
1
+ 2012-05-02 Michael Granger <ged@FaerieMUD.org>
2
+
3
+ * MILESTONES.rdoc, Manifest.txt:
4
+ Adding a MILESTONES file.
5
+
6
+ We'll use this as a checklist of what needs to be done for the next
7
+ release.
8
+ [d8e74e3bf97b] [tip]
9
+
10
+ * lib/strelka/logging.rb:
11
+ Change fatal output color to be more readable
12
+ [403cf0ef01f0]
13
+
14
+ 2012-04-25 Michael Granger <ged@FaerieMUD.org>
15
+
16
+ * lib/strelka/app.rb, lib/strelka/plugins.rb,
17
+ spec/strelka/httpresponse/negotiation_spec.rb,
18
+ spec/strelka/plugins_spec.rb:
19
+ Add an #application_stack method to the PluginLoader mixin
20
+ [7427a74ae313] [github/master]
21
+
22
+ * lib/strelka/app.rb, spec/strelka/app_spec.rb:
23
+ Add configurable ::devmode? setting to Strelka::App
24
+ [c94cf810fdf7]
25
+
26
+ * lib/strelka/plugins.rb, spec/strelka/plugins_spec.rb:
27
+ Fix plugins clobbering their Class ivars if registered more than
28
+ once
29
+ [d9ff6bdd0177]
30
+
31
+ * lib/strelka/mixins.rb:
32
+ Add a 'singleton_method_alias' declarative to MethodUtilities
33
+ [e33e97ad96bd]
34
+
35
+ * lib/strelka/app/errors.rb, lib/strelka/mixins.rb,
36
+ spec/strelka/app/errors_spec.rb:
37
+ Add an exception-handler to the :errors plugin.
38
+ [53001e8ff327]
39
+
40
+ 2012-04-24 Michael Granger <ged@FaerieMUD.org>
41
+
42
+ * lib/strelka/app/templating.rb, spec/strelka/app/templating_spec.rb:
43
+ Refactored on of the big methods in :templating.
44
+ [f933118fb9db]
45
+
46
+ 2012-04-23 Michael Granger <ged@FaerieMUD.org>
47
+
48
+ * .rvm.gems:
49
+ Bumped hoe-deveiate in the dev gemset
50
+ [2a0529c51350]
51
+
52
+ * Rakefile:
53
+ Activate deveiate Hoe plugin
54
+ [74927b62af8f]
55
+
56
+ * lib/strelka/app/parameters.rb, lib/strelka/paramvalidator.rb,
57
+ spec/strelka/paramvalidator_spec.rb:
58
+ Clean up ParamValidator specs,
59
+ [90ca23f958cd]
60
+
61
+ 2012-04-21 Mahlon E. Smith <mahlon@martini.nu>
62
+
63
+ * lib/strelka/paramvalidator.rb, spec/strelka/app/parameters_spec.rb,
64
+ spec/strelka/paramvalidator_spec.rb:
65
+ Ensure form data is revalidated when its profile is changed.
66
+
67
+ This also fixes some Symbol/String bugs in the internals.
68
+ [f343990cae18]
69
+
1
70
  2012-04-21 Michael Granger <ged@FaerieMUD.org>
2
71
 
72
+ * lib/strelka/mixins.rb, spec/lib/helpers.rb,
73
+ spec/strelka/authprovider/basic_spec.rb,
74
+ spec/strelka/authprovider_spec.rb, spec/strelka/httprequest_spec.rb,
75
+ spec/strelka/router/default_spec.rb,
76
+ spec/strelka/router/exclusive_spec.rb:
77
+ Add the backtrace to the finish_with status_info.
78
+
79
+ This release also adds a 'finish_with' matcher that will eliminate
80
+ the need to duplicate the status_info struct exactly to test
81
+ abnormal status responses.
82
+ [8f6441fd0751]
83
+
3
84
  * lib/strelka/app/parameters.rb:
4
85
  Add some better docs for the :parameters plugin
5
- [f0c8f37e24d7] [tip]
86
+ [f0c8f37e24d7]
6
87
 
7
88
  2012-04-20 Michael Granger <ged@FaerieMUD.org>
8
89
 
@@ -80,7 +161,7 @@
80
161
 
81
162
  * Strelka::App::Plugin is now Strelka::Plugin
82
163
  * Strelka::App::Plugins is now Strelka::PluginLoader
83
- [ea4c4358a943] [github/master]
164
+ [ea4c4358a943]
84
165
 
85
166
  2012-04-16 Mahlon E. Smith <mahlon@martini.nu>
86
167
 
@@ -163,18 +244,16 @@
163
244
  * Merging with ssh://hg@deveiate.org/Strelka@8f1c27819e70
164
245
  [5fcd76455aad]
165
246
 
247
+ * Manifest.txt:
248
+ Updating the manifest
249
+ [35165b3d01cc]
250
+
166
251
  2012-04-11 Mahlon E. Smith <mahlon@martini.nu>
167
252
 
168
253
  * lib/strelka/session/default.rb:
169
254
  Use the built-in securerandom method for obtaining a hex value.
170
255
  [8f1c27819e70]
171
256
 
172
- 2012-04-11 Michael Granger <ged@FaerieMUD.org>
173
-
174
- * Manifest.txt:
175
- Updating the manifest
176
- [35165b3d01cc]
177
-
178
257
  2012-04-10 Michael Granger <ged@FaerieMUD.org>
179
258
 
180
259
  * lib/strelka/app/auth.rb, lib/strelka/app/parameters.rb,
@@ -245,6 +324,22 @@
245
324
  Add the ChangeLog to the ignorefile
246
325
  [cc8c30d38652]
247
326
 
327
+ * lib/strelka/app/templating.rb:
328
+ Add API docs to the :templating plugin module
329
+ [3c160d996320]
330
+
331
+ * README.rdoc:
332
+ Add more URLs
333
+ [060962556bd1]
334
+
335
+ * Rakefile:
336
+ Oops. Fix typo
337
+ [5a8aa207860b]
338
+
339
+ * .rvm.gems, Rakefile:
340
+ Update dependencies
341
+ [787e523777d1]
342
+
248
343
  2012-04-06 Mahlon E. Smith <mahlon@martini.nu>
249
344
 
250
345
  * lib/strelka/app/sessions.rb, lib/strelka/cookie.rb,
@@ -262,24 +357,6 @@
262
357
  Add a persistent DB session store, using sequel.
263
358
  [99f3c3f5d6ca]
264
359
 
265
- 2012-04-06 Michael Granger <ged@FaerieMUD.org>
266
-
267
- * lib/strelka/app/templating.rb:
268
- Add API docs to the :templating plugin module
269
- [3c160d996320]
270
-
271
- * README.rdoc:
272
- Add more URLs
273
- [060962556bd1]
274
-
275
- * Rakefile:
276
- Oops. Fix typo
277
- [5a8aa207860b]
278
-
279
- * .rvm.gems, Rakefile:
280
- Update dependencies
281
- [787e523777d1]
282
-
283
360
  2012-04-04 Michael Granger <ged@FaerieMUD.org>
284
361
 
285
362
  * manual/src/tutorial.page:
data/MILESTONES.rdoc ADDED
@@ -0,0 +1,16 @@
1
+ = Strelka Milestones
2
+
3
+ == v0.0.1
4
+
5
+ * Ensure the README is up to date
6
+ * Update the IDEAS doc
7
+ * Finish the 'setup' task in bin/strelka
8
+ * Extract the rest of the manual out into RDoc for the app classes
9
+ * Lay out the framework for the 'cookbook' section of the manual
10
+ * Mix in the 18pt awesomesauce.
11
+
12
+
13
+ == v0.1.0
14
+
15
+ * Add WebSocketService and plugins
16
+
data/Manifest.txt CHANGED
@@ -2,6 +2,7 @@
2
2
  ChangeLog
3
3
  History.rdoc
4
4
  IDEAS.rdoc
5
+ MILESTONES.rdoc
5
6
  Manifest.txt
6
7
  README.rdoc
7
8
  Rakefile
data/Rakefile CHANGED
@@ -11,6 +11,7 @@ end
11
11
  Hoe.plugin :mercurial
12
12
  Hoe.plugin :signing
13
13
  Hoe.plugin :manualgen
14
+ Hoe.plugin :deveiate
14
15
 
15
16
  Hoe.plugins.delete :rubyforge
16
17
 
data/lib/strelka/app.rb CHANGED
@@ -4,6 +4,7 @@
4
4
 
5
5
  require 'rubygems' # For the Rubygems API
6
6
 
7
+ require 'configurability'
7
8
  require 'mongrel2/handler'
8
9
  require 'strelka' unless defined?( Strelka )
9
10
  require 'strelka/mixins'
@@ -12,18 +13,22 @@ require 'strelka/plugins'
12
13
 
13
14
  # The application base class.
14
15
  class Strelka::App < Mongrel2::Handler
15
- extend Strelka::MethodUtilities,
16
+ extend Configurability,
17
+ Strelka::MethodUtilities,
16
18
  Strelka::PluginLoader
17
19
  include Strelka::Loggable,
18
20
  Strelka::Constants,
19
21
  Strelka::ResponseHelpers
20
22
 
21
23
 
24
+ # Configurability API -- use the 'app' section of the config file.
25
+ config_key :app
26
+
22
27
  # Glob for matching Strelka apps relative to a gem's data directory
23
28
  APP_GLOB_PATTERN = '{apps,handlers}/**/*'
24
29
 
25
-
26
30
  # Class instance variables
31
+ @devmode = false
27
32
  @default_type = nil
28
33
  @loading_file = nil
29
34
  @subclasses = Hash.new {|h,k| h[k] = [] }
@@ -34,6 +39,10 @@ class Strelka::App < Mongrel2::Handler
34
39
  # loaded from, or +nil+ if they weren't loaded via ::load.
35
40
  singleton_attr_reader :subclasses
36
41
 
42
+ ##
43
+ # 'Developer mode' flag.
44
+ singleton_attr_writer :devmode
45
+
37
46
 
38
47
  ### Inheritance callback -- add subclasses to @subclasses so .load can figure out which
39
48
  ### classes correspond to which files.
@@ -43,13 +52,14 @@ class Strelka::App < Mongrel2::Handler
43
52
  end
44
53
 
45
54
 
55
+
46
56
  ### Overridden from Mongrel2::Handler -- use the value returned from .default_appid if
47
57
  ### one is not specified, and automatically install the config DB if it hasn't been
48
58
  ### already.
49
59
  def self::run( appid=nil )
50
60
  appid ||= self.default_appid
51
61
 
52
- Strelka.logger.level = Logger::DEBUG if $VERBOSE
62
+ Strelka.logger.level = Logger::DEBUG if self.devmode?
53
63
  Strelka.logger.formatter = Strelka::Logging::ColorFormatter.new( Strelka.logger ) if $stderr.tty?
54
64
 
55
65
  Strelka.log.info "Starting up with appid %p." % [ appid ]
@@ -157,6 +167,29 @@ class Strelka::App < Mongrel2::Handler
157
167
  end
158
168
 
159
169
 
170
+ ### Configure the App. Override this if you wish to add additional configuration
171
+ ### to the 'app' section of the config that will be passed to you when the config
172
+ ### is loaded.
173
+ def self::configure( config=nil )
174
+ if config
175
+ self.devmode = true if config[:devmode]
176
+ else
177
+ self.devmode = $DEBUG ? true : false
178
+ end
179
+
180
+ Strelka.log.info "Enabled developer mode." if self.devmode?
181
+ end
182
+
183
+
184
+ ### Returns +true+ if the application has been configured to run in 'developer mode'.
185
+ ### Developer mode is mostly informational by default (it just makes logging more
186
+ ### verbose), but plugins and such might alter their behavior based on this setting.
187
+ def self::devmode?
188
+ return @devmode
189
+ end
190
+ singleton_method_alias :in_devmode?, :devmode?
191
+
192
+
160
193
  #
161
194
  # :section: Application declarative methods
162
195
  #
@@ -175,7 +208,7 @@ class Strelka::App < Mongrel2::Handler
175
208
 
176
209
  ### Dump the application stack when a new instance is created.
177
210
  def initialize( * )
178
- self.dump_application_stack
211
+ self.class.dump_application_stack
179
212
  super
180
213
  end
181
214
 
@@ -221,8 +254,7 @@ class Strelka::App < Mongrel2::Handler
221
254
 
222
255
  return response
223
256
  rescue => err
224
- msg = "%s: %s %s" % [ err.class.name, err.message, err.backtrace.first ]
225
- self.log.error( msg )
257
+ self.log.error "%s: %s %s" % [ err.class.name, err.message, err.backtrace.first ]
226
258
  err.backtrace[ 1..-1 ].each {|frame| self.log.debug(' ' + frame) }
227
259
 
228
260
  status_info = { :status => HTTP::SERVER_ERROR, :message => 'internal server error' }
@@ -325,8 +357,6 @@ class Strelka::App < Mongrel2::Handler
325
357
 
326
358
  ### Create a response to specified +request+ based on the specified +status_code+
327
359
  ### and +message+.
328
- ### :TODO: Document and test the :content_type status_info field.
329
- ### :TODO: Implement a way to set headers from the status_info.
330
360
  def prepare_status_response( request, status_info )
331
361
  status_code, message = status_info.values_at( :status, :message )
332
362
  self.log.info "Non-OK response: %d (%s)" % [ status_code, message ]
@@ -338,7 +368,7 @@ class Strelka::App < Mongrel2::Handler
338
368
 
339
369
  # Some status codes allow explanatory text to be returned; some forbid it. Append the
340
370
  # message for those that allow one.
341
- unless request.verb == :HEAD || HTTP::BODILESS_HTTP_RESPONSE_CODES.include?( status_code )
371
+ unless request.verb == :HEAD || response.bodiless?
342
372
  response.content_type = 'text/plain'
343
373
  response.puts( message )
344
374
  end
@@ -353,18 +383,5 @@ class Strelka::App < Mongrel2::Handler
353
383
  return response
354
384
  end
355
385
 
356
-
357
- ### Output the application stack into the logfile.
358
- def dump_application_stack
359
- stack = self.class.ancestors.
360
- reverse.
361
- drop_while {|mod| mod != Strelka::App }.
362
- select {|mod| mod.respond_to?(:plugin_name) }.
363
- reverse.
364
- collect {|mod| mod.plugin_name }
365
-
366
- self.log.info "Application stack: request -> %s" % [ stack.join(" -> ") ]
367
- end
368
-
369
386
  end # class Strelka::App
370
387
 
@@ -77,9 +77,15 @@ require 'strelka/app' unless defined?( Strelka::App )
77
77
  #
78
78
  module Strelka::App::Errors
79
79
  extend Strelka::Plugin
80
+ include Strelka::Constants
80
81
 
82
+
83
+ # The range of status codes to delegate to an on_status handler that doesn't
84
+ # specify one
81
85
  DEFAULT_HANDLER_STATUS_RANGE = 400..599
82
86
 
87
+
88
+ # Plugin load order
83
89
  run_before :routing
84
90
 
85
91
 
@@ -141,7 +147,22 @@ module Strelka::App::Errors
141
147
 
142
148
  # Catch a finish_with; the status_response will only be non-nil
143
149
  status_response = catch( :finish ) do
144
- response = super
150
+
151
+ # Provide our own exception-handling and translate them into server errors
152
+ begin
153
+ response = super
154
+ rescue => err
155
+ self.log.error "%s: %s %s" % [ err.class.name, err.message, err.backtrace.first ]
156
+ err.backtrace[ 1..-1 ].each {|frame| self.log.debug(' ' + frame) }
157
+
158
+ finish_with(
159
+ status: HTTP::SERVER_ERROR,
160
+ message: err.message,
161
+ headers: {},
162
+ backtrace: err.backtrace,
163
+ exception: err
164
+ )
165
+ end
145
166
  nil
146
167
  end
147
168
 
@@ -20,12 +20,11 @@ require 'strelka/paramvalidator'
20
20
  #
21
21
  # class UserManager < Strelka::App
22
22
  #
23
- # plugins :routing, :parameters
23
+ # plugin :parameters
24
24
  #
25
- # param :username, /\w+/, "User login", :required
26
25
  # param :email
27
26
  # param :id, /\d+/, "The user's numeric ID"
28
- # param :mode, ['add', 'remove']
27
+ # param :mode, /^\s*(?<prefix>[A-Z]{2})-(?<sku>\p{Print}+)/
29
28
  #
30
29
  # The first item is the parameter _key_, which corresponds to the field 'name' attribute for
31
30
  # a form, or the key for JSON or YAML data.
@@ -68,7 +67,7 @@ require 'strelka/paramvalidator'
68
67
  #
69
68
  # end # class UserManager
70
69
  #
71
- # [:FIXME:] Add more docs
70
+ # [:FIXME:] Add more docs.
72
71
  module Strelka::App::Parameters
73
72
  extend Strelka::Plugin
74
73
 
@@ -185,52 +185,73 @@ module Strelka::App::Templating
185
185
  response = super
186
186
 
187
187
  self.log.debug "Templating: examining %p response." % [ response.class ]
188
- template = nil
188
+ template = self.extract_template_from_response( response ) or
189
+ return response
190
+
191
+ # Wrap the template in a layout if there is one
192
+ template = self.wrap_in_layout( template )
193
+
194
+ # Set some default stuff on the top-level template
195
+ self.set_common_attributes( template, request )
196
+
197
+ # Now render the response body
198
+ self.log.debug " rendering the template into the response body"
199
+ response = request.response unless response.is_a?( Mongrel2::Response )
200
+ response.body = template.render
201
+ response.status ||= HTTP::OK
202
+
203
+ return response
204
+ end
205
+
206
+
207
+ ### Fetch the template from the +response+ (if there is one) and return it. If
208
+ ### +response+ itself is a template.
209
+ def extract_template_from_response( response )
189
210
 
190
211
  # Response is a template name
191
212
  if response.is_a?( Symbol ) && self.template_map.key?( response )
192
213
  self.log.debug " response is a template name (Symbol); using the %p template" % [ response ]
193
- template = self.template( response )
194
- response = request.response
214
+ return self.template( response )
195
215
 
196
216
  # Template object
197
- elsif response.is_a?( Inversion::Template )
198
- self.log.debug " response is an %p; wrapping it in a Response object" % [ response.class ]
199
- template = response
200
- response = request.response
217
+ elsif response.respond_to?( :render )
218
+ self.log.debug " response is a #renderable %p; returning it as-is" % [ response.class ]
219
+ return response
201
220
 
202
221
  # Template object already in a Response
203
- elsif response.is_a?( Mongrel2::Response ) && response.body.is_a?( Inversion::Template )
204
- template = response.body
205
- self.log.debug " response is a %p in the body of a %p" % [ template.class, response.class ]
222
+ elsif response.is_a?( Mongrel2::Response ) && response.body.respond_to?( :render )
223
+ self.log.debug " response is a %p in the body of a %p" % [ response.body.class, response.class ]
224
+ return response.body
206
225
 
207
226
  # Not templated; returned as-is
208
227
  else
209
- self.log.debug " response isn't templated; returning it as-is"
210
- return response
228
+ self.log.debug " response isn't templated; returning nil"
229
+ return nil
211
230
  end
231
+ end
212
232
 
213
- # Wrap the template in a layout if there is one
214
- if self.layout
215
- self.layout.reload if self.layout.changed?
216
- l_template = self.layout.dup
217
- self.log.debug " wrapping response in layout %p" % [ l_template ]
218
- l_template.body = template
219
- template = l_template
220
- end
221
233
 
222
- # Set some default stuff on the top-level template
234
+ ### Wrap the specified +content+ template in the layout template and
235
+ ### return it. If there isn't a layout declared, just return +content+ as-is.
236
+ def wrap_in_layout( content )
237
+ return content unless self.layout
238
+
239
+ self.layout.reload if self.layout.changed?
240
+ l_template = self.layout.dup
241
+ self.log.debug " wrapping response in layout %p" % [ l_template ]
242
+ l_template.body = content
243
+
244
+ return l_template
245
+ end
246
+
247
+
248
+ ### Set some default values from the +request+ in the given top-level +template+.
249
+ def set_common_attributes( template, request )
223
250
  template.request = request
251
+ template.app = self
224
252
  template.strelka_version = Strelka.version_string( true )
225
253
  template.mongrel2_version = Mongrel2.version_string( true )
226
254
  template.route = request.notes[:routing][:route]
227
-
228
- # Now render the response body
229
- self.log.debug " rendering the template into the response body"
230
- response.body = template.render
231
- response.status ||= HTTP::OK
232
-
233
- return response
234
255
  end
235
256
 
236
257
  end # module Strelka::App::Templating