esplanade 1.5.0 → 1.8.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/.github/workflows/ruby.yml +33 -0
- data/.rubocop.yml +10 -3
- data/.tool-versions +1 -1
- data/CHANGELOG.md +25 -1
- data/README.md +148 -46
- data/esplanade.gemspec +6 -7
- data/lib/esplanade/configuration.rb +2 -4
- data/lib/esplanade/middleware.rb +2 -11
- data/lib/esplanade/middlewares/check_custom_response_middleware.rb +2 -11
- data/lib/esplanade/middlewares/dangerous_middleware.rb +2 -11
- data/lib/esplanade/middlewares/safe_middleware.rb +2 -11
- data/lib/esplanade/request/doc.rb +3 -2
- data/lib/esplanade/request/error.rb +12 -4
- data/lib/esplanade/request/raw/body.rb +3 -4
- data/lib/esplanade/request/raw.rb +5 -1
- data/lib/esplanade/request/validation.rb +23 -1
- data/lib/esplanade/response/doc.rb +1 -0
- data/lib/esplanade/response/error.rb +9 -3
- data/lib/esplanade/response/raw/body.rb +4 -5
- data/lib/esplanade/response/validation.rb +5 -4
- data/lib/esplanade/version.rb +1 -1
- metadata +33 -60
- data/.github/workflows/gempush.yml +0 -28
- data/.travis.yml +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6ffb0698e7cf24ebc36233050d09fd554687ce58d52e7bd7ca22cdccb13d005a
|
4
|
+
data.tar.gz: a70a122a41e29e8c7124cea908110340440702af5da52b6e41a32d73348214b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3ee7a3176c117d301dd0bc96bd460ae23fba1a052d371a8a0be9ce4d7f70f6234c9047fb07835573e6a1444bbc91069ed62b1972899d2e1619dfb84a09a9749a
|
7
|
+
data.tar.gz: 06dc2239fa3d97135ffcc6046fbd9b7fb2581ba8ba15e93c56df3caca5777856037a5a638118a03f86e9c43fb76257c43fcf0695ab6aaf9f65bbd5fd4c04005e
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# This workflow uses actions that are not certified by GitHub.
|
2
|
+
# They are provided by a third-party and are governed by
|
3
|
+
# separate terms of service, privacy policy, and support
|
4
|
+
# documentation.
|
5
|
+
# This workflow will download a prebuilt Ruby version, install dependencies and run tests with Rake
|
6
|
+
# For more information see: https://github.com/marketplace/actions/setup-ruby-jruby-and-truffleruby
|
7
|
+
|
8
|
+
name: Ruby
|
9
|
+
|
10
|
+
on:
|
11
|
+
push:
|
12
|
+
branches: [ master ]
|
13
|
+
pull_request:
|
14
|
+
branches: [ master ]
|
15
|
+
|
16
|
+
jobs:
|
17
|
+
test:
|
18
|
+
|
19
|
+
runs-on: ubuntu-latest
|
20
|
+
|
21
|
+
steps:
|
22
|
+
- uses: actions/checkout@v2
|
23
|
+
- name: Set up Ruby
|
24
|
+
# To automatically get bug fixes and new Ruby versions for ruby/setup-ruby,
|
25
|
+
# change this to (see https://github.com/ruby/setup-ruby#versioning):
|
26
|
+
uses: ruby/setup-ruby@v1
|
27
|
+
# uses: ruby/setup-ruby@ec106b438a1ff6ff109590de34ddc62c540232e0
|
28
|
+
with:
|
29
|
+
ruby-version: 2.7
|
30
|
+
- name: Install dependencies
|
31
|
+
run: bundle install
|
32
|
+
- name: Run tests
|
33
|
+
run: bundle exec rake
|
data/.rubocop.yml
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
AllCops:
|
2
|
-
|
2
|
+
NewCops: enable
|
3
|
+
TargetRubyVersion: 2.4
|
3
4
|
|
4
|
-
|
5
|
-
|
5
|
+
Layout/LineLength:
|
6
|
+
Enabled: false
|
6
7
|
|
7
8
|
Style/Documentation:
|
8
9
|
Enabled: false
|
@@ -13,6 +14,12 @@ Style/FrozenStringLiteralComment:
|
|
13
14
|
Metrics/BlockLength:
|
14
15
|
Enabled: false
|
15
16
|
|
17
|
+
Metrics/ParameterLists:
|
18
|
+
Enabled: false
|
19
|
+
|
20
|
+
Metrics/MethodLength:
|
21
|
+
Enabled: false
|
22
|
+
|
16
23
|
Style/IfUnlessModifier:
|
17
24
|
Enabled: false
|
18
25
|
|
data/.tool-versions
CHANGED
@@ -1 +1 @@
|
|
1
|
-
ruby 2.
|
1
|
+
ruby 2.7.1
|
data/CHANGELOG.md
CHANGED
@@ -1,6 +1,30 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
-
### 1.
|
3
|
+
### 1.8.0 - 2021-09-29
|
4
|
+
|
5
|
+
* patch
|
6
|
+
* remove multi_json
|
7
|
+
|
8
|
+
### 1.7.1 - 2021-02-10
|
9
|
+
|
10
|
+
* setting
|
11
|
+
* improve gemspec dependency for tomograph
|
12
|
+
|
13
|
+
### 1.7.0 - 2020-12-22
|
14
|
+
|
15
|
+
* improvements
|
16
|
+
* changed middleware arguments
|
17
|
+
|
18
|
+
### 1.6.0 - 2020-10-12
|
19
|
+
|
20
|
+
* features
|
21
|
+
* in the errors write not only a documented path but also a raw [#11](https://github.com/funbox/esplanade/issues/11)
|
22
|
+
* write in the documentation that the body is empty and nil is skipped [#13](https://github.com/funbox/esplanade/issues/13)
|
23
|
+
* redefine error PrefixNotMatch for response [#17](https://github.com/funbox/esplanade/issues/17)
|
24
|
+
* content-type can contain additional parameters [#21](https://github.com/funbox/esplanade/issues/21)
|
25
|
+
* update esplanade for the new tomograph [#29](https://github.com/funbox/esplanade/issues/29)
|
26
|
+
|
27
|
+
### 1.5.0 - 2020-04-07
|
4
28
|
|
5
29
|
* improvements
|
6
30
|
* updated dependenses
|
data/README.md
CHANGED
@@ -1,16 +1,36 @@
|
|
1
1
|
# Esplanade
|
2
2
|
|
3
|
-
<a href="https://funbox.ru">
|
4
|
-
<img src="https://funbox.ru/badges/sponsored_by_funbox_compact.svg" alt="Sponsored by FunBox" width=250 />
|
5
|
-
</a>
|
6
|
-
|
7
3
|
[](https://badge.fury.io/rb/esplanade)
|
8
|
-
[](https://travis-ci.org/funbox/esplanade)
|
9
4
|
|
10
|
-
This gem
|
5
|
+
This gem helps you to validate and synchronize your API in strict accordance to the documentation in
|
11
6
|
[API Blueprint](https://apiblueprint.org/) format.
|
12
|
-
To do this it automatically searches received
|
13
|
-
|
7
|
+
To do this it automatically searches received requests and responses in the documentation and run
|
8
|
+
JSON-schemas validators.
|
9
|
+
|
10
|
+
## Contents
|
11
|
+
|
12
|
+
- [Installation](#installation)
|
13
|
+
- [Usage](#usage)
|
14
|
+
- [Middlewares](#middlewares)
|
15
|
+
- [Esplanade::SafeMiddleware](#esplanadesafemiddleware)
|
16
|
+
- [Esplanade::DangerousMiddleware](#esplanadedangerousmiddleware)
|
17
|
+
- [Esplanade::CheckCustomResponseMiddleware](#esplanadecheckcustomresponsemiddleware)
|
18
|
+
- [Esplanade::Error](#esplanadeerror)
|
19
|
+
- [Esplanade::Request::Error](#esplanaderequesterror)
|
20
|
+
- [Esplanade::Request::PrefixNotMatch](#esplanaderequestprefixnotmatch)
|
21
|
+
- [Esplanade::Request::NotDocumented](#esplanaderequestnotdocumented)
|
22
|
+
- [Esplanade::Request::ContentTypeIsNotJson](#esplanaderequestcontenttypeisnotjson)
|
23
|
+
- [Esplanade::Request::BodyIsNotJson](#esplanaderequestbodyisnotjson)
|
24
|
+
- [Esplanade::Request::Invalid](#esplanaderequestinvalid)
|
25
|
+
- [Esplanade::Response::Error](#esplanaderesponseerror)
|
26
|
+
- [Esplanade::Response::NotDocumented](#esplanaderesponsenotdocumented)
|
27
|
+
- [Esplanade::Response::BodyIsNotJson](#esplanaderesponsebodyisnotjson)
|
28
|
+
- [Esplanade::Response::Invalid](#esplanaderesponseinvalid)
|
29
|
+
- [Middleware args](#middleware-args)
|
30
|
+
- [`apib_path`](#apib_path)
|
31
|
+
- [`drafter_yaml_path`](#drafter_yaml_path)
|
32
|
+
- [`prefix`](#prefix)
|
33
|
+
- [License](#license)
|
14
34
|
|
15
35
|
## Installation
|
16
36
|
|
@@ -20,107 +40,189 @@ Add this line to your application's Gemfile:
|
|
20
40
|
gem 'esplanade'
|
21
41
|
```
|
22
42
|
|
23
|
-
|
43
|
+
After that execute:
|
24
44
|
|
25
|
-
|
45
|
+
```bash
|
46
|
+
$ bundle
|
47
|
+
```
|
26
48
|
|
27
|
-
Or install
|
49
|
+
Or install the gem by yourself:
|
28
50
|
|
29
|
-
|
51
|
+
```bash
|
52
|
+
$ gem install esplanade
|
53
|
+
```
|
30
54
|
|
31
55
|
## Usage
|
32
56
|
|
33
|
-
`config/application.rb
|
57
|
+
`config/application.rb`:
|
34
58
|
|
35
59
|
```ruby
|
36
|
-
config.middleware.use Esplanade::SafeMiddleware,
|
60
|
+
config.middleware.use Esplanade::SafeMiddleware, drafter_yaml_path: 'doc.yaml'
|
37
61
|
```
|
38
62
|
|
39
|
-
##
|
63
|
+
## Middlewares
|
40
64
|
|
41
65
|
### Esplanade::SafeMiddleware
|
42
66
|
|
43
|
-
|
67
|
+
Debug logger.
|
44
68
|
|
45
69
|
### Esplanade::DangerousMiddleware
|
46
70
|
|
47
|
-
It throws errors, so you
|
71
|
+
It throws errors, so you should add your own middleware for processing.
|
48
72
|
|
49
73
|
```ruby
|
50
|
-
|
51
|
-
|
74
|
+
config.middleware.use YourMiddleware
|
75
|
+
config.middleware.use Esplanade::DangerousMiddleware, drafter_yaml_path: 'doc.yaml'
|
52
76
|
```
|
53
77
|
|
54
78
|
### Esplanade::CheckCustomResponseMiddleware
|
55
79
|
|
56
|
-
|
80
|
+
Use it if you want to be sure that you have documented new custom responses.
|
57
81
|
|
58
82
|
```ruby
|
59
|
-
|
60
|
-
|
61
|
-
|
83
|
+
config.middleware.use Esplanade::CheckCustomResponseMiddleware, drafter_yaml_path: 'doc.yaml'
|
84
|
+
config.middleware.use YourMiddleware
|
85
|
+
config.middleware.use Esplanade::DangerousMiddleware, drafter_yaml_path: 'doc.yaml'
|
62
86
|
```
|
63
87
|
|
64
88
|
## Esplanade::Error
|
65
89
|
|
66
|
-
|
90
|
+
Parent class for those described below.
|
67
91
|
|
68
92
|
### Esplanade::Request::Error
|
69
93
|
|
70
|
-
|
94
|
+
Parent class for those described below. Inherited from `Esplanade::Error`.
|
71
95
|
|
72
96
|
#### Esplanade::Request::PrefixNotMatch
|
73
97
|
|
74
|
-
Error message
|
98
|
+
Error message format:
|
99
|
+
|
100
|
+
```ruby
|
101
|
+
{
|
102
|
+
:method => "method",
|
103
|
+
:path => "path",
|
104
|
+
:raw_path => "path",
|
105
|
+
:content_type => "content_type"
|
106
|
+
}
|
107
|
+
```
|
75
108
|
|
76
109
|
#### Esplanade::Request::NotDocumented
|
77
110
|
|
78
|
-
Error message
|
111
|
+
Error message format:
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
{
|
115
|
+
:method => "method",
|
116
|
+
:path => "path",
|
117
|
+
:raw_path => "path",
|
118
|
+
:content_type => "content_type"
|
119
|
+
}
|
120
|
+
```
|
79
121
|
|
80
122
|
#### Esplanade::Request::ContentTypeIsNotJson
|
81
123
|
|
82
|
-
Error message
|
124
|
+
Error message format:
|
125
|
+
|
126
|
+
```ruby
|
127
|
+
{
|
128
|
+
:method => "method",
|
129
|
+
:path => "path",
|
130
|
+
:raw_path => "path",
|
131
|
+
:content_type => "content_type"
|
132
|
+
}
|
133
|
+
```
|
83
134
|
|
84
135
|
#### Esplanade::Request::BodyIsNotJson
|
85
136
|
|
86
|
-
|
137
|
+
Throws an error also when the body is empty and equal nil.
|
138
|
+
|
139
|
+
Error message format:
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
{
|
143
|
+
:method => "method",
|
144
|
+
:path => "path",
|
145
|
+
:raw_path => "path",
|
146
|
+
:content_type => "content_type",
|
147
|
+
:body => "body"
|
148
|
+
}
|
149
|
+
```
|
87
150
|
|
88
151
|
#### Esplanade::Request::Invalid
|
89
152
|
|
90
|
-
Error message
|
153
|
+
Error message format:
|
154
|
+
|
155
|
+
```ruby
|
156
|
+
{
|
157
|
+
:method => "method",
|
158
|
+
:path => "path",
|
159
|
+
:raw_path => "path",
|
160
|
+
:content_type => "content_type",
|
161
|
+
:body => "body",
|
162
|
+
:error => ["error"]
|
163
|
+
}
|
164
|
+
```
|
91
165
|
|
92
166
|
### Esplanade::Response::Error
|
93
167
|
|
94
|
-
|
168
|
+
Parent class for those described below. Inherited from `Esplanade::Error`.
|
95
169
|
|
96
170
|
#### Esplanade::Response::NotDocumented
|
97
171
|
|
98
|
-
Error message
|
172
|
+
Error message format:
|
99
173
|
|
100
|
-
|
101
|
-
|
102
|
-
|
174
|
+
```ruby
|
175
|
+
{
|
176
|
+
:request => {
|
177
|
+
:method => "method",
|
178
|
+
:path => "path",
|
179
|
+
:raw_path => "path"
|
180
|
+
},
|
181
|
+
:status => "status"
|
182
|
+
}
|
183
|
+
```
|
103
184
|
|
104
|
-
|
185
|
+
#### Esplanade::Response::BodyIsNotJson
|
105
186
|
|
106
|
-
|
187
|
+
It's thrown when expected response to request isn't JSON (not `Content-Type: application/json`) and there's no non-JSON responses documented for the endpoint.
|
107
188
|
|
108
|
-
Error message
|
189
|
+
Error message format:
|
109
190
|
|
110
|
-
|
111
|
-
|
112
|
-
|
191
|
+
```ruby
|
192
|
+
{
|
193
|
+
:request => {
|
194
|
+
:method => "method",
|
195
|
+
:path => "path",
|
196
|
+
:raw_path => "path"
|
197
|
+
},
|
198
|
+
:status => "status",
|
199
|
+
:body => "body"
|
200
|
+
}
|
201
|
+
```
|
113
202
|
|
114
|
-
|
203
|
+
#### Esplanade::Response::Invalid
|
115
204
|
|
116
|
-
|
205
|
+
Error message format:
|
117
206
|
|
118
|
-
|
207
|
+
```ruby
|
208
|
+
{
|
209
|
+
:request => {
|
210
|
+
:method => "method",
|
211
|
+
:path => "path",
|
212
|
+
:raw_path => "path"
|
213
|
+
},
|
214
|
+
:status => "status",
|
215
|
+
:body => "body",
|
216
|
+
:error => ["error"]
|
217
|
+
}
|
218
|
+
```
|
119
219
|
|
120
|
-
|
220
|
+
## Middleware args
|
121
221
|
|
122
|
-
|
222
|
+
Support any [tomograph constructor-params](https://github.com/funbox/tomograph/tree/master#constructor-params)
|
123
223
|
|
124
224
|
## License
|
125
225
|
|
126
226
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
227
|
+
|
228
|
+
[](https://funbox.ru)
|
data/esplanade.gemspec
CHANGED
@@ -17,12 +17,11 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.require_paths = ['lib']
|
18
18
|
|
19
19
|
spec.add_runtime_dependency 'json-schema', '~> 2.6', '>= 2.6.2'
|
20
|
-
spec.add_runtime_dependency '
|
21
|
-
spec.
|
22
|
-
spec.add_development_dependency '
|
23
|
-
spec.add_development_dependency '
|
24
|
-
spec.add_development_dependency '
|
25
|
-
spec.add_development_dependency '
|
26
|
-
spec.add_development_dependency 'simplecov', '~> 0.18', '>= 0.18'
|
20
|
+
spec.add_runtime_dependency 'tomograph', '~> 3.1', '>= 3.1.0'
|
21
|
+
spec.add_development_dependency 'byebug', '~> 11.1', '>= 11.1.3'
|
22
|
+
spec.add_development_dependency 'rake', '~> 13.0', '>= 13.0.6'
|
23
|
+
spec.add_development_dependency 'rspec', '~> 3.10'
|
24
|
+
spec.add_development_dependency 'rubocop', '~> 1.22.0'
|
25
|
+
spec.add_development_dependency 'simplecov', '~> 0.21'
|
27
26
|
spec.required_ruby_version = '>= 2.4.0'
|
28
27
|
end
|
data/lib/esplanade/middleware.rb
CHANGED
@@ -4,18 +4,9 @@ require 'esplanade/response'
|
|
4
4
|
|
5
5
|
module Esplanade
|
6
6
|
class Middleware
|
7
|
-
def initialize(
|
8
|
-
app,
|
9
|
-
prefix: Esplanade.configuration.prefix,
|
10
|
-
apib_path: Esplanade.configuration.apib_path,
|
11
|
-
drafter_yaml_path: Esplanade.configuration.drafter_yaml_path
|
12
|
-
)
|
7
|
+
def initialize(app, **params)
|
13
8
|
@app = app
|
14
|
-
@documentation = Tomograph::Tomogram.new(
|
15
|
-
prefix: prefix,
|
16
|
-
apib_path: apib_path,
|
17
|
-
drafter_yaml_path: drafter_yaml_path
|
18
|
-
)
|
9
|
+
@documentation = Tomograph::Tomogram.new(Esplanade.configuration.params.merge(params))
|
19
10
|
end
|
20
11
|
|
21
12
|
def call(env)
|
@@ -4,18 +4,9 @@ require 'esplanade/response'
|
|
4
4
|
|
5
5
|
module Esplanade
|
6
6
|
class CheckCustomResponseMiddleware
|
7
|
-
def initialize(
|
8
|
-
app,
|
9
|
-
prefix: Esplanade.configuration.prefix,
|
10
|
-
apib_path: Esplanade.configuration.apib_path,
|
11
|
-
drafter_yaml_path: Esplanade.configuration.drafter_yaml_path
|
12
|
-
)
|
7
|
+
def initialize(app, **params)
|
13
8
|
@app = app
|
14
|
-
@documentation = Tomograph::Tomogram.new(
|
15
|
-
prefix: prefix,
|
16
|
-
apib_path: apib_path,
|
17
|
-
drafter_yaml_path: drafter_yaml_path
|
18
|
-
)
|
9
|
+
@documentation = Tomograph::Tomogram.new(Esplanade.configuration.params.merge(params))
|
19
10
|
end
|
20
11
|
|
21
12
|
def call(env)
|
@@ -4,18 +4,9 @@ require 'esplanade/response'
|
|
4
4
|
|
5
5
|
module Esplanade
|
6
6
|
class DangerousMiddleware
|
7
|
-
def initialize(
|
8
|
-
app,
|
9
|
-
prefix: Esplanade.configuration.prefix,
|
10
|
-
apib_path: Esplanade.configuration.apib_path,
|
11
|
-
drafter_yaml_path: Esplanade.configuration.drafter_yaml_path
|
12
|
-
)
|
7
|
+
def initialize(app, **params)
|
13
8
|
@app = app
|
14
|
-
@documentation = Tomograph::Tomogram.new(
|
15
|
-
prefix: prefix,
|
16
|
-
apib_path: apib_path,
|
17
|
-
drafter_yaml_path: drafter_yaml_path
|
18
|
-
)
|
9
|
+
@documentation = Tomograph::Tomogram.new(Esplanade.configuration.params.merge(params))
|
19
10
|
end
|
20
11
|
|
21
12
|
def call(env)
|
@@ -4,18 +4,9 @@ require 'esplanade/response'
|
|
4
4
|
|
5
5
|
module Esplanade
|
6
6
|
class SafeMiddleware
|
7
|
-
def initialize(
|
8
|
-
app,
|
9
|
-
prefix: Esplanade.configuration.prefix,
|
10
|
-
apib_path: Esplanade.configuration.apib_path,
|
11
|
-
drafter_yaml_path: Esplanade.configuration.drafter_yaml_path
|
12
|
-
)
|
7
|
+
def initialize(app, **params)
|
13
8
|
@app = app
|
14
|
-
@documentation = Tomograph::Tomogram.new(
|
15
|
-
prefix: prefix,
|
16
|
-
apib_path: apib_path,
|
17
|
-
drafter_yaml_path: drafter_yaml_path
|
18
|
-
)
|
9
|
+
@documentation = Tomograph::Tomogram.new(Esplanade.configuration.params.merge(params))
|
19
10
|
end
|
20
11
|
|
21
12
|
def call(env)
|
@@ -19,8 +19,8 @@ module Esplanade
|
|
19
19
|
@tomogram
|
20
20
|
end
|
21
21
|
|
22
|
-
def
|
23
|
-
@
|
22
|
+
def json_schemas
|
23
|
+
@json_schemas ||= tomogram.requests
|
24
24
|
end
|
25
25
|
|
26
26
|
def method
|
@@ -47,6 +47,7 @@ module Esplanade
|
|
47
47
|
{
|
48
48
|
method: @raw.method,
|
49
49
|
path: @raw.path,
|
50
|
+
raw_path: @raw.raw_path,
|
50
51
|
content_type: @raw.content_type
|
51
52
|
}
|
52
53
|
end
|
@@ -5,9 +5,10 @@ module Esplanade
|
|
5
5
|
class PrefixNotMatch < Error; end
|
6
6
|
|
7
7
|
class NotDocumented < Error
|
8
|
-
def initialize(method:, path:, content_type:)
|
8
|
+
def initialize(method:, path:, raw_path:, content_type:)
|
9
9
|
@method = method
|
10
10
|
@path = path
|
11
|
+
@raw_path = raw_path
|
11
12
|
@content_type = content_type
|
12
13
|
|
13
14
|
super(to_hash)
|
@@ -17,14 +18,16 @@ module Esplanade
|
|
17
18
|
{
|
18
19
|
method: @method,
|
19
20
|
path: @path,
|
21
|
+
raw_path: @raw_path,
|
20
22
|
content_type: @content_type
|
21
23
|
}
|
22
24
|
end
|
23
25
|
end
|
24
26
|
|
25
27
|
class ContentTypeIsNotJson < Error
|
26
|
-
def initialize(method:, path:, content_type:)
|
28
|
+
def initialize(method:, path:, raw_path:, content_type:)
|
27
29
|
@method = method
|
30
|
+
@raw_path = raw_path
|
28
31
|
@path = path
|
29
32
|
@content_type = content_type
|
30
33
|
|
@@ -35,15 +38,17 @@ module Esplanade
|
|
35
38
|
{
|
36
39
|
method: @method,
|
37
40
|
path: @path,
|
41
|
+
raw_path: @raw_path,
|
38
42
|
content_type: @content_type
|
39
43
|
}
|
40
44
|
end
|
41
45
|
end
|
42
46
|
|
43
47
|
class BodyIsNotJson < Error
|
44
|
-
def initialize(method:, path:, content_type:, body:)
|
48
|
+
def initialize(method:, path:, raw_path:, content_type:, body:)
|
45
49
|
@method = method
|
46
50
|
@path = path
|
51
|
+
@raw_path = raw_path
|
47
52
|
@content_type = content_type
|
48
53
|
@body = body
|
49
54
|
|
@@ -54,6 +59,7 @@ module Esplanade
|
|
54
59
|
{
|
55
60
|
method: @method,
|
56
61
|
path: @path,
|
62
|
+
raw_path: @raw_path,
|
57
63
|
content_type: @content_type,
|
58
64
|
body: @body
|
59
65
|
}
|
@@ -61,9 +67,10 @@ module Esplanade
|
|
61
67
|
end
|
62
68
|
|
63
69
|
class Invalid < Error
|
64
|
-
def initialize(method:, path:, content_type:, body:, error:)
|
70
|
+
def initialize(method:, path:, raw_path:, content_type:, body:, error:)
|
65
71
|
@method = method
|
66
72
|
@path = path
|
73
|
+
@raw_path = raw_path
|
67
74
|
@content_type = content_type
|
68
75
|
@body = body
|
69
76
|
@error = error
|
@@ -75,6 +82,7 @@ module Esplanade
|
|
75
82
|
{
|
76
83
|
method: @method,
|
77
84
|
path: @path,
|
85
|
+
raw_path: @raw_path,
|
78
86
|
content_type: @content_type,
|
79
87
|
body: @body,
|
80
88
|
error: @error
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'multi_json'
|
2
|
-
|
3
1
|
module Esplanade
|
4
2
|
class Request
|
5
3
|
class Raw
|
@@ -18,8 +16,8 @@ module Esplanade
|
|
18
16
|
end
|
19
17
|
|
20
18
|
def to_hash
|
21
|
-
@hash ||=
|
22
|
-
rescue
|
19
|
+
@hash ||= JSON.parse(to_string.to_s)
|
20
|
+
rescue JSON::ParserError
|
23
21
|
raise BodyIsNotJson.new(**message)
|
24
22
|
end
|
25
23
|
|
@@ -37,6 +35,7 @@ module Esplanade
|
|
37
35
|
{
|
38
36
|
method: @raw_request.method,
|
39
37
|
path: @raw_request.path,
|
38
|
+
raw_path: @raw_request.raw_path,
|
40
39
|
content_type: @raw_request.content_type,
|
41
40
|
body: reduced_version
|
42
41
|
}
|
@@ -15,12 +15,16 @@ module Esplanade
|
|
15
15
|
@path ||= @env['PATH_INFO']
|
16
16
|
end
|
17
17
|
|
18
|
+
def raw_path
|
19
|
+
@raw_path ||= "#{@env['PATH_INFO']}/#{@env['QUERY_STRING']}"
|
20
|
+
end
|
21
|
+
|
18
22
|
def body
|
19
23
|
@body ||= Body.new(self, @env)
|
20
24
|
end
|
21
25
|
|
22
26
|
def content_type
|
23
|
-
@content_type ||= @env['CONTENT_TYPE']
|
27
|
+
@content_type ||= @env['CONTENT_TYPE'].to_s.split(';').first
|
24
28
|
end
|
25
29
|
end
|
26
30
|
end
|
@@ -12,17 +12,38 @@ module Esplanade
|
|
12
12
|
def valid!
|
13
13
|
raise ContentTypeIsNotJson.new(**mini_message) unless @doc.content_type == 'application/json'
|
14
14
|
|
15
|
-
@error ||=
|
15
|
+
@error ||= if @doc.json_schemas.size == 1
|
16
|
+
one_json_schema
|
17
|
+
else
|
18
|
+
more_than_one_json_schema
|
19
|
+
end
|
16
20
|
|
17
21
|
raise Invalid.new(**message) unless @error.empty?
|
18
22
|
end
|
19
23
|
|
20
24
|
private
|
21
25
|
|
26
|
+
def one_json_schema
|
27
|
+
JSON::Validator.fully_validate(@doc.json_schemas.first, @raw.body.to_hash)
|
28
|
+
end
|
29
|
+
|
30
|
+
def more_than_one_json_schema
|
31
|
+
main_res = @doc.json_schemas.each do |json_schema|
|
32
|
+
res = JSON::Validator.fully_validate(json_schema, @raw.body.to_hash)
|
33
|
+
break res if res == []
|
34
|
+
end
|
35
|
+
if main_res == []
|
36
|
+
[]
|
37
|
+
else
|
38
|
+
['invalid']
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
22
42
|
def mini_message
|
23
43
|
{
|
24
44
|
method: @doc.method,
|
25
45
|
path: @doc.path,
|
46
|
+
raw_path: @raw.raw_path,
|
26
47
|
content_type: @doc.content_type
|
27
48
|
}
|
28
49
|
end
|
@@ -31,6 +52,7 @@ module Esplanade
|
|
31
52
|
{
|
32
53
|
method: @raw.method,
|
33
54
|
path: @raw.path,
|
55
|
+
raw_path: @raw.raw_path,
|
34
56
|
content_type: @raw.content_type,
|
35
57
|
body: @raw.body.to_hash,
|
36
58
|
error: @error
|
@@ -6,6 +6,7 @@ module Esplanade
|
|
6
6
|
def initialize(request:, status:)
|
7
7
|
@method = request[:method]
|
8
8
|
@path = request[:path]
|
9
|
+
@raw_path = request[:raw_path]
|
9
10
|
@status = status
|
10
11
|
|
11
12
|
super(to_hash)
|
@@ -16,7 +17,8 @@ module Esplanade
|
|
16
17
|
request:
|
17
18
|
{
|
18
19
|
method: @method,
|
19
|
-
path: @path
|
20
|
+
path: @path,
|
21
|
+
raw_path: @raw_path
|
20
22
|
},
|
21
23
|
status: @status
|
22
24
|
}
|
@@ -27,6 +29,7 @@ module Esplanade
|
|
27
29
|
def initialize(request:, status:, body:)
|
28
30
|
@method = request[:method]
|
29
31
|
@path = request[:path]
|
32
|
+
@raw_path = request[:raw_path]
|
30
33
|
@status = status
|
31
34
|
@body = body
|
32
35
|
|
@@ -38,7 +41,8 @@ module Esplanade
|
|
38
41
|
request:
|
39
42
|
{
|
40
43
|
method: @method,
|
41
|
-
path: @path
|
44
|
+
path: @path,
|
45
|
+
raw_path: @raw_path
|
42
46
|
},
|
43
47
|
status: @status,
|
44
48
|
body: @body
|
@@ -50,6 +54,7 @@ module Esplanade
|
|
50
54
|
def initialize(request:, status:, body:, error:)
|
51
55
|
@method = request[:method]
|
52
56
|
@path = request[:path]
|
57
|
+
@raw_path = request[:raw_path]
|
53
58
|
@status = status
|
54
59
|
@body = body
|
55
60
|
@error = error
|
@@ -62,7 +67,8 @@ module Esplanade
|
|
62
67
|
request:
|
63
68
|
{
|
64
69
|
method: @method,
|
65
|
-
path: @path
|
70
|
+
path: @path,
|
71
|
+
raw_path: @raw_path
|
66
72
|
},
|
67
73
|
status: @status,
|
68
74
|
body: @body,
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'multi_json'
|
2
|
-
|
3
1
|
module Esplanade
|
4
2
|
class Response
|
5
3
|
class Raw
|
@@ -16,8 +14,8 @@ module Esplanade
|
|
16
14
|
end
|
17
15
|
|
18
16
|
def to_hash
|
19
|
-
@hash ||=
|
20
|
-
rescue
|
17
|
+
@hash ||= JSON.parse(to_string)
|
18
|
+
rescue JSON::ParserError
|
21
19
|
raise BodyIsNotJson.new(**message)
|
22
20
|
end
|
23
21
|
|
@@ -27,7 +25,8 @@ module Esplanade
|
|
27
25
|
{
|
28
26
|
request: {
|
29
27
|
method: @request.raw.method,
|
30
|
-
path: @request.raw.path
|
28
|
+
path: @request.raw.path,
|
29
|
+
raw_path: @request.raw.raw_path
|
31
30
|
},
|
32
31
|
status: @raw_response.status,
|
33
32
|
body: @raw_response.body.to_string
|
@@ -29,10 +29,10 @@ module Esplanade
|
|
29
29
|
res = JSON::Validator.fully_validate(json_schema, @raw.body.to_hash)
|
30
30
|
break res if res == []
|
31
31
|
end
|
32
|
-
if main_res
|
33
|
-
['invalid']
|
34
|
-
else
|
32
|
+
if main_res == []
|
35
33
|
[]
|
34
|
+
else
|
35
|
+
['invalid']
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
@@ -40,7 +40,8 @@ module Esplanade
|
|
40
40
|
{
|
41
41
|
request: {
|
42
42
|
method: @request.raw.method,
|
43
|
-
path: @request.raw.path
|
43
|
+
path: @request.raw.path,
|
44
|
+
raw_path: @request.raw.raw_path
|
44
45
|
},
|
45
46
|
status: @raw.status,
|
46
47
|
body: @raw.body.to_string,
|
data/lib/esplanade/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: esplanade
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- d.efimov
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-09-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: json-schema
|
@@ -31,146 +31,119 @@ dependencies:
|
|
31
31
|
- !ruby/object:Gem::Version
|
32
32
|
version: 2.6.2
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
|
-
name:
|
34
|
+
name: tomograph
|
35
35
|
requirement: !ruby/object:Gem::Requirement
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version: '1
|
39
|
+
version: '3.1'
|
40
40
|
- - ">="
|
41
41
|
- !ruby/object:Gem::Version
|
42
|
-
version: 1.
|
42
|
+
version: 3.1.0
|
43
43
|
type: :runtime
|
44
44
|
prerelease: false
|
45
45
|
version_requirements: !ruby/object:Gem::Requirement
|
46
46
|
requirements:
|
47
47
|
- - "~>"
|
48
48
|
- !ruby/object:Gem::Version
|
49
|
-
version: '1
|
49
|
+
version: '3.1'
|
50
50
|
- - ">="
|
51
51
|
- !ruby/object:Gem::Version
|
52
|
-
version: 1.
|
52
|
+
version: 3.1.0
|
53
53
|
- !ruby/object:Gem::Dependency
|
54
|
-
name:
|
54
|
+
name: byebug
|
55
55
|
requirement: !ruby/object:Gem::Requirement
|
56
56
|
requirements:
|
57
57
|
- - "~>"
|
58
58
|
- !ruby/object:Gem::Version
|
59
|
-
version: '
|
59
|
+
version: '11.1'
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
63
|
-
type: :
|
62
|
+
version: 11.1.3
|
63
|
+
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - "~>"
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version: '
|
70
|
-
- - ">="
|
71
|
-
- !ruby/object:Gem::Version
|
72
|
-
version: 2.0.0
|
73
|
-
- !ruby/object:Gem::Dependency
|
74
|
-
name: byebug
|
75
|
-
requirement: !ruby/object:Gem::Requirement
|
76
|
-
requirements:
|
77
|
-
- - ">="
|
78
|
-
- !ruby/object:Gem::Version
|
79
|
-
version: 10.0.0
|
80
|
-
type: :development
|
81
|
-
prerelease: false
|
82
|
-
version_requirements: !ruby/object:Gem::Requirement
|
83
|
-
requirements:
|
69
|
+
version: '11.1'
|
84
70
|
- - ">="
|
85
71
|
- !ruby/object:Gem::Version
|
86
|
-
version:
|
72
|
+
version: 11.1.3
|
87
73
|
- !ruby/object:Gem::Dependency
|
88
74
|
name: rake
|
89
75
|
requirement: !ruby/object:Gem::Requirement
|
90
76
|
requirements:
|
91
77
|
- - "~>"
|
92
78
|
- !ruby/object:Gem::Version
|
93
|
-
version: '13'
|
79
|
+
version: '13.0'
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 13.0.6
|
94
83
|
type: :development
|
95
84
|
prerelease: false
|
96
85
|
version_requirements: !ruby/object:Gem::Requirement
|
97
86
|
requirements:
|
98
87
|
- - "~>"
|
99
88
|
- !ruby/object:Gem::Version
|
100
|
-
version: '13'
|
89
|
+
version: '13.0'
|
90
|
+
- - ">="
|
91
|
+
- !ruby/object:Gem::Version
|
92
|
+
version: 13.0.6
|
101
93
|
- !ruby/object:Gem::Dependency
|
102
94
|
name: rspec
|
103
95
|
requirement: !ruby/object:Gem::Requirement
|
104
96
|
requirements:
|
105
97
|
- - "~>"
|
106
98
|
- !ruby/object:Gem::Version
|
107
|
-
version: '3.
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: 3.9.0
|
99
|
+
version: '3.10'
|
111
100
|
type: :development
|
112
101
|
prerelease: false
|
113
102
|
version_requirements: !ruby/object:Gem::Requirement
|
114
103
|
requirements:
|
115
104
|
- - "~>"
|
116
105
|
- !ruby/object:Gem::Version
|
117
|
-
version: '3.
|
118
|
-
- - ">="
|
119
|
-
- !ruby/object:Gem::Version
|
120
|
-
version: 3.9.0
|
106
|
+
version: '3.10'
|
121
107
|
- !ruby/object:Gem::Dependency
|
122
108
|
name: rubocop
|
123
109
|
requirement: !ruby/object:Gem::Requirement
|
124
110
|
requirements:
|
125
111
|
- - "~>"
|
126
112
|
- !ruby/object:Gem::Version
|
127
|
-
version:
|
128
|
-
- - ">="
|
129
|
-
- !ruby/object:Gem::Version
|
130
|
-
version: 0.81.0
|
113
|
+
version: 1.22.0
|
131
114
|
type: :development
|
132
115
|
prerelease: false
|
133
116
|
version_requirements: !ruby/object:Gem::Requirement
|
134
117
|
requirements:
|
135
118
|
- - "~>"
|
136
119
|
- !ruby/object:Gem::Version
|
137
|
-
version:
|
138
|
-
- - ">="
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
version: 0.81.0
|
120
|
+
version: 1.22.0
|
141
121
|
- !ruby/object:Gem::Dependency
|
142
122
|
name: simplecov
|
143
123
|
requirement: !ruby/object:Gem::Requirement
|
144
124
|
requirements:
|
145
125
|
- - "~>"
|
146
126
|
- !ruby/object:Gem::Version
|
147
|
-
version: '0.
|
148
|
-
- - ">="
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: '0.18'
|
127
|
+
version: '0.21'
|
151
128
|
type: :development
|
152
129
|
prerelease: false
|
153
130
|
version_requirements: !ruby/object:Gem::Requirement
|
154
131
|
requirements:
|
155
132
|
- - "~>"
|
156
133
|
- !ruby/object:Gem::Version
|
157
|
-
version: '0.
|
158
|
-
|
159
|
-
- !ruby/object:Gem::Version
|
160
|
-
version: '0.18'
|
161
|
-
description:
|
134
|
+
version: '0.21'
|
135
|
+
description:
|
162
136
|
email:
|
163
137
|
- d.efimov@fun-box.ru
|
164
138
|
executables: []
|
165
139
|
extensions: []
|
166
140
|
extra_rdoc_files: []
|
167
141
|
files:
|
168
|
-
- ".github/workflows/
|
142
|
+
- ".github/workflows/ruby.yml"
|
169
143
|
- ".gitignore"
|
170
144
|
- ".rubocop.yml"
|
171
145
|
- ".ruby-version"
|
172
146
|
- ".tool-versions"
|
173
|
-
- ".travis.yml"
|
174
147
|
- CHANGELOG.md
|
175
148
|
- CODE_OF_CONDUCT.md
|
176
149
|
- Gemfile
|
@@ -200,11 +173,11 @@ files:
|
|
200
173
|
- lib/esplanade/response/raw/body.rb
|
201
174
|
- lib/esplanade/response/validation.rb
|
202
175
|
- lib/esplanade/version.rb
|
203
|
-
homepage:
|
176
|
+
homepage:
|
204
177
|
licenses:
|
205
178
|
- MIT
|
206
179
|
metadata: {}
|
207
|
-
post_install_message:
|
180
|
+
post_install_message:
|
208
181
|
rdoc_options: []
|
209
182
|
require_paths:
|
210
183
|
- lib
|
@@ -220,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
220
193
|
version: '0'
|
221
194
|
requirements: []
|
222
195
|
rubygems_version: 3.1.2
|
223
|
-
signing_key:
|
196
|
+
signing_key:
|
224
197
|
specification_version: 4
|
225
198
|
summary: Validate requests and responses against API Blueprint specifications
|
226
199
|
test_files: []
|
@@ -1,28 +0,0 @@
|
|
1
|
-
name: Ruby Gem
|
2
|
-
|
3
|
-
on:
|
4
|
-
push:
|
5
|
-
branches: [ master ]
|
6
|
-
pull_request:
|
7
|
-
branches: [ master ]
|
8
|
-
|
9
|
-
jobs:
|
10
|
-
build:
|
11
|
-
name: Build + Publish
|
12
|
-
runs-on: ubuntu-latest
|
13
|
-
|
14
|
-
steps:
|
15
|
-
- uses: actions/checkout@v2
|
16
|
-
- name: Set up Ruby 2.6
|
17
|
-
uses: actions/setup-ruby@v1
|
18
|
-
|
19
|
-
- name: Publish to RubyGems
|
20
|
-
run: |
|
21
|
-
mkdir -p $HOME/.gem
|
22
|
-
touch $HOME/.gem/credentials
|
23
|
-
chmod 0600 $HOME/.gem/credentials
|
24
|
-
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
25
|
-
gem build *.gemspec
|
26
|
-
gem push *.gem
|
27
|
-
env:
|
28
|
-
GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
|