rack-param 0.1.6 → 0.2.0
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 +4 -4
- data/README.md +146 -25
- data/lib/rack/param.rb +63 -111
- data/rack-param.gemspec +2 -1
- data/spec/coercion_spec.rb +9 -10
- data/spec/rules_spec.rb +2 -2
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ab3d04d1dc5029f30b604be0b2490e16140328c8
|
4
|
+
data.tar.gz: 13b3eb4a749b321419056b59e3a3a5918d8adcd8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 742f43719a390fd85917e14cb3f03897744e79685e05f5b196273a07e9264896e8029b9b624e0c957f26bd3eb3a835269996cd6c4d41bb28ec38fd32942bc780
|
7
|
+
data.tar.gz: f571447e217d3fece1f2c56db92d418e1d751c31e0f113b299e4d626e7f0257f4109cf8e4292418cdd9e77f4923ce1d33fc188e792f112a58da32886d38ced05
|
data/README.md
CHANGED
@@ -2,11 +2,12 @@
|
|
2
2
|
|
3
3
|
Parameter checking and validation for `Rack::Request`. Originally designed to be used with [`Sansom`](http://github.com/fhsjaagshs/fhsjaagshs), but it also works with [`Rack`](http://github.com/rack/rack).
|
4
4
|
|
5
|
-
|
5
|
+
Installation
|
6
|
+
-
|
6
7
|
|
7
8
|
Add this line to your application's Gemfile:
|
8
9
|
|
9
|
-
gem
|
10
|
+
gem "rack-param"
|
10
11
|
|
11
12
|
And then execute:
|
12
13
|
|
@@ -16,39 +17,159 @@ Or install it through `gem`:
|
|
16
17
|
|
17
18
|
$ gem install rack-param
|
18
19
|
|
19
|
-
|
20
|
+
Usage
|
21
|
+
-
|
22
|
+
|
23
|
+
For example:
|
20
24
|
|
21
25
|
require "rack/param"
|
22
26
|
|
23
27
|
r = Rack::Request env # pass your env
|
24
|
-
r.param :
|
28
|
+
r.param :positive, Integer, :min => 0, :required => true
|
25
29
|
|
26
|
-
Now, `r.params` should contain a single entry
|
30
|
+
Now, `r.params` should contain a single entry, regardless of the original request's parameters.
|
27
31
|
|
28
|
-
{
|
32
|
+
{ "positive" => <some Integer> }
|
29
33
|
|
30
|
-
`Rack::Param` patches `Rack::Request#params` to contain only the validated parameters, in coerced form.
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
34
|
+
`Rack::Param` patches `Rack::Request#params` to contain only the validated parameters, in coerced form. If you want the original parameters hash, use the `Rack::Request#raw_params` method.
|
35
|
+
|
36
|
+
Rules
|
37
|
+
-
|
38
|
+
|
39
|
+
Rules are a way of making sure parameters are valid. Rather than type them yourself, use the rules below to
|
40
|
+
|
41
|
+
<table border="0" style="width:100%">
|
42
|
+
<tr>
|
43
|
+
<td><b>Rule</b></td>
|
44
|
+
<td><b>Argument</b></td>
|
45
|
+
<td><b>Default</b></td>
|
46
|
+
<td><b>Description</b></td>
|
47
|
+
</tr>
|
48
|
+
<tr>
|
49
|
+
<td><code>:greater_than</code></td>
|
50
|
+
<td><code>Numeric</code></td>
|
51
|
+
<td>none</td>
|
52
|
+
<td>Self explanatory.</td>
|
53
|
+
</tr>
|
54
|
+
<tr>
|
55
|
+
<td><code>:less_than</code></td>
|
56
|
+
<td><code>Numeric</code></td>
|
57
|
+
<td>none</td>
|
58
|
+
<td>Self explanatory.</td>
|
59
|
+
</tr>
|
60
|
+
<tr>
|
61
|
+
<td><code>:min</code></td>
|
62
|
+
<td><code>Numeric</code></td>
|
63
|
+
<td>none</td>
|
64
|
+
<td>Greater than or equal to.</td>
|
65
|
+
</tr>
|
66
|
+
<tr>
|
67
|
+
<td><code>:max</code></td>
|
68
|
+
<td><code>Numeric</code></td>
|
69
|
+
<td>none</td>
|
70
|
+
<td>Less than or equal to.</td>
|
71
|
+
</tr>
|
72
|
+
<tr>
|
73
|
+
<td><code>:length</code></td>
|
74
|
+
<td><code>Numeric</code></td>
|
75
|
+
<td>none</td>
|
76
|
+
<td>Self explanatory.</td>
|
77
|
+
</tr>
|
78
|
+
<tr>
|
79
|
+
<td><code>:min_length</code></td>
|
80
|
+
<td><code>Numeric</code></td>
|
81
|
+
<td>none</td>
|
82
|
+
<td>Greater than or equal to, using the parameter's length.</td>
|
83
|
+
</tr>
|
84
|
+
<tr>
|
85
|
+
<td><code>:max_length</code></td>
|
86
|
+
<td><code>Numeric</code></td>
|
87
|
+
<td>none</td>
|
88
|
+
<td>Less than or equal to, using the parameter's length.</td>
|
89
|
+
</tr>
|
90
|
+
<tr>
|
91
|
+
<td><code>:in</code></td>
|
92
|
+
<td>Responds to <code>include?</code></td>
|
93
|
+
<td>none</td>
|
94
|
+
<td>Less than or equal to, using the parameter's length.</td>
|
95
|
+
</tr>
|
96
|
+
<tr>
|
97
|
+
<!--TODO: This should be :matches-->
|
98
|
+
<td><code>:regex</code></td>
|
99
|
+
<td>Responds to <code>match</code></td>
|
100
|
+
<td>none</td>
|
101
|
+
<td>Self explanatory.</td>
|
102
|
+
</tr>
|
103
|
+
<tr>
|
104
|
+
<td><code>:validator</code></td>
|
105
|
+
<td>Responds to <code>call</code> with a <i>single</i> argument. Returns <code>true</code> or <code>false</code<</td>
|
106
|
+
<td>none</td>
|
107
|
+
<td>If the argument returns something truthy or <code>true</code>, this rule is true.</td>
|
108
|
+
</tr>
|
109
|
+
</table>
|
110
|
+
|
111
|
+
There are also a couple options used to control parameter checking.
|
112
|
+
|
113
|
+
<table border="0" style="width:100%">
|
114
|
+
<tr>
|
115
|
+
<td><b>Option</b></td>
|
116
|
+
<td><b>Argument</b></td>
|
117
|
+
<td><b>Default</b></td>
|
118
|
+
<td><b>Description</b></td>
|
119
|
+
</tr>
|
120
|
+
<tr>
|
121
|
+
<td><code>:error_message</code></td>
|
122
|
+
<td><code>String</code></td>
|
123
|
+
<td>depends on rule</td>
|
124
|
+
<td>The message to be used when a <code>Rack::ParameterError</code> is raised. It has a specific format: <code>$</code> is the parameter and <code>#</code> is the argument. (ex "Invalid token: $")</td>
|
125
|
+
</tr>
|
126
|
+
<tr>
|
127
|
+
<td><code>:coerce</code></td>
|
128
|
+
<td><code>true</code>/<code>false</code></td>
|
129
|
+
<td><code>true</code></td>
|
130
|
+
<td>Whether or not rack-param coerces the parameter.</td>
|
131
|
+
</tr>
|
132
|
+
<tr>
|
133
|
+
<td><code>:required</code></td>
|
134
|
+
<td><code>true</code>/<code>false</code></td>
|
135
|
+
<td><code>false</code></td>
|
136
|
+
<td>Whether or not the parameter is required.</td>
|
137
|
+
</tr>
|
138
|
+
<tr>
|
139
|
+
<td><code>:default</code></td>
|
140
|
+
<td><code>Object</code></td>
|
141
|
+
<td><code>none</code></td>
|
142
|
+
<td>If the parameter doesn't exist, this value takes its place. It should be a fully coerced value.</td>
|
143
|
+
</tr>
|
144
|
+
<tr>
|
145
|
+
<td><code>:transform</code></td>
|
146
|
+
<td>Responds to <code>call</code> with a <i>single</i> argument. Returns a new value.</td>
|
147
|
+
<td><code>none</code></td>
|
148
|
+
<td>Called to transform a coerced value.</td>
|
149
|
+
</tr>
|
150
|
+
</table>
|
151
|
+
|
152
|
+
Custom Types & Coercion
|
153
|
+
-
|
154
|
+
|
155
|
+
Have a custom type that you want to be able to coerce a value? Write a function whose name is the same as your class. It should take one argument, a `String`. In fact, most classes already have this (like `Integer()`)
|
156
|
+
|
157
|
+
class Money
|
158
|
+
...
|
159
|
+
end
|
160
|
+
|
161
|
+
# somewhere in the global scope (or in `Kernel`)
|
162
|
+
def Money str
|
163
|
+
# turn str into a `Money` and return it
|
164
|
+
end
|
165
|
+
|
166
|
+
Contributing
|
167
|
+
-
|
49
168
|
|
50
169
|
1. Fork it ( https://github.com/sansomrb/rack-param/fork )
|
51
170
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
52
171
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
53
172
|
4. Push to the branch (`git push origin my-new-feature`)
|
54
173
|
5. Create a new Pull Request
|
174
|
+
|
175
|
+
Your changes must pass the rspec test suite.
|
data/lib/rack/param.rb
CHANGED
@@ -4,136 +4,88 @@ require "rack"
|
|
4
4
|
require "time"
|
5
5
|
require "date"
|
6
6
|
|
7
|
-
Boolean =
|
7
|
+
Boolean = Class.new TrueClass # giant hack
|
8
8
|
|
9
9
|
module Rack
|
10
10
|
ParameterError = Class.new StandardError
|
11
11
|
|
12
12
|
class ::String
|
13
|
-
def truthy
|
14
|
-
|
15
|
-
end
|
16
|
-
|
17
|
-
def falsey?
|
18
|
-
(/^(false|f|no|n|0|off)$/ =~ downcase) != nil
|
19
|
-
end
|
13
|
+
def truthy?; (/^(true|t|yes|y|1|on)$/ =~ downcase) != nil; end
|
14
|
+
def falsey?; (/^(false|f|no|n|0|off)$/ =~ downcase) != nil; end
|
20
15
|
end
|
21
16
|
|
22
|
-
class
|
23
|
-
|
24
|
-
|
25
|
-
|
17
|
+
class Rule
|
18
|
+
def self.rule message, █ new message, █ end
|
19
|
+
|
20
|
+
def initialize message, &block
|
21
|
+
@blk = block
|
22
|
+
@msg = message
|
26
23
|
end
|
27
24
|
|
28
|
-
def param
|
29
|
-
|
30
|
-
|
31
|
-
if params_original.member? _name
|
32
|
-
p = Rack::Parameter.new(
|
33
|
-
:name => _name,
|
34
|
-
:value => params_original[_name] || params[_name],
|
35
|
-
:type => type,
|
36
|
-
:conditions => opts
|
37
|
-
)
|
38
|
-
|
39
|
-
raise ParameterError, p.error unless p.valid?
|
40
|
-
params[_name] = p.value
|
41
|
-
end
|
25
|
+
def validate! param, val, emsg=nil
|
26
|
+
raise ParameterError, (emsg || @msg).sub('$',"`#{param}`").sub('#',"`#{val}`") unless @blk.call(param, val)
|
42
27
|
end
|
43
28
|
end
|
44
29
|
|
45
|
-
class
|
46
|
-
|
30
|
+
class Request
|
31
|
+
alias_method :raw_params, :params
|
32
|
+
def params; @processed_parameters ||= {}; end
|
47
33
|
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
@message = message
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.rule message, &block
|
55
|
-
new message, &block
|
56
|
-
end
|
34
|
+
def param name, type, opts={}
|
35
|
+
name = name.to_s
|
36
|
+
opts = Hash[opts.map { |k,v| [k.to_sym,v] }]
|
57
37
|
|
58
|
-
|
59
|
-
|
38
|
+
if raw_params.member? name
|
39
|
+
v = raw_params[name] || params[name]
|
40
|
+
|
41
|
+
if !v.is_a?(type) && ((opts.member?(:coerce) && opts[:coerce]) || !opts.member?(:coerce))
|
42
|
+
begin
|
43
|
+
v = self.class.coercers[type].call type, v
|
44
|
+
rescue StandardError
|
45
|
+
raise ParameterError, "Parameter `#{name}` is not a valid #{type}."
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# will raise an error on an invalid param
|
50
|
+
opts.select { |k,_| self.class.rules.member? k }
|
51
|
+
.each { |k,arg| self.class.rules[k].validate! v, arg, opts[:error_message] }
|
52
|
+
|
53
|
+
v = opts[:transform].to_proc.call v if opts.member?(:transform)
|
54
|
+
params[name] = v
|
55
|
+
else
|
56
|
+
raise ParameterError, "Parameter #{name} is required." if opts.member?(:required) && opts[:required] && !opts.member?(:default)
|
57
|
+
params[name] = opts[:default]
|
60
58
|
end
|
61
59
|
end
|
62
60
|
|
63
|
-
def
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
@
|
74
|
-
@type = _opts.delete :type
|
75
|
-
@value = _opts.delete(:value) || @default
|
76
|
-
@error = process(_opts) unless default?
|
77
|
-
end
|
78
|
-
|
79
|
-
def valid?
|
80
|
-
@error.nil?
|
61
|
+
def self.coercers
|
62
|
+
@coercers ||= {
|
63
|
+
Date => lambda { |t,v| Date.parse v },
|
64
|
+
Time => lambda { |t,v| Time.parse v },
|
65
|
+
DateTime => lambda { |t,v| DateTime.parse v },
|
66
|
+
Array => lambda { |t,v| v.split(',') },
|
67
|
+
Hash => lambda { |t,v| Hash[v.split(',').map { |c| c.split ':', 2 }] },
|
68
|
+
Boolean => lambda { |t,v| v.falsey? ? false : (v.truthy? ? true : raise(StandardError)) }
|
69
|
+
}
|
70
|
+
@coercers.default_proc = lambda { |h, k| h[k] = lambda { |t,v| method(t.to_s.to_sym).call v } }
|
71
|
+
@coercers
|
81
72
|
end
|
82
73
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
unless @value.class == @type || @value.nil?
|
99
|
-
begin
|
100
|
-
@value = case @type.to_s.downcase.to_sym
|
101
|
-
when :date then Date.parse @value
|
102
|
-
when :time then Time.parse @value
|
103
|
-
when :datetime then DateTime.parse @value
|
104
|
-
when :array then @value.split(@delimiter)
|
105
|
-
when :hash then Hash[@value.split(@delimiter).map { |c| c.split @separator, 2 }]
|
106
|
-
when :boolean then (@value.falsey? ? false : @value.truthy? ? true : raise(StandardError))
|
107
|
-
else method(@type.to_s.to_sym).call @value end
|
108
|
-
rescue StandardError => e
|
109
|
-
return "Parameter `#{@name}` is not a valid #{@type.to_s}."
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
validate_error = opts.detect { |k,v| break rules[k].validate @value, v, @error_message }
|
114
|
-
return validate_error unless validate_error.nil?
|
115
|
-
|
116
|
-
@value = @transform.to_proc.call @value if @transform
|
117
|
-
nil
|
118
|
-
end
|
119
|
-
|
120
|
-
def rules
|
121
|
-
@rules ||= {}
|
122
|
-
if @rules.empty?
|
123
|
-
@rules[:blank] = Rule.rule("$ cannot be blank.") { |p,v| v == (p.empty? rescue false) }
|
124
|
-
@rules[:greater_than] = Rule.rule("$ can't be less than #.") { |p,v| p > v }
|
125
|
-
@rules[:less_than] = Rule.rule("$ can't be greater than #.") { |p,v| p < v }
|
126
|
-
@rules[:min] = Rule.rule("$ can't be less than #.") { |p,v| p >= v }
|
127
|
-
@rules[:max] = Rule.rule("$ can't be greater than #.") { |p,v| p <= v }
|
128
|
-
@rules[:length] = Rule.rule("$ can't be longer or shorter than #.") { |p,v| p.length == v }
|
129
|
-
@rules[:min_length] = Rule.rule("$ must be longer than #.") { |p,v| p.length >= v }
|
130
|
-
@rules[:max_length] = Rule.rule("$ must be shorter than #.") { |p,v| p.length <= v }
|
131
|
-
@rules[:in] = Rule.rule("$ must be included in #.") { |p,v| v.include? p }
|
132
|
-
@rules[:contains] = Rule.rule("$ must include #") { |p,v| p.include? v }
|
133
|
-
@rules[:regex] = Rule.rule("$ failed validation.") { |p,v| v.match(p) rescue false }
|
134
|
-
@rules[:validator] = Rule.rule("$ failed validation.") { |p,v| v.call p }
|
135
|
-
end
|
136
|
-
@rules
|
74
|
+
def self.rules
|
75
|
+
@rules ||= {
|
76
|
+
:blank => Rule.rule("$ cannot be blank.") { |p,v| v == (p.empty? rescue false) },
|
77
|
+
:greater_than => Rule.rule("$ can't be less than #.") { |p,v| p > v },
|
78
|
+
:less_than => Rule.rule("$ can't be greater than #.") { |p,v| p < v },
|
79
|
+
:min => Rule.rule("$ can't be less than #.") { |p,v| p >= v },
|
80
|
+
:max => Rule.rule("$ can't be greater than #.") { |p,v| p <= v },
|
81
|
+
:length => Rule.rule("$ can't be longer or shorter than #.") { |p,v| p.length == v },
|
82
|
+
:min_length => Rule.rule("$ must be longer than #.") { |p,v| p.length >= v },
|
83
|
+
:max_length => Rule.rule("$ must be shorter than #.") { |p,v| p.length <= v },
|
84
|
+
:in => Rule.rule("$ must be included in #.") { |p,v| v.include? p },
|
85
|
+
:contains => Rule.rule("$ must include #") { |p,v| p.include? v },
|
86
|
+
:regex => Rule.rule("$ failed validation.") { |p,v| v.match(p) rescue false },
|
87
|
+
:validator => Rule.rule("$ failed validation.") { |p,v| v.call p }
|
88
|
+
}
|
137
89
|
end
|
138
90
|
end
|
139
91
|
end
|
data/rack-param.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "rack-param"
|
7
|
-
spec.version = "0.
|
7
|
+
spec.version = "0.2.0"
|
8
8
|
spec.authors = ["Nathaniel Symer"]
|
9
9
|
spec.email = ["nate@natesymer.com"]
|
10
10
|
spec.summary = "Sane parameter validation for Rack::Request."
|
@@ -18,5 +18,6 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
20
|
spec.add_development_dependency "bundler", "~> 1.6"
|
21
|
+
spec.add_development_dependency "rspec", "~> 3.0"
|
21
22
|
spec.add_dependency "rack", "~> 1.0"
|
22
23
|
end
|
data/spec/coercion_spec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative "./spec_helper.rb"
|
4
4
|
|
5
|
-
describe Rack::
|
5
|
+
describe Rack::Request do
|
6
6
|
before :all do
|
7
7
|
@p = {
|
8
8
|
:date => "2014/8/4",
|
@@ -18,38 +18,34 @@ describe Rack::Parameter do
|
|
18
18
|
:integer => "42",
|
19
19
|
:float => "420.42",
|
20
20
|
:string => "foo bar baz",
|
21
|
-
:should_fail => "asdfasdf"
|
21
|
+
:should_fail => "asdfasdf",
|
22
|
+
:dont_coerce => "1"
|
22
23
|
}
|
23
24
|
end
|
24
25
|
|
25
26
|
context "when coercing types" do
|
26
27
|
it "parses a Date" do
|
27
28
|
@r.param :date, Date
|
28
|
-
|
29
29
|
expect(@r.params["date"]).to eq(Date.new(2014, 8, 4))
|
30
30
|
end
|
31
31
|
|
32
32
|
it "parses a Time" do
|
33
33
|
@r.param :time, Time
|
34
|
-
|
35
34
|
expect(@r.params["time"].to_i).to eq(1007044400)
|
36
35
|
end
|
37
36
|
|
38
37
|
it "parses a DateTime" do
|
39
38
|
@r.param :datetime, DateTime
|
40
|
-
|
41
39
|
expect(@r.params["datetime"].to_s).to eq("2012-02-09T20:05:33+00:00")
|
42
40
|
end
|
43
41
|
|
44
42
|
it "parses an Array" do
|
45
43
|
@r.param :array, Array
|
46
|
-
|
47
44
|
expect(@r.params["array"]).to eq(["asdf", "asdf", "asdf"])
|
48
45
|
end
|
49
46
|
|
50
47
|
it "parses a Hash" do
|
51
48
|
@r.param :hash, Hash
|
52
|
-
|
53
49
|
expect(@r.params["hash"]).to eq({"key" => "value", "this" => "that", "foo" => "bar"})
|
54
50
|
end
|
55
51
|
|
@@ -69,24 +65,27 @@ describe Rack::Parameter do
|
|
69
65
|
|
70
66
|
it "coerces an Integer" do
|
71
67
|
@r.param :integer, Integer
|
72
|
-
|
73
68
|
expect(@r.params["integer"]).to eq(42)
|
74
69
|
end
|
75
70
|
|
76
71
|
it "coerces a Float" do
|
77
72
|
@r.param :float, Float
|
78
|
-
|
79
73
|
expect(@r.params["float"]).to eq(420.42)
|
80
74
|
end
|
81
75
|
|
82
76
|
it "\"coerces\" a String" do
|
83
77
|
@r.param :string, String
|
84
|
-
|
85
78
|
expect(@r.params["string"]).to eq("foo bar baz")
|
86
79
|
end
|
87
80
|
|
88
81
|
it "errors out on unrecognized types" do
|
89
82
|
expect { @r.param :should_fail, Date }.to raise_error(Rack::ParameterError)
|
90
83
|
end
|
84
|
+
|
85
|
+
it "doesn't coerce when the coerce option is set to false" do
|
86
|
+
@r.param :dont_coerce, Integer, :coerce => false
|
87
|
+
expect(@r.params["dont_coerce"]).to eq(@p[:dont_coerce])
|
88
|
+
expect(@r.params["dont_coerce"].class).to eq(String)
|
89
|
+
end
|
91
90
|
end
|
92
91
|
end
|
data/spec/rules_spec.rb
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
require_relative "./spec_helper.rb"
|
4
4
|
|
5
|
-
describe Rack::
|
5
|
+
describe Rack::Rule do
|
6
6
|
before :all do
|
7
7
|
@p = {
|
8
8
|
:int_three => "3",
|
@@ -17,7 +17,7 @@ describe Rack::Parameter do
|
|
17
17
|
|
18
18
|
context "when given rules" do
|
19
19
|
it "checks a parameter based on :required" do
|
20
|
-
expect { @r.param :
|
20
|
+
expect { @r.param :not_a_param_asdfasdfasdfasdf, String, :required => true }.to raise_error(Rack::ParameterError)
|
21
21
|
expect { @r.param :required, String, :required => true }.to_not raise_error
|
22
22
|
end
|
23
23
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-param
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathaniel Symer
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-02-
|
11
|
+
date: 2015-02-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.6'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rspec
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '3.0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '3.0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: rack
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|