strelka 0.0.1.pre.200 → 0.0.1.pre.203

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,12 +1,44 @@
1
+ 2012-04-21 Michael Granger <ged@FaerieMUD.org>
2
+
3
+ * lib/strelka/app/parameters.rb:
4
+ Add some better docs for the :parameters plugin
5
+ [f0c8f37e24d7] [tip]
6
+
7
+ 2012-04-20 Michael Granger <ged@FaerieMUD.org>
8
+
9
+ * lib/strelka/app.rb, lib/strelka/app/errors.rb,
10
+ spec/strelka/app/errors_spec.rb, spec/strelka/app_spec.rb:
11
+ Set the status info in the transaction notes on status responses.
12
+ [cd78c839f328]
13
+
14
+ * lib/strelka/httprequest.rb, lib/strelka/httpresponse.rb,
15
+ lib/strelka/mixins.rb, spec/strelka/app/filters_spec.rb,
16
+ spec/strelka/httpresponse_spec.rb:
17
+ Make HTTPResponse share the request's notes Hash.
18
+ [9d7fb3d16c12]
19
+
20
+ * lib/strelka/app/errors.rb:
21
+ Allow re-throwing with the status_info struct
22
+ [90e1c9e72ae7]
23
+
24
+ * bin/strelka, lib/strelka/app.rb:
25
+ Add the local 'lib' directory to the discovery path.
26
+
27
+ This makes it easier to use the 'strelka' command to interact with
28
+ apps during development, and also some kinds of deployment
29
+ environments like 'supervise'-style ones.
30
+ [612140994e8b]
31
+
1
32
  2012-04-19 Michael Granger <ged@FaerieMUD.org>
2
33
 
3
- * lib/strelka/websocketserver.rb:
4
- Adding a websocket service base class
5
- [149dae18de58] [qbase, qtip, tip, websocketservice.patch]
34
+ * bin/strelka, lib/strelka.rb, lib/strelka/app.rb:
35
+ Use a local data/<something> directory as the Strelka datadir for
36
+ the 'strelka' command.
37
+ [c3e9ce4035b6]
6
38
 
7
39
  * lib/strelka/plugins.rb:
8
40
  Moving application stack dump function to the PluginLoader mixin
9
- [3c35f0dd2089] [qparent]
41
+ [3c35f0dd2089]
10
42
 
11
43
  2012-04-18 Michael Granger <ged@FaerieMUD.org>
12
44
 
@@ -10,8 +10,13 @@ require 'strelka/paramvalidator'
10
10
 
11
11
  # Parameter validation and untainting for Strelka apps.
12
12
  #
13
- # The application can declare parameters globally, and then override them on a
14
- # per-route basis:
13
+ # When you include the +:parameters+ plugin, you can declare valid parameters, specify
14
+ # constraints that describe what they should contain, and automatically untaint the incoming
15
+ # values that match.
16
+ #
17
+ # == Parameter Declaration
18
+ #
19
+ # Parameters are declared using the +param+ declarative:
15
20
  #
16
21
  # class UserManager < Strelka::App
17
22
  #
@@ -22,9 +27,37 @@ require 'strelka/paramvalidator'
22
27
  # param :id, /\d+/, "The user's numeric ID"
23
28
  # param :mode, ['add', 'remove']
24
29
  #
30
+ # The first item is the parameter _key_, which corresponds to the field 'name' attribute for
31
+ # a form, or the key for JSON or YAML data.
32
+ #
33
+ # The second item is the _constraint_, which specifies what the value in that parameter should
34
+ # look like if it's valid. This can be one of several things:
35
+ #
36
+ # [a Regexp]::
37
+ # The parameter value, as a String, is matched against the Regexp and validates if the
38
+ # pattern matches. If the Regexp contains one match group, and the pattern matches, the
39
+ # validated value will be the capture from that group. If it contains two or more match
40
+ # groups, the new value is an Array of the captures from the match. If the pattern contains
41
+ # at least one named capture group, the value will be a Hash of the captures from the named
42
+ # capture groups. Note that you cannot intermix named and positional capture groups.
43
+ # [a Symbol]::
44
+ # The parameter value is matched using a built-in constraint. The current built-in
45
+ # constraints are documented in the ParamValidator API documentation. As a shortcut, if the
46
+ # parameter's _key_ is the same as a built-in constraint, you can omit the _constraint_ from
47
+ # the declaration.
48
+ # [a Proc or Method]::
49
+ # The parameter (or parameters in the case where there are more than one value) are passed to
50
+ # the given Proc, and the Proc should return what the validated value of the parameter should
51
+ # be. If it's invalid, the Proc should raise a RuntimeError.
52
+ #
53
+ # == Parameter Routing
54
+ #
55
+ # The inclusion of this plugin also allows you to use parameters in your routes:
56
+ #
25
57
  # # :username gets validated and merged into query args; URI parameters
26
58
  # # clobber query params
27
- # get '/info/:username', :params => { :id => /[XRT]\d{4}-\d{8}/ } do |req|
59
+ # get '/info/:username' do |req|
60
+ # req.params.add( :id, /[XRT]\d{4}-\d{8}/ )
28
61
  # req.params.okay?
29
62
  # req.params[:username]
30
63
  # req.params.values_at( :id, :username )
@@ -35,6 +68,7 @@ require 'strelka/paramvalidator'
35
68
  #
36
69
  # end # class UserManager
37
70
  #
71
+ # [:FIXME:] Add more docs
38
72
  module Strelka::App::Parameters
39
73
  extend Strelka::Plugin
40
74
 
@@ -357,7 +357,12 @@ module Strelka
357
357
  status_info = http_status
358
358
  else
359
359
  message ||= HTTP::STATUS_NAME[ http_status ]
360
- status_info = { :status => http_status, :message => message, :headers => headers }
360
+ status_info = {
361
+ status: http_status,
362
+ message: message,
363
+ headers: headers,
364
+ backtrace: caller(1),
365
+ }
361
366
  end
362
367
 
363
368
  throw :finish, status_info
@@ -220,7 +220,7 @@ class Strelka::ParamValidator < ::FormValidator
220
220
  ### Fetch the constraint/s that apply to the parameter with the given
221
221
  ### +name+.
222
222
  def constraint_for( name )
223
- constraint = self.profile[:constraints][ name.to_sym ] or
223
+ constraint = self.profile[:constraints][ name.to_s ] or
224
224
  raise ScriptError, "no parameter %p defined" % [ name ]
225
225
  return constraint
226
226
  end
@@ -270,11 +270,12 @@ class Strelka::ParamValidator < ::FormValidator
270
270
  ### Add a validation for a parameter with the specified +name+. The +args+ can include
271
271
  ### a constraint, a description, and one or more flags.
272
272
  def add( name, *args, &block )
273
- name = name.to_sym
273
+ name = name.to_s
274
274
  raise ArgumentError,
275
275
  "parameter %p is already defined; perhaps you meant to use #override?" % [name] if
276
276
  self.param_names.include?( name )
277
277
 
278
+ self.log.debug "Adding parameter '%s' to profile" % [ name ]
278
279
  self.set_param( name, *args, &block )
279
280
  end
280
281
 
@@ -282,11 +283,12 @@ class Strelka::ParamValidator < ::FormValidator
282
283
  ### Replace the existing parameter with the specified +name+. The +args+ replace
283
284
  ### the existing description, constraints, and flags. See #add for details.
284
285
  def override( name, *args, &block )
285
- name = name.to_sym
286
+ name = name.to_s
286
287
  raise ArgumentError,
287
288
  "no parameter %p defined; perhaps you meant to use #add?" % [name] unless
288
289
  self.param_names.include?( name )
289
290
 
291
+ self.log.debug "Overriding parameter '%s' in profile" % [ name ]
290
292
  self.set_param( name, *args, &block )
291
293
  end
292
294
 
@@ -397,6 +399,8 @@ class Strelka::ParamValidator < ::FormValidator
397
399
  else
398
400
  self.profile[:untaint_constraint_fields].delete( :name )
399
401
  end
402
+
403
+ self.revalidate if self.validated?
400
404
  end
401
405
 
402
406
 
@@ -431,6 +435,12 @@ class Strelka::ParamValidator < ::FormValidator
431
435
  alias_method :has_args?, :args?
432
436
 
433
437
 
438
+ ### Returns +true+ if the parameters have been validated.
439
+ def validated?
440
+ return !@raw_form.empty?
441
+ end
442
+
443
+
434
444
  ### Returns +true+ if any fields are missing or contain invalid values.
435
445
  def errors?
436
446
  return !self.okay?
@@ -553,8 +563,14 @@ class Strelka::ParamValidator < ::FormValidator
553
563
  ### re-validate the resulting values.
554
564
  def merge!( params )
555
565
  return if params.empty?
556
-
557
566
  self.log.debug "Merging parameters for revalidation: %p" % [ params ]
567
+ self.revalidate( params )
568
+ end
569
+
570
+
571
+ ### Clear existing validation information and re-check against the
572
+ ### current state of the profile.
573
+ def revalidate( params={} )
558
574
  @missing_fields.clear
559
575
  @unknown_fields.clear
560
576
  @required_fields.clear
data/spec/lib/helpers.rb CHANGED
@@ -145,6 +145,155 @@ module Strelka::SpecHelpers
145
145
  end
146
146
  end
147
147
 
148
+ # finish_with matcher
149
+ class FinishWithMatcher
150
+
151
+ ### Create a new matcher for the specified +status+, +expected_message+, and
152
+ ### +expected_headers+.
153
+ def initialize( status, expected_message=nil, expected_headers={} )
154
+
155
+ # Allow headers, but no message
156
+ if expected_message.is_a?( Hash )
157
+ expected_headers = expected_message
158
+ expected_message = nil
159
+ end
160
+
161
+ @expected_status = status
162
+ @expected_message = expected_message
163
+ @expected_headers = expected_headers || {}
164
+
165
+ @failure = nil
166
+ end
167
+
168
+
169
+ ######
170
+ public
171
+ ######
172
+
173
+ ##
174
+ # The data structures expected to be part of the response's status_info.
175
+ attr_reader :expected_status, :expected_message, :expected_headers
176
+
177
+
178
+ ### Also expect a header with the given +name+ and +value+ from the response.
179
+ def and_header( name, value=nil )
180
+ if name.is_a?( Hash )
181
+ self.expected_headers.merge!( name )
182
+ else
183
+ self.expected_headers[ name ] = value
184
+ end
185
+ return self
186
+ end
187
+
188
+
189
+ ### RSpec matcher API -- call the +given_proc+ and ensure that it behaves in
190
+ ### the expected manner.
191
+ def matches?( given_proc )
192
+ result = nil
193
+ status_info = catch( :finish ) do
194
+ given_proc.call
195
+ nil
196
+ end
197
+
198
+ return self.check_finish( status_info ) &&
199
+ self.check_status_code( status_info ) &&
200
+ self.check_message( status_info ) &&
201
+ self.check_headers( status_info )
202
+ end
203
+
204
+
205
+ ### Check the result from calling the proc to ensure it's a status
206
+ ### info Hash, returning true if so, or setting the failure message and
207
+ ### returning false if not.
208
+ def check_finish( status_info )
209
+ return true if status_info && status_info.is_a?( Hash )
210
+ @failure = "an abnormal status"
211
+ return false
212
+ end
213
+
214
+
215
+ ### Check the result's status code against the expectation, returning true if
216
+ ### it was the same, or setting the failure message and returning false if not.
217
+ def check_status_code( status_info )
218
+ return true if status_info[:status] == self.expected_status
219
+ @failure = "a %d status, but got %d instead" %
220
+ [ self.expected_status, status_info[:status] ]
221
+ return false
222
+ end
223
+
224
+
225
+ ### Check the result's status message against the expectation, returning true if
226
+ ### it was present and matched the expectation, or setting the failure message
227
+ ### and returning false if not.
228
+ def check_message( status_info )
229
+ msg = self.expected_message or return true
230
+
231
+ if msg.respond_to?( :match )
232
+ return true if msg.match( status_info[:message] )
233
+ @failure = "a message matching %p, but got: %p" % [ msg, status_info[:message] ]
234
+ return false
235
+ else
236
+ return true if msg == status_info[:message]
237
+ @failure = "the message %p, but got: %p" % [ msg, status_info[:message] ]
238
+ return false
239
+ end
240
+ end
241
+
242
+
243
+ ### Check the result's headers against the expectation, returning true if all
244
+ ### expected headers were present and set to expected values, or setting the failure
245
+ ### message and returning false if not.
246
+ def check_headers( status_info )
247
+ headers = self.expected_headers or return true
248
+ return true if headers.empty?
249
+
250
+ status_headers = status_info[:headers]
251
+ headers.each do |name, value|
252
+ unless status_value = status_headers[ name ]
253
+ @failure = "a %s header" % [ name ]
254
+ return false
255
+ end
256
+
257
+ if value.respond_to?( :match )
258
+ unless value.match( status_value )
259
+ @failure = "a %s header matching %p, but got %p" %
260
+ [ name, value, status_value ]
261
+ return false
262
+ end
263
+ else
264
+ unless value == status_value
265
+ @failure = "the %s header %p, but got %p" %
266
+ [ name, value, status_value ]
267
+ return false
268
+ end
269
+ end
270
+ end
271
+
272
+ return true
273
+ end
274
+
275
+
276
+ ### Return a message suitable for describing when the matcher fails when it should succeed.
277
+ def failure_message_for_should
278
+ return "expected response to finish_with %s" % [ @failure ]
279
+ end
280
+
281
+
282
+ ### Return a message suitable for describing when the matcher succeeds when it should fail.
283
+ def failure_message_for_should_not
284
+ return "expected response not to finish_with %s" % [ @failure ]
285
+ end
286
+
287
+
288
+ end # class FinishWithMatcher
289
+
290
+
291
+ ### Match a response thrown via the +finish_with+ function.
292
+ def finish_with( status, message=nil, headers={} )
293
+ FinishWithMatcher.new( status, message, headers )
294
+ end
295
+
296
+
148
297
  end
149
298
 
150
299
 
@@ -69,7 +69,7 @@ describe Strelka::App::Parameters do
69
69
  param :username, /\w+/i
70
70
  end
71
71
 
72
- @app.paramvalidator.param_names.should == [ :username ]
72
+ @app.paramvalidator.param_names.should == [ 'username' ]
73
73
  end
74
74
 
75
75
 
@@ -79,7 +79,7 @@ describe Strelka::App::Parameters do
79
79
  end
80
80
  subapp = Class.new( @app )
81
81
 
82
- subapp.paramvalidator.param_names.should == [ :username ]
82
+ subapp.paramvalidator.param_names.should == [ 'username' ]
83
83
  end
84
84
 
85
85
  describe "instance" do
@@ -77,22 +77,13 @@ describe Strelka::AuthProvider::Basic do
77
77
 
78
78
  context "unconfigured" do
79
79
 
80
- before( :each ) do
81
- @expected_info = {
82
- status: 401,
83
- message: "Requires authentication.",
84
- headers: {
85
- www_authenticate: "Basic realm=test-app"
86
- }
87
- }
88
- end
89
-
90
80
  it "rejects a request with no Authorization header" do
91
81
  req = @request_factory.get( '/admin/console' )
92
82
 
93
83
  expect {
94
84
  @provider.authenticate( req )
95
- }.to throw_symbol( :finish, @expected_info )
85
+ }.to finish_with( HTTP::UNAUTHORIZED, /requires authentication/i ).
86
+ and_header( www_authenticate: "Basic realm=test-app" )
96
87
  end
97
88
 
98
89
  it "rejects a request with credentials" do
@@ -101,7 +92,8 @@ describe Strelka::AuthProvider::Basic do
101
92
 
102
93
  expect {
103
94
  @provider.authenticate( req )
104
- }.to throw_symbol( :finish, @expected_info )
95
+ }.to finish_with( HTTP::UNAUTHORIZED, /requires authentication/i ).
96
+ and_header( www_authenticate: "Basic realm=test-app" )
105
97
  end
106
98
 
107
99
  end
@@ -110,13 +102,6 @@ describe Strelka::AuthProvider::Basic do
110
102
  context "configured with at least one user" do
111
103
 
112
104
  before( :each ) do
113
- @expected_info = {
114
- status: 401,
115
- message: "Requires authentication.",
116
- headers: {
117
- www_authenticate: "Basic realm=Pern"
118
- }
119
- }
120
105
  described_class.configure( @config )
121
106
  end
122
107
 
@@ -124,7 +109,8 @@ describe Strelka::AuthProvider::Basic do
124
109
  req = @request_factory.get( '/admin/console' )
125
110
  expect {
126
111
  @provider.authenticate( req )
127
- }.to throw_symbol( :finish, @expected_info )
112
+ }.to finish_with( HTTP::UNAUTHORIZED, /requires authentication/i ).
113
+ and_header( www_authenticate: "Basic realm=Pern" )
128
114
  end
129
115
 
130
116
  it "rejects a request with an authorization header for some other auth scheme" do
@@ -141,7 +127,8 @@ describe Strelka::AuthProvider::Basic do
141
127
 
142
128
  expect {
143
129
  @provider.authenticate( req )
144
- }.to throw_symbol( :finish, @expected_info )
130
+ }.to finish_with( HTTP::UNAUTHORIZED, /requires authentication/i ).
131
+ and_header( www_authenticate: "Basic realm=Pern" )
145
132
  end
146
133
 
147
134
  it "rejects a request with malformed credentials (no ':')" do
@@ -150,7 +137,8 @@ describe Strelka::AuthProvider::Basic do
150
137
 
151
138
  expect {
152
139
  @provider.authenticate( req )
153
- }.to throw_symbol( :finish, @expected_info )
140
+ }.to finish_with( HTTP::UNAUTHORIZED, /requires authentication/i ).
141
+ and_header( www_authenticate: "Basic realm=Pern" )
154
142
  end
155
143
 
156
144
  it "rejects a request with malformed credentials (invalid base64)" do
@@ -159,7 +147,8 @@ describe Strelka::AuthProvider::Basic do
159
147
 
160
148
  expect {
161
149
  @provider.authenticate( req )
162
- }.to throw_symbol( :finish, @expected_info )
150
+ }.to finish_with( HTTP::UNAUTHORIZED, /requires authentication/i ).
151
+ and_header( www_authenticate: "Basic realm=Pern" )
163
152
  end
164
153
 
165
154
  it "rejects a request with non-existant user credentials" do
@@ -168,7 +157,8 @@ describe Strelka::AuthProvider::Basic do
168
157
 
169
158
  expect {
170
159
  @provider.authenticate( req )
171
- }.to throw_symbol( :finish, @expected_info )
160
+ }.to finish_with( HTTP::UNAUTHORIZED, /requires authentication/i ).
161
+ and_header( www_authenticate: "Basic realm=Pern" )
172
162
  end
173
163
 
174
164
  it "rejects a request with a valid user, but the wrong password" do
@@ -177,7 +167,8 @@ describe Strelka::AuthProvider::Basic do
177
167
 
178
168
  expect {
179
169
  @provider.authenticate( req )
180
- }.to throw_symbol( :finish, @expected_info )
170
+ }.to finish_with( HTTP::UNAUTHORIZED, /requires authentication/i ).
171
+ and_header( www_authenticate: "Basic realm=Pern" )
181
172
  end
182
173
 
183
174
  it "accepts a request with valid credentials" do
@@ -79,16 +79,11 @@ describe Strelka::AuthProvider do
79
79
  end
80
80
 
81
81
  it "fails with a 403 (Forbidden) if the app's authz callback returns false" do
82
- expected_info = {
83
- status: 403,
84
- message: "You are not authorized to access this resource.",
85
- headers: {}
86
- }
87
82
  req = @request_factory.get( '/admin/console' )
88
83
 
89
84
  expect {
90
85
  @provider.authorize( 'anonymous', req ) { false }
91
- }.to throw_symbol( :finish, expected_info )
86
+ }.to finish_with( HTTP::FORBIDDEN, /you are not authorized/i )
92
87
  end
93
88
 
94
89
  end
@@ -166,7 +166,7 @@ describe Strelka::HTTPRequest do
166
166
 
167
167
  expect {
168
168
  @req.params
169
- }.to throw_symbol( :finish, expected_info )
169
+ }.to finish_with( HTTP::BAD_REQUEST, /no content type/i )
170
170
  end
171
171
  end
172
172
 
@@ -51,21 +51,33 @@ describe Strelka::ParamValidator do
51
51
 
52
52
  it "allows constraints to be added" do
53
53
  @validator.add( :a_field, :string )
54
- @validator.param_names.should include( :a_field )
54
+ @validator.param_names.should include( 'a_field' )
55
55
  end
56
56
 
57
57
  it "doesn't allow a parameter to be added twice" do
58
58
  @validator.add( :a_field, :string )
59
59
  expect {
60
60
  @validator.add( :a_field, :string )
61
- }.to raise_error( /parameter :a_field is already defined/i )
62
- @validator.param_names.should include( :a_field )
61
+ }.to raise_error( /parameter "a_field" is already defined/i )
62
+ @validator.param_names.should include( 'a_field' )
63
+ end
64
+
65
+ it "re-validates if profile is modified" do
66
+ @validator.add( :a_field, :string )
67
+ @validator.validate( 'a_field' => 'a string!' )
68
+ @validator.should_not have_errors()
69
+ @validator.should be_okay()
70
+
71
+ @validator.override( :a_field, :integer )
72
+ @validator.should have_errors()
73
+ @validator.should_not be_okay()
74
+ @validator.error_messages.should include( "Invalid value for 'A Field'" )
63
75
  end
64
76
 
65
77
  it "allows an existing constraint to be overridden" do
66
78
  @validator.add( :a_field, :string )
67
79
  @validator.override( :a_field, :integer )
68
- @validator.param_names.should include( :a_field )
80
+ @validator.param_names.should include( 'a_field' )
69
81
  @validator.validate( 'a_field' => 'a string!' )
70
82
  @validator.should have_errors()
71
83
  @validator.should_not be_okay()
@@ -75,14 +87,14 @@ describe Strelka::ParamValidator do
75
87
  it "doesn't allow a non-existant parameter to be overridden" do
76
88
  expect {
77
89
  @validator.override( :a_field, :string )
78
- }.to raise_error( /no parameter :a_field defined/i )
79
- @validator.param_names.should_not include( :a_field )
90
+ }.to raise_error( /no parameter "a_field" defined/i )
91
+ @validator.param_names.should_not include( 'a_field' )
80
92
  end
81
93
 
82
94
  it "raises an exception on an unknown constraint type" do
83
95
  expect {
84
96
  @validator.add( :foo, $stderr )
85
- }.to raise_error( /no builtin :foo validator/ )
97
+ }.to raise_error( /no builtin "foo" validator/ )
86
98
  end
87
99
 
88
100
  it "retains its parameters through a copy" do
@@ -74,18 +74,11 @@ describe Strelka::Router::Default do
74
74
  end
75
75
 
76
76
  it "responds with a 405 (method not allowed) for a POST request to /user/foo" do
77
- expected_info = {
78
- status: 405,
79
- message: "Method not allowed.",
80
- headers: {
81
- allow: 'GET, HEAD'
82
- }
83
- }
84
-
85
77
  req = @request_factory.post( '/user/foo' )
86
78
  expect {
87
79
  @router.route_request( req )
88
- }.to throw_symbol( :finish, expected_info )
80
+ }.to finish_with( HTTP::METHOD_NOT_ALLOWED, /method not allowed/i ).
81
+ and_header( allow: 'GET, HEAD' )
89
82
  end
90
83
 
91
84
  end
@@ -108,18 +108,11 @@ describe Strelka::Router::Exclusive do
108
108
  end
109
109
 
110
110
  it "responds with an HTTP::METHOD_NOT_ALLOWED for a POST request to /user/foo" do
111
- expected_info = {
112
- status: 405,
113
- message: "Method not allowed.",
114
- headers: {
115
- allow: 'GET, HEAD'
116
- }
117
- }
118
-
119
111
  req = @request_factory.post( '/user/foo' )
120
112
  expect {
121
113
  @router.route_request( req )
122
- }.to throw_symbol( :finish, expected_info )
114
+ }.to finish_with( HTTP::METHOD_NOT_ALLOWED, /method not allowed/i ).
115
+ and_header( allow: 'GET, HEAD' )
123
116
  end
124
117
  end
125
118
 
data.tar.gz.sig CHANGED
Binary file
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.200
4
+ version: 0.0.1.pre.203
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -36,11 +36,11 @@ cert_chain:
36
36
  YUhDS0xaZFNLai9SSHVUT3QrZ2JsUmV4OEZBaDhOZUEKY21saFhlNDZwWk5K
37
37
  Z1dLYnhaYWg4NWpJang5NWhSOHZPSStOQU01aUg5a09xSzEzRHJ4YWNUS1Bo
38
38
  cWo1UGp3RgotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
39
- date: 2012-04-20 00:00:00.000000000 Z
39
+ date: 2012-04-22 00:00:00.000000000 Z
40
40
  dependencies:
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: trollop
43
- requirement: &70139550821000 !ruby/object:Gem::Requirement
43
+ requirement: &70272015625260 !ruby/object:Gem::Requirement
44
44
  none: false
45
45
  requirements:
46
46
  - - ~>
@@ -48,10 +48,10 @@ dependencies:
48
48
  version: '1.16'
49
49
  type: :runtime
50
50
  prerelease: false
51
- version_requirements: *70139550821000
51
+ version_requirements: *70272015625260
52
52
  - !ruby/object:Gem::Dependency
53
53
  name: highline
54
- requirement: &70139550820480 !ruby/object:Gem::Requirement
54
+ requirement: &70272015624740 !ruby/object:Gem::Requirement
55
55
  none: false
56
56
  requirements:
57
57
  - - ~>
@@ -59,10 +59,10 @@ dependencies:
59
59
  version: '1.6'
60
60
  type: :runtime
61
61
  prerelease: false
62
- version_requirements: *70139550820480
62
+ version_requirements: *70272015624740
63
63
  - !ruby/object:Gem::Dependency
64
64
  name: sysexits
65
- requirement: &70139550819940 !ruby/object:Gem::Requirement
65
+ requirement: &70272015624280 !ruby/object:Gem::Requirement
66
66
  none: false
67
67
  requirements:
68
68
  - - ~>
@@ -70,10 +70,10 @@ dependencies:
70
70
  version: '1.0'
71
71
  type: :runtime
72
72
  prerelease: false
73
- version_requirements: *70139550819940
73
+ version_requirements: *70272015624280
74
74
  - !ruby/object:Gem::Dependency
75
75
  name: formvalidator
76
- requirement: &70139550819420 !ruby/object:Gem::Requirement
76
+ requirement: &70272015623780 !ruby/object:Gem::Requirement
77
77
  none: false
78
78
  requirements:
79
79
  - - ~>
@@ -81,10 +81,10 @@ dependencies:
81
81
  version: '0.1'
82
82
  type: :runtime
83
83
  prerelease: false
84
- version_requirements: *70139550819420
84
+ version_requirements: *70272015623780
85
85
  - !ruby/object:Gem::Dependency
86
86
  name: inversion
87
- requirement: &70139550818880 !ruby/object:Gem::Requirement
87
+ requirement: &70272015623300 !ruby/object:Gem::Requirement
88
88
  none: false
89
89
  requirements:
90
90
  - - ~>
@@ -92,10 +92,10 @@ dependencies:
92
92
  version: '0.8'
93
93
  type: :runtime
94
94
  prerelease: false
95
- version_requirements: *70139550818880
95
+ version_requirements: *70272015623300
96
96
  - !ruby/object:Gem::Dependency
97
97
  name: mongrel2
98
- requirement: &70139550818380 !ruby/object:Gem::Requirement
98
+ requirement: &70272015622700 !ruby/object:Gem::Requirement
99
99
  none: false
100
100
  requirements:
101
101
  - - ~>
@@ -103,10 +103,10 @@ dependencies:
103
103
  version: '0.20'
104
104
  type: :runtime
105
105
  prerelease: false
106
- version_requirements: *70139550818380
106
+ version_requirements: *70272015622700
107
107
  - !ruby/object:Gem::Dependency
108
108
  name: uuidtools
109
- requirement: &70139550817900 !ruby/object:Gem::Requirement
109
+ requirement: &70272015682300 !ruby/object:Gem::Requirement
110
110
  none: false
111
111
  requirements:
112
112
  - - ~>
@@ -114,10 +114,10 @@ dependencies:
114
114
  version: '2.1'
115
115
  type: :runtime
116
116
  prerelease: false
117
- version_requirements: *70139550817900
117
+ version_requirements: *70272015682300
118
118
  - !ruby/object:Gem::Dependency
119
119
  name: configurability
120
- requirement: &70139550877520 !ruby/object:Gem::Requirement
120
+ requirement: &70272015681780 !ruby/object:Gem::Requirement
121
121
  none: false
122
122
  requirements:
123
123
  - - ~>
@@ -125,10 +125,10 @@ dependencies:
125
125
  version: '1.0'
126
126
  type: :runtime
127
127
  prerelease: false
128
- version_requirements: *70139550877520
128
+ version_requirements: *70272015681780
129
129
  - !ruby/object:Gem::Dependency
130
130
  name: pluginfactory
131
- requirement: &70139550876960 !ruby/object:Gem::Requirement
131
+ requirement: &70272015681280 !ruby/object:Gem::Requirement
132
132
  none: false
133
133
  requirements:
134
134
  - - ~>
@@ -136,10 +136,10 @@ dependencies:
136
136
  version: '1.0'
137
137
  type: :runtime
138
138
  prerelease: false
139
- version_requirements: *70139550876960
139
+ version_requirements: *70272015681280
140
140
  - !ruby/object:Gem::Dependency
141
141
  name: hoe-mercurial
142
- requirement: &70139550876400 !ruby/object:Gem::Requirement
142
+ requirement: &70272015680760 !ruby/object:Gem::Requirement
143
143
  none: false
144
144
  requirements:
145
145
  - - ~>
@@ -147,10 +147,10 @@ dependencies:
147
147
  version: 1.4.0
148
148
  type: :development
149
149
  prerelease: false
150
- version_requirements: *70139550876400
150
+ version_requirements: *70272015680760
151
151
  - !ruby/object:Gem::Dependency
152
152
  name: hoe-manualgen
153
- requirement: &70139550875880 !ruby/object:Gem::Requirement
153
+ requirement: &70272015680200 !ruby/object:Gem::Requirement
154
154
  none: false
155
155
  requirements:
156
156
  - - ~>
@@ -158,10 +158,10 @@ dependencies:
158
158
  version: 0.3.0
159
159
  type: :development
160
160
  prerelease: false
161
- version_requirements: *70139550875880
161
+ version_requirements: *70272015680200
162
162
  - !ruby/object:Gem::Dependency
163
163
  name: hoe-highline
164
- requirement: &70139550875380 !ruby/object:Gem::Requirement
164
+ requirement: &70272015679720 !ruby/object:Gem::Requirement
165
165
  none: false
166
166
  requirements:
167
167
  - - ~>
@@ -169,10 +169,10 @@ dependencies:
169
169
  version: 0.1.0
170
170
  type: :development
171
171
  prerelease: false
172
- version_requirements: *70139550875380
172
+ version_requirements: *70272015679720
173
173
  - !ruby/object:Gem::Dependency
174
174
  name: rdoc
175
- requirement: &70139550874860 !ruby/object:Gem::Requirement
175
+ requirement: &70272015679160 !ruby/object:Gem::Requirement
176
176
  none: false
177
177
  requirements:
178
178
  - - ~>
@@ -180,10 +180,10 @@ dependencies:
180
180
  version: '3.10'
181
181
  type: :development
182
182
  prerelease: false
183
- version_requirements: *70139550874860
183
+ version_requirements: *70272015679160
184
184
  - !ruby/object:Gem::Dependency
185
185
  name: hoe-deveiate
186
- requirement: &70139550874320 !ruby/object:Gem::Requirement
186
+ requirement: &70272015678660 !ruby/object:Gem::Requirement
187
187
  none: false
188
188
  requirements:
189
189
  - - ~>
@@ -191,10 +191,10 @@ dependencies:
191
191
  version: '0.1'
192
192
  type: :development
193
193
  prerelease: false
194
- version_requirements: *70139550874320
194
+ version_requirements: *70272015678660
195
195
  - !ruby/object:Gem::Dependency
196
196
  name: simplecov
197
- requirement: &70139550873780 !ruby/object:Gem::Requirement
197
+ requirement: &70272015678180 !ruby/object:Gem::Requirement
198
198
  none: false
199
199
  requirements:
200
200
  - - ~>
@@ -202,10 +202,10 @@ dependencies:
202
202
  version: '0.6'
203
203
  type: :development
204
204
  prerelease: false
205
- version_requirements: *70139550873780
205
+ version_requirements: *70272015678180
206
206
  - !ruby/object:Gem::Dependency
207
207
  name: hoe
208
- requirement: &70139550873300 !ruby/object:Gem::Requirement
208
+ requirement: &70272015677640 !ruby/object:Gem::Requirement
209
209
  none: false
210
210
  requirements:
211
211
  - - ~>
@@ -213,7 +213,7 @@ dependencies:
213
213
  version: '3.0'
214
214
  type: :development
215
215
  prerelease: false
216
- version_requirements: *70139550873300
216
+ version_requirements: *70272015677640
217
217
  description: ! 'Strelka is a framework for creating and deploying Mongrel2 web applications
218
218
 
219
219
  in Ruby, and for managing a Mongrel2 cluster.
metadata.gz.sig CHANGED
Binary file