tomograph 2.5.4 → 3.0.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/gempush.yml +1 -3
- data/CHANGELOG.md +7 -0
- data/README.md +175 -159
- data/exe/tomograph +4 -10
- data/lib/tomograph/api_blueprint/crafter/yaml.rb +2 -2
- data/lib/tomograph/api_blueprint/drafter_4/yaml.rb +2 -2
- data/lib/tomograph/api_blueprint/json_schema.rb +1 -1
- data/lib/tomograph/tomogram.rb +1 -4
- data/lib/tomograph/tomogram/action.rb +4 -4
- data/lib/tomograph/version.rb +1 -1
- metadata +15 -17
- data/lib/tomograph/api_blueprint/drafter_3/yaml.rb +0 -128
- data/lib/tomograph/api_blueprint/drafter_3/yaml/action.rb +0 -65
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c457270d6d9ab0b7d23c4af643248636f3fe9b3f673858700505ab55ee31716f
|
4
|
+
data.tar.gz: d089a1f21d1ab2e739854f962eff9e0e7fcdc3cdb631a595f84a328afc016823
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4f31296ba8532f93e0f89f881e0c0aa07a3a2a2752d2f6764be9ac6bf0ee5a8e1103b4f5bc2eb9b8ef0472f70432acaec379d2b914338fefed6f8e7c2842f3d3
|
7
|
+
data.tar.gz: b54f9a273905b2e7d3bd2d91777f46fc5c626dec43124abf6a3b5fed85a63e3ec63e21568498e6f072ab48020a58e6c833ab89a2ef7bf2692acc184c614cb6d4
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
# Change log
|
2
2
|
|
3
|
+
### 3.0.0 - 2020-08-27
|
4
|
+
|
5
|
+
* features
|
6
|
+
* support multi request for one resource path [#27](https://github.com/funbox/tomograph/issues/27)
|
7
|
+
* removed
|
8
|
+
* delete support drafter 3 [#29](https://github.com/funbox/tomograph/issues/29)
|
9
|
+
|
3
10
|
### 2.5.4 - 2020-04-06
|
4
11
|
|
5
12
|
* fixed warnings on ruby 2.7
|
data/README.md
CHANGED
@@ -1,8 +1,6 @@
|
|
1
|
-
# Tomograph
|
1
|
+
# Tomograph
|
2
2
|
|
3
|
-
|
4
|
-
<img src="https://funbox.ru/badges/sponsored_by_funbox_compact.svg" alt="Sponsored by FunBox" width=250 />
|
5
|
-
</a>
|
3
|
+
[](https://travis-ci.org/funbox/tomograph) [](https://badge.fury.io/rb/tomograph)
|
6
4
|
|
7
5
|
Convert API Blueprint to JSON Schema and search.
|
8
6
|
|
@@ -10,187 +8,203 @@ Convert API Blueprint to JSON Schema and search.
|
|
10
8
|
|
11
9
|
First you need to install [drafter](https://github.com/apiaryio/drafter).
|
12
10
|
|
13
|
-
|
11
|
+
Then add this line to your application's Gemfile:
|
14
12
|
|
15
13
|
```ruby
|
16
14
|
gem 'tomograph'
|
17
15
|
```
|
18
16
|
|
19
|
-
|
17
|
+
After that execute:
|
20
18
|
|
21
|
-
|
19
|
+
```bash
|
20
|
+
$ bundle
|
21
|
+
```
|
22
22
|
|
23
|
-
Or install
|
23
|
+
Or install the gem by yourself:
|
24
24
|
|
25
|
-
|
25
|
+
```bash
|
26
|
+
$ gem install tomograph
|
27
|
+
```
|
26
28
|
|
27
29
|
## Usage
|
28
30
|
|
29
31
|
```ruby
|
30
32
|
require 'tomograph'
|
31
|
-
```
|
32
33
|
|
33
|
-
```ruby
|
34
34
|
tomogram = Tomograph::Tomogram.new(apib_path: '/path/to/doc.apib')
|
35
35
|
```
|
36
36
|
|
37
37
|
### Command line tool
|
38
38
|
|
39
|
-
|
40
|
-
|
39
|
+
CLI allows you to convert files from API Blueprint or API Elements to JSON Schema.
|
40
|
+
|
41
|
+
```bash
|
41
42
|
tomograph doc.apib doc.json
|
42
43
|
```
|
43
|
-
|
44
|
-
|
44
|
+
|
45
|
+
There is also support for documents pre-parsed by [drafter](https://github.com/apiaryio/drafter) versions 3 and 4, or `crafter`.
|
46
|
+
To specify the handler version use the `-d` flag:
|
47
|
+
|
48
|
+
```bash
|
45
49
|
tomograph -d 4 doc_by_drafter4.yaml doc.json
|
46
50
|
```
|
47
|
-
|
48
|
-
|
51
|
+
|
52
|
+
Run CLI with `-h` to get detailed help:
|
53
|
+
|
54
|
+
```bash
|
49
55
|
tomograph -h
|
50
56
|
```
|
51
|
-
for more details on usage.
|
52
57
|
|
53
58
|
## Convert
|
54
59
|
|
60
|
+
Use `to_json` for converting APIB to JSON:
|
61
|
+
|
55
62
|
```ruby
|
56
63
|
tomogram.to_json
|
57
64
|
```
|
58
65
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
#
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
+
|
82
|
-
|
83
|
-
+ Response
|
84
|
-
|
85
|
-
+ Response
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
"
|
111
|
-
"
|
112
|
-
|
113
|
-
|
66
|
+
<details>
|
67
|
+
<summary>Example input</summary>
|
68
|
+
|
69
|
+
```apib
|
70
|
+
FORMAT: 1A
|
71
|
+
HOST: http://test.local
|
72
|
+
|
73
|
+
# project
|
74
|
+
|
75
|
+
# Group project
|
76
|
+
|
77
|
+
Project
|
78
|
+
|
79
|
+
## Authentication [/sessions]
|
80
|
+
|
81
|
+
### Sign In [POST]
|
82
|
+
|
83
|
+
+ Request (application/json)
|
84
|
+
|
85
|
+
+ Attributes
|
86
|
+
+ login (string, required)
|
87
|
+
+ password (string, required)
|
88
|
+
+ captcha (string, optional)
|
89
|
+
|
90
|
+
+ Response 401 (application/json)
|
91
|
+
|
92
|
+
+ Response 429 (application/json)
|
93
|
+
|
94
|
+
+ Response 201 (application/json)
|
95
|
+
|
96
|
+
+ Attributes
|
97
|
+
+ confirmation (Confirmation, optional)
|
98
|
+
+ captcha (string, optional)
|
99
|
+
+ captcha_does_not_match (boolean, optional)
|
100
|
+
|
101
|
+
|
102
|
+
# Data Structures
|
103
|
+
|
104
|
+
## Confirmation (object)
|
105
|
+
+ id (string, required)
|
106
|
+
+ type (string, required)
|
107
|
+
+ operation (string, required)
|
108
|
+
```
|
109
|
+
</details>
|
110
|
+
|
111
|
+
<details>
|
112
|
+
<summary>Example output</summary>
|
113
|
+
|
114
|
+
```json
|
115
|
+
[
|
116
|
+
{
|
117
|
+
"path": "/sessions",
|
118
|
+
"method": "POST",
|
119
|
+
"content-type": "application/json",
|
120
|
+
"requests": [{
|
121
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
122
|
+
"type": "object",
|
123
|
+
"properties": {
|
124
|
+
"login": {
|
125
|
+
"type": "string"
|
126
|
+
},
|
127
|
+
"password": {
|
128
|
+
"type": "string"
|
129
|
+
},
|
130
|
+
"captcha": {
|
131
|
+
"type": "string"
|
132
|
+
}
|
114
133
|
},
|
115
|
-
"
|
116
|
-
"
|
134
|
+
"required": [
|
135
|
+
"login",
|
136
|
+
"password"
|
137
|
+
]
|
138
|
+
}],
|
139
|
+
"responses": [
|
140
|
+
{
|
141
|
+
"status": "401",
|
142
|
+
"content-type": "application/json",
|
143
|
+
"body": {}
|
117
144
|
},
|
118
|
-
|
119
|
-
"
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
"$schema": "http://json-schema.org/draft-04/schema#",
|
143
|
-
"type": "object",
|
144
|
-
"properties": {
|
145
|
-
"confirmation": {
|
146
|
-
"type": "object",
|
147
|
-
"properties": {
|
148
|
-
"id": {
|
149
|
-
"type": "string"
|
150
|
-
},
|
151
|
-
"type": {
|
152
|
-
"type": "string"
|
145
|
+
{
|
146
|
+
"status": "429",
|
147
|
+
"content-type": "application/json",
|
148
|
+
"body": {}
|
149
|
+
},
|
150
|
+
{
|
151
|
+
"status": "201",
|
152
|
+
"content-type": "application/json",
|
153
|
+
"body": {
|
154
|
+
"$schema": "http://json-schema.org/draft-04/schema#",
|
155
|
+
"type": "object",
|
156
|
+
"properties": {
|
157
|
+
"confirmation": {
|
158
|
+
"type": "object",
|
159
|
+
"properties": {
|
160
|
+
"id": {
|
161
|
+
"type": "string"
|
162
|
+
},
|
163
|
+
"type": {
|
164
|
+
"type": "string"
|
165
|
+
},
|
166
|
+
"operation": {
|
167
|
+
"type": "string"
|
168
|
+
}
|
153
169
|
},
|
154
|
-
"
|
155
|
-
"
|
156
|
-
|
170
|
+
"required": [
|
171
|
+
"id",
|
172
|
+
"type",
|
173
|
+
"operation"
|
174
|
+
]
|
175
|
+
},
|
176
|
+
"captcha": {
|
177
|
+
"type": "string"
|
157
178
|
},
|
158
|
-
"
|
159
|
-
"
|
160
|
-
|
161
|
-
"operation"
|
162
|
-
]
|
163
|
-
},
|
164
|
-
"captcha": {
|
165
|
-
"type": "string"
|
166
|
-
},
|
167
|
-
"captcha_does_not_match": {
|
168
|
-
"type": "boolean"
|
179
|
+
"captcha_does_not_match": {
|
180
|
+
"type": "boolean"
|
181
|
+
}
|
169
182
|
}
|
170
183
|
}
|
171
184
|
}
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
185
|
+
]
|
186
|
+
}
|
187
|
+
]
|
188
|
+
```
|
189
|
+
</details>
|
177
190
|
|
178
191
|
## Search
|
179
192
|
|
180
|
-
|
193
|
+
Use these methods to search through parsed API Blueprint spec to get request => responses hash maps.
|
194
|
+
|
195
|
+
### `find_request`
|
181
196
|
|
182
197
|
```ruby
|
183
198
|
request = tomogram.find_request(method: 'GET', path: '/status/1?qwe=rty')
|
184
199
|
```
|
185
200
|
|
186
|
-
###
|
201
|
+
### `find_request_with_content_type`
|
187
202
|
|
188
203
|
```ruby
|
189
204
|
request = tomogram.find_request_with_content_type(method: 'GET', path: '/status/1?qwe=rty', content_type: 'application/json')
|
190
205
|
```
|
191
206
|
|
192
|
-
### find_responses
|
193
|
-
|
207
|
+
### `find_responses`
|
194
208
|
|
195
209
|
```ruby
|
196
210
|
responses = request.find_responses(status: '200')
|
@@ -198,68 +212,70 @@ responses = request.find_responses(status: '200')
|
|
198
212
|
|
199
213
|
## Other methods
|
200
214
|
|
201
|
-
### prefix_match
|
215
|
+
### `prefix_match?`
|
202
216
|
|
203
|
-
This
|
217
|
+
This may be useful if you specify a prefix.
|
204
218
|
|
205
219
|
```ruby
|
206
220
|
tomogram.prefix_match?('http://local/api/v2/users')
|
207
221
|
```
|
208
222
|
|
209
|
-
|
223
|
+
### `to_resources`
|
210
224
|
|
211
|
-
|
225
|
+
Maps resources with possible requests.
|
226
|
+
|
227
|
+
Example output:
|
212
228
|
|
213
229
|
```ruby
|
214
|
-
|
230
|
+
{
|
231
|
+
'/sessions' => ['POST /sessions']
|
232
|
+
}
|
215
233
|
```
|
216
234
|
|
217
|
-
|
235
|
+
## Constructor params
|
236
|
+
|
237
|
+
You can specify API prefix and path to the spec using one of the possible formats:
|
218
238
|
|
219
239
|
```ruby
|
220
|
-
Tomograph::Tomogram.new(prefix: '/api/v2',
|
240
|
+
Tomograph::Tomogram.new(prefix: '/api/v2', apib_path: '/path/to/doc.apib')
|
221
241
|
```
|
222
242
|
|
223
|
-
|
243
|
+
```ruby
|
244
|
+
Tomograph::Tomogram.new(prefix: '/api/v2', drafter_yaml_path: '/path/to/doc.yaml')
|
245
|
+
```
|
224
246
|
|
225
247
|
```ruby
|
226
248
|
Tomograph::Tomogram.new(prefix: '/api/v2', tomogram_json_path: '/path/to/doc.json')
|
227
249
|
```
|
228
250
|
|
229
|
-
### apib_path
|
251
|
+
### `apib_path`
|
230
252
|
|
231
253
|
Path to API Blueprint documentation. There must be an installed [drafter](https://github.com/apiaryio/drafter) to parse it.
|
232
254
|
|
233
|
-
### drafter_yaml_path
|
255
|
+
### `drafter_yaml_path`
|
234
256
|
|
235
257
|
Path to API Blueprint documentation pre-parsed with `drafter` and saved to a YAML file.
|
236
258
|
|
237
|
-
Drafter
|
259
|
+
### Drafter v4 & Crafter support
|
238
260
|
|
239
|
-
If you are using a `drafter
|
261
|
+
If you are using a `drafter v4`, you should use `drafter_4_apib_path` and `drafter_4_yaml_path` respectively.
|
240
262
|
|
241
|
-
|
263
|
+
In case when you want to use `сrafter`, then you should pass these params: `crafter_apib_path`, `crafter_yaml_path`.
|
242
264
|
|
243
|
-
|
244
|
-
|
245
|
-
### tomogram_json_path
|
265
|
+
### `tomogram_json_path`
|
246
266
|
|
247
267
|
Path to API Blueprint documentation converted with `tomograph` to a JSON file.
|
248
268
|
|
249
|
-
### prefix
|
269
|
+
### `prefix`
|
250
270
|
|
251
|
-
Default
|
271
|
+
Default: `''`
|
252
272
|
|
253
|
-
|
273
|
+
Prefix for API requests.
|
254
274
|
|
255
|
-
|
256
|
-
The result for the example above:
|
257
|
-
```ruby
|
258
|
-
{
|
259
|
-
'/sessions' => ['POST /sessions']
|
260
|
-
}
|
261
|
-
```
|
275
|
+
Example: `'/api'`.
|
262
276
|
|
263
277
|
## License
|
264
278
|
|
265
279
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
280
|
+
|
281
|
+
[](https://funbox.ru)
|
data/exe/tomograph
CHANGED
@@ -12,7 +12,7 @@ include Methadone::CLILogging
|
|
12
12
|
|
13
13
|
version Tomograph::VERSION
|
14
14
|
description 'Converts API Blueprint to JSON Schema'
|
15
|
-
on('-d DRAFTER_VERSION', '--drafter', 'Choose drafter version: crafter
|
15
|
+
on('-d DRAFTER_VERSION', '--drafter', 'Choose drafter version: crafter or 4. Default: use drafter v.4.')
|
16
16
|
on('-f INPUT_FORMAT', '--format', 'Force input format: "apib" or "yaml". Default: detect by file extension.')
|
17
17
|
on('--exclude-description', 'Exclude "description" keys.')
|
18
18
|
on('--split', 'Split output into files by method.')
|
@@ -52,12 +52,10 @@ def choose_drafter(opt_parser)
|
|
52
52
|
case opt_parser
|
53
53
|
when 'crafter'
|
54
54
|
:crafter
|
55
|
-
when '3'
|
56
|
-
:drafter_3
|
57
55
|
when '4'
|
58
56
|
:drafter_4
|
59
57
|
when nil
|
60
|
-
:
|
58
|
+
:drafter_4
|
61
59
|
else
|
62
60
|
raise 'Unsupported drafter version!'
|
63
61
|
end
|
@@ -88,17 +86,13 @@ main do |input, output|
|
|
88
86
|
version = choose_drafter(options['drafter'])
|
89
87
|
format_key = case format
|
90
88
|
when :apib
|
91
|
-
if version == :
|
92
|
-
:apib_path
|
93
|
-
elsif version == :crafter
|
89
|
+
if version == :crafter
|
94
90
|
:crafter_apib_path
|
95
91
|
else
|
96
92
|
:drafter_4_apib_path
|
97
93
|
end
|
98
94
|
when :yaml
|
99
|
-
if version == :
|
100
|
-
:drafter_yaml_path
|
101
|
-
elsif version == :crafter
|
95
|
+
if version == :crafter
|
102
96
|
:crafter_yaml_path
|
103
97
|
else
|
104
98
|
:drafter_4_yaml_path
|
@@ -101,8 +101,8 @@ module Tomograph
|
|
101
101
|
path: "#{@prefix}#{related_actions.first.path}",
|
102
102
|
method: related_actions.first.method,
|
103
103
|
content_type: related_actions.first.content_type,
|
104
|
-
|
105
|
-
responses: related_actions.map(&:responses).flatten,
|
104
|
+
requests: related_actions.map(&:request).flatten.uniq,
|
105
|
+
responses: related_actions.map(&:responses).flatten.uniq,
|
106
106
|
resource: related_actions.first.resource
|
107
107
|
}
|
108
108
|
end
|
@@ -101,8 +101,8 @@ module Tomograph
|
|
101
101
|
path: "#{@prefix}#{related_actions.first.path}",
|
102
102
|
method: related_actions.first.method,
|
103
103
|
content_type: related_actions.first.content_type,
|
104
|
-
|
105
|
-
responses: related_actions.map(&:responses).flatten,
|
104
|
+
requests: related_actions.map(&:request).flatten.uniq,
|
105
|
+
responses: related_actions.map(&:responses).flatten.uniq,
|
106
106
|
resource: related_actions.first.resource
|
107
107
|
}
|
108
108
|
end
|
@@ -14,7 +14,7 @@ module Tomograph
|
|
14
14
|
path: "#{@prefix}#{action['path']}",
|
15
15
|
method: action['method'],
|
16
16
|
content_type: action['content-type'],
|
17
|
-
|
17
|
+
requests: action['requests'],
|
18
18
|
responses: action['responses'],
|
19
19
|
resource: action['resource']))
|
20
20
|
end
|
data/lib/tomograph/tomogram.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require 'multi_json'
|
2
2
|
require 'tomograph/path'
|
3
3
|
require 'tomograph/api_blueprint/json_schema'
|
4
|
-
require 'tomograph/api_blueprint/drafter_3/yaml'
|
5
4
|
require 'tomograph/api_blueprint/drafter_4/yaml'
|
6
5
|
require 'tomograph/api_blueprint/crafter/yaml'
|
7
6
|
|
@@ -12,12 +11,10 @@ module Tomograph
|
|
12
11
|
def initialize(prefix: '', apib_path: nil, drafter_yaml_path: nil, tomogram_json_path: nil, drafter_4_apib_path: nil, drafter_4_yaml_path: nil, crafter_apib_path: nil, crafter_yaml_path: nil)
|
13
12
|
@documentation = if tomogram_json_path
|
14
13
|
Tomograph::ApiBlueprint::JsonSchema.new(prefix, tomogram_json_path)
|
15
|
-
elsif drafter_4_yaml_path || drafter_4_apib_path
|
16
|
-
Tomograph::ApiBlueprint::Drafter4::Yaml.new(prefix, drafter_4_apib_path, drafter_4_yaml_path)
|
17
14
|
elsif crafter_yaml_path || crafter_apib_path
|
18
15
|
Tomograph::ApiBlueprint::Crafter::Yaml.new(prefix, crafter_apib_path, crafter_yaml_path)
|
19
16
|
else
|
20
|
-
Tomograph::ApiBlueprint::
|
17
|
+
Tomograph::ApiBlueprint::Drafter4::Yaml.new(prefix, drafter_4_apib_path, drafter_4_yaml_path)
|
21
18
|
end
|
22
19
|
@prefix = prefix
|
23
20
|
end
|
@@ -3,13 +3,13 @@ require 'tomograph/path'
|
|
3
3
|
module Tomograph
|
4
4
|
class Tomogram
|
5
5
|
class Action
|
6
|
-
attr_reader :path, :method, :content_type, :
|
6
|
+
attr_reader :path, :method, :content_type, :requests, :responses, :resource
|
7
7
|
|
8
|
-
def initialize(path:, method:, content_type:,
|
8
|
+
def initialize(path:, method:, content_type:, requests:, responses:, resource:)
|
9
9
|
@path ||= Tomograph::Path.new(path)
|
10
10
|
@method ||= method
|
11
11
|
@content_type ||= content_type
|
12
|
-
@
|
12
|
+
@requests ||= requests
|
13
13
|
@responses ||= responses
|
14
14
|
@resource ||= resource
|
15
15
|
end
|
@@ -25,7 +25,7 @@ module Tomograph
|
|
25
25
|
'path' => path,
|
26
26
|
'method' => method,
|
27
27
|
'content-type' => content_type,
|
28
|
-
'
|
28
|
+
'requests' => requests,
|
29
29
|
'responses' => responses,
|
30
30
|
'resource' => resource
|
31
31
|
}
|
data/lib/tomograph/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tomograph
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- d.efimov
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-08-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: methadone
|
@@ -88,42 +88,42 @@ dependencies:
|
|
88
88
|
name: rspec
|
89
89
|
requirement: !ruby/object:Gem::Requirement
|
90
90
|
requirements:
|
91
|
-
- - ">="
|
92
|
-
- !ruby/object:Gem::Version
|
93
|
-
version: 3.9.0
|
94
91
|
- - "~>"
|
95
92
|
- !ruby/object:Gem::Version
|
96
93
|
version: '3.9'
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 3.9.0
|
97
97
|
type: :development
|
98
98
|
prerelease: false
|
99
99
|
version_requirements: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: 3.9.0
|
104
101
|
- - "~>"
|
105
102
|
- !ruby/object:Gem::Version
|
106
103
|
version: '3.9'
|
104
|
+
- - ">="
|
105
|
+
- !ruby/object:Gem::Version
|
106
|
+
version: 3.9.0
|
107
107
|
- !ruby/object:Gem::Dependency
|
108
108
|
name: rubocop
|
109
109
|
requirement: !ruby/object:Gem::Requirement
|
110
110
|
requirements:
|
111
|
-
- - ">="
|
112
|
-
- !ruby/object:Gem::Version
|
113
|
-
version: 0.81.0
|
114
111
|
- - "~>"
|
115
112
|
- !ruby/object:Gem::Version
|
116
113
|
version: '0.81'
|
114
|
+
- - ">="
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: 0.81.0
|
117
117
|
type: :development
|
118
118
|
prerelease: false
|
119
119
|
version_requirements: !ruby/object:Gem::Requirement
|
120
120
|
requirements:
|
121
|
-
- - ">="
|
122
|
-
- !ruby/object:Gem::Version
|
123
|
-
version: 0.81.0
|
124
121
|
- - "~>"
|
125
122
|
- !ruby/object:Gem::Version
|
126
123
|
version: '0.81'
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: 0.81.0
|
127
127
|
- !ruby/object:Gem::Dependency
|
128
128
|
name: simplecov
|
129
129
|
requirement: !ruby/object:Gem::Requirement
|
@@ -170,8 +170,6 @@ files:
|
|
170
170
|
- lib/tomograph.rb
|
171
171
|
- lib/tomograph/api_blueprint/crafter/yaml.rb
|
172
172
|
- lib/tomograph/api_blueprint/crafter/yaml/action.rb
|
173
|
-
- lib/tomograph/api_blueprint/drafter_3/yaml.rb
|
174
|
-
- lib/tomograph/api_blueprint/drafter_3/yaml/action.rb
|
175
173
|
- lib/tomograph/api_blueprint/drafter_4/yaml.rb
|
176
174
|
- lib/tomograph/api_blueprint/drafter_4/yaml/action.rb
|
177
175
|
- lib/tomograph/api_blueprint/json_schema.rb
|
@@ -200,7 +198,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
200
198
|
- !ruby/object:Gem::Version
|
201
199
|
version: '0'
|
202
200
|
requirements: []
|
203
|
-
rubygems_version: 3.
|
201
|
+
rubygems_version: 3.1.2
|
204
202
|
signing_key:
|
205
203
|
specification_version: 4
|
206
204
|
summary: Convert API Blueprint to Tomogram
|
@@ -1,128 +0,0 @@
|
|
1
|
-
require 'yaml'
|
2
|
-
require 'tomograph/api_blueprint/drafter_3/yaml/action'
|
3
|
-
require 'tomograph/tomogram/action'
|
4
|
-
|
5
|
-
module Tomograph
|
6
|
-
module ApiBlueprint
|
7
|
-
class Drafter3
|
8
|
-
class Yaml
|
9
|
-
def initialize(prefix, apib_path, drafter_yaml_path)
|
10
|
-
@prefix = prefix
|
11
|
-
@documentation = if apib_path
|
12
|
-
YAML.safe_load(`drafter #{apib_path}`)
|
13
|
-
elsif drafter_yaml_path
|
14
|
-
YAML.safe_load(File.read(drafter_yaml_path))
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
def groups
|
19
|
-
@groups ||= @documentation['content'][0]['content'].inject([]) do |result_groups, group|
|
20
|
-
next result_groups unless group?(group)
|
21
|
-
result_groups.push(group)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def group?(group)
|
26
|
-
group['element'] != 'copy' && # Element is a human readable text
|
27
|
-
group['meta']['classes'][0] == 'resourceGroup' # skip Data Structures
|
28
|
-
end
|
29
|
-
|
30
|
-
def resources
|
31
|
-
@resources ||= groups.inject([]) do |result_groups, group|
|
32
|
-
result_groups.push(group['content'].inject([]) do |result_resources, resource|
|
33
|
-
next result_resources unless resource?(resource)
|
34
|
-
result_resources.push('resource' => resource, 'resource_path' => resource_path(resource))
|
35
|
-
end)
|
36
|
-
end.flatten
|
37
|
-
end
|
38
|
-
|
39
|
-
def resource?(resource)
|
40
|
-
resource['element'] != 'copy' # Element is a human readable text
|
41
|
-
end
|
42
|
-
|
43
|
-
def resource_path(resource)
|
44
|
-
resource['attributes'] && resource['attributes']['href']
|
45
|
-
end
|
46
|
-
|
47
|
-
def transitions
|
48
|
-
@transitions ||= resources.inject([]) do |result_resources, resource|
|
49
|
-
result_resources.push(resource['resource']['content'].inject([]) do |result_transitions, transition|
|
50
|
-
next result_transitions unless transition?(transition)
|
51
|
-
result_transitions.push(transition_hash(transition, resource))
|
52
|
-
end)
|
53
|
-
end.flatten
|
54
|
-
end
|
55
|
-
|
56
|
-
def transition?(transition)
|
57
|
-
transition['element'] == 'transition'
|
58
|
-
end
|
59
|
-
|
60
|
-
def transition_hash(transition, resource)
|
61
|
-
{
|
62
|
-
'transition' => transition,
|
63
|
-
'transition_path' => transition_path(transition, resource['resource_path']),
|
64
|
-
'resource' => resource['resource_path']
|
65
|
-
}
|
66
|
-
end
|
67
|
-
|
68
|
-
def transition_path(transition, resource_path)
|
69
|
-
transition['attributes'] && transition['attributes']['href'] || resource_path
|
70
|
-
end
|
71
|
-
|
72
|
-
def without_group_actions
|
73
|
-
transitions.inject([]) do |result_transition, transition|
|
74
|
-
result_transition.push(transition['transition']['content'].inject([]) do |result_contents, content|
|
75
|
-
next result_contents unless action?(content)
|
76
|
-
result_contents.push(Tomograph::ApiBlueprint::Drafter3::Yaml::Action.new(
|
77
|
-
content['content'],
|
78
|
-
transition['transition_path'],
|
79
|
-
transition['resource']
|
80
|
-
))
|
81
|
-
end)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
def action?(content)
|
86
|
-
content['element'] == 'httpTransaction'
|
87
|
-
end
|
88
|
-
|
89
|
-
def actions
|
90
|
-
@actions ||= without_group_actions
|
91
|
-
.flatten
|
92
|
-
.group_by { |action| "#{action.method} #{action.path}" }.map do |_key, related_actions|
|
93
|
-
action_hash(related_actions)
|
94
|
-
end.flatten
|
95
|
-
end
|
96
|
-
|
97
|
-
def action_hash(related_actions)
|
98
|
-
{
|
99
|
-
path: "#{@prefix}#{related_actions.first.path}",
|
100
|
-
method: related_actions.first.method,
|
101
|
-
content_type: related_actions.first.content_type,
|
102
|
-
request: related_actions.first.request,
|
103
|
-
responses: related_actions.map(&:responses).flatten,
|
104
|
-
resource: related_actions.first.resource
|
105
|
-
}
|
106
|
-
end
|
107
|
-
|
108
|
-
def to_tomogram
|
109
|
-
@tomogram ||= actions.inject([]) do |result, action|
|
110
|
-
result.push(Tomograph::Tomogram::Action.new(**action))
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def to_resources
|
115
|
-
return @to_resources if @to_resources
|
116
|
-
|
117
|
-
@to_resources = actions.group_by { |action| action[:resource] }
|
118
|
-
@to_resources = @to_resources.inject({}) do |res, related_actions|
|
119
|
-
requests = related_actions[1].map do |action|
|
120
|
-
"#{action[:method]} #{action[:path]}"
|
121
|
-
end
|
122
|
-
res.merge(related_actions[1].first[:resource] => requests)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
@@ -1,65 +0,0 @@
|
|
1
|
-
require 'tomograph/tomogram/action'
|
2
|
-
|
3
|
-
module Tomograph
|
4
|
-
module ApiBlueprint
|
5
|
-
class Drafter3
|
6
|
-
class Yaml
|
7
|
-
class Action
|
8
|
-
def initialize(content, path, resource)
|
9
|
-
@content = content
|
10
|
-
@path = path
|
11
|
-
@resource = resource
|
12
|
-
end
|
13
|
-
|
14
|
-
attr_reader :path, :resource
|
15
|
-
|
16
|
-
def method
|
17
|
-
@method ||= @content.first['attributes']['method']
|
18
|
-
end
|
19
|
-
|
20
|
-
def content_type
|
21
|
-
if @content.first['attributes'].has_key?('headers')
|
22
|
-
@content.first['attributes']['headers']['content'][0]['content']['key']['content'] == 'Content-Type' ?
|
23
|
-
@content.first['attributes']['headers']['content'][0]['content']['value']['content'] : nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def request
|
28
|
-
return @request if @request
|
29
|
-
|
30
|
-
request_action = @content.find { |el| el['element'] == 'httpRequest' }
|
31
|
-
@request = json_schema(request_action['content'])
|
32
|
-
end
|
33
|
-
|
34
|
-
def json_schema(actions)
|
35
|
-
schema_node = actions.find do |action|
|
36
|
-
action && action['element'] == 'asset' && action['attributes']['contentType'] == 'application/schema+json'
|
37
|
-
end
|
38
|
-
return {} unless schema_node
|
39
|
-
|
40
|
-
MultiJson.load(schema_node['content'])
|
41
|
-
rescue MultiJson::ParseError => e
|
42
|
-
puts "[Tomograph] Error while parsing #{e}. skipping..."
|
43
|
-
{}
|
44
|
-
end
|
45
|
-
|
46
|
-
def responses
|
47
|
-
return @responses if @responses
|
48
|
-
|
49
|
-
@responses = @content.select do |response|
|
50
|
-
response['element'] == 'httpResponse' && response['attributes']
|
51
|
-
end
|
52
|
-
@responses = @responses.map do |response|
|
53
|
-
{
|
54
|
-
'status' => response['attributes']['statusCode'].to_s,
|
55
|
-
'body' => json_schema(response['content']),
|
56
|
-
'content-type' => response['attributes'].has_key?('headers') ?
|
57
|
-
response['attributes']['headers']['content'][0]['content']['value']['content'] : nil
|
58
|
-
}
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|