strelka 0.5.0 → 0.6.0.pre.409

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e6d4fe519bbd4afaacce50262948b7a079041378
4
- data.tar.gz: 8c38f999384187837c9b15b9786c60a8099aa4fe
3
+ metadata.gz: 50a4d91af69f2c2c769b0083c519c0236f507de6
4
+ data.tar.gz: ea34b00f822a1844b3b71d60c3dd6ab8217d4c23
5
5
  SHA512:
6
- metadata.gz: 367d122a8c1ca23bb8e49a172e273a5a2b6baba2f0bdae38f576871649ae76637dcd75cf90d3f926852010058c7fab7b9d4ca081da5e056b5d3d1cf91169ff3c
7
- data.tar.gz: 7da4ade4e80c6a066e20d20748167f583f2536ae18d078798db28a428742f52c76c57ff527e5dfa400f81a175a3cad9988d96b9658f00c0ff0b74fee54aa051d
6
+ metadata.gz: 664324eea627f727cef57d61a5b1e8e274a55cb19fdbc1acb7a73ec7b6db70d57247ecb65acf08065b7678d6daf7d1b4607c839b4e5b1f6029884ffa95028dc2
7
+ data.tar.gz: 328780a90b04272bc1b2bdb57735bcd9b7d06a3ea651e28cee8ed0beb2d283ba719d0e599f3e265e0de7cd2be40176671c43a0d77dfb387daff4a249fae8f6b3
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/ChangeLog CHANGED
@@ -1,9 +1,113 @@
1
+ 2013-06-12 Michael Granger <ged@FaerieMUD.org>
2
+
3
+ * Rakefile:
4
+ Add Mahlon (finally) as an author
5
+ [d0a7eba63c10] [tip]
6
+
7
+ * lib/strelka/httprequest.rb, spec/strelka/httprequest_spec.rb:
8
+ Make HTTPRequest#params always return a Hash
9
+ [ad9220ddef52]
10
+
11
+ * .rvm.gems:
12
+ Bump the safe_yaml version to the latest.
13
+ [dbac1c7bdd06]
14
+
15
+ 2013-06-07 Michael Granger <ged@FaerieMUD.org>
16
+
17
+ * .rvm.gems, Rakefile:
18
+ Bump dependency on Loggability and Configurability
19
+ [9ec05ec558e5]
20
+
21
+ 2013-05-31 Michael Granger <ged@FaerieMUD.org>
22
+
23
+ * lib/strelka/app/restresources.rb:
24
+ Add some planned features to restresources
25
+ [c068b5d7039e]
26
+
27
+ * .rvm.gems:
28
+ Fix the rspec version in the RMV gemset
29
+ [da790bc36db7]
30
+
31
+ * .rvm.gems, Rakefile, lib/strelka/httprequest.rb,
32
+ lib/strelka/session/db.rb, spec/strelka/httprequest_spec.rb:
33
+ Use the safe_yaml gem for loading untrusted request bodies.
34
+ [ce0387824c10] [github/master]
35
+
36
+ * lib/strelka/paramvalidator.rb, spec/strelka/paramvalidator_spec.rb:
37
+ Fix validator for literal "false" (via JSON)
38
+ [b59828d371a8]
39
+
40
+ 2013-05-17 Michael Granger <ged@FaerieMUD.org>
41
+
42
+ * .hgtags:
43
+ Added tag v0.5.0 for changeset 600f4e4d8f65
44
+ [762c320af7d0]
45
+
46
+ * .hgsigs:
47
+ Added signature for changeset 80db7acd42dc
48
+ [600f4e4d8f65] [v0.5.0]
49
+
50
+ * History.rdoc, lib/strelka.rb:
51
+ Bump the minor version and update history.
52
+ [80db7acd42dc]
53
+
54
+ * experiments/codeobjects.rb:
55
+ Add an experiment
56
+ [96d7a4bdc444]
57
+
58
+ * lib/strelka/paramvalidator.rb, spec/strelka/paramvalidator_spec.rb:
59
+ Add :datetime builtin validator
60
+ [54367e5f3cee]
61
+
62
+ * lib/strelka/app/restresources.rb:
63
+ Add checklist for planned features to restresource header
64
+ [a12acfcd0108]
65
+
66
+ 2013-05-08 Michael Granger <ged@FaerieMUD.org>
67
+
68
+ * lib/strelka/paramvalidator.rb, spec/strelka/paramvalidator_spec.rb:
69
+ Add builtin validators for various checksums.
70
+ [6d2e2cfbd5f3]
71
+
72
+ 2013-05-02 Michael Granger <ged@FaerieMUD.org>
73
+
74
+ * lib/strelka/app/negotiation.rb,
75
+ lib/strelka/httpresponse/negotiation.rb,
76
+ spec/strelka/app/negotiation_spec.rb,
77
+ spec/strelka/httpresponse/negotiation_spec.rb:
78
+ Wire up custom mediatype handlers to content negotiation. Fixes #5.
79
+ [6a0e777a42ad]
80
+
81
+ 2013-03-28 Michael Granger <ged@FaerieMUD.org>
82
+
83
+ * .rvm.gems, Rakefile:
84
+ Bump Pluggability dependency
85
+ [cae6b252a20b]
86
+
1
87
  2013-03-26 Michael Granger <ged@FaerieMUD.org>
2
88
 
89
+ * .hgtags:
90
+ Added tag v0.4.0 for changeset bf131e4f535c
91
+ [84261d71f9ac]
92
+
93
+ * .hgsigs:
94
+ Added signature for changeset 49ae27e4588e
95
+ [bf131e4f535c] [v0.4.0]
96
+
97
+ * History.rdoc, lib/strelka.rb:
98
+ Bump minor version, update history.
99
+ [49ae27e4588e]
100
+
101
+ * lib/strelka.rb, lib/strelka/app.rb, spec/strelka/app_spec.rb,
102
+ spec/strelka_spec.rb:
103
+ Handle Strelka::App subclass inheritance, add Strelka::App syntactic
104
+ sugar.
105
+ [e43f773141e5]
106
+
3
107
  * bin/strelka, lib/strelka/app.rb:
4
108
  Pull app finder code from bin/strelka up into a Strelka::App class
5
109
  method.
6
- [715de56560f6] [tip]
110
+ [715de56560f6]
7
111
 
8
112
  * .rvm.gems, Rakefile:
9
113
  Update deps, add fivefish doc option only in development
@@ -67,7 +171,7 @@
67
171
 
68
172
  * .rvm.gems, Rakefile:
69
173
  Update dependency for configurability.
70
- [8e7f432be135] [github/master]
174
+ [8e7f432be135]
71
175
 
72
176
  2013-02-27 Michael Granger <ged@FaerieMUD.org>
73
177
 
data/History.rdoc CHANGED
@@ -1,3 +1,14 @@
1
+ == v0.6.0 [2013-06-12] Michael Granger <ged@FaerieMUD.org>
2
+
3
+ - Bump dependency on Loggability and Configurability
4
+ - Add some planned features to restresources
5
+ - Fix the rspec version in the RMV gemset
6
+ - Use the safe_yaml gem for loading untrusted request bodies.
7
+ - Fix validator for literal "false" (via JSON)
8
+ - Change HTTPRequest#params to consistently return a Hash, regardless of
9
+ whether or not the request body is one.
10
+
11
+
1
12
  == v0.5.0 [2013-05-17] Michael Granger <ged@FaerieMUD.org>
2
13
 
3
14
  - Add :datetime builtin validator
data/Rakefile CHANGED
@@ -19,22 +19,25 @@ hoespec = Hoe.spec 'strelka' do
19
19
  self.history_file = 'History.rdoc'
20
20
  self.extra_rdoc_files = FileList[ '*.rdoc' ]
21
21
 
22
+ self.developer 'Mahlon E. Smith', 'mahlon@martini.nu'
22
23
  self.developer 'Michael Granger', 'ged@FaerieMUD.org'
23
24
 
24
25
  self.dependency 'configurability', '~> 2.0'
25
26
  self.dependency 'foreman', '~> 0.62'
26
27
  self.dependency 'highline', '~> 1.6'
27
28
  self.dependency 'inversion', '~> 0.12'
28
- self.dependency 'loggability', '~> 0.5'
29
+ self.dependency 'loggability', '~> 0.6'
29
30
  self.dependency 'mongrel2', '~> 0.36'
30
31
  self.dependency 'pluggability', '~> 0.2'
31
32
  self.dependency 'sysexits', '~> 1.1'
32
33
  self.dependency 'trollop', '~> 2.0'
33
34
  self.dependency 'uuidtools', '~> 2.1'
35
+ self.dependency 'safe_yaml', '~> 0.9'
34
36
 
35
- self.dependency 'hoe-deveiate', '~> 0.1', :developer
36
- self.dependency 'simplecov', '~> 0.7', :developer
37
- self.dependency 'rdoc-generator-fivefish', '~> 0.2', :developer
37
+ self.dependency 'hoe-deveiate', '~> 0.1', :developer
38
+ self.dependency 'rspec', '~> 0.14', :developer
39
+ self.dependency 'simplecov', '~> 0.7', :developer
40
+ self.dependency 'rdoc-generator-fivefish', '~> 0.2', :developer
38
41
 
39
42
  self.spec_extras[:licenses] = ["BSD"]
40
43
  self.spec_extras[:rdoc_options] = [
data/lib/strelka.rb CHANGED
@@ -24,10 +24,10 @@ module Strelka
24
24
  log_as :strelka
25
25
 
26
26
  # Library version constant
27
- VERSION = '0.5.0'
27
+ VERSION = '0.6.0'
28
28
 
29
29
  # Version-control revision constant
30
- REVISION = %q$Revision: 80db7acd42dc $
30
+ REVISION = %q$Revision: a043d61c759c $
31
31
 
32
32
  require 'strelka/constants'
33
33
  require 'strelka/exceptions'
@@ -47,6 +47,8 @@ require 'strelka/app' unless defined?( Strelka::App )
47
47
  #
48
48
  # [√] Composite resources generated from associations
49
49
  # [ ] Honor If-unmodified-since and If-match headers
50
+ # [ ] Support the 'fields' parameter for GET /collection
51
+ # [ ] Support reverse-ordering (via '-fieldname'?)
50
52
  # [ ] Caching support (ETag, If-modified-since)
51
53
  # [ ] Means of tailoring responses for requests for which the response
52
54
  # isn't clearly specified in the RFC (DELETE /resource)
@@ -3,7 +3,7 @@
3
3
  # encoding: utf-8
4
4
 
5
5
  require 'yajl'
6
- require 'yaml'
6
+ require 'safe_yaml'
7
7
  require 'uri'
8
8
  require 'loggability'
9
9
 
@@ -127,24 +127,32 @@ class Strelka::HTTPRequest < Mongrel2::HTTPRequest
127
127
 
128
128
  ### Parse the request parameters and return them as a Hash. For GET requests, these are
129
129
  ### taken from the query arguments. For requests that commonly
130
- ### contain an entity-body, try and parse that.
130
+ ### contain an entity-body, this method will attempt to parse that.
131
131
  ###
132
132
  ### # For a handler with a route of '/user', for the request:
133
133
  ### # "GET /user/1/profile?checkbox=1&checkbox=2&text=foo HTTP/1.1"
134
134
  ### # r.params
135
135
  ### # => {"checkbox"=>["1", "2"], "text"=>"foo"}
136
+ ###
137
+ ### If the request body is not a Hash, an empty Hash with the body's value as the default
138
+ ### value will be returned instead.
136
139
  def params
137
140
  unless @params
141
+ value = nil
142
+
138
143
  case self.verb
139
144
  when :GET, :HEAD
140
- @params = self.parse_query_args
145
+ value = self.parse_query_args
141
146
  when :POST, :PUT
142
- @params = self.parse_form_data
147
+ value = self.parse_form_data
143
148
  when :TRACE
144
149
  self.log.debug "No parameters for a TRACE request."
145
150
  else
146
- @params = self.parse_form_data if self.content_type
151
+ value = self.parse_form_data if self.content_type
147
152
  end
153
+
154
+ value = Hash.new( value ) unless value.is_a?( Hash )
155
+ @params = value
148
156
  end
149
157
 
150
158
  return @params
@@ -203,7 +211,7 @@ class Strelka::HTTPRequest < Mongrel2::HTTPRequest
203
211
  when 'application/json', 'text/javascript'
204
212
  return Yajl.load( self.body )
205
213
  when 'text/x-yaml', 'application/x-yaml'
206
- return YAML.load( self.body )
214
+ return YAML.load( self.body, safe: true )
207
215
  when 'multipart/form-data'
208
216
  boundary = self.content_type[ /\bboundary=(\S+)/, 1 ] or
209
217
  raise Strelka::ParseError, "no boundary found for form data: %p" %
@@ -728,6 +728,8 @@ class Strelka::ParamValidator
728
728
  params = stringify_keys( params )
729
729
  @fields = deep_copy( params )
730
730
 
731
+ self.log.debug "Starting validation with fields: %p" % [ @fields ]
732
+
731
733
  # Use the constraints list to extract all the parameters that have corresponding
732
734
  # constraints
733
735
  self.constraints.each do |field, constraint|
@@ -751,7 +753,7 @@ class Strelka::ParamValidator
751
753
  ### the given +value+, and add the field to the appropriate field list based on the
752
754
  ### result.
753
755
  def apply_constraint( constraint, value )
754
- if value
756
+ if !value.nil?
755
757
  result = constraint.apply( value, self.untaint_all? )
756
758
 
757
759
  if !result.nil?
@@ -807,9 +809,11 @@ class Strelka::ParamValidator
807
809
  def valid
808
810
  self.validate unless self.validated?
809
811
 
812
+ self.log.debug "Building valid fields hash from raw data: %p" % [ @valid ]
810
813
  unless @parsed_params
811
814
  @parsed_params = {}
812
815
  for key, value in @valid
816
+ self.log.debug " adding %s: %p" % [ key, value ]
813
817
  value = [ value ] if key.to_s.end_with?( '[]' )
814
818
  if key.to_s.include?( '[' )
815
819
  build_deep_hash( value, @parsed_params, get_levels(key.to_s) )
@@ -87,7 +87,11 @@ class Strelka::Session::Db < Strelka::Session::Default
87
87
  ### Load a session instance from storage using the given +session_id+.
88
88
  def self::load( session_id )
89
89
  session_row = self.dataset.filter( :session_id => session_id ).first
90
- session = session_row.nil? ? {} : YAML.load( session_row[:session] )
90
+ session = if session_row.nil?
91
+ {}
92
+ else
93
+ YAML.load( session_row[:session], safe: false )
94
+ end
91
95
  return new( session_id, session )
92
96
  end
93
97
 
@@ -38,43 +38,43 @@ describe Strelka::HTTPRequest do
38
38
  end
39
39
 
40
40
  it "knows what the request's parsed URI is" do
41
- @req.uri.should be_a( URI )
42
- @req.uri.to_s.should == 'http://localhost:8080/directory/userinfo/ged'
41
+ expect( @req.uri ).to be_a( URI )
42
+ expect( @req.uri.to_s ).to eq( 'http://localhost:8080/directory/userinfo/ged' )
43
43
  end
44
44
 
45
45
  it "knows what the request's parsed URI is when it's an HTTPS request" do
46
46
  @req.headers.url_scheme = 'https'
47
- @req.uri.should be_a( URI )
48
- @req.uri.to_s.should == 'https://localhost:8080/directory/userinfo/ged'
47
+ expect( @req.uri ).to be_a( URI )
48
+ expect( @req.uri.to_s ).to eq( 'https://localhost:8080/directory/userinfo/ged' )
49
49
  end
50
50
 
51
51
  it "doesn't error when run under earlier versions of Mongrel that didn't set the " +
52
52
  "url-scheme header" do
53
53
  @req.headers.url_scheme = nil
54
- @req.uri.should be_a( URI )
55
- @req.uri.to_s.should == 'http://localhost:8080/directory/userinfo/ged'
54
+ expect( @req.uri ).to be_a( URI )
55
+ expect( @req.uri.to_s ).to eq( 'http://localhost:8080/directory/userinfo/ged' )
56
56
  end
57
57
 
58
58
  it "knows what Mongrel2 route it followed" do
59
- @req.pattern.should == '/directory'
59
+ expect( @req.pattern ).to eq( '/directory' )
60
60
  end
61
61
 
62
62
  it "knows what the URI of the route handling the request is" do
63
- @req.base_uri.should be_a( URI )
64
- @req.base_uri.to_s.should == 'http://localhost:8080/directory'
63
+ expect( @req.base_uri ).to be_a( URI )
64
+ expect( @req.base_uri.to_s ).to eq( 'http://localhost:8080/directory' )
65
65
  end
66
66
 
67
67
  it "knows what the path of the request past its route is" do
68
- @req.app_path.should == '/userinfo/ged'
68
+ expect( @req.app_path ).to eq( '/userinfo/ged' )
69
69
  end
70
70
 
71
71
  it "knows what HTTP verb the request used" do
72
- @req.verb.should == :GET
72
+ expect( @req.verb ).to eq(:GET)
73
73
  end
74
74
 
75
75
  it "can get and set notes for communication between plugins" do
76
- @req.notes.should be_a( Hash )
77
- @req.notes[:routing].should be_a( Hash )
76
+ expect( @req.notes ).to be_a( Hash )
77
+ expect( @req.notes[:routing] ).to be_a( Hash )
78
78
  end
79
79
 
80
80
  it "can redirect the request to a different URI" do
@@ -97,21 +97,21 @@ describe Strelka::HTTPRequest do
97
97
  end
98
98
 
99
99
  it "knows what the request's parsed URI is" do
100
- @req.uri.should be_a( URI )
101
- @req.uri.to_s.should == 'http://localhost:8080/directory/user%20info/ged%00'
100
+ expect( @req.uri ).to be_a( URI )
101
+ expect( @req.uri.to_s ).to eq( 'http://localhost:8080/directory/user%20info/ged%00' )
102
102
  end
103
103
 
104
104
  it "knows what Mongrel2 route it followed" do
105
- @req.pattern.should == "/directory"
105
+ expect( @req.pattern ).to eq('/directory')
106
106
  end
107
107
 
108
108
  it "knows what the URI of the route handling the request is" do
109
- @req.base_uri.should be_a( URI )
110
- @req.base_uri.to_s.should == 'http://localhost:8080/directory'
109
+ expect( @req.base_uri ).to be_a( URI )
110
+ expect( @req.base_uri.to_s ).to eq( 'http://localhost:8080/directory' )
111
111
  end
112
112
 
113
113
  it "knows what the path of the request past its route is" do
114
- @req.app_path.should == "/user info/ged\0"
114
+ expect( @req.app_path ).to eq("/user info/ged\0")
115
115
  end
116
116
 
117
117
  end
@@ -124,26 +124,26 @@ describe Strelka::HTTPRequest do
124
124
  end
125
125
 
126
126
  it "knows what the request's parsed URI is" do
127
- @req.uri.should be_a( URI )
128
- @req.uri.to_s.should == 'http://localhost:8080/directory/userinfo/ged?limit=10;offset=20'
127
+ expect( @req.uri ).to be_a( URI )
128
+ expect( @req.uri.to_s ).to eq( 'http://localhost:8080/directory/userinfo/ged?limit=10;offset=20' )
129
129
  end
130
130
 
131
131
  it "knows what Mongrel2 route it followed" do
132
- @req.pattern.should == '/directory'
132
+ expect( @req.pattern ).to eq( '/directory' )
133
133
  end
134
134
 
135
135
  it "knows what the URI of the route handling the request is" do
136
- @req.base_uri.should be_a( URI )
137
- @req.base_uri.to_s.should == 'http://localhost:8080/directory'
136
+ expect( @req.base_uri ).to be_a( URI )
137
+ expect( @req.base_uri.to_s ).to eq( 'http://localhost:8080/directory' )
138
138
  end
139
139
 
140
140
  it "knows what the path of the request past its route is" do
141
- @req.app_path.should == '/userinfo/ged'
142
- @req.app_path.should == '/userinfo/ged' # make sure the slice is non-destructive
141
+ expect( @req.app_path ).to eq( '/userinfo/ged' )
142
+ expect( @req.app_path ).to eq( '/userinfo/ged' ) # make sure the slice is non-destructive
143
143
  end
144
144
 
145
145
  it "knows what HTTP verb the request used" do
146
- @req.verb.should == :GET
146
+ expect( @req.verb ).to eq(:GET)
147
147
  end
148
148
 
149
149
  end
@@ -154,53 +154,53 @@ describe Strelka::HTTPRequest do
154
154
  context "a GET request" do
155
155
  it "has an empty params Hash if the request doesn't have a query string " do
156
156
  req = @request_factory.get( '/directory/path' )
157
- req.params.should == {}
157
+ expect( req.params ).to eq({})
158
158
  end
159
159
 
160
160
  it "has a params Hash with the key/value pair in it if the query string has " +
161
161
  "one key/value pair" do
162
162
  req = @request_factory.get( '/directory/path?foo=bar' )
163
- req.params.should == {'foo' => 'bar'}
163
+ expect( req.params ).to eq({'foo' => 'bar'})
164
164
  end
165
165
 
166
166
  it "has a params Hash with the key/value pairs in it if the query string has " +
167
167
  "two pairs seperated with a an ampersand" do
168
168
  req = @request_factory.get( '/directory/path?foo=bar&chunky=pork' )
169
- req.params.should == {
169
+ expect( req.params ).to eq({
170
170
  'foo' => 'bar',
171
171
  'chunky' => 'pork',
172
- }
172
+ })
173
173
  end
174
174
 
175
175
  it "has a params Hash with the key/value pairs in it if the query string has " +
176
176
  "two pairs with a semi-colon separator" do
177
177
  req = @request_factory.get( '/directory/path?potato=gun;legume=bazooka' )
178
- req.params.should == {
178
+ expect( req.params ).to eq({
179
179
  'potato' => 'gun',
180
180
  'legume' => 'bazooka',
181
- }
181
+ })
182
182
  end
183
183
 
184
184
  it "has a params Hash with an Array of values if the query string has two values " +
185
185
  "for the same key" do
186
186
  req = @request_factory.get( '/directory/path?foo=bar&foo=baz' )
187
- req.params.should == {
187
+ expect( req.params ).to eq({
188
188
  'foo' => ['bar', 'baz'],
189
- }
189
+ })
190
190
  end
191
191
 
192
192
  it "has a params Hash with one Array of values and a scalar value if the query " +
193
193
  "string has three values and two keys" do
194
194
  req = @request_factory.get( '/directory/path?foo=bar&foo=pork;mirror=sequel' )
195
- req.params.should == {
195
+ expect( req.params ).to eq({
196
196
  'foo' => ['bar', 'pork'],
197
197
  'mirror' => 'sequel',
198
- }
198
+ })
199
199
  end
200
200
 
201
201
  it "treats a malformed query string as the lack of a query" do
202
202
  req = @request_factory.get( '/directory/path?foo' )
203
- req.params.should == {}
203
+ expect( req.params ).to eq({})
204
204
  end
205
205
  end
206
206
 
@@ -211,8 +211,8 @@ describe Strelka::HTTPRequest do
211
211
  end
212
212
 
213
213
 
214
- it "Doesn't respond with a 400 (BAD_REQUEST)" do
215
- @req.params.should be_nil
214
+ it "params are all nil" do
215
+ expect( @req.params[:foo] ).to be_nil
216
216
  end
217
217
  end
218
218
 
@@ -231,7 +231,7 @@ describe Strelka::HTTPRequest do
231
231
  %{I really don't like this path.\r\n} +
232
232
  %{----a_boundary--\r\n}
233
233
 
234
- @req.params.should == {'reason' => "I really don't like this path."}
234
+ expect( @req.params ).to eq({'reason' => "I really don't like this path."})
235
235
  end
236
236
 
237
237
  end
@@ -267,46 +267,46 @@ describe Strelka::HTTPRequest do
267
267
 
268
268
  it "returns an empty Hash for an empty body" do
269
269
  @req.body = ''
270
- @req.params.should == {}
270
+ expect( @req.params['foo'] ).to be_nil
271
271
  end
272
272
 
273
273
  it "has a params Hash with the key/value pair in it if the form data has " +
274
274
  "one key/value pair" do
275
275
  @req.body = 'foo=bar'
276
- @req.params.should == {'foo' => 'bar'}
276
+ expect( @req.params ).to eq({'foo' => 'bar'})
277
277
  end
278
278
 
279
279
  it "has a params Hash with the key/value pairs in it if the form data has " +
280
280
  "two pairs seperated with a an ampersand" do
281
281
  @req.body = 'foo=bar&chunky=pork'
282
- @req.params.should == {
282
+ expect( @req.params ).to eq({
283
283
  'foo' => 'bar',
284
284
  'chunky' => 'pork',
285
- }
285
+ })
286
286
  end
287
287
 
288
288
  it "has a params Hash with the key/value pairs in it if the form data has " +
289
289
  "two pairs with a semi-colon separator" do
290
290
  @req.body = 'potato=gun;legume=bazooka'
291
- @req.params.should == {
291
+ expect( @req.params ).to eq({
292
292
  'potato' => 'gun',
293
293
  'legume' => 'bazooka',
294
- }
294
+ })
295
295
  end
296
296
 
297
297
  it "has a params Hash with an Array of values if the form data has two values " +
298
298
  "for the same key" do
299
299
  @req.body = 'foo=bar&foo=baz'
300
- @req.params.should == { 'foo' => ['bar', 'baz'] }
300
+ expect( @req.params ).to eq({ 'foo' => ['bar', 'baz'] })
301
301
  end
302
302
 
303
303
  it "has a params Hash with one Array of values and a scalar value if the form " +
304
304
  "data has three values and two keys" do
305
305
  @req.body = 'foo=bar&foo=pork;mirror=sequel'
306
- @req.params.should == {
306
+ expect( @req.params ).to eq({
307
307
  'foo' => ['bar', 'pork'],
308
308
  'mirror' => 'sequel',
309
- }
309
+ })
310
310
  end
311
311
  end
312
312
 
@@ -324,7 +324,7 @@ describe Strelka::HTTPRequest do
324
324
  %{An Impossible Task\r\n} +
325
325
  %{----a_boundary--\r\n}
326
326
 
327
- @req.params.should == {'title' => 'An Impossible Task'}
327
+ expect( @req.params ).to eq({'title' => 'An Impossible Task'})
328
328
  end
329
329
 
330
330
  end
@@ -336,18 +336,77 @@ describe Strelka::HTTPRequest do
336
336
  'Content-type' => 'application/json' )
337
337
  end
338
338
 
339
- it "returns nil for an empty body" do
339
+ it "returns a default params hash for an empty body" do
340
340
  @req.body = ''
341
- @req.params.should be_nil()
341
+ expect( @req.params[:foo] ).to be_nil
342
342
  end
343
343
 
344
- it "has the JSON data as the params if it has a body with JSON object in it" do
344
+ it "has the JSON data as the params if it has a body with a JSON object in it" do
345
345
  data = {
346
346
  'animal' => 'ducky',
347
347
  'adjectives' => ['fluffy', 'puddle-ey'],
348
348
  }
349
349
  @req.body = Yajl.dump( data )
350
- @req.params.should == data
350
+ expect( @req.params ).to eq( data )
351
+ end
352
+
353
+ it "has the array as the default param value if the body has a JSON array in it" do
354
+ data = %w[an array of stuff]
355
+ @req.body = Yajl.dump( data )
356
+ expect( @req.params[:foo] ).to eq( data )
357
+ end
358
+
359
+ end
360
+
361
+ context "a POST request with a 'text/x-yaml' body" do
362
+ before( :each ) do
363
+ @req = @request_factory.post( '/directory/path', '',
364
+ 'Content-type' => 'text/x-yaml' )
365
+ end
366
+
367
+ it "returns a params hash in which all values are nil for an empty body" do
368
+ @req.body = ''
369
+ expect( @req.params[:profile] ).to be_false
370
+ end
371
+
372
+ it "has the YAML data as the params if it has a body with YAML in it" do
373
+ data = {
374
+ 'animal' => 'ducky',
375
+ 'adjectives' => ['fluffy', 'puddle-ey'],
376
+ }
377
+ @req.body = data.to_yaml
378
+ expect( @req.params ).to eq( data )
379
+ end
380
+
381
+ it "doesn't deserialize Symbols from the YAML body" do
382
+ data = {
383
+ animal: 'horsie',
384
+ adjectives: ['cuddly', 'stompery'],
385
+ }
386
+ @req.body = data.to_yaml
387
+
388
+ expect( @req.params.keys ).not_to include( :animal, :adjectives )
389
+ end
390
+
391
+ it "doesn't deserialize unsafe objects" do
392
+ obj = OpenStruct.new
393
+ obj.foo = 'stuff'
394
+ obj.bar = 'some other stuff'
395
+ @req.body = obj.to_yaml
396
+
397
+ expect( @req.params ).not_to be_a( OpenStruct )
398
+ expect( @req.params ).to eq({
399
+ "table" => {
400
+ ":foo" => "stuff",
401
+ ":bar" => "some other stuff"
402
+ },
403
+ "modifiable"=>true
404
+ })
405
+ end
406
+
407
+ it "handles null entity bodies by returning an empty Hash" do
408
+ @req.body = ''
409
+ expect( @req.params ).to eq( {} )
351
410
  end
352
411
 
353
412
  end
@@ -364,16 +423,16 @@ describe Strelka::HTTPRequest do
364
423
 
365
424
  it "parses a single cookie into a cookieset with the cookie in it" do
366
425
  @req.header.cookie = 'foom=chuckUfarly'
367
- @req.cookies.should have( 1 ).member
368
- @req.cookies['foom'].value.should == 'chuckUfarly'
426
+ expect( @req.cookies ).to have( 1 ).member
427
+ expect( @req.cookies['foom'].value ).to eq( 'chuckUfarly' )
369
428
  end
370
429
 
371
430
  it "parses multiple cookies into a cookieset with multiple cookies in it" do
372
431
  @req.header.cookie = 'foom=chuckUfarly; glarn=hotchinfalcheck'
373
432
 
374
- @req.cookies.should have( 2 ).members
375
- @req.cookies['foom'].value.should == 'chuckUfarly'
376
- @req.cookies['glarn'].value.should == 'hotchinfalcheck'
433
+ expect( @req.cookies ).to have( 2 ).members
434
+ expect( @req.cookies['foom'].value ).to eq( 'chuckUfarly' )
435
+ expect( @req.cookies['glarn'].value ).to eq( 'hotchinfalcheck' )
377
436
  end
378
437
 
379
438
  end
@@ -508,7 +508,7 @@ describe Strelka::ParamValidator do
508
508
  @validator[:enabled].should be_true()
509
509
  end
510
510
 
511
- it "accepts the value 'false'" do
511
+ it "accepts the string 'false'" do
512
512
  @validator.validate( 'enabled' => 'false' )
513
513
 
514
514
  @validator.should be_okay()
@@ -517,6 +517,15 @@ describe Strelka::ParamValidator do
517
517
  @validator[:enabled].should be_false()
518
518
  end
519
519
 
520
+ it "accepts the literal false value" do
521
+ @validator.validate( 'enabled' => false )
522
+
523
+ @validator.should be_okay()
524
+ @validator.should_not have_errors()
525
+
526
+ @validator[:enabled].should be_false()
527
+ end
528
+
520
529
  it "accepts the value 'f'" do
521
530
  @validator.validate( 'enabled' => 'f' )
522
531
 
@@ -562,6 +571,12 @@ describe Strelka::ParamValidator do
562
571
  @validator[:enabled].should be_nil()
563
572
  end
564
573
 
574
+ it "includes literal false values in the hash of valid data" do
575
+ @validator.validate( 'enabled' => false )
576
+
577
+ @validator.valid.should include( enabled: false )
578
+ end
579
+
565
580
  end
566
581
 
567
582
  describe ":integer constraints" do
@@ -596,6 +611,16 @@ describe Strelka::ParamValidator do
596
611
  @validator[:count].should == -407
597
612
  end
598
613
 
614
+ it "accepts literal integers" do
615
+ @validator.add( :count, :integer )
616
+ @validator.validate( 'count' => 118 )
617
+
618
+ @validator.should be_okay()
619
+ @validator.should_not have_errors()
620
+
621
+ @validator[:count].should == 118
622
+ end
623
+
599
624
  it "rejects non-integers" do
600
625
  @validator.add( :count, :integer )
601
626
  @validator.validate( 'count' => '11.1' )
metadata CHANGED
@@ -1,9 +1,10 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strelka
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0.pre.409
5
5
  platform: ruby
6
6
  authors:
7
+ - Mahlon E. Smith
7
8
  - Michael Granger
8
9
  autorequire:
9
10
  bindir: bin
@@ -30,7 +31,7 @@ cert_chain:
30
31
  6mKCwjpegytE0oifXfF8k75A9105cBnNiMZOe1tXiqYc/exCgWvbggurzDOcRkZu
31
32
  /YSusaiDXHKU2O3Akc3htA==
32
33
  -----END CERTIFICATE-----
33
- date: 2013-05-17 00:00:00.000000000 Z
34
+ date: 2013-06-12 00:00:00.000000000 Z
34
35
  dependencies:
35
36
  - !ruby/object:Gem::Dependency
36
37
  name: configurability
@@ -94,14 +95,14 @@ dependencies:
94
95
  requirements:
95
96
  - - ~>
96
97
  - !ruby/object:Gem::Version
97
- version: '0.5'
98
+ version: '0.6'
98
99
  type: :runtime
99
100
  prerelease: false
100
101
  version_requirements: !ruby/object:Gem::Requirement
101
102
  requirements:
102
103
  - - ~>
103
104
  - !ruby/object:Gem::Version
104
- version: '0.5'
105
+ version: '0.6'
105
106
  - !ruby/object:Gem::Dependency
106
107
  name: mongrel2
107
108
  requirement: !ruby/object:Gem::Requirement
@@ -172,6 +173,20 @@ dependencies:
172
173
  - - ~>
173
174
  - !ruby/object:Gem::Version
174
175
  version: '2.1'
176
+ - !ruby/object:Gem::Dependency
177
+ name: safe_yaml
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ~>
181
+ - !ruby/object:Gem::Version
182
+ version: '0.9'
183
+ type: :runtime
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - ~>
188
+ - !ruby/object:Gem::Version
189
+ version: '0.9'
175
190
  - !ruby/object:Gem::Dependency
176
191
  name: hoe-mercurial
177
192
  requirement: !ruby/object:Gem::Requirement
@@ -228,6 +243,20 @@ dependencies:
228
243
  - - ~>
229
244
  - !ruby/object:Gem::Version
230
245
  version: '0.1'
246
+ - !ruby/object:Gem::Dependency
247
+ name: rspec
248
+ requirement: !ruby/object:Gem::Requirement
249
+ requirements:
250
+ - - ~>
251
+ - !ruby/object:Gem::Version
252
+ version: '0.14'
253
+ type: :development
254
+ prerelease: false
255
+ version_requirements: !ruby/object:Gem::Requirement
256
+ requirements:
257
+ - - ~>
258
+ - !ruby/object:Gem::Version
259
+ version: '0.14'
231
260
  - !ruby/object:Gem::Dependency
232
261
  name: simplecov
233
262
  requirement: !ruby/object:Gem::Requirement
@@ -279,6 +308,7 @@ description: |-
279
308
  one of the first canine space travelers to orbit the Earth and return alive.
280
309
  Her name means "little arrow".
281
310
  email:
311
+ - mahlon@martini.nu
282
312
  - ged@FaerieMUD.org
283
313
  executables:
284
314
  - strelka
metadata.gz.sig CHANGED
Binary file