rack-spec 0.0.1 → 0.0.2
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/CHANGELOG.md +10 -0
- data/README.md +14 -2
- data/lib/rack/spec.rb +4 -1
- data/lib/rack/spec/validation.rb +3 -3
- data/lib/rack/spec/validator_factory.rb +5 -2
- data/lib/rack/spec/validators/base.rb +21 -5
- data/lib/rack/spec/validators/maximum_length_validator.rb +17 -0
- data/lib/rack/spec/validators/maximum_validator.rb +6 -9
- data/lib/rack/spec/validators/minimum_length_validator.rb +17 -0
- data/lib/rack/spec/validators/minimum_validator.rb +6 -9
- data/lib/rack/spec/validators/only_validator.rb +17 -0
- data/lib/rack/spec/validators/{query_parameters_validator.rb → parameters_validator.rb} +3 -3
- data/lib/rack/spec/validators/type_validator.rb +8 -7
- data/lib/rack/spec/version.rb +1 -1
- data/spec/rack/spec_spec.rb +76 -35
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1eaf27c620c698b3f0d4648fa5e243a391aafe03
|
4
|
+
data.tar.gz: e34cca3032930bbe5912ff95ff9c526a2a30ea1e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06b6732cf5f1d56cbdf792db56540407ad8139d3431fac24472cb693238004f74ef5ed71bc82e33563619b160ee5087f358ffd081db4c4d6b1ba9df5da5162d1
|
7
|
+
data.tar.gz: 09893425824f9924f3fa23aa60821e9a8cf86b7ff2774dd0fbd1b0104f7f00a9aec07048173280dba0202443042a3a1c45465905335d6b20e198712a511056b2
|
data/CHANGELOG.md
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
## v0.0.2
|
2
|
+
* Change key name: queryParameters -> parameters
|
3
|
+
* Add a new constraint: only
|
4
|
+
* Add a new constraint: minimumLength
|
5
|
+
* Add a new constraint: maxinumLength
|
6
|
+
|
7
|
+
## v0.0.1
|
8
|
+
* Add a new constraint: type
|
9
|
+
* Add a new constraint: minimum
|
10
|
+
* Add a new constraint: maxinum
|
data/README.md
CHANGED
@@ -12,7 +12,7 @@ require "rack"
|
|
12
12
|
require "rack/spec"
|
13
13
|
require "yaml"
|
14
14
|
|
15
|
-
use Rack::Spec, spec: YAML.
|
15
|
+
use Rack::Spec, spec: YAML.load_file("spec.yml")
|
16
16
|
|
17
17
|
run ->(env) do
|
18
18
|
[200, {}, ["OK"]]
|
@@ -27,7 +27,7 @@ meta:
|
|
27
27
|
endpoints:
|
28
28
|
/recipes:
|
29
29
|
GET:
|
30
|
-
|
30
|
+
parameters:
|
31
31
|
page:
|
32
32
|
type: integer
|
33
33
|
minimum: 1
|
@@ -38,6 +38,18 @@ endpoints:
|
|
38
38
|
type: float
|
39
39
|
time:
|
40
40
|
type: iso8601
|
41
|
+
kind:
|
42
|
+
type: string
|
43
|
+
only:
|
44
|
+
- mono
|
45
|
+
- di
|
46
|
+
- tri
|
47
|
+
POST:
|
48
|
+
parameters:
|
49
|
+
title:
|
50
|
+
type: string
|
51
|
+
minimumLength: 3
|
52
|
+
maximumLength: 10
|
41
53
|
```
|
42
54
|
|
43
55
|
## Development
|
data/lib/rack/spec.rb
CHANGED
@@ -4,10 +4,13 @@ require "rack/spec/spec"
|
|
4
4
|
require "rack/spec/validation"
|
5
5
|
require "rack/spec/validation_error"
|
6
6
|
require "rack/spec/validators/base"
|
7
|
+
require "rack/spec/validators/maximum_length_validator"
|
7
8
|
require "rack/spec/validators/maximum_validator"
|
9
|
+
require "rack/spec/validators/minimum_length_validator"
|
8
10
|
require "rack/spec/validators/minimum_validator"
|
9
11
|
require "rack/spec/validators/null_validator"
|
10
|
-
require "rack/spec/validators/
|
12
|
+
require "rack/spec/validators/only_validator"
|
13
|
+
require "rack/spec/validators/parameters_validator"
|
11
14
|
require "rack/spec/validators/type_validator"
|
12
15
|
require "rack/spec/validator_factory"
|
13
16
|
require "rack/spec/version"
|
data/lib/rack/spec/validation.rb
CHANGED
@@ -7,7 +7,7 @@ module Rack
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def call(env)
|
10
|
-
|
10
|
+
parameters_validator.validate!(env)
|
11
11
|
@app.call(env)
|
12
12
|
end
|
13
13
|
|
@@ -17,8 +17,8 @@ module Rack
|
|
17
17
|
Spec.new(@options[:spec])
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
21
|
-
@
|
20
|
+
def parameters_validator
|
21
|
+
@parameters_validator ||= Validators::ParametersValidator.new(spec)
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -10,13 +10,16 @@ module Rack
|
|
10
10
|
validator_classes[name] = klass
|
11
11
|
end
|
12
12
|
|
13
|
-
def build(key, type, constraint)
|
14
|
-
validator_classes[type].new(key, constraint)
|
13
|
+
def build(key, type, constraint, env)
|
14
|
+
validator_classes[type].new(key, constraint, env)
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
register "maximum", Validators::MaximumValidator
|
19
|
+
register "maximumLength", Validators::MaximumLengthValidator
|
19
20
|
register "minimum", Validators::MinimumValidator
|
21
|
+
register "minimumLength", Validators::MinimumLengthValidator
|
22
|
+
register "only", Validators::OnlyValidator
|
20
23
|
register "type", Validators::TypeValidator
|
21
24
|
end
|
22
25
|
end
|
@@ -2,20 +2,36 @@ module Rack
|
|
2
2
|
class Spec
|
3
3
|
module Validators
|
4
4
|
class Base
|
5
|
-
|
5
|
+
attr_reader :constraint, :key, :env
|
6
|
+
|
7
|
+
def initialize(key, constraint, env)
|
6
8
|
@key = key
|
7
9
|
@constraint = constraint
|
10
|
+
@env = env
|
8
11
|
end
|
9
12
|
|
10
|
-
def validate!
|
11
|
-
|
13
|
+
def validate!
|
14
|
+
unless valid?
|
15
|
+
raise ValidationError, error_message
|
16
|
+
end
|
12
17
|
end
|
13
18
|
|
14
19
|
private
|
15
20
|
|
16
|
-
def
|
21
|
+
def valid?
|
22
|
+
raise NotImplementedError
|
23
|
+
end
|
24
|
+
|
25
|
+
def error_message
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
def value
|
30
|
+
@value ||= request.params[@key]
|
31
|
+
end
|
32
|
+
|
33
|
+
def request
|
17
34
|
env["rack-spec.request"] ||= Rack::Request.new(env)
|
18
|
-
env["rack-spec.request"].params[@key]
|
19
35
|
end
|
20
36
|
end
|
21
37
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Rack
|
2
|
+
class Spec
|
3
|
+
module Validators
|
4
|
+
class MaximumLengthValidator < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def valid?
|
8
|
+
value.nil? || value.length <= constraint
|
9
|
+
end
|
10
|
+
|
11
|
+
def error_message
|
12
|
+
"Expected #{key} to be equal or shorter than #{constraint}, but in fact #{value.inspect}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -2,17 +2,14 @@ module Rack
|
|
2
2
|
class Spec
|
3
3
|
module Validators
|
4
4
|
class MaximumValidator < Base
|
5
|
-
def validate!(env)
|
6
|
-
value = extract_value(env)
|
7
|
-
if value && value.to_f > maximum
|
8
|
-
raise ValidationError, "Expected #@key to be equal or less than #@maximum, but in fact #{value.inspect}"
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
5
|
private
|
13
6
|
|
14
|
-
def
|
15
|
-
|
7
|
+
def valid?
|
8
|
+
value.nil? || value.to_f <= constraint
|
9
|
+
end
|
10
|
+
|
11
|
+
def error_message
|
12
|
+
"Expected #{key} to be equal or higher than #{constraint}, but in fact #{value.inspect}"
|
16
13
|
end
|
17
14
|
end
|
18
15
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Rack
|
2
|
+
class Spec
|
3
|
+
module Validators
|
4
|
+
class MinimumLengthValidator < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def valid?
|
8
|
+
value.nil? || value.length >= constraint
|
9
|
+
end
|
10
|
+
|
11
|
+
def error_message
|
12
|
+
"Expected #{key} to be equal or longer than #{constraint}, but in fact #{value.inspect}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -2,17 +2,14 @@ module Rack
|
|
2
2
|
class Spec
|
3
3
|
module Validators
|
4
4
|
class MinimumValidator < Base
|
5
|
-
def validate!(env)
|
6
|
-
value = extract_value(env)
|
7
|
-
if value && value.to_f < minimum
|
8
|
-
raise ValidationError, "Expected #@key to be equal or higher than #@minimum, but in fact #{value.inspect}"
|
9
|
-
end
|
10
|
-
end
|
11
|
-
|
12
5
|
private
|
13
6
|
|
14
|
-
def
|
15
|
-
|
7
|
+
def valid?
|
8
|
+
value.nil? || value.to_f >= constraint
|
9
|
+
end
|
10
|
+
|
11
|
+
def error_message
|
12
|
+
"Expected #{key} to be equal or higher than #{constraint}, but in fact #{value.inspect}"
|
16
13
|
end
|
17
14
|
end
|
18
15
|
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Rack
|
2
|
+
class Spec
|
3
|
+
module Validators
|
4
|
+
class OnlyValidator < Base
|
5
|
+
private
|
6
|
+
|
7
|
+
def valid?
|
8
|
+
value.nil? || constraint.include?(value)
|
9
|
+
end
|
10
|
+
|
11
|
+
def error_message
|
12
|
+
"Expected #{key} to be included in #{constraint}, but in fact #{value.inspect}"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -1,16 +1,16 @@
|
|
1
1
|
module Rack
|
2
2
|
class Spec
|
3
3
|
module Validators
|
4
|
-
class
|
4
|
+
class ParametersValidator
|
5
5
|
def initialize(spec)
|
6
6
|
@spec = spec
|
7
7
|
end
|
8
8
|
|
9
9
|
def validate!(env)
|
10
|
-
parameters = @spec.reach("endpoints", env["PATH_INFO"], env["REQUEST_METHOD"], "
|
10
|
+
parameters = @spec.reach("endpoints", env["PATH_INFO"], env["REQUEST_METHOD"], "parameters") || {}
|
11
11
|
parameters.each do |key, hash|
|
12
12
|
hash.each do |type, constraint|
|
13
|
-
ValidatorFactory.build(key, type, constraint).validate!
|
13
|
+
ValidatorFactory.build(key, type, constraint, env).validate!
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -19,17 +19,18 @@ module Rack
|
|
19
19
|
register "integer", /\A-?\d+\z/
|
20
20
|
register "iso8601", ->(value) { Time.iso8601(value) rescue false }
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
22
|
+
private
|
23
|
+
|
24
|
+
def valid?
|
25
|
+
value.nil? || pattern === value
|
27
26
|
end
|
28
27
|
|
29
|
-
|
28
|
+
def error_message
|
29
|
+
"Expected #{key} to be #{constraint}, but in fact #{value.inspect}"
|
30
|
+
end
|
30
31
|
|
31
32
|
def pattern
|
32
|
-
self.class.patterns[
|
33
|
+
self.class.patterns[constraint]
|
33
34
|
end
|
34
35
|
end
|
35
36
|
end
|
data/lib/rack/spec/version.rb
CHANGED
data/spec/rack/spec_spec.rb
CHANGED
@@ -7,42 +7,43 @@ describe Rack::Spec do
|
|
7
7
|
include Rack::Test::Methods
|
8
8
|
|
9
9
|
let(:app) do
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
10
|
+
Rack::Builder.app do
|
11
|
+
use Rack::Spec, spec: YAML.load(<<-EOS.strip_heredoc)
|
12
|
+
meta:
|
13
|
+
baseUri: http://api.example.com/
|
14
|
+
endpoints:
|
15
|
+
/recipes:
|
16
|
+
GET:
|
17
|
+
parameters:
|
18
|
+
page:
|
19
|
+
type: integer
|
20
|
+
minimum: 1
|
21
|
+
maximum: 10
|
22
|
+
private:
|
23
|
+
type: boolean
|
24
|
+
rank:
|
25
|
+
type: float
|
26
|
+
time:
|
27
|
+
type: iso8601
|
28
|
+
kind:
|
29
|
+
type: string
|
30
|
+
only:
|
31
|
+
- mono
|
32
|
+
- di
|
33
|
+
- tri
|
34
|
+
POST:
|
35
|
+
parameters:
|
36
|
+
title:
|
37
|
+
type: string
|
38
|
+
minimumLength: 3
|
39
|
+
maximumLength: 10
|
40
|
+
EOS
|
41
|
+
run ->(env) do
|
42
|
+
[200, {}, ["OK"]]
|
43
|
+
end
|
16
44
|
end
|
17
45
|
end
|
18
46
|
|
19
|
-
let(:spec) do
|
20
|
-
YAML.load(yaml)
|
21
|
-
end
|
22
|
-
|
23
|
-
let(:yaml) do
|
24
|
-
<<-EOS.strip_heredoc
|
25
|
-
---
|
26
|
-
meta:
|
27
|
-
baseUri: http://api.example.com/
|
28
|
-
|
29
|
-
endpoints:
|
30
|
-
/recipes:
|
31
|
-
GET:
|
32
|
-
queryParameters:
|
33
|
-
page:
|
34
|
-
type: integer
|
35
|
-
minimum: 1
|
36
|
-
maximum: 10
|
37
|
-
private:
|
38
|
-
type: boolean
|
39
|
-
rank:
|
40
|
-
type: float
|
41
|
-
time:
|
42
|
-
type: iso8601
|
43
|
-
EOS
|
44
|
-
end
|
45
|
-
|
46
47
|
let(:path) do
|
47
48
|
"/recipes"
|
48
49
|
end
|
@@ -56,17 +57,22 @@ describe Rack::Spec do
|
|
56
57
|
end
|
57
58
|
|
58
59
|
subject do
|
59
|
-
|
60
|
+
send verb, path, params, env
|
60
61
|
last_response.status
|
61
62
|
end
|
62
63
|
|
63
|
-
describe "
|
64
|
+
describe "GET" do
|
65
|
+
let(:verb) do
|
66
|
+
:get
|
67
|
+
end
|
68
|
+
|
64
69
|
context "with valid request" do
|
65
70
|
before do
|
66
71
|
params[:page] = 5
|
67
72
|
params[:private] = "false"
|
68
73
|
params[:rank] = 2.0
|
69
74
|
params[:time] = "2000-01-01T00:00:00+00:00"
|
75
|
+
params[:kind] = "mono"
|
70
76
|
end
|
71
77
|
it { should == 200 }
|
72
78
|
end
|
@@ -112,5 +118,40 @@ describe Rack::Spec do
|
|
112
118
|
end
|
113
119
|
it { should == 400 }
|
114
120
|
end
|
121
|
+
|
122
|
+
context "with query parameter invalid on only" do
|
123
|
+
before do
|
124
|
+
params[:kind] = "tetra"
|
125
|
+
end
|
126
|
+
it { should == 400 }
|
127
|
+
end
|
128
|
+
end
|
129
|
+
|
130
|
+
describe "POST" do
|
131
|
+
let(:verb) do
|
132
|
+
:post
|
133
|
+
end
|
134
|
+
|
135
|
+
context "with valid request" do
|
136
|
+
before do
|
137
|
+
params[:title] = "test"
|
138
|
+
end
|
139
|
+
|
140
|
+
it { should == 200 }
|
141
|
+
end
|
142
|
+
|
143
|
+
context "with request body parameter invalid on minimumLength" do
|
144
|
+
before do
|
145
|
+
params[:title] = "te"
|
146
|
+
end
|
147
|
+
it { should == 400 }
|
148
|
+
end
|
149
|
+
|
150
|
+
context "with request body parameter invalid on maximumLength" do
|
151
|
+
before do
|
152
|
+
params[:title] = "toooooolong"
|
153
|
+
end
|
154
|
+
it { should == 400 }
|
155
|
+
end
|
115
156
|
end
|
116
157
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rack-spec
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
@@ -130,6 +130,7 @@ extensions: []
|
|
130
130
|
extra_rdoc_files: []
|
131
131
|
files:
|
132
132
|
- .gitignore
|
133
|
+
- CHANGELOG.md
|
133
134
|
- Gemfile
|
134
135
|
- LICENSE.txt
|
135
136
|
- README.md
|
@@ -142,10 +143,13 @@ files:
|
|
142
143
|
- lib/rack/spec/validation_error.rb
|
143
144
|
- lib/rack/spec/validator_factory.rb
|
144
145
|
- lib/rack/spec/validators/base.rb
|
146
|
+
- lib/rack/spec/validators/maximum_length_validator.rb
|
145
147
|
- lib/rack/spec/validators/maximum_validator.rb
|
148
|
+
- lib/rack/spec/validators/minimum_length_validator.rb
|
146
149
|
- lib/rack/spec/validators/minimum_validator.rb
|
147
150
|
- lib/rack/spec/validators/null_validator.rb
|
148
|
-
- lib/rack/spec/validators/
|
151
|
+
- lib/rack/spec/validators/only_validator.rb
|
152
|
+
- lib/rack/spec/validators/parameters_validator.rb
|
149
153
|
- lib/rack/spec/validators/type_validator.rb
|
150
154
|
- lib/rack/spec/version.rb
|
151
155
|
- rack-spec.gemspec
|