sinatra-param 1.0.3 → 1.1.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bf5f1311ba75a60c4d17f503747120635cb7136e
4
- data.tar.gz: b46df70795c76b593aac58002e2b97119838c545
3
+ metadata.gz: b64e12a2936520c3207c50339213644d8610709c
4
+ data.tar.gz: 41d317945c4128feb98c69f096797fc380932d38
5
5
  SHA512:
6
- metadata.gz: 653a105893940b08c122286974d4b85096063364c41c2b15ac1fafe7aede753cd9522ba70a97cee11063973296cb3189141b34c1e4ae2e585e8e5948c22439c0
7
- data.tar.gz: 93bbae31f59d4a92fd3bb899e545bde01af2e5dc032cba714cabb747fba2910994c6b4147961bec0d23010d6b1606aa7e2bde7c196723653c36021af59ceba53
6
+ metadata.gz: fef20f2728a516b7c19d85058d27119e9976e49f5f20d8a238de837c0637f7ad3fb2abc368ba48aa8a55ff8bcd8c93da48792bbba18c4ad47e48b8c95b79ea30
7
+ data.tar.gz: e1aa8c9c2f62bf7c44e349401aae77f880b27a40c7d1109e00a54256ac01ce489315aff0756f0214a4ea3fee11af7361b86186f45fe43d427be87568a999243c
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sinatra-param (1.0.3)
4
+ sinatra-param (1.1.0)
5
5
  sinatra (~> 1.3)
6
6
 
7
7
  GEM
@@ -10,7 +10,7 @@ GEM
10
10
  diff-lcs (1.2.4)
11
11
  multi_json (1.7.2)
12
12
  rack (1.5.2)
13
- rack-protection (1.5.1)
13
+ rack-protection (1.5.2)
14
14
  rack
15
15
  rack-test (0.6.2)
16
16
  rack (>= 1.0)
data/README.md CHANGED
@@ -3,7 +3,7 @@ _Parameter Contracts for Sinatra_
3
3
 
4
4
  REST conventions take the guesswork out of designing and consuming web APIs. Simply `GET`, `POST`, `PATCH`, or `DELETE` resource endpoints, and you get what you'd expect.
5
5
 
6
- However, when it comes to figuring out what parameters are expected... well, all bets are off.
6
+ However, when it comes to figuring out what parameters are expected... well, all bets are off.
7
7
 
8
8
  This Sinatra extension takes a first step to solving this problem on the developer side
9
9
 
@@ -66,6 +66,35 @@ Passing a `default` option will provide a default value for a parameter if none
66
66
 
67
67
  Use the `transform` option to take even more of the business logic of parameter I/O out of your code. Anything that responds to `to_proc` (including Procs and symbols) will do.
68
68
 
69
+ ### Exceptions
70
+
71
+ By default, when a parameter precondition fails, `Sinatra::Param` will `halt 400` with an error message:
72
+
73
+ ```json
74
+ {
75
+ "errors": {
76
+ "order": "Param must be within [\"ASC\", \"DESC\"]"
77
+ },
78
+ "message": "Invalid parameter, order"
79
+ }
80
+ ```
81
+
82
+ To change this, you can set `:raise_sinatra_param_exceptions` to `true`, and intercept `Sinatra::Param::InvalidParameterError` with a Sinatra `error do...end` block. _(To make this work in development, set `:show_exceptions` to `false`)_:
83
+
84
+ ```ruby
85
+ set :raise_sinatra_param_exceptions, true
86
+
87
+ error Sinatra::Param::InvalidParameterError do
88
+ {error: "#{env['sinatra.error'].param} is invalid"}.to_json
89
+ end
90
+ ```
91
+
92
+ Custom exception handling can also be enabled on an individual parameter basis, by passing the `raise` option:
93
+
94
+ ```ruby
95
+ param :order, String, in: ["ASC", "DESC"], raise: true
96
+ ```
97
+
69
98
  ## Contact
70
99
 
71
100
  Mattt Thompson
@@ -1,5 +1,5 @@
1
1
  module Sinatra
2
2
  module Param
3
- VERSION = '1.0.3'
3
+ VERSION = '1.1.0'
4
4
  end
5
5
  end
data/lib/sinatra/param.rb CHANGED
@@ -7,7 +7,9 @@ module Sinatra
7
7
  module Param
8
8
  Boolean = :boolean
9
9
 
10
- class InvalidParameterError < StandardError; end
10
+ class InvalidParameterError < StandardError
11
+ attr_accessor :param, :options
12
+ end
11
13
 
12
14
  def param(name, type, options = {})
13
15
  name = name.to_s
@@ -19,10 +21,15 @@ module Sinatra
19
21
  params[name] = options[:default] if params[name].nil? and options[:default]
20
22
  params[name] = options[:transform].to_proc.call(params[name]) if options[:transform]
21
23
  validate!(params[name], options)
22
- rescue
23
- error = "Invalid parameter, #{name}"
24
+ rescue InvalidParameterError => exception
25
+ if options[:raise] or (settings.raise_sinatra_param_exceptions rescue false)
26
+ exception.param, exception.options = name, options
27
+ raise exception
28
+ end
29
+
30
+ error = "Invalid Parameter: #{name}"
24
31
  if content_type and content_type.match(mime_type(:json))
25
- error = {message: error}.to_json
32
+ error = {message: error, errors: {name => exception.message}}.to_json
26
33
  end
27
34
 
28
35
  halt 400, error
@@ -67,9 +74,9 @@ module Sinatra
67
74
  options.each do |key, value|
68
75
  case key
69
76
  when :required
70
- raise InvalidParameterError if value && param.nil?
77
+ raise InvalidParameterError, "Parameter is required" if value && param.nil?
71
78
  when :blank
72
- raise InvalidParameterError if !value && case param
79
+ raise InvalidParameterError, "Parameter cannot be blank" if !value && case param
73
80
  when String
74
81
  !(/\S/ === param)
75
82
  when Array, Hash
@@ -78,22 +85,22 @@ module Sinatra
78
85
  param.nil?
79
86
  end
80
87
  when :is
81
- raise InvalidParameterError unless value === param
88
+ raise InvalidParameterError, "Parameter must be #{value}" unless value === param
82
89
  when :in, :within, :range
83
- raise InvalidParameterError unless param.nil? || case value
90
+ raise InvalidParameterError, "Parameter must be within #{value}" unless param.nil? || case value
84
91
  when Range
85
92
  value.include?(param)
86
93
  else
87
94
  Array(value).include?(param)
88
95
  end
89
96
  when :min
90
- raise InvalidParameterError unless param.nil? || value <= param
97
+ raise InvalidParameterError, "Parameter cannot be less than #{value}" unless param.nil? || value <= param
91
98
  when :max
92
- raise InvalidParameterError unless param.nil? || value >= param
99
+ raise InvalidParameterError, "Parameter cannot be greater than #{value}" unless param.nil? || value >= param
93
100
  when :min_length
94
- raise InvalidParameterError unless param.nil? || value <= param.length
101
+ raise InvalidParameterError, "Parameter cannot have length less than #{value}" unless param.nil? || value <= param.length
95
102
  when :max_length
96
- raise InvalidParameterError unless param.nil? || value >= param.length
103
+ raise InvalidParameterError, "Parameter cannot have length greater than #{value}" unless param.nil? || value >= param.length
97
104
  end
98
105
  end
99
106
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinatra-param
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.3
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mattt Thompson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-02 00:00:00.000000000 Z
11
+ date: 2014-02-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sinatra
@@ -168,7 +168,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
168
  version: '0'
169
169
  requirements: []
170
170
  rubyforge_project:
171
- rubygems_version: 2.0.3
171
+ rubygems_version: 2.1.11
172
172
  signing_key:
173
173
  specification_version: 4
174
174
  summary: Parameter Contracts for Sinatra