strelka 0.0.1.pre.224 → 0.0.1.pre.229
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.tar.gz.sig +0 -0
- data/ChangeLog +116 -2
- data/Rakefile +2 -2
- data/lib/strelka/app.rb +17 -17
- data/lib/strelka/app/auth.rb +5 -5
- data/lib/strelka/app/negotiation.rb +1 -1
- data/lib/strelka/app/parameters.rb +1 -1
- data/lib/strelka/app/restresources.rb +18 -18
- data/lib/strelka/app/routing.rb +5 -5
- data/lib/strelka/app/sessions.rb +2 -2
- data/lib/strelka/app/templating.rb +2 -2
- data/lib/strelka/authprovider/basic.rb +1 -1
- data/lib/strelka/cookie.rb +7 -7
- data/lib/strelka/cookieset.rb +13 -12
- data/lib/strelka/httprequest/session.rb +6 -0
- data/lib/strelka/httpresponse/session.rb +7 -1
- data/lib/strelka/plugins.rb +27 -17
- data/lib/strelka/session/db.rb +2 -2
- data/lib/strelka/session/default.rb +3 -3
- data/spec/lib/helpers.rb +2 -28
- data/spec/strelka/app/filters_spec.rb +0 -3
- data/spec/strelka/app/restresources_spec.rb +0 -1
- data/spec/strelka/app/routing_spec.rb +0 -3
- data/spec/strelka/app/sessions_spec.rb +3 -2
- data/spec/strelka/cookieset_spec.rb +8 -0
- data/spec/strelka/httprequest/session_spec.rb +10 -2
- data/spec/strelka/httpresponse/session_spec.rb +22 -1
- metadata +6 -6
- metadata.gz.sig +0 -0
data.tar.gz.sig
CHANGED
|
Binary file
|
data/ChangeLog
CHANGED
|
@@ -1,10 +1,124 @@
|
|
|
1
|
+
2012-05-09 Michael Granger <ged@FaerieMUD.org>
|
|
2
|
+
|
|
3
|
+
* lib/strelka/cookieset.rb, spec/strelka/cookieset_spec.rb:
|
|
4
|
+
Add delegation for some more Set methods to CookieSet
|
|
5
|
+
[c88faf6871e7] [tip]
|
|
6
|
+
|
|
7
|
+
2012-05-08 Michael Granger <ged@FaerieMUD.org>
|
|
8
|
+
|
|
9
|
+
* .rvm.gems, Rakefile, lib/strelka/app.rb, lib/strelka/app/auth.rb,
|
|
10
|
+
lib/strelka/app/negotiation.rb, lib/strelka/app/parameters.rb,
|
|
11
|
+
lib/strelka/app/restresources.rb, lib/strelka/app/routing.rb,
|
|
12
|
+
lib/strelka/app/sessions.rb, lib/strelka/authprovider/basic.rb,
|
|
13
|
+
lib/strelka/cookie.rb, lib/strelka/cookieset.rb,
|
|
14
|
+
lib/strelka/plugins.rb, lib/strelka/session/db.rb,
|
|
15
|
+
lib/strelka/session/default.rb, spec/lib/helpers.rb,
|
|
16
|
+
spec/strelka/app/filters_spec.rb,
|
|
17
|
+
spec/strelka/app/restresources_spec.rb,
|
|
18
|
+
spec/strelka/app/routing_spec.rb, spec/strelka/app/sessions_spec.rb,
|
|
19
|
+
spec/strelka/httprequest/session_spec.rb:
|
|
20
|
+
Convert class-/module-level logging to Loggability API.
|
|
21
|
+
[751512af4f1f]
|
|
22
|
+
|
|
23
|
+
2012-05-07 Mahlon E. Smith <mahlon@martini.nu>
|
|
24
|
+
|
|
25
|
+
* lib/strelka/app/templating.rb:
|
|
26
|
+
Provide access to the request during layout template wrapping, so
|
|
27
|
+
handlers can potentially override the method and attach arbitrary
|
|
28
|
+
request attributes to the layout.
|
|
29
|
+
[1fc0cf040a1e] [github/master]
|
|
30
|
+
|
|
31
|
+
2012-05-07 Michael Granger <ged@FaerieMUD.org>
|
|
32
|
+
|
|
33
|
+
* spec/lib/helpers.rb:
|
|
34
|
+
Removed some leftover logging code from pre-Loggability.
|
|
35
|
+
[60fdf52af868]
|
|
36
|
+
|
|
37
|
+
2012-05-07 Mahlon E. Smith <mahlon@martini.nu>
|
|
38
|
+
|
|
39
|
+
* lib/strelka/httprequest.rb, spec/strelka/httprequest_spec.rb:
|
|
40
|
+
Add a simple shortcut method for URI redirection.
|
|
41
|
+
[eb22b0f1372c]
|
|
42
|
+
|
|
43
|
+
* lib/strelka/httprequest/session.rb,
|
|
44
|
+
spec/strelka/httprequest/session_spec.rb:
|
|
45
|
+
Add a method to completely purge a session, from the request object.
|
|
46
|
+
[b8ed17e550e2]
|
|
47
|
+
|
|
48
|
+
2012-05-07 Michael Granger <ged@FaerieMUD.org>
|
|
49
|
+
|
|
50
|
+
* lib/strelka/app.rb:
|
|
51
|
+
Move Strelka::App.devmode? above ::configure.
|
|
52
|
+
|
|
53
|
+
This is required when the App config is loaded by the deferred
|
|
54
|
+
loader.
|
|
55
|
+
[09e467f68dca]
|
|
56
|
+
|
|
57
|
+
* .rvm.gems, Rakefile, bin/strelka, lib/strelka.rb,
|
|
58
|
+
lib/strelka/app.rb, lib/strelka/app/auth.rb,
|
|
59
|
+
lib/strelka/app/routing.rb, lib/strelka/app/sessions.rb,
|
|
60
|
+
lib/strelka/authprovider.rb, lib/strelka/authprovider/basic.rb,
|
|
61
|
+
lib/strelka/authprovider/hostaccess.rb, lib/strelka/cookie.rb,
|
|
62
|
+
lib/strelka/httprequest.rb, lib/strelka/httprequest/acceptparams.rb,
|
|
63
|
+
lib/strelka/httpresponse.rb, lib/strelka/mixins.rb,
|
|
64
|
+
lib/strelka/paramvalidator.rb, lib/strelka/router.rb,
|
|
65
|
+
lib/strelka/router/default.rb, lib/strelka/router/exclusive.rb,
|
|
66
|
+
lib/strelka/session.rb, lib/strelka/session/db.rb,
|
|
67
|
+
lib/strelka/session/default.rb, spec/lib/helpers.rb,
|
|
68
|
+
spec/strelka/mixins_spec.rb:
|
|
69
|
+
Convert to Loggability for logging.
|
|
70
|
+
[4f0cbd7b3070]
|
|
71
|
+
|
|
72
|
+
2012-05-03 Michael Granger <ged@FaerieMUD.org>
|
|
73
|
+
|
|
74
|
+
* bin/strelka:
|
|
75
|
+
Run started apps directly instead of counting on the app to run
|
|
76
|
+
itself
|
|
77
|
+
[7a2694d364b3]
|
|
78
|
+
|
|
79
|
+
* lib/strelka/app/errors.rb:
|
|
80
|
+
Extract a method from the status response part of the :errors
|
|
81
|
+
plugin.
|
|
82
|
+
[2b827b37bae5]
|
|
83
|
+
|
|
84
|
+
* lib/strelka/app/templating.rb:
|
|
85
|
+
Make the #layout method an accessor in the :templating plugin
|
|
86
|
+
[b3dc560d0863]
|
|
87
|
+
|
|
88
|
+
* lib/strelka/mixins.rb:
|
|
89
|
+
Log uses of finish_with
|
|
90
|
+
[01cd0a6edde9]
|
|
91
|
+
|
|
92
|
+
* MILESTONES.rdoc:
|
|
93
|
+
Add another task to MILESTONES
|
|
94
|
+
[22e60aaebaea]
|
|
95
|
+
|
|
96
|
+
* .rvm.gems, MILESTONES.rdoc, README.rdoc, lib/strelka.rb,
|
|
97
|
+
lib/strelka/app.rb, lib/strelka/app/templating.rb,
|
|
98
|
+
lib/strelka/httprequest/acceptparams.rb:
|
|
99
|
+
Add some documentation
|
|
100
|
+
[5bd05add55ad]
|
|
101
|
+
|
|
102
|
+
2012-05-02 Michael Granger <ged@FaerieMUD.org>
|
|
103
|
+
|
|
104
|
+
* MILESTONES.rdoc, Manifest.txt:
|
|
105
|
+
Adding a MILESTONES file.
|
|
106
|
+
|
|
107
|
+
We'll use this as a checklist of what needs to be done for the next
|
|
108
|
+
release.
|
|
109
|
+
[d8e74e3bf97b]
|
|
110
|
+
|
|
111
|
+
* lib/strelka/logging.rb:
|
|
112
|
+
Change fatal output color to be more readable
|
|
113
|
+
[403cf0ef01f0]
|
|
114
|
+
|
|
1
115
|
2012-04-25 Michael Granger <ged@FaerieMUD.org>
|
|
2
116
|
|
|
3
117
|
* lib/strelka/app.rb, lib/strelka/plugins.rb,
|
|
4
118
|
spec/strelka/httpresponse/negotiation_spec.rb,
|
|
5
119
|
spec/strelka/plugins_spec.rb:
|
|
6
120
|
Add an #application_stack method to the PluginLoader mixin
|
|
7
|
-
[7427a74ae313]
|
|
121
|
+
[7427a74ae313]
|
|
8
122
|
|
|
9
123
|
* lib/strelka/app.rb, spec/strelka/app_spec.rb:
|
|
10
124
|
Add configurable ::devmode? setting to Strelka::App
|
|
@@ -28,7 +142,7 @@
|
|
|
28
142
|
|
|
29
143
|
* lib/strelka/app/templating.rb, spec/strelka/app/templating_spec.rb:
|
|
30
144
|
Refactored on of the big methods in :templating.
|
|
31
|
-
[f933118fb9db]
|
|
145
|
+
[f933118fb9db]
|
|
32
146
|
|
|
33
147
|
2012-04-23 Michael Granger <ged@FaerieMUD.org>
|
|
34
148
|
|
data/Rakefile
CHANGED
|
@@ -27,11 +27,11 @@ hoespec = Hoe.spec 'strelka' do
|
|
|
27
27
|
self.dependency 'sysexits', '~> 1.0'
|
|
28
28
|
self.dependency 'formvalidator', '~> 0.1'
|
|
29
29
|
self.dependency 'inversion', '~> 0.8'
|
|
30
|
-
self.dependency 'mongrel2', '~> 0.
|
|
30
|
+
self.dependency 'mongrel2', '~> 0.22'
|
|
31
31
|
self.dependency 'uuidtools', '~> 2.1'
|
|
32
32
|
self.dependency 'configurability', '~> 1.0'
|
|
33
33
|
self.dependency 'pluginfactory', '~> 1.0'
|
|
34
|
-
self.dependency 'loggability', '~> 0.
|
|
34
|
+
self.dependency 'loggability', '~> 0.1'
|
|
35
35
|
|
|
36
36
|
self.dependency 'hoe-deveiate', '~> 0.1', :developer
|
|
37
37
|
self.dependency 'hoe-manualgen', '~> 0.3', :developer
|
data/lib/strelka/app.rb
CHANGED
|
@@ -73,16 +73,16 @@ class Strelka::App < Mongrel2::Handler
|
|
|
73
73
|
### Calculate a default application ID for the class based on either its ID
|
|
74
74
|
### constant or its name and return it.
|
|
75
75
|
def self::default_appid
|
|
76
|
-
|
|
76
|
+
self.log.info "Looking up appid for %p" % [ self.class ]
|
|
77
77
|
appid = nil
|
|
78
78
|
|
|
79
79
|
if self.const_defined?( :ID )
|
|
80
80
|
appid = self.const_get( :ID )
|
|
81
|
-
|
|
81
|
+
self.log.info " app has an ID: %p" % [ appid ]
|
|
82
82
|
else
|
|
83
83
|
appid = ( self.name || "anonymous#{self.object_id}" ).downcase
|
|
84
84
|
appid.gsub!( /[^[:alnum:]]+/, '-' )
|
|
85
|
-
|
|
85
|
+
self.log.info " deriving one from the class name: %p" % [ appid ]
|
|
86
86
|
end
|
|
87
87
|
|
|
88
88
|
return appid
|
|
@@ -92,7 +92,7 @@ class Strelka::App < Mongrel2::Handler
|
|
|
92
92
|
### Return a Hash of Strelka app files as Pathname objects from installed gems,
|
|
93
93
|
### keyed by gemspec name .
|
|
94
94
|
def self::discover_paths
|
|
95
|
-
|
|
95
|
+
self.log.debug "Local paths: %s" % [ Strelka.datadir + APP_GLOB_PATTERN ]
|
|
96
96
|
|
|
97
97
|
appfiles = {
|
|
98
98
|
'' => Pathname.glob( Strelka.datadir + APP_GLOB_PATTERN )
|
|
@@ -103,7 +103,7 @@ class Strelka::App < Mongrel2::Handler
|
|
|
103
103
|
gemspec.dependencies.find {|dep| dep.name == 'strelka'}
|
|
104
104
|
end
|
|
105
105
|
|
|
106
|
-
|
|
106
|
+
self.log.debug "Found %d gems with a Strelka dependency" % [ gems.length ]
|
|
107
107
|
|
|
108
108
|
# Find all the files under those gems' data directories that match the application
|
|
109
109
|
# pattern
|
|
@@ -112,11 +112,11 @@ class Strelka::App < Mongrel2::Handler
|
|
|
112
112
|
next if appfiles.key?( gemspec.name )
|
|
113
113
|
appfiles[ gemspec.name ] = []
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
self.log.debug " checking %s for apps in its datadir" % [ gemspec.name ]
|
|
116
116
|
pattern = File.join( gemspec.full_gem_path, "data", gemspec.name, APP_GLOB_PATTERN )
|
|
117
|
-
|
|
117
|
+
self.log.debug " glob pattern is: %p" % [ pattern ]
|
|
118
118
|
gemapps = Pathname.glob( pattern )
|
|
119
|
-
|
|
119
|
+
self.log.debug " found %d app files" % [ gemapps.length ]
|
|
120
120
|
appfiles[ gemspec.name ] += gemapps
|
|
121
121
|
end
|
|
122
122
|
|
|
@@ -129,22 +129,22 @@ class Strelka::App < Mongrel2::Handler
|
|
|
129
129
|
discovered_apps = []
|
|
130
130
|
app_paths = self.discover_paths
|
|
131
131
|
|
|
132
|
-
|
|
132
|
+
self.log.debug "Loading apps from %d discovered paths" % [ app_paths.length ]
|
|
133
133
|
app_paths.each do |gemname, paths|
|
|
134
|
-
|
|
134
|
+
self.log.debug " loading gem %s" % [ gemname ]
|
|
135
135
|
gem( gemname ) unless gemname == ''
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
self.log.debug " loading apps from %s: %d handlers" % [ gemname, paths.length ]
|
|
138
138
|
paths.each do |path|
|
|
139
139
|
classes = begin
|
|
140
140
|
Strelka::App.load( path )
|
|
141
141
|
rescue StandardError, ScriptError => err
|
|
142
|
-
|
|
142
|
+
self.log.error "%p while loading Strelka apps from %s: %s" %
|
|
143
143
|
[ err.class, path, err.message ]
|
|
144
|
-
|
|
144
|
+
self.log.debug "Backtrace: %s" % [ err.backtrace.join("\n\t") ]
|
|
145
145
|
[]
|
|
146
146
|
end
|
|
147
|
-
|
|
147
|
+
self.log.debug " loaded app classes: %p" % [ classes ]
|
|
148
148
|
|
|
149
149
|
discovered_apps += classes
|
|
150
150
|
end
|
|
@@ -157,12 +157,12 @@ class Strelka::App < Mongrel2::Handler
|
|
|
157
157
|
### Load the specified +file+, and return any Strelka::App subclasses that are loaded
|
|
158
158
|
### as a result.
|
|
159
159
|
def self::load( file )
|
|
160
|
-
|
|
160
|
+
self.log.debug "Loading application/s from %p" % [ file ]
|
|
161
161
|
@loading_file = Pathname( file ).expand_path
|
|
162
162
|
self.subclasses.delete( @loading_file )
|
|
163
163
|
Kernel.load( @loading_file.to_s )
|
|
164
164
|
new_subclasses = self.subclasses[ @loading_file ]
|
|
165
|
-
|
|
165
|
+
self.log.debug " loaded %d new app class/es" % [ new_subclasses.size ]
|
|
166
166
|
|
|
167
167
|
return new_subclasses
|
|
168
168
|
ensure
|
|
@@ -189,7 +189,7 @@ class Strelka::App < Mongrel2::Handler
|
|
|
189
189
|
self.devmode = $DEBUG ? true : false
|
|
190
190
|
end
|
|
191
191
|
|
|
192
|
-
|
|
192
|
+
self.log.info "Enabled developer mode." if self.devmode?
|
|
193
193
|
end
|
|
194
194
|
|
|
195
195
|
|
data/lib/strelka/app/auth.rb
CHANGED
|
@@ -286,9 +286,9 @@ module Strelka::App::Auth
|
|
|
286
286
|
@auth_provider = Strelka::AuthProvider.get_subclass( type )
|
|
287
287
|
end
|
|
288
288
|
|
|
289
|
-
|
|
289
|
+
self.log.debug "Auth provider %p" % [ @auth_provider ]
|
|
290
290
|
@auth_provider ||= Strelka::AuthProvider.get_subclass( DEFAULT_AUTH_PROVIDER )
|
|
291
|
-
|
|
291
|
+
self.log.debug "Auth provider %p" % [ @auth_provider ]
|
|
292
292
|
return @auth_provider
|
|
293
293
|
end
|
|
294
294
|
|
|
@@ -350,7 +350,7 @@ module Strelka::App::Auth
|
|
|
350
350
|
|
|
351
351
|
criteria.each do |pattern|
|
|
352
352
|
pattern.gsub!( %r{^/+|/+$}, '' ) if pattern.respond_to?( :gsub! )
|
|
353
|
-
|
|
353
|
+
self.log.debug " adding require_auth for %p" % [ pattern ]
|
|
354
354
|
self.positive_auth_criteria[ pattern ] = block
|
|
355
355
|
end
|
|
356
356
|
end
|
|
@@ -369,7 +369,7 @@ module Strelka::App::Auth
|
|
|
369
369
|
|
|
370
370
|
criteria.each do |pattern|
|
|
371
371
|
pattern.gsub!( %r{^/+|/+$}, '' ) if pattern.respond_to?( :gsub! )
|
|
372
|
-
|
|
372
|
+
self.log.debug " adding no_auth for %p" % [ pattern ]
|
|
373
373
|
self.negative_auth_criteria[ pattern ] = block
|
|
374
374
|
end
|
|
375
375
|
end
|
|
@@ -381,7 +381,7 @@ module Strelka::App::Auth
|
|
|
381
381
|
### Extension callback -- extend the HTTPRequest class with Auth
|
|
382
382
|
### support when this plugin is loaded.
|
|
383
383
|
def self::included( object )
|
|
384
|
-
|
|
384
|
+
self.log.debug "Extending Request with Auth mixin"
|
|
385
385
|
Strelka::HTTPRequest.class_eval { include Strelka::HTTPRequest::Auth }
|
|
386
386
|
super
|
|
387
387
|
end
|
|
@@ -82,7 +82,7 @@ module Strelka::App::Negotiation
|
|
|
82
82
|
### Extension callback -- extend the HTTPRequest and HTTPResponse classes with Negotiation
|
|
83
83
|
### support when this plugin is loaded.
|
|
84
84
|
def self::included( object )
|
|
85
|
-
|
|
85
|
+
self.log.debug "Extending Request and Response with Negotiation mixins"
|
|
86
86
|
Strelka::HTTPRequest.class_eval { include Strelka::HTTPRequest::Negotiation }
|
|
87
87
|
Strelka::HTTPResponse.class_eval { include Strelka::HTTPResponse::Negotiation }
|
|
88
88
|
super
|
|
@@ -94,7 +94,7 @@ module Strelka::App::Parameters
|
|
|
94
94
|
### +constraint+. The +constraint+ can be any of the types supported by
|
|
95
95
|
### Strelka::ParamValidator.
|
|
96
96
|
def param( name, *args )
|
|
97
|
-
|
|
97
|
+
self.log.debug "New param %p" % [ name ]
|
|
98
98
|
self.paramvalidator.add( name, *args )
|
|
99
99
|
end
|
|
100
100
|
|
|
@@ -117,7 +117,7 @@ module Strelka::App::RestResources
|
|
|
117
117
|
### Expose the specified +rsrcobj+ (which should be an object that responds to #dataset
|
|
118
118
|
### and returns a Sequel::Dataset)
|
|
119
119
|
def resource( rsrcobj, options={} )
|
|
120
|
-
|
|
120
|
+
self.log.debug "Adding REST resource for %p" % [ rsrcobj ]
|
|
121
121
|
options = self.service_options.merge( options )
|
|
122
122
|
|
|
123
123
|
# Figure out what the resource name is, and make the route from it
|
|
@@ -128,7 +128,7 @@ module Strelka::App::RestResources
|
|
|
128
128
|
self.add_parameters( rsrcobj, options )
|
|
129
129
|
|
|
130
130
|
# Make and install handler methods
|
|
131
|
-
|
|
131
|
+
self.log.debug " adding readers"
|
|
132
132
|
self.add_options_handler( route, rsrcobj, options )
|
|
133
133
|
self.add_read_handler( route, rsrcobj, options )
|
|
134
134
|
self.add_collection_read_handler( route, rsrcobj, options )
|
|
@@ -136,7 +136,7 @@ module Strelka::App::RestResources
|
|
|
136
136
|
# Add handler methods for the mutator parts of the API unless
|
|
137
137
|
# the resource is read-only
|
|
138
138
|
if options[:readonly]
|
|
139
|
-
|
|
139
|
+
self.log.debug " skipping mutators (read-only set)"
|
|
140
140
|
else
|
|
141
141
|
self.add_collection_create_handler( route, rsrcobj, options )
|
|
142
142
|
self.add_update_handler( route, rsrcobj, options )
|
|
@@ -152,10 +152,10 @@ module Strelka::App::RestResources
|
|
|
152
152
|
|
|
153
153
|
### Add parameter declarations for parameters related to +rsrcobj+.
|
|
154
154
|
def add_parameters( rsrcobj, options )
|
|
155
|
-
|
|
155
|
+
self.log.debug "Declaring validations for columns from %p" % [ rsrcobj ]
|
|
156
156
|
self.untaint_all_constraints
|
|
157
157
|
rsrcobj.db_schema.each do |col, config|
|
|
158
|
-
|
|
158
|
+
self.log.debug " %s (%p)" % [ col, config[:type] ]
|
|
159
159
|
param col, config[:type]
|
|
160
160
|
end
|
|
161
161
|
end
|
|
@@ -165,7 +165,7 @@ module Strelka::App::RestResources
|
|
|
165
165
|
### OPTIONS /resources
|
|
166
166
|
def add_options_handler( route, rsrcobj, options )
|
|
167
167
|
# :TODO: Documentation for HTML mode (possibly using http://swagger.wordnik.com/)
|
|
168
|
-
|
|
168
|
+
self.log.debug "Adding OPTIONS handler for %p" % [ route, rsrcobj ]
|
|
169
169
|
self.add_route( :OPTIONS, route, options ) do |req|
|
|
170
170
|
self.log.debug "OPTIONS handler!"
|
|
171
171
|
verbs = self.class.resource_verbs[ route ].sort
|
|
@@ -191,7 +191,7 @@ module Strelka::App::RestResources
|
|
|
191
191
|
pkey = rsrcobj.primary_key
|
|
192
192
|
route = "#{route_prefix}/:#{pkey}"
|
|
193
193
|
|
|
194
|
-
|
|
194
|
+
self.log.debug "Creating handler for reading a single %p: GET %s" % [ rsrcobj, route ]
|
|
195
195
|
self.add_route( :GET, route, options ) do |req|
|
|
196
196
|
finish_with( HTTP::BAD_REQUEST, req.params.error_messages.join("\n") ) unless
|
|
197
197
|
req.params.okay?
|
|
@@ -214,7 +214,7 @@ module Strelka::App::RestResources
|
|
|
214
214
|
### Sequel::Model class or a ducktype-alike.
|
|
215
215
|
### GET /resources
|
|
216
216
|
def add_collection_read_handler( route, rsrcobj, options )
|
|
217
|
-
|
|
217
|
+
self.log.debug "Creating handler for reading collections of %p: GET %s" % [ rsrcobj, route ]
|
|
218
218
|
self.add_route( :GET, route, options ) do |req|
|
|
219
219
|
finish_with( HTTP::BAD_REQUEST, req.params.error_messages.join("\n") ) unless
|
|
220
220
|
req.params.okay?
|
|
@@ -241,7 +241,7 @@ module Strelka::App::RestResources
|
|
|
241
241
|
### Add a handler method for creating a new instance of +rsrcobj+.
|
|
242
242
|
### POST /resources
|
|
243
243
|
def add_collection_create_handler( route, rsrcobj, options )
|
|
244
|
-
|
|
244
|
+
self.log.debug "Creating handler for creating %p resources: POST %s" % [ rsrcobj, route ]
|
|
245
245
|
|
|
246
246
|
self.add_route( :POST, route, options ) do |req|
|
|
247
247
|
finish_with( HTTP::BAD_REQUEST, req.params.error_messages.join(", ") ) unless
|
|
@@ -279,7 +279,7 @@ module Strelka::App::RestResources
|
|
|
279
279
|
pkey = rsrcobj.primary_key
|
|
280
280
|
route = "#{route_prefix}/:#{pkey}"
|
|
281
281
|
|
|
282
|
-
|
|
282
|
+
self.log.debug "Creating handler for creating %p resources: POST %s" % [ rsrcobj, route ]
|
|
283
283
|
self.add_route( :PUT, route, options ) do |req|
|
|
284
284
|
finish_with( HTTP::BAD_REQUEST, req.params.error_messages.join(", ") ) unless
|
|
285
285
|
req.params.okay?
|
|
@@ -312,7 +312,7 @@ module Strelka::App::RestResources
|
|
|
312
312
|
### PUT /resources
|
|
313
313
|
def add_collection_update_handler( route, rsrcobj, options )
|
|
314
314
|
pkey = rsrcobj.primary_key
|
|
315
|
-
|
|
315
|
+
self.log.debug "Creating handler for updating every %p resources: PUT %s" % [ rsrcobj, route ]
|
|
316
316
|
|
|
317
317
|
self.add_route( :PUT, route, options ) do |req|
|
|
318
318
|
finish_with( HTTP::BAD_REQUEST, req.params.error_messages.join(", ") ) unless
|
|
@@ -379,7 +379,7 @@ module Strelka::App::RestResources
|
|
|
379
379
|
### DELETE /resources
|
|
380
380
|
def add_collection_deletion_handler( route, rsrcobj, options )
|
|
381
381
|
pkey = rsrcobj.primary_key
|
|
382
|
-
|
|
382
|
+
self.log.debug "Creating handler for deleting every %p resources: DELETE %s" %
|
|
383
383
|
[ rsrcobj, route ]
|
|
384
384
|
|
|
385
385
|
self.add_route( :DELETE, route, options ) do |req|
|
|
@@ -411,7 +411,7 @@ module Strelka::App::RestResources
|
|
|
411
411
|
# :TODO: Support multiple args? (customers/by_city_state/{city}/{state})
|
|
412
412
|
rsrcobj.dataset_methods.each do |name, proc|
|
|
413
413
|
if proc.parameters.length > 1
|
|
414
|
-
|
|
414
|
+
self.log.debug " skipping dataset method %p: more than 1 argument" % [ name ]
|
|
415
415
|
next
|
|
416
416
|
end
|
|
417
417
|
|
|
@@ -420,16 +420,16 @@ module Strelka::App::RestResources
|
|
|
420
420
|
# or a parameter-type more gracefully.
|
|
421
421
|
param = proc.parameters.first[1]
|
|
422
422
|
route = "%s/%s/:%s" % [ route_prefix, name, param ]
|
|
423
|
-
|
|
423
|
+
self.log.debug " route for dataset method %s: %s" % [ name, route ]
|
|
424
424
|
self.add_dataset_read_handler( route, rsrcobj, name, param, options )
|
|
425
425
|
end
|
|
426
426
|
|
|
427
427
|
# Add composite service routes for each association
|
|
428
|
-
|
|
428
|
+
self.log.debug "Adding composite resource routes for %p" % [ rsrcobj ]
|
|
429
429
|
rsrcobj.association_reflections.each do |name, refl|
|
|
430
430
|
pkey = rsrcobj.primary_key
|
|
431
431
|
route = "%s/:%s/%s" % [ route_prefix, pkey, name ]
|
|
432
|
-
|
|
432
|
+
self.log.debug " route for associated %p objects via the %s association: %s" %
|
|
433
433
|
[ refl[:class_name], name, route ]
|
|
434
434
|
self.add_composite_read_handler( route, rsrcobj, name, options )
|
|
435
435
|
end
|
|
@@ -440,7 +440,7 @@ module Strelka::App::RestResources
|
|
|
440
440
|
### Add a GET route for the dataset method +dsname+ for the given +rsrcobj+ at the
|
|
441
441
|
### given +path+.
|
|
442
442
|
def add_dataset_read_handler( path, rsrcobj, dsname, param, options )
|
|
443
|
-
|
|
443
|
+
self.log.debug "Adding dataset method read handler: %s" % [ path ]
|
|
444
444
|
|
|
445
445
|
self.add_route( :GET, path, options ) do |req|
|
|
446
446
|
self.log.debug "Resource dataset GET request for dataset %s on %p" % [ dsname, rsrcobj ]
|
|
@@ -474,7 +474,7 @@ module Strelka::App::RestResources
|
|
|
474
474
|
### +path+.
|
|
475
475
|
def add_composite_read_handler( path, rsrcobj, association, options )
|
|
476
476
|
pkey = rsrcobj.primary_key
|
|
477
|
-
|
|
477
|
+
self.log.debug "Adding composite read handler for association: %s" % [ association ]
|
|
478
478
|
|
|
479
479
|
self.add_route( :GET, path, options ) do |req|
|
|
480
480
|
finish_with( HTTP::BAD_REQUEST, req.params.error_messages.join("\n") ) unless
|
data/lib/strelka/app/routing.rb
CHANGED
|
@@ -166,7 +166,7 @@ module Strelka::App::Routing
|
|
|
166
166
|
### Get/set the router class to use for mapping requests to handlers to +newclass.
|
|
167
167
|
def router( newclass=nil )
|
|
168
168
|
if newclass
|
|
169
|
-
|
|
169
|
+
self.log.info "%p router class set to: %p" % [ self, newclass ]
|
|
170
170
|
self.routerclass = newclass
|
|
171
171
|
end
|
|
172
172
|
|
|
@@ -182,7 +182,7 @@ module Strelka::App::Routing
|
|
|
182
182
|
# route pattern into its components
|
|
183
183
|
methodparts = [ verb.upcase ]
|
|
184
184
|
patternparts = self.split_route_pattern( pattern )
|
|
185
|
-
|
|
185
|
+
self.log.debug "Split pattern %p into parts: %p" % [ pattern, patternparts ]
|
|
186
186
|
|
|
187
187
|
# Make a method name from the directories and the named captures of the patterns
|
|
188
188
|
# in the route
|
|
@@ -193,11 +193,11 @@ module Strelka::App::Routing
|
|
|
193
193
|
methodparts << part
|
|
194
194
|
end
|
|
195
195
|
end
|
|
196
|
-
|
|
196
|
+
self.log.debug " route methodname parts are: %p" % [ methodparts ]
|
|
197
197
|
methodname = methodparts.join( '_' )
|
|
198
198
|
|
|
199
199
|
# Define the method using the block from the route as its body
|
|
200
|
-
|
|
200
|
+
self.log.debug " adding route method %p for %p route: %p" % [ methodname, verb, block ]
|
|
201
201
|
define_method( methodname, &block )
|
|
202
202
|
|
|
203
203
|
# Remove any existing route for the same verb, patternparts, and options
|
|
@@ -223,7 +223,7 @@ module Strelka::App::Routing
|
|
|
223
223
|
return pattern.split( '/' ).collect do |component|
|
|
224
224
|
|
|
225
225
|
if component.start_with?( ':' )
|
|
226
|
-
|
|
226
|
+
self.log.debug "translating parameter component %p to a regexp" % [component]
|
|
227
227
|
raise ScriptError,
|
|
228
228
|
"parameter-based routing not supported without a 'parameters' plugin" unless
|
|
229
229
|
self.respond_to?( :paramvalidator )
|
data/lib/strelka/app/sessions.rb
CHANGED
|
@@ -165,9 +165,9 @@ module Strelka::App::Sessions
|
|
|
165
165
|
### Extension callback -- extend the HTTPRequest classes with Session
|
|
166
166
|
### support when this plugin is loaded.
|
|
167
167
|
def self::included( object )
|
|
168
|
-
|
|
168
|
+
self.log.debug "Extending Request with Session mixin"
|
|
169
169
|
Strelka::HTTPRequest.class_eval { include Strelka::HTTPRequest::Session }
|
|
170
|
-
|
|
170
|
+
self.log.debug "Extending Response with Session mixin"
|
|
171
171
|
Strelka::HTTPResponse.class_eval { include Strelka::HTTPResponse::Session }
|
|
172
172
|
super
|
|
173
173
|
end
|
|
@@ -191,7 +191,7 @@ module Strelka::App::Templating
|
|
|
191
191
|
return response
|
|
192
192
|
|
|
193
193
|
# Wrap the template in a layout if there is one
|
|
194
|
-
template = self.wrap_in_layout( template )
|
|
194
|
+
template = self.wrap_in_layout( template, request )
|
|
195
195
|
|
|
196
196
|
# Set some default stuff on the top-level template
|
|
197
197
|
self.set_common_attributes( template, request )
|
|
@@ -235,7 +235,7 @@ module Strelka::App::Templating
|
|
|
235
235
|
|
|
236
236
|
### Wrap the specified +content+ template in the layout template and
|
|
237
237
|
### return it. If there isn't a layout declared, just return +content+ as-is.
|
|
238
|
-
def wrap_in_layout( content )
|
|
238
|
+
def wrap_in_layout( content, request )
|
|
239
239
|
return content unless self.layout
|
|
240
240
|
|
|
241
241
|
self.layout.reload if self.layout.changed?
|
|
@@ -55,7 +55,7 @@ class Strelka::AuthProvider::Basic < Strelka::AuthProvider
|
|
|
55
55
|
### Configurability API -- configure the auth provider instance.
|
|
56
56
|
def self::configure( config=nil )
|
|
57
57
|
if config
|
|
58
|
-
|
|
58
|
+
self.log.debug "Configuring Basic authprovider: %p" % [ config ]
|
|
59
59
|
self.realm = config['realm'] if config['realm']
|
|
60
60
|
self.users = config['users'] if config['users']
|
|
61
61
|
else
|
data/lib/strelka/cookie.rb
CHANGED
|
@@ -103,39 +103,39 @@ class Strelka::Cookie
|
|
|
103
103
|
### one or more new Strelka::Cookie objects, keyed by name.
|
|
104
104
|
def self::parse( header )
|
|
105
105
|
return {} if header.nil? or header.empty?
|
|
106
|
-
|
|
106
|
+
self.log.debug "Parsing cookie header: %p" % [ header ]
|
|
107
107
|
cookies = []
|
|
108
108
|
version = 0
|
|
109
109
|
header = header.strip
|
|
110
110
|
|
|
111
111
|
# "$Version" = value
|
|
112
112
|
if COOKIE_VERSION.match( header )
|
|
113
|
-
|
|
113
|
+
self.log.debug " Found cookie version %p" % [ $1 ]
|
|
114
114
|
version = Integer( dequote($1) )
|
|
115
115
|
header.slice!( COOKIE_VERSION )
|
|
116
116
|
end
|
|
117
117
|
|
|
118
118
|
# 1*((";" | ",") NAME "=" VALUE [";" path] [";" domain])
|
|
119
119
|
header.split( /[,;]\s*/ ).each do |pair|
|
|
120
|
-
|
|
120
|
+
self.log.debug " Found pair %p" % [ pair ]
|
|
121
121
|
key, valstr = pair.split( /=/, 2 ).collect {|s| s.strip }
|
|
122
122
|
|
|
123
123
|
case key
|
|
124
124
|
when COOKIE_PATH
|
|
125
|
-
|
|
125
|
+
self.log.debug " -> cookie-path %p" % [ valstr ]
|
|
126
126
|
cookies.last.path = dequote( valstr ) unless cookies.empty?
|
|
127
127
|
|
|
128
128
|
when COOKIE_DOMAIN
|
|
129
|
-
|
|
129
|
+
self.log.debug " -> cookie-domain %p" % [ valstr ]
|
|
130
130
|
cookies.last.domain = dequote( valstr ) unless cookies.empty?
|
|
131
131
|
|
|
132
132
|
when HTTP_TOKEN
|
|
133
133
|
values = parse_valuestring( valstr )
|
|
134
|
-
|
|
134
|
+
self.log.debug " -> cookie-values %p" % [ values ]
|
|
135
135
|
cookies << new( key, values, :version => version )
|
|
136
136
|
|
|
137
137
|
else
|
|
138
|
-
|
|
138
|
+
self.log.warn \
|
|
139
139
|
"Malformed cookie header %p: %p is not a valid token; ignoring" %
|
|
140
140
|
[ header, key ]
|
|
141
141
|
end
|
data/lib/strelka/cookieset.rb
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
# vim: set nosta noet ts=4 sw=4:
|
|
3
3
|
# encoding: utf-8
|
|
4
4
|
|
|
5
|
-
require 'strelka' unless defined?( Strelka )
|
|
6
|
-
require 'strelka/cookie'
|
|
7
5
|
require 'set'
|
|
8
6
|
require 'forwardable'
|
|
7
|
+
require 'loggability'
|
|
8
|
+
|
|
9
|
+
require 'strelka' unless defined?( Strelka )
|
|
10
|
+
require 'strelka/cookie'
|
|
9
11
|
|
|
10
12
|
|
|
11
13
|
# An object class which provides a convenient way of accessing a set of Strelka::Cookies.
|
|
@@ -35,16 +37,21 @@ require 'forwardable'
|
|
|
35
37
|
# * Jeremiah Jordan <phaedrus@FaerieMUD.org>
|
|
36
38
|
#
|
|
37
39
|
class Strelka::CookieSet
|
|
38
|
-
extend Forwardable
|
|
40
|
+
extend Forwardable,
|
|
41
|
+
Loggability
|
|
39
42
|
include Enumerable
|
|
40
43
|
|
|
41
44
|
|
|
45
|
+
# Loggability API -- send logs through the :strelka logger
|
|
46
|
+
log_to :strelka
|
|
47
|
+
|
|
48
|
+
|
|
42
49
|
### Parse the Cookie header of the specified +request+ into Strelka::Cookie objects
|
|
43
50
|
### and return them in a new CookieSet.
|
|
44
51
|
def self::parse( request )
|
|
45
|
-
|
|
52
|
+
self.log.debug "Parsing cookies from header: %p" % [ request.header.cookie ]
|
|
46
53
|
cookies = Strelka::Cookie.parse( request.header.cookie )
|
|
47
|
-
|
|
54
|
+
self.log.debug " found %d cookies: %p" % [ cookies.length, cookies ]
|
|
48
55
|
return new( cookies.values )
|
|
49
56
|
end
|
|
50
57
|
|
|
@@ -63,15 +70,9 @@ class Strelka::CookieSet
|
|
|
63
70
|
public
|
|
64
71
|
######
|
|
65
72
|
|
|
66
|
-
def_delegators :@cookie_set, :each
|
|
73
|
+
def_delegators :@cookie_set, :each, :empty?, :member?, :length, :size
|
|
67
74
|
|
|
68
75
|
|
|
69
|
-
### Returns the number of cookies in the cookieset
|
|
70
|
-
def length
|
|
71
|
-
return @cookie_set.length
|
|
72
|
-
end
|
|
73
|
-
alias_method :size, :length
|
|
74
|
-
|
|
75
76
|
|
|
76
77
|
### Index operator method: returns the Strelka::Cookie with the given +name+ if it
|
|
77
78
|
### exists in the cookieset.
|
|
@@ -50,6 +50,12 @@ module Strelka::HTTPRequest::Session
|
|
|
50
50
|
alias_method :has_session?, :session?
|
|
51
51
|
|
|
52
52
|
|
|
53
|
+
### Returns +true+ if the request has loaded its session.
|
|
54
|
+
def session_loaded?
|
|
55
|
+
return @session ? true : false
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
|
|
53
59
|
### Return the session associated with the request, creating it if necessary.
|
|
54
60
|
def session
|
|
55
61
|
unless @session
|
|
@@ -85,10 +85,16 @@ module Strelka::HTTPResponse::Session
|
|
|
85
85
|
alias_method :has_session?, :session?
|
|
86
86
|
|
|
87
87
|
|
|
88
|
+
### Returns +true+ if the response or its request has already loaded the session.
|
|
89
|
+
def session_loaded?
|
|
90
|
+
return @session || self.request.session_loaded?
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
|
|
88
94
|
### Tell the associated session to save itself and set up the session ID in the
|
|
89
95
|
### response, if one exists.
|
|
90
96
|
def save_session
|
|
91
|
-
if self.
|
|
97
|
+
if self.session_loaded?
|
|
92
98
|
self.log.debug "Saving session: %p" % [ self.session ]
|
|
93
99
|
self.session.save( self )
|
|
94
100
|
else
|
data/lib/strelka/plugins.rb
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
require 'set'
|
|
6
6
|
require 'tsort'
|
|
7
7
|
|
|
8
|
+
require 'loggability'
|
|
8
9
|
require 'strelka' unless defined?( Strelka )
|
|
9
10
|
require 'strelka/mixins'
|
|
10
11
|
|
|
@@ -28,11 +29,18 @@ module Strelka
|
|
|
28
29
|
|
|
29
30
|
# Plugin Module extension -- adds registration, load-order support, etc.
|
|
30
31
|
module Plugin
|
|
32
|
+
extend Loggability
|
|
33
|
+
|
|
34
|
+
# Loggability API -- send logs through the :strelka logger
|
|
35
|
+
log_to :strelka
|
|
36
|
+
|
|
31
37
|
|
|
32
38
|
### Extension hook -- Extend the given object with methods for setting it
|
|
33
39
|
### up as a plugin for its containing namespace.
|
|
34
40
|
def self::extended( object )
|
|
35
41
|
super
|
|
42
|
+
object.extend( Loggability )
|
|
43
|
+
object.log_to( :strelka )
|
|
36
44
|
|
|
37
45
|
# Find the plugin's namespace container, which will be the
|
|
38
46
|
# pluggable class/module
|
|
@@ -41,18 +49,18 @@ module Strelka
|
|
|
41
49
|
mod.const_get( name )
|
|
42
50
|
end
|
|
43
51
|
|
|
44
|
-
|
|
52
|
+
self.log.debug "Extending %p as a Strelka::Plugin for %p" % [ object, pluggable ]
|
|
45
53
|
object.successors = Set.new
|
|
46
54
|
object.pluggable = pluggable
|
|
47
55
|
|
|
48
56
|
# Register any pending dependencies for the newly-loaded plugin
|
|
49
57
|
name = object.plugin_name
|
|
50
58
|
if (( deps = pluggable.loaded_plugins[name] ))
|
|
51
|
-
|
|
59
|
+
self.log.debug " installing deferred deps for %p" % [ name ]
|
|
52
60
|
object.run_after( *deps )
|
|
53
61
|
end
|
|
54
62
|
|
|
55
|
-
|
|
63
|
+
self.log.debug " adding %p (%p) to the plugin registry for %p" %
|
|
56
64
|
[ name, object, pluggable ]
|
|
57
65
|
pluggable.loaded_plugins[ name ] = object
|
|
58
66
|
end
|
|
@@ -88,7 +96,7 @@ module Strelka
|
|
|
88
96
|
if mod.respond_to?( :run_after )
|
|
89
97
|
mod.run_after( name )
|
|
90
98
|
else
|
|
91
|
-
|
|
99
|
+
self.log.debug "%p plugin not yet loaded; setting up pending deps" % [ other_name ]
|
|
92
100
|
mod << name
|
|
93
101
|
end
|
|
94
102
|
end
|
|
@@ -98,7 +106,7 @@ module Strelka
|
|
|
98
106
|
### Register the receiver as needing to be run after +other_plugins+ for requests, and
|
|
99
107
|
### *before* them for responses.
|
|
100
108
|
def run_after( *other_plugins )
|
|
101
|
-
|
|
109
|
+
self.log.debug " %p will run after %p" % [ self, other_plugins ]
|
|
102
110
|
self.successors.merge( other_plugins )
|
|
103
111
|
end
|
|
104
112
|
|
|
@@ -113,6 +121,8 @@ module Strelka
|
|
|
113
121
|
### object.
|
|
114
122
|
def self::extended( mod )
|
|
115
123
|
super
|
|
124
|
+
mod.extend( Loggability )
|
|
125
|
+
mod.log_to( :strelka )
|
|
116
126
|
mod.loaded_plugins = Strelka::PluginRegistry.new
|
|
117
127
|
mod.plugin_path_prefix = mod.name.downcase.gsub( /::/, File::SEPARATOR )
|
|
118
128
|
end
|
|
@@ -156,7 +166,7 @@ module Strelka
|
|
|
156
166
|
|
|
157
167
|
### Load the plugins with the given +names+ and install them.
|
|
158
168
|
def plugins( *names )
|
|
159
|
-
|
|
169
|
+
self.log.info "Adding plugins: %s" % [ names.flatten.map(&:to_s).join(', ') ]
|
|
160
170
|
|
|
161
171
|
# Load the associated Plugin Module objects
|
|
162
172
|
names.flatten.each {|name| self.load_plugin(name) }
|
|
@@ -174,7 +184,7 @@ module Strelka
|
|
|
174
184
|
plugin = self.loaded_plugins[ name ]
|
|
175
185
|
end
|
|
176
186
|
|
|
177
|
-
|
|
187
|
+
self.log.debug " registering %p" % [ name ]
|
|
178
188
|
self.register_plugin( plugin )
|
|
179
189
|
end
|
|
180
190
|
end
|
|
@@ -205,12 +215,12 @@ module Strelka
|
|
|
205
215
|
def register_plugin( mod )
|
|
206
216
|
if mod.const_defined?( :ClassMethods )
|
|
207
217
|
cm_mod = mod.const_get(:ClassMethods)
|
|
208
|
-
|
|
218
|
+
self.log.debug " adding class methods from %p" % [ cm_mod ]
|
|
209
219
|
|
|
210
220
|
extend( cm_mod )
|
|
211
221
|
cm_mod.instance_variables.each do |ivar|
|
|
212
222
|
next if instance_variable_defined?( ivar )
|
|
213
|
-
|
|
223
|
+
self.log.debug " copying class instance variable %s" % [ ivar ]
|
|
214
224
|
ival = cm_mod.instance_variable_get( ivar )
|
|
215
225
|
|
|
216
226
|
# Don't duplicate modules/classes or immediates
|
|
@@ -233,12 +243,12 @@ module Strelka
|
|
|
233
243
|
### of the plugins themselves.
|
|
234
244
|
def install_plugins
|
|
235
245
|
if self.plugins_installed?
|
|
236
|
-
|
|
246
|
+
self.log.warn "Plugins were already installed for %p from %p" %
|
|
237
247
|
[ self, self.plugins_installed_from ]
|
|
238
|
-
|
|
239
|
-
|
|
248
|
+
self.log.info "I'll attempt to install any new ones, but plugin ordering"
|
|
249
|
+
self.log.info "and other functionality might exhibit strange behavior."
|
|
240
250
|
else
|
|
241
|
-
|
|
251
|
+
self.log.info "Installing plugins for %p." % [ self ]
|
|
242
252
|
end
|
|
243
253
|
|
|
244
254
|
sorted_plugins = self.loaded_plugins.tsort.reverse
|
|
@@ -247,11 +257,11 @@ module Strelka
|
|
|
247
257
|
mod = self.loaded_plugins[ name ]
|
|
248
258
|
|
|
249
259
|
unless @plugins.include?( name ) || @plugins.include?( mod )
|
|
250
|
-
|
|
260
|
+
self.log.debug " skipping %s" % [ name ]
|
|
251
261
|
next
|
|
252
262
|
end
|
|
253
263
|
|
|
254
|
-
|
|
264
|
+
self.log.info " including %p." % [ mod ]
|
|
255
265
|
include( mod )
|
|
256
266
|
end
|
|
257
267
|
|
|
@@ -262,7 +272,7 @@ module Strelka
|
|
|
262
272
|
### Return the list of plugin modules that are in effect for the current
|
|
263
273
|
### app.
|
|
264
274
|
def application_stack
|
|
265
|
-
|
|
275
|
+
self.log.debug "Ancestors are: %p" % [ self.class.ancestors ]
|
|
266
276
|
return self.ancestors.select {|mod| mod.respond_to?(:plugin_name) }
|
|
267
277
|
end
|
|
268
278
|
|
|
@@ -270,7 +280,7 @@ module Strelka
|
|
|
270
280
|
### Output the application stack into the logfile.
|
|
271
281
|
def dump_application_stack
|
|
272
282
|
stack = self.application_stack.map( &:plugin_name )
|
|
273
|
-
|
|
283
|
+
self.log.info "Application stack: request -> %s" % [ stack.join(" -> ") ]
|
|
274
284
|
end
|
|
275
285
|
|
|
276
286
|
end # module PluginLoader
|
data/lib/strelka/session/db.rb
CHANGED
|
@@ -75,10 +75,10 @@ class Strelka::Session::Db < Strelka::Session::Default
|
|
|
75
75
|
###
|
|
76
76
|
def self::initialize_sessions_table
|
|
77
77
|
if self.db.table_exists?( @table_name )
|
|
78
|
-
|
|
78
|
+
self.log.debug "Using existing sessions table for %p" % [ db ]
|
|
79
79
|
|
|
80
80
|
else
|
|
81
|
-
|
|
81
|
+
self.log.debug "Creating new sessions table for %p" % [ db ]
|
|
82
82
|
self.db.create_table( @table_name ) do
|
|
83
83
|
text :session_id, :index => true
|
|
84
84
|
text :session
|
|
@@ -82,7 +82,7 @@ class Strelka::Session::Default < Strelka::Session
|
|
|
82
82
|
if cookie.value =~ /^([[:xdigit:]]+)$/i
|
|
83
83
|
return $1.untaint
|
|
84
84
|
else
|
|
85
|
-
|
|
85
|
+
self.log.warn "Request with a malformed session cookie: %p" % [ request ]
|
|
86
86
|
return nil
|
|
87
87
|
end
|
|
88
88
|
end
|
|
@@ -99,9 +99,9 @@ class Strelka::Session::Default < Strelka::Session
|
|
|
99
99
|
### Return +true+ if the given +request+ has a session token which corresponds
|
|
100
100
|
### to an existing session key.
|
|
101
101
|
def self::has_session_for?( request )
|
|
102
|
-
|
|
102
|
+
self.log.debug "Checking request (%s/%d) for session." % [ request.sender_id, request.conn_id ]
|
|
103
103
|
id = self.get_existing_session_id( request ) or return false
|
|
104
|
-
|
|
104
|
+
self.log.debug " got a session ID: %p" % [ id ]
|
|
105
105
|
return @sessions.key?( id )
|
|
106
106
|
end
|
|
107
107
|
|
data/spec/lib/helpers.rb
CHANGED
|
@@ -27,6 +27,7 @@ if ENV['COVERAGE']
|
|
|
27
27
|
end
|
|
28
28
|
end
|
|
29
29
|
|
|
30
|
+
require 'loggability'
|
|
30
31
|
require 'configurability'
|
|
31
32
|
require 'pathname'
|
|
32
33
|
require 'tmpdir'
|
|
@@ -44,33 +45,6 @@ require 'spec/lib/constants'
|
|
|
44
45
|
module Strelka::SpecHelpers
|
|
45
46
|
include Strelka::TestConstants
|
|
46
47
|
|
|
47
|
-
class ArrayLogger
|
|
48
|
-
### Create a new ArrayLogger that will append content to +array+.
|
|
49
|
-
def initialize( array )
|
|
50
|
-
@array = array
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
### Write the specified +message+ to the array.
|
|
54
|
-
def write( message )
|
|
55
|
-
@array << message
|
|
56
|
-
end
|
|
57
|
-
|
|
58
|
-
### No-op -- this is here just so Logger doesn't complain
|
|
59
|
-
def close; end
|
|
60
|
-
|
|
61
|
-
end # class ArrayLogger
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
unless defined?( LEVEL )
|
|
65
|
-
LEVEL = {
|
|
66
|
-
:debug => Logger::DEBUG,
|
|
67
|
-
:info => Logger::INFO,
|
|
68
|
-
:warn => Logger::WARN,
|
|
69
|
-
:error => Logger::ERROR,
|
|
70
|
-
:fatal => Logger::FATAL,
|
|
71
|
-
}
|
|
72
|
-
end
|
|
73
|
-
|
|
74
48
|
###############
|
|
75
49
|
module_function
|
|
76
50
|
###############
|
|
@@ -90,7 +64,7 @@ module Strelka::SpecHelpers
|
|
|
90
64
|
|
|
91
65
|
|
|
92
66
|
### Alter the output of the default log formatter to be pretty in SpecMate output
|
|
93
|
-
def setup_logging( level
|
|
67
|
+
def setup_logging( level=:fatal )
|
|
94
68
|
|
|
95
69
|
# Only do this when executing from a spec in TextMate
|
|
96
70
|
if ENV['HTML_LOGGING'] || (ENV['TM_FILENAME'] && ENV['TM_FILENAME'] =~ /_spec\.rb/)
|
|
@@ -41,15 +41,12 @@ describe Strelka::App::Filters do
|
|
|
41
41
|
describe "an including App" do
|
|
42
42
|
|
|
43
43
|
before( :each ) do
|
|
44
|
-
Strelka.log.debug "Creating a new Strelka::App"
|
|
45
44
|
@app = Class.new( Strelka::App ) do
|
|
46
45
|
plugin :filters
|
|
47
46
|
def initialize( appid='params-test', sspec=TEST_SEND_SPEC, rspec=TEST_RECV_SPEC )
|
|
48
47
|
super
|
|
49
48
|
end
|
|
50
49
|
end
|
|
51
|
-
Strelka.log.debug " App class is: %p, filters array: 0x%016x" %
|
|
52
|
-
[ @app, @app.filters.object_id * 2 ]
|
|
53
50
|
end
|
|
54
51
|
|
|
55
52
|
it "has its filters config inherited by subclasses" do
|
|
@@ -45,7 +45,6 @@ describe Strelka::App::RestResources do
|
|
|
45
45
|
describe "an including App" do
|
|
46
46
|
|
|
47
47
|
before( :each ) do
|
|
48
|
-
Strelka.log.debug "Creating a new Strelka::App"
|
|
49
48
|
@app = Class.new( Strelka::App ) do
|
|
50
49
|
plugin :restresources
|
|
51
50
|
def initialize( appid='rest-test', sspec=TEST_SEND_SPEC, rspec=TEST_RECV_SPEC )
|
|
@@ -41,15 +41,12 @@ describe Strelka::App::Routing do
|
|
|
41
41
|
describe "an including App" do
|
|
42
42
|
|
|
43
43
|
before( :each ) do
|
|
44
|
-
Strelka.log.debug "Creating a new Strelka::App"
|
|
45
44
|
@app = Class.new( Strelka::App ) do
|
|
46
45
|
plugin :routing
|
|
47
46
|
def initialize( appid='params-test', sspec=TEST_SEND_SPEC, rspec=TEST_RECV_SPEC )
|
|
48
47
|
super
|
|
49
48
|
end
|
|
50
49
|
end
|
|
51
|
-
Strelka.log.debug " App class is: %p, routes array: 0x%016x" %
|
|
52
|
-
[ @app, @app.routes.object_id * 2 ]
|
|
53
50
|
end
|
|
54
51
|
|
|
55
52
|
|
|
@@ -85,8 +85,8 @@ describe Strelka::App::Sessions do
|
|
|
85
85
|
|
|
86
86
|
before( :each ) do
|
|
87
87
|
@app = Class.new( Strelka::App ) do
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
self.log.info "Anonymous App class: %p" % [ self ]
|
|
89
|
+
self.log.info "ID constant is: %p" % [ const_defined?(:ID) ? const_get(:ID) : "(not defined)" ]
|
|
90
90
|
|
|
91
91
|
self::ID = 'monkeyshines'
|
|
92
92
|
# Guard against ID leakage
|
|
@@ -101,6 +101,7 @@ describe Strelka::App::Sessions do
|
|
|
101
101
|
|
|
102
102
|
def handle_request( req )
|
|
103
103
|
super do
|
|
104
|
+
self.log.debug "Session is: %p" % [ req.session ]
|
|
104
105
|
req.session[ :test ] = 'session data'
|
|
105
106
|
req.response
|
|
106
107
|
end
|
|
@@ -27,6 +27,14 @@ describe Strelka::CookieSet do
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
|
|
30
|
+
it "delegates some methods to its underlying Set" do
|
|
31
|
+
cookie = Strelka::Cookie.new( 'pants', 'baggy' )
|
|
32
|
+
|
|
33
|
+
@cookieset.should be_empty()
|
|
34
|
+
@cookieset.length.should == 0
|
|
35
|
+
@cookieset.member?( cookie ).should be_false()
|
|
36
|
+
end
|
|
37
|
+
|
|
30
38
|
it "is able to enummerate over each cookie in the set" do
|
|
31
39
|
pants_cookie = Strelka::Cookie.new( 'pants', 'baggy' )
|
|
32
40
|
shirt_cookie = Strelka::Cookie.new( 'shirt', 'pirate' )
|
|
@@ -35,7 +35,6 @@ describe Strelka::HTTPRequest::Session, "-extended request" do
|
|
|
35
35
|
|
|
36
36
|
before( :each ) do
|
|
37
37
|
@req = @request_factory.get( '/service/user/estark' )
|
|
38
|
-
Strelka.log.debug "Extending request %p" % [ @req ]
|
|
39
38
|
@req.extend( described_class )
|
|
40
39
|
end
|
|
41
40
|
|
|
@@ -110,13 +109,22 @@ describe Strelka::HTTPRequest::Session, "-extended request" do
|
|
|
110
109
|
context "and a corresponding entry in the database" do
|
|
111
110
|
|
|
112
111
|
before( :each ) do
|
|
113
|
-
|
|
112
|
+
Strelka::Session::Default.sessions[ @sess_id ] = {}
|
|
114
113
|
end
|
|
115
114
|
|
|
116
115
|
it "knows that it has a session" do
|
|
117
116
|
@req.should have_session()
|
|
118
117
|
end
|
|
119
118
|
|
|
119
|
+
it "knows when its session hasn't been loaded" do
|
|
120
|
+
@req.session_loaded?.should be_false()
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
it "knows when its session has been loaded" do
|
|
124
|
+
@req.session # Load it
|
|
125
|
+
@req.session_loaded?.should be_true()
|
|
126
|
+
end
|
|
127
|
+
|
|
120
128
|
it "can purge the session from the database" do
|
|
121
129
|
@req.should have_session()
|
|
122
130
|
@req.destroy_session
|
|
@@ -130,12 +130,33 @@ describe Strelka::HTTPResponse::Session, "-extended response" do
|
|
|
130
130
|
@res.should have_session()
|
|
131
131
|
end
|
|
132
132
|
|
|
133
|
-
it "
|
|
133
|
+
it "knows that its session has been loaded if it has one" do
|
|
134
|
+
@res.session
|
|
135
|
+
@res.session_loaded?.should be_true()
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
it "knows that its session has been loaded if its request has one" do
|
|
139
|
+
@res.request.session
|
|
140
|
+
@res.session_loaded?.should be_true()
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
it "knows that its session hasn't been loaded if neither its request not itself has one" do
|
|
144
|
+
@res.session_loaded?.should be_false()
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
it "saves the session via itself if it was loaded" do
|
|
134
148
|
@res.cookies.should_not include( @cookie_name )
|
|
149
|
+
@res.session
|
|
135
150
|
@res.save_session
|
|
136
151
|
@res.cookies[ @cookie_name ].value.should == @sess_id
|
|
137
152
|
end
|
|
138
153
|
|
|
154
|
+
it "doesn't save the session via itself if it wasn't loaded" do
|
|
155
|
+
@res.cookies.should_not include( @cookie_name )
|
|
156
|
+
@res.save_session
|
|
157
|
+
@res.cookies.should be_empty()
|
|
158
|
+
end
|
|
159
|
+
|
|
139
160
|
end
|
|
140
161
|
|
|
141
162
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: strelka
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.0.1.pre.
|
|
4
|
+
version: 0.0.1.pre.229
|
|
5
5
|
prerelease:
|
|
6
6
|
platform: ruby
|
|
7
7
|
authors:
|
|
@@ -36,7 +36,7 @@ cert_chain:
|
|
|
36
36
|
YUhDS0xaZFNLai9SSHVUT3QrZ2JsUmV4OEZBaDhOZUEKY21saFhlNDZwWk5K
|
|
37
37
|
Z1dLYnhaYWg4NWpJang5NWhSOHZPSStOQU01aUg5a09xSzEzRHJ4YWNUS1Bo
|
|
38
38
|
cWo1UGp3RgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
|
|
39
|
-
date: 2012-05-
|
|
39
|
+
date: 2012-05-09 00:00:00.000000000 Z
|
|
40
40
|
dependencies:
|
|
41
41
|
- !ruby/object:Gem::Dependency
|
|
42
42
|
name: trollop
|
|
@@ -125,7 +125,7 @@ dependencies:
|
|
|
125
125
|
requirements:
|
|
126
126
|
- - ~>
|
|
127
127
|
- !ruby/object:Gem::Version
|
|
128
|
-
version: '0.
|
|
128
|
+
version: '0.22'
|
|
129
129
|
type: :runtime
|
|
130
130
|
prerelease: false
|
|
131
131
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -133,7 +133,7 @@ dependencies:
|
|
|
133
133
|
requirements:
|
|
134
134
|
- - ~>
|
|
135
135
|
- !ruby/object:Gem::Version
|
|
136
|
-
version: '0.
|
|
136
|
+
version: '0.22'
|
|
137
137
|
- !ruby/object:Gem::Dependency
|
|
138
138
|
name: uuidtools
|
|
139
139
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -189,7 +189,7 @@ dependencies:
|
|
|
189
189
|
requirements:
|
|
190
190
|
- - ~>
|
|
191
191
|
- !ruby/object:Gem::Version
|
|
192
|
-
version: '0.
|
|
192
|
+
version: '0.1'
|
|
193
193
|
type: :runtime
|
|
194
194
|
prerelease: false
|
|
195
195
|
version_requirements: !ruby/object:Gem::Requirement
|
|
@@ -197,7 +197,7 @@ dependencies:
|
|
|
197
197
|
requirements:
|
|
198
198
|
- - ~>
|
|
199
199
|
- !ruby/object:Gem::Version
|
|
200
|
-
version: '0.
|
|
200
|
+
version: '0.1'
|
|
201
201
|
- !ruby/object:Gem::Dependency
|
|
202
202
|
name: hoe-mercurial
|
|
203
203
|
requirement: !ruby/object:Gem::Requirement
|
metadata.gz.sig
CHANGED
|
Binary file
|