apiary_blueprint_convertor 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +9 -1
- data/features/convert.feature +25 -26
- data/lib/apiary_blueprint_convertor/convertor.rb +12 -10
- data/lib/apiary_blueprint_convertor/version.rb +1 -1
- data/test/convertor_test.rb +14 -31
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ae60b7154b1f950ea52995a28d339838c37dbfe0
|
4
|
+
data.tar.gz: 6554c053da25fc9543a2a5b913bd4a64a238aa29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 580261db38265d29ad56bad9bcf1bcb46dbdcb65776f8179c085018629f45bd34f52310cf9e8f89099d60c41f4837a06d108966064aa524a08c2b9b1177a608e
|
7
|
+
data.tar.gz: a0188bd53f80ffd71deaafa08b7eab36d4d5d6c843e66f420f227b04b7c02f4a8d6a8f6b147e9f5619b074cc735fe628fcb9924923ae1e060dfb10b42ace716d
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,7 @@
|
|
1
|
+
![logo](https://raw.github.com/apiaryio/api-blueprint/gh-pages/assets/logo_apiblueprint.png)
|
2
|
+
|
1
3
|
# Apiary Blueprint AST Convertor [![Build Status](https://travis-ci.org/apiaryio/apiary_blueprint_convertor.png?branch=master)](https://travis-ci.org/apiaryio/apiary_blueprint_convertor)
|
2
|
-
A migration tool for legacy [Apiary Blueprint](https://github.com/apiaryio/blueprint-parser) AST into [API Blueprint](http://apiblueprint.org) AST. Converts Apiary Blueprint AST serialized into a JSON file to [API Blueprint AST](https://github.com/apiaryio/
|
4
|
+
A migration tool for legacy [Apiary Blueprint](https://github.com/apiaryio/blueprint-parser) AST into [API Blueprint](http://apiblueprint.org) AST. Converts Apiary Blueprint AST serialized into a JSON file to [API Blueprint AST](https://github.com/apiaryio/api-blueprint-ast) JSON representation (`vnd.apiblueprint.ast.raw+json; version=2.0`).
|
3
5
|
|
4
6
|
## Installation
|
5
7
|
Add this line to your application's Gemfile:
|
@@ -29,6 +31,12 @@ Use this convertor together with the legacy [Apiary Blueprint Parser](https://gi
|
|
29
31
|
2. Convert legacy JSON AST into API Blueprint JSON AST using `apiary_blueprint_convertor`
|
30
32
|
3. Compose API Blueprint from API Blueprint JSON AST using `matter_compiler`
|
31
33
|
|
34
|
+
For example:
|
35
|
+
|
36
|
+
```sh
|
37
|
+
$ blueprint-parser legacy_blueprint.apib | apiary_blueprint_convertor | matter_compiler --format json > new_blueprint.md
|
38
|
+
```
|
39
|
+
|
32
40
|
## Contributing
|
33
41
|
1. Fork this repository (http://github.com/apiaryio/apiary_blueprint_convertor/fork)
|
34
42
|
2. Create your feature branch (`git checkout -b my-new-feature`)
|
data/features/convert.feature
CHANGED
@@ -113,12 +113,13 @@ Feature: Convert AST
|
|
113
113
|
Given a file named "apiblueprint_ast.json" with:
|
114
114
|
"""
|
115
115
|
{
|
116
|
-
"_version": "
|
117
|
-
"metadata":
|
118
|
-
|
116
|
+
"_version": "2.0",
|
117
|
+
"metadata": [
|
118
|
+
{
|
119
|
+
"name": "HOST",
|
119
120
|
"value": "http://www.google.com/"
|
120
121
|
}
|
121
|
-
|
122
|
+
],
|
122
123
|
"name": "Sample API v2",
|
123
124
|
"description": "Welcome to our sample API documentation. All comments can be written in (support [Markdown](http://daringfireball.net/projects/markdown/syntax) syntax)",
|
124
125
|
"resourceGroups": [
|
@@ -132,14 +133,12 @@ Feature: Convert AST
|
|
132
133
|
"uriTemplate": "/shopping-cart",
|
133
134
|
"model": null,
|
134
135
|
"parameters": null,
|
135
|
-
"headers": null,
|
136
136
|
"actions": [
|
137
137
|
{
|
138
138
|
"name": null,
|
139
139
|
"description": "List products added into your shopping-cart. (comment block again in Markdown)",
|
140
140
|
"method": "GET",
|
141
141
|
"parameters": null,
|
142
|
-
"headers": null,
|
143
142
|
"examples": [
|
144
143
|
{
|
145
144
|
"name": null,
|
@@ -149,11 +148,12 @@ Feature: Convert AST
|
|
149
148
|
{
|
150
149
|
"name": "200",
|
151
150
|
"description": null,
|
152
|
-
"headers":
|
153
|
-
|
151
|
+
"headers": [
|
152
|
+
{
|
153
|
+
"name": "Content-Type",
|
154
154
|
"value": "application/json"
|
155
155
|
}
|
156
|
-
|
156
|
+
],
|
157
157
|
"body": "{\n \"items\": [\n {\n \"url\": \"/shopping-cart/1\",\n \"product\": \"2ZY48XPZ\",\n \"quantity\": 1,\n \"name\": \"New socks\",\n \"price\": 1.25\n }\n ]\n}",
|
158
158
|
"schema": null
|
159
159
|
}
|
@@ -166,7 +166,6 @@ Feature: Convert AST
|
|
166
166
|
"description": "Save new products in your shopping cart",
|
167
167
|
"method": "POST",
|
168
168
|
"parameters": null,
|
169
|
-
"headers": null,
|
170
169
|
"examples": [
|
171
170
|
{
|
172
171
|
"name": null,
|
@@ -175,11 +174,12 @@ Feature: Convert AST
|
|
175
174
|
{
|
176
175
|
"name": null,
|
177
176
|
"description": null,
|
178
|
-
"headers":
|
179
|
-
|
177
|
+
"headers": [
|
178
|
+
{
|
179
|
+
"name": "Content-Type",
|
180
180
|
"value": "application/json"
|
181
181
|
}
|
182
|
-
|
182
|
+
],
|
183
183
|
"body": "{\n \"product\": \"1AB23ORM\",\n \"quantity\": 2\n}",
|
184
184
|
"schema": null
|
185
185
|
}
|
@@ -188,22 +188,24 @@ Feature: Convert AST
|
|
188
188
|
{
|
189
189
|
"name": "201",
|
190
190
|
"description": null,
|
191
|
-
"headers":
|
192
|
-
|
191
|
+
"headers": [
|
192
|
+
{
|
193
|
+
"name": "Content-Type",
|
193
194
|
"value": "application/json"
|
194
195
|
}
|
195
|
-
|
196
|
+
],
|
196
197
|
"body": "{\n \"status\": \"created\",\n \"url\": \"/shopping-cart/2\"\n}",
|
197
198
|
"schema": null
|
198
199
|
},
|
199
200
|
{
|
200
201
|
"name": "401",
|
201
202
|
"description": null,
|
202
|
-
"headers":
|
203
|
-
|
203
|
+
"headers": [
|
204
|
+
{
|
205
|
+
"name": "Content-Type",
|
204
206
|
"value": "application/json; charset=utf-8"
|
205
207
|
}
|
206
|
-
|
208
|
+
],
|
207
209
|
"body": "{\n \"message\": \"You have not provided proper request token\"\n}",
|
208
210
|
"schema": null
|
209
211
|
}
|
@@ -225,14 +227,12 @@ Feature: Convert AST
|
|
225
227
|
"uriTemplate": "/payment",
|
226
228
|
"model": null,
|
227
229
|
"parameters": null,
|
228
|
-
"headers": null,
|
229
230
|
"actions": [
|
230
231
|
{
|
231
232
|
"name": null,
|
232
233
|
"description": "This resource allows you to submit payment information to process your *shopping cart* items",
|
233
234
|
"method": "POST",
|
234
235
|
"parameters": null,
|
235
|
-
"headers": null,
|
236
236
|
"examples": [
|
237
237
|
{
|
238
238
|
"name": null,
|
@@ -266,14 +266,12 @@ Feature: Convert AST
|
|
266
266
|
"uriTemplate": "/resource",
|
267
267
|
"model": null,
|
268
268
|
"parameters": null,
|
269
|
-
"headers": null,
|
270
269
|
"actions": [
|
271
270
|
{
|
272
271
|
"name": null,
|
273
272
|
"description": null,
|
274
273
|
"method": "POST",
|
275
274
|
"parameters": null,
|
276
|
-
"headers": null,
|
277
275
|
"examples": [
|
278
276
|
{
|
279
277
|
"name": null,
|
@@ -282,11 +280,12 @@ Feature: Convert AST
|
|
282
280
|
{
|
283
281
|
"name": null,
|
284
282
|
"description": null,
|
285
|
-
"headers":
|
286
|
-
|
283
|
+
"headers": [
|
284
|
+
{
|
285
|
+
"name": "Content-Type",
|
287
286
|
"value": "application/json"
|
288
287
|
}
|
289
|
-
|
288
|
+
],
|
290
289
|
"body": "{\n \"a\": \"b\",\n \"c\": \"0\"\n}",
|
291
290
|
"schema": "{\"type\":\"object\",\"properties\":{\"a\":{\"type\":\"string\",\"format\":\"alphanumeric\"},\"c\":{\"type\":\"integer\"}}}"
|
292
291
|
}
|
@@ -5,7 +5,7 @@ module ApiaryBlueprintConvertor
|
|
5
5
|
|
6
6
|
class Convertor
|
7
7
|
|
8
|
-
|
8
|
+
API_BLUEPRINT_AST_VERSION = "2.0"
|
9
9
|
|
10
10
|
def self.read_file(file)
|
11
11
|
unless File.readable?(file)
|
@@ -33,7 +33,7 @@ module ApiaryBlueprintConvertor
|
|
33
33
|
|
34
34
|
# Top level API Blueprint Template
|
35
35
|
blueprint_ast = {
|
36
|
-
:_version =>
|
36
|
+
:_version => API_BLUEPRINT_AST_VERSION,
|
37
37
|
:metadata => nil,
|
38
38
|
:name => nil,
|
39
39
|
:description => nil,
|
@@ -77,11 +77,12 @@ module ApiaryBlueprintConvertor
|
|
77
77
|
return
|
78
78
|
end
|
79
79
|
|
80
|
-
blueprint_ast[:metadata] =
|
81
|
-
|
80
|
+
blueprint_ast[:metadata] = [
|
81
|
+
{
|
82
|
+
:name => "HOST",
|
82
83
|
:value => "#{legacy_location}"
|
83
84
|
}
|
84
|
-
|
85
|
+
]
|
85
86
|
end
|
86
87
|
|
87
88
|
# Convert array of blueprint sections
|
@@ -125,7 +126,6 @@ module ApiaryBlueprintConvertor
|
|
125
126
|
:uriTemplate => legacy_resource[:url],
|
126
127
|
:model => nil,
|
127
128
|
:parameters => nil,
|
128
|
-
:headers => nil,
|
129
129
|
:actions => nil
|
130
130
|
}
|
131
131
|
|
@@ -162,7 +162,6 @@ module ApiaryBlueprintConvertor
|
|
162
162
|
:description => legacy_resource[:description],
|
163
163
|
:method => legacy_resource[:method],
|
164
164
|
:parameters => nil,
|
165
|
-
:headers => nil,
|
166
165
|
:examples => nil
|
167
166
|
}
|
168
167
|
|
@@ -234,12 +233,15 @@ module ApiaryBlueprintConvertor
|
|
234
233
|
# from legacy headers hash
|
235
234
|
def self.create_headers_hash(legacy_headers)
|
236
235
|
return nil if legacy_headers.blank?
|
237
|
-
headers =
|
236
|
+
headers = []
|
238
237
|
|
239
238
|
legacy_headers.each do |key, value|
|
240
|
-
|
241
|
-
:
|
239
|
+
header = {
|
240
|
+
:name => key.to_s,
|
241
|
+
:value => value.to_s
|
242
242
|
}
|
243
|
+
|
244
|
+
headers << header
|
243
245
|
end
|
244
246
|
|
245
247
|
headers
|
data/test/convertor_test.rb
CHANGED
@@ -88,13 +88,9 @@ class ConvertorTest < Minitest::Test
|
|
88
88
|
assert_equal 1, blueprint_ast.keys.length
|
89
89
|
assert_equal :metadata, blueprint_ast.keys.first
|
90
90
|
|
91
|
-
assert_equal 1, blueprint_ast[:metadata].
|
92
|
-
assert_equal
|
93
|
-
|
94
|
-
assert_equal 1, blueprint_ast[:metadata][:HOST].keys.length
|
95
|
-
assert_equal :value, blueprint_ast[:metadata][:HOST].keys.first
|
96
|
-
|
97
|
-
assert_equal "http://google.com", blueprint_ast[:metadata][:HOST][:value]
|
91
|
+
assert_equal 1, blueprint_ast[:metadata].length
|
92
|
+
assert_equal "HOST", blueprint_ast[:metadata][0][:name]
|
93
|
+
assert_equal "http://google.com", blueprint_ast[:metadata][0][:value]
|
98
94
|
end
|
99
95
|
|
100
96
|
def test_convert_blueprint
|
@@ -104,6 +100,7 @@ class ConvertorTest < Minitest::Test
|
|
104
100
|
assert_equal 4, blueprint_ast.keys.length
|
105
101
|
|
106
102
|
assert blueprint_ast[:metadata]
|
103
|
+
assert_equal 1, blueprint_ast[:metadata].length
|
107
104
|
assert_equal "API NAME", blueprint_ast[:name]
|
108
105
|
assert_equal "Lorem Ipsum", blueprint_ast[:description]
|
109
106
|
assert blueprint_ast[:resourceGroups]
|
@@ -145,7 +142,6 @@ class ConvertorTest < Minitest::Test
|
|
145
142
|
assert_equal "/resource1", group_ast[:resources][0][:uriTemplate]
|
146
143
|
assert_equal nil, group_ast[:resources][0][:model]
|
147
144
|
assert_equal nil, group_ast[:resources][0][:parameters]
|
148
|
-
assert_equal nil, group_ast[:resources][0][:headers]
|
149
145
|
assert group_ast[:resources][0][:actions]
|
150
146
|
assert_equal 2, group_ast[:resources][0][:actions].length
|
151
147
|
|
@@ -154,7 +150,6 @@ class ConvertorTest < Minitest::Test
|
|
154
150
|
assert_equal "/resource2", group_ast[:resources][1][:uriTemplate]
|
155
151
|
assert_equal nil, group_ast[:resources][1][:model]
|
156
152
|
assert_equal nil, group_ast[:resources][1][:parameters]
|
157
|
-
assert_equal nil, group_ast[:resources][1][:headers]
|
158
153
|
assert group_ast[:resources][1][:actions]
|
159
154
|
assert_equal 1, group_ast[:resources][1][:actions].length
|
160
155
|
end
|
@@ -168,7 +163,6 @@ class ConvertorTest < Minitest::Test
|
|
168
163
|
assert_equal "GET", resource_ast[:actions][0][:method]
|
169
164
|
assert_equal "Ipsum Lorem", resource_ast[:actions][0][:description]
|
170
165
|
assert_equal nil, resource_ast[:actions][0][:parameters]
|
171
|
-
assert_equal nil, resource_ast[:actions][0][:headers]
|
172
166
|
assert_instance_of Array, resource_ast[:actions][0][:examples]
|
173
167
|
end
|
174
168
|
|
@@ -195,34 +189,23 @@ class ConvertorTest < Minitest::Test
|
|
195
189
|
assert_equal "200", action_ast[:examples][0][:responses][0][:name]
|
196
190
|
assert_equal nil, action_ast[:examples][0][:responses][0][:description]
|
197
191
|
|
198
|
-
assert_instance_of
|
199
|
-
assert_equal 1, action_ast[:examples][0][:responses][0][:headers].
|
200
|
-
assert_equal
|
201
|
-
|
202
|
-
assert_equal 1, action_ast[:examples][0][:responses][0][:headers][:'Content-Type'].keys.length
|
203
|
-
assert_equal :value, action_ast[:examples][0][:responses][0][:headers][:'Content-Type'].keys[0]
|
204
|
-
assert_equal "text/plain", action_ast[:examples][0][:responses][0][:headers][:'Content-Type'][:value]
|
205
|
-
|
192
|
+
assert_instance_of Array, action_ast[:examples][0][:responses][0][:headers]
|
193
|
+
assert_equal 1, action_ast[:examples][0][:responses][0][:headers].length
|
194
|
+
assert_equal "Content-Type", action_ast[:examples][0][:responses][0][:headers][0][:name]
|
195
|
+
assert_equal "text/plain", action_ast[:examples][0][:responses][0][:headers][0][:value]
|
206
196
|
assert_equal "Hello World!", action_ast[:examples][0][:responses][0][:body]
|
207
197
|
assert_equal "0xdeadbeef", action_ast[:examples][0][:responses][0][:schema]
|
208
198
|
|
209
199
|
assert_equal "404", action_ast[:examples][0][:responses][1][:name]
|
210
200
|
assert_equal nil, action_ast[:examples][0][:responses][1][:description]
|
211
201
|
|
212
|
-
assert_instance_of
|
213
|
-
assert_equal 2, action_ast[:examples][0][:responses][1][:headers].
|
202
|
+
assert_instance_of Array, action_ast[:examples][0][:responses][1][:headers]
|
203
|
+
assert_equal 2, action_ast[:examples][0][:responses][1][:headers].length
|
214
204
|
|
215
|
-
assert_equal
|
216
|
-
|
217
|
-
assert_equal
|
218
|
-
assert_equal
|
219
|
-
assert_equal "application/json", action_ast[:examples][0][:responses][1][:headers][:'Content-Type'][:value]
|
220
|
-
|
221
|
-
assert_equal :'X-Header', action_ast[:examples][0][:responses][1][:headers].keys[1]
|
222
|
-
assert_instance_of Hash, action_ast[:examples][0][:responses][1][:headers][:'X-Header']
|
223
|
-
assert_equal 1, action_ast[:examples][0][:responses][1][:headers][:'X-Header'].keys.length
|
224
|
-
assert_equal :value, action_ast[:examples][0][:responses][1][:headers][:'X-Header'].keys[0]
|
225
|
-
assert_equal "42", action_ast[:examples][0][:responses][1][:headers][:'X-Header'][:value]
|
205
|
+
assert_equal "Content-Type", action_ast[:examples][0][:responses][1][:headers][0][:name]
|
206
|
+
assert_equal "application/json", action_ast[:examples][0][:responses][1][:headers][0][:value]
|
207
|
+
assert_equal "X-Header", action_ast[:examples][0][:responses][1][:headers][1][:name]
|
208
|
+
assert_equal "42", action_ast[:examples][0][:responses][1][:headers][1][:value]
|
226
209
|
|
227
210
|
assert_equal "42 not found.", action_ast[:examples][0][:responses][1][:body]
|
228
211
|
assert_equal "0xdeadbeef", action_ast[:examples][0][:responses][1][:schema]
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apiary_blueprint_convertor
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Zdenek Nemec
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01
|
11
|
+
date: 2014-03-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|