sinatra-param 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile.lock CHANGED
@@ -1,17 +1,27 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sinatra-param (0.0.2)
4
+ sinatra-param (0.1.0)
5
5
  sinatra (~> 1.3)
6
6
 
7
7
  GEM
8
8
  remote: http://rubygems.org/
9
9
  specs:
10
+ diff-lcs (1.1.3)
10
11
  rack (1.4.1)
11
12
  rack-protection (1.2.0)
12
13
  rack
14
+ rack-test (0.6.1)
15
+ rack (>= 1.0)
13
16
  rake (0.9.2.2)
14
- rspec (0.6.4)
17
+ rspec (2.10.0)
18
+ rspec-core (~> 2.10.0)
19
+ rspec-expectations (~> 2.10.0)
20
+ rspec-mocks (~> 2.10.0)
21
+ rspec-core (2.10.1)
22
+ rspec-expectations (2.10.0)
23
+ diff-lcs (~> 1.1.3)
24
+ rspec-mocks (2.10.1)
15
25
  sinatra (1.3.2)
16
26
  rack (~> 1.3, >= 1.3.6)
17
27
  rack-protection (~> 1.2)
@@ -22,7 +32,8 @@ PLATFORMS
22
32
  ruby
23
33
 
24
34
  DEPENDENCIES
35
+ rack-test
25
36
  rake (~> 0.9.2)
26
- rspec (~> 0.6.1)
37
+ rspec (~> 2.10)
27
38
  sinatra (~> 1.3)
28
39
  sinatra-param!
data/README.md CHANGED
@@ -10,6 +10,7 @@ But figuring out what parameters are expected... well, all bets are off. This Si
10
10
  ## Example
11
11
 
12
12
  ``` ruby
13
+ require 'sinatra/param'
13
14
  class App < Sinatra::Base
14
15
  helpers Sinatra::Param
15
16
 
File without changes
File without changes
File without changes
@@ -1,7 +1,7 @@
1
1
  require 'sinatra/base'
2
2
  require 'json'
3
3
 
4
- require '../lib/sinatra/param'
4
+ require_relative '../sinatra/param'
5
5
 
6
6
  class App < Sinatra::Base
7
7
  helpers Sinatra::Param
@@ -39,5 +39,20 @@ class App < Sinatra::Base
39
39
  message: params[:message]
40
40
  }.to_json
41
41
  end
42
+
43
+ # GET /choice?a=foo
44
+ # GET /choice?b=bar
45
+ # GET /choice?c=baz
46
+ get '/choice' do
47
+ param :a, String
48
+ param :b, String
49
+ param :c, String
50
+
51
+ one_of(:a, :b, :c)
52
+
53
+ {
54
+ message: 'OK'
55
+ }.to_json
56
+ end
42
57
  end
43
58
 
File without changes
data/lib/sinatra/param.rb CHANGED
@@ -1,11 +1,10 @@
1
1
  require 'sinatra/base'
2
+ require 'sinatra/param/version'
2
3
  require 'time'
3
4
  require 'date'
4
5
 
5
6
  module Sinatra
6
7
  module Param
7
- VERSION = "0.0.2"
8
-
9
8
  class InvalidParameterError < StandardError; end
10
9
 
11
10
  def param(name, type, options = {})
@@ -23,10 +22,25 @@ module Sinatra
23
22
  end
24
23
  end
25
24
 
25
+ def one_of(*names)
26
+ found = 0
27
+ names.each do |name|
28
+ found += 1 if params[name] && present?(params[name])
29
+ if found > 1
30
+ error = "Parameters #{names.join(', ')} are mutually exclusive"
31
+ if content_type.match(mime_type(:json))
32
+ error = {message: error}.to_json
33
+ end
34
+ halt 406, error
35
+ end
36
+ end
37
+ end
38
+
26
39
  private
27
40
 
28
41
  def coerce(param, type, options = {})
29
42
  return nil if param.nil?
43
+ return param if param.is_a?(type)
30
44
  return Integer(param) if type == Integer
31
45
  return Float(param) if type == Float
32
46
  return String(param) if type == String
@@ -35,15 +49,15 @@ module Sinatra
35
49
  return DateTime.parse(param) if type == DateTime
36
50
  return Array(param.split(options[:delimiter] || ",")) if type == Array
37
51
  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
52
+ return (/(false|f|no|n|0)$/i === param.to_s ? false : (/(true|t|yes|y|1)$/i === param.to_s ? true : nil)) if type == TrueClass || type == FalseClass || type == :boolean
39
53
  return nil
40
54
  end
41
55
 
42
56
  def validate!(param, options)
43
57
  options.each do |key, value|
44
58
  case key
45
- when :required
46
- raise InvalidParameterError if value && param.nil?
59
+ when :required
60
+ raise InvalidParameterError if value && param.nil?
47
61
  when :blank
48
62
  raise InvalidParameterError if !value && case param
49
63
  when String
@@ -66,10 +80,22 @@ module Sinatra
66
80
  raise InvalidParameterError unless param.nil? || value <= param
67
81
  when :max
68
82
  raise InvalidParameterError unless param.nil? || value >= param
83
+ when :min_length
84
+ raise InvalidParameterError unless param.nil? || value <= param.length
85
+ when :max_length
86
+ raise InvalidParameterError unless param.nil? || value >= param.length
69
87
  end
70
88
  end
71
89
  end
90
+
91
+ # ActiveSupport #present? and #blank? without patching Object
92
+ def present?(object)
93
+ !blank?(object)
94
+ end
95
+
96
+ def blank?(object)
97
+ object.respond_to?(:empty?) ? object.empty? : !object
98
+ end
72
99
  end
73
-
74
100
  helpers Param
75
101
  end
@@ -0,0 +1,5 @@
1
+ module Sinatra
2
+ module Param
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -1,6 +1,6 @@
1
1
  # -*- encoding: utf-8 -*-
2
2
  $:.push File.expand_path("../lib", __FILE__)
3
- require "sinatra/param"
3
+ require "sinatra/param/version"
4
4
 
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "sinatra-param"
@@ -14,7 +14,8 @@ Gem::Specification.new do |s|
14
14
 
15
15
  s.add_dependency "sinatra", "~> 1.3"
16
16
 
17
- s.add_development_dependency "rspec", "~> 0.6.1"
17
+ s.add_development_dependency "rspec", "~> 2.10"
18
+ s.add_development_dependency "rack-test"
18
19
  s.add_development_dependency "rake", "~> 0.9.2"
19
20
 
20
21
  s.files = Dir["./**/*"].reject { |file| file =~ /\.\/(bin|log|pkg|script|spec|test|vendor)/ }
@@ -0,0 +1,36 @@
1
+ require 'spec_helper'
2
+ require 'rack/test'
3
+
4
+ describe 'parameter exclusion' do
5
+ include Rack::Test::Methods
6
+ def app; App; end
7
+
8
+ it 'returns 406 on requests that contain more than one mutually exclusive parameter' do
9
+ params = [
10
+ {a: 1, b: 2},
11
+ {b: 2, c: 3},
12
+ {a: 1, b: 2, c: 3}
13
+ ]
14
+ params.each do |param|
15
+ get('/exclude', param) do |response|
16
+ response.status.should == 406
17
+ JSON.parse(response.body)['message'].should =~ /mutually exclusive/
18
+ end
19
+ end
20
+ end
21
+
22
+ it 'returns successfully for requests that only have one parameter' do
23
+ params = [
24
+ {a: 1},
25
+ {b: 2},
26
+ {c: 3},
27
+ {a: 1, c: 3},
28
+ ]
29
+ params.each do |param|
30
+ get('/exclude', param) do |response|
31
+ response.status.should == 200
32
+ JSON.parse(response.body)['message'].should =~ /OK/
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,3 @@
1
+ require 'bundler/setup'
2
+ require 'sinatra/param'
3
+ require 'example/app'
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.2
4
+ version: 0.1.0
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-06-14 00:00:00.000000000Z
12
+ date: 2012-08-01 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sinatra
16
- requirement: &70267098070800 !ruby/object:Gem::Requirement
16
+ requirement: &70343992738160 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,21 +21,32 @@ dependencies:
21
21
  version: '1.3'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70267098070800
24
+ version_requirements: *70343992738160
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec
27
- requirement: &70267098069940 !ruby/object:Gem::Requirement
27
+ requirement: &70343992737380 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
31
31
  - !ruby/object:Gem::Version
32
- version: 0.6.1
32
+ version: '2.10'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70267098069940
35
+ version_requirements: *70343992737380
36
+ - !ruby/object:Gem::Dependency
37
+ name: rack-test
38
+ requirement: &70343992736800 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :development
45
+ prerelease: false
46
+ version_requirements: *70343992736800
36
47
  - !ruby/object:Gem::Dependency
37
48
  name: rake
38
- requirement: &70267098067980 !ruby/object:Gem::Requirement
49
+ requirement: &70343992736040 !ruby/object:Gem::Requirement
39
50
  none: false
40
51
  requirements:
41
52
  - - ~>
@@ -43,26 +54,28 @@ dependencies:
43
54
  version: 0.9.2
44
55
  type: :development
45
56
  prerelease: false
46
- version_requirements: *70267098067980
57
+ version_requirements: *70343992736040
47
58
  description: Parameter Contracts for Sinatra
48
59
  email: m@mattt.me
49
60
  executables: []
50
61
  extensions: []
51
62
  extra_rdoc_files: []
52
63
  files:
53
- - ./example/app.rb
54
- - ./example/config.ru
55
- - ./example/Gemfile
56
- - ./example/Gemfile.lock
57
- - ./example/Procfile
58
64
  - ./Gemfile
59
65
  - ./Gemfile.lock
66
+ - ./lib/example/app.rb
67
+ - ./lib/example/config.ru
68
+ - ./lib/example/Gemfile
69
+ - ./lib/example/Gemfile.lock
70
+ - ./lib/example/Procfile
71
+ - ./lib/sinatra/param/version.rb
60
72
  - ./lib/sinatra/param.rb
61
73
  - ./LICENSE
62
74
  - ./Rakefile
63
75
  - ./README.md
64
- - ./sinatra-param-0.0.1.gem
65
76
  - ./sinatra-param.gemspec
77
+ - spec/exclude_spec.rb
78
+ - spec/spec_helper.rb
66
79
  homepage: http://github.com/mattt/sinatra-param
67
80
  licenses: []
68
81
  post_install_message:
@@ -77,7 +90,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
90
  version: '0'
78
91
  segments:
79
92
  - 0
80
- hash: 567877916880817740
93
+ hash: -1546291879647992050
81
94
  required_rubygems_version: !ruby/object:Gem::Requirement
82
95
  none: false
83
96
  requirements:
@@ -86,11 +99,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
99
  version: '0'
87
100
  segments:
88
101
  - 0
89
- hash: 567877916880817740
102
+ hash: -1546291879647992050
90
103
  requirements: []
91
104
  rubyforge_project:
92
105
  rubygems_version: 1.8.15
93
106
  signing_key:
94
107
  specification_version: 3
95
108
  summary: sinatra-param
96
- test_files: []
109
+ test_files:
110
+ - spec/exclude_spec.rb
111
+ - spec/spec_helper.rb
Binary file