sinatra-param 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile.lock +1 -1
- data/README.md +9 -7
- data/lib/sinatra/param.rb +44 -39
- data/sinatra-param-0.0.1.gem +0 -0
- metadata +11 -10
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
# sinatra-param
|
2
|
-
_Parameter
|
2
|
+
_Parameter Contracts for Sinatra_
|
3
3
|
|
4
4
|
REST conventions takes the guesswork out of designing and consuming web APIs. `GET` / `POST` / `PATCH` / `DELETE` resource endpoints and you get what you'd expect.
|
5
5
|
|
@@ -36,12 +36,12 @@ end
|
|
36
36
|
|
37
37
|
By declaring parameter types, incoming parameters will automatically be transformed into an object of that type. For instance, if a param is `Boolean`, values of `'1'`, `'true'`, `'t'`, `'yes'`, and `'y'` will be automatically transformed into `true`.
|
38
38
|
|
39
|
-
- String
|
40
|
-
- Integer
|
41
|
-
- Float
|
42
|
-
- Boolean _("1/0", "true/false", "t/f", "yes/no", "y/n")_
|
43
|
-
- Array _("1,2,3,4,5")_
|
44
|
-
- Hash _(key1:value1,key2:value2)_
|
39
|
+
- `String`
|
40
|
+
- `Integer`
|
41
|
+
- `Float`
|
42
|
+
- `Boolean` _("1/0", "true/false", "t/f", "yes/no", "y/n")_
|
43
|
+
- `Array` _("1,2,3,4,5")_
|
44
|
+
- `Hash` _(key1:value1,key2:value2)_
|
45
45
|
|
46
46
|
### Validations
|
47
47
|
|
@@ -65,6 +65,8 @@ Use the `transform` option to take even more of the business logic of parameter
|
|
65
65
|
|
66
66
|
- Another pain point is the awkward way parameters are passed as JSON in HTTP bodies. I'd love to see an elegant, unobtrusive way to do this automatically.
|
67
67
|
|
68
|
+
- Support for Rails-style Arrays (`'key[]=value1&key[]=value2'`) and Hashes (`'key[a]=value1&key[b]=value2`). /via [@manton](https://twitter.com/#!/manton)
|
69
|
+
|
68
70
|
- Testing. This will happen soon.
|
69
71
|
|
70
72
|
## Contact
|
data/lib/sinatra/param.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
require 'sinatra/base'
|
2
|
+
require 'time'
|
3
|
+
require 'date'
|
2
4
|
|
3
5
|
module Sinatra
|
4
6
|
module Param
|
5
|
-
VERSION = "0.0.
|
7
|
+
VERSION = "0.0.2"
|
6
8
|
|
7
9
|
class InvalidParameterError < StandardError; end
|
8
10
|
|
@@ -13,7 +15,7 @@ module Sinatra
|
|
13
15
|
validate!(params[name], options)
|
14
16
|
rescue
|
15
17
|
error = "Invalid parameter, #{name}"
|
16
|
-
if content_type.match(mime_type(:json))
|
18
|
+
if content_type && content_type.match(mime_type(:json))
|
17
19
|
error = {message: error}.to_json
|
18
20
|
end
|
19
21
|
|
@@ -23,48 +25,51 @@ module Sinatra
|
|
23
25
|
|
24
26
|
private
|
25
27
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
28
|
+
def coerce(param, type, options = {})
|
29
|
+
return nil if param.nil?
|
30
|
+
return Integer(param) if type == Integer
|
31
|
+
return Float(param) if type == Float
|
32
|
+
return String(param) if type == String
|
33
|
+
return Time.parse(param) if type == Time
|
34
|
+
return Date.parse(param) if type == Date
|
35
|
+
return DateTime.parse(param) if type == DateTime
|
36
|
+
return Array(param.split(options[:delimiter] || ",")) if type == Array
|
37
|
+
return Hash[param.split(options[:delimiter] || ",").map{|c| c.split(options[:separator] || ":")}] if type == Hash
|
38
|
+
return ((/(false|f|no|n|0)$/i === param) ? false : (/(true|t|yes|y|1)$/i === param) ? true : nil) if type == TrueClass || type == FalseClass || type == :boolean
|
39
|
+
return nil
|
40
|
+
end
|
36
41
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
42
|
+
def validate!(param, options)
|
43
|
+
options.each do |key, value|
|
44
|
+
case key
|
45
|
+
when :required
|
46
|
+
raise InvalidParameterError if value && param.nil?
|
47
|
+
when :blank
|
48
|
+
raise InvalidParameterError if !value && case param
|
49
|
+
when String
|
50
|
+
!(/\S/ === param)
|
51
|
+
when Array, Hash
|
52
|
+
param.empty?
|
53
|
+
else
|
54
|
+
param.nil?
|
55
|
+
end
|
56
|
+
when :is
|
57
|
+
raise InvalidParameterError unless value === param
|
58
|
+
when :in, :within, :range
|
59
|
+
raise InvalidParameterError unless param.nil? || case value
|
60
|
+
when Range
|
61
|
+
value.include?(param)
|
62
|
+
else
|
63
|
+
Array(value).include?(param)
|
50
64
|
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
when Range
|
56
|
-
value.include?(param)
|
57
|
-
else
|
58
|
-
Array(value).include?(param)
|
59
|
-
end
|
60
|
-
when :min
|
61
|
-
raise InvalidParameterError unless value <= param
|
62
|
-
when :max
|
63
|
-
raise InvalidParameterError unless value >= param
|
64
|
-
end
|
65
|
+
when :min
|
66
|
+
raise InvalidParameterError unless param.nil? || value <= param
|
67
|
+
when :max
|
68
|
+
raise InvalidParameterError unless param.nil? || value >= param
|
65
69
|
end
|
66
70
|
end
|
67
71
|
end
|
72
|
+
end
|
68
73
|
|
69
74
|
helpers Param
|
70
75
|
end
|
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sinatra-param
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-06-14 00:00:00.000000000Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sinatra
|
16
|
-
requirement: &
|
16
|
+
requirement: &70267098070800 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: '1.3'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70267098070800
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: rspec
|
27
|
-
requirement: &
|
27
|
+
requirement: &70267098069940 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ~>
|
@@ -32,10 +32,10 @@ dependencies:
|
|
32
32
|
version: 0.6.1
|
33
33
|
type: :development
|
34
34
|
prerelease: false
|
35
|
-
version_requirements: *
|
35
|
+
version_requirements: *70267098069940
|
36
36
|
- !ruby/object:Gem::Dependency
|
37
37
|
name: rake
|
38
|
-
requirement: &
|
38
|
+
requirement: &70267098067980 !ruby/object:Gem::Requirement
|
39
39
|
none: false
|
40
40
|
requirements:
|
41
41
|
- - ~>
|
@@ -43,7 +43,7 @@ dependencies:
|
|
43
43
|
version: 0.9.2
|
44
44
|
type: :development
|
45
45
|
prerelease: false
|
46
|
-
version_requirements: *
|
46
|
+
version_requirements: *70267098067980
|
47
47
|
description: Parameter Contracts for Sinatra
|
48
48
|
email: m@mattt.me
|
49
49
|
executables: []
|
@@ -61,6 +61,7 @@ files:
|
|
61
61
|
- ./LICENSE
|
62
62
|
- ./Rakefile
|
63
63
|
- ./README.md
|
64
|
+
- ./sinatra-param-0.0.1.gem
|
64
65
|
- ./sinatra-param.gemspec
|
65
66
|
homepage: http://github.com/mattt/sinatra-param
|
66
67
|
licenses: []
|
@@ -76,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
77
|
version: '0'
|
77
78
|
segments:
|
78
79
|
- 0
|
79
|
-
hash:
|
80
|
+
hash: 567877916880817740
|
80
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
82
|
none: false
|
82
83
|
requirements:
|
@@ -85,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
86
|
version: '0'
|
86
87
|
segments:
|
87
88
|
- 0
|
88
|
-
hash:
|
89
|
+
hash: 567877916880817740
|
89
90
|
requirements: []
|
90
91
|
rubyforge_project:
|
91
92
|
rubygems_version: 1.8.15
|