jdoc 0.2.0 → 0.2.1
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 +3 -0
- data/example-api-documentation.md +37 -1
- data/jdoc.gemspec +1 -0
- data/lib/jdoc.rb +2 -0
- data/lib/jdoc/link.rb +37 -1
- data/lib/jdoc/request/multipart.rb +43 -0
- data/lib/jdoc/version.rb +1 -1
- data/spec/fixtures/schema.yml +17 -0
- data/template.md.erb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3037f3d705868d91ab1a9760532a0c94b40443a9
|
4
|
+
data.tar.gz: 3902451a12fa080192ad162f505937ccaaade5ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b013094bfbc4221fd7eb72d5ff4ef01ab6015dd08bd026702b3a32024dc65de55df2076cbb32854d7eace2958acc4538d9134b7286f4bf726a52bc1bb4cfcb9a
|
7
|
+
data.tar.gz: ea026e0adb173194b64df59fbfb60a47db6483f47f3c4a60f434192f821dc4611b90a63bac0ab1ef4221b614478eb610d1f394fafb2e6110dda30f7c1888042e
|
data/CHANGELOG.md
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# Example API
|
2
2
|
A schema for a small example API.
|
3
|
+
|
3
4
|
* [App](#app)
|
4
5
|
* [POST /apps](#post-apps)
|
5
6
|
* [DELETE /apps/:id](#delete-appsid)
|
6
7
|
* [GET /apps/:id](#get-appsid)
|
7
8
|
* [GET /apps](#get-apps)
|
8
9
|
* [PATCH /apps/:id](#patch-appsid)
|
10
|
+
* [POST /apps/:id/files](#post-appsidfiles)
|
9
11
|
* [Recipe](#recipe)
|
10
12
|
* [GET /recipes](#get-recipes)
|
11
13
|
* [User](#user)
|
@@ -190,6 +192,41 @@ Content-Type: application/json
|
|
190
192
|
}
|
191
193
|
```
|
192
194
|
|
195
|
+
### POST /apps/:id/files
|
196
|
+
Upload an attachment file for an app
|
197
|
+
|
198
|
+
```
|
199
|
+
POST /apps/:id/files HTTP/1.1
|
200
|
+
Content-Type: multipart/form-data; boundary=---BoundaryX
|
201
|
+
Host: api.example.com
|
202
|
+
|
203
|
+
-----BoundaryX
|
204
|
+
Content-Disposition: form-data; name="[file]"
|
205
|
+
|
206
|
+
... contents of file ...
|
207
|
+
|
193
|
-
|
208
|
+
```
|
209
|
+
|
210
|
+
```
|
211
|
+
HTTP/1.1 201
|
212
|
+
Content-Type: application/json
|
213
|
+
|
214
|
+
{
|
215
|
+
"id": "01234567-89ab-cdef-0123-456789abcdef",
|
216
|
+
"name": "example",
|
217
|
+
"private": false,
|
218
|
+
"deleted_at": null,
|
219
|
+
"user_ids": [
|
220
|
+
1
|
221
|
+
],
|
222
|
+
"users": [
|
223
|
+
{
|
224
|
+
"name": "alice"
|
225
|
+
}
|
226
|
+
]
|
227
|
+
}
|
228
|
+
```
|
229
|
+
|
194
230
|
## Recipe
|
195
231
|
|
196
232
|
|
data/jdoc.gemspec
CHANGED
@@ -19,6 +19,7 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.add_dependency "activesupport"
|
20
20
|
spec.add_dependency "erubis"
|
21
21
|
spec.add_dependency "json_schema"
|
22
|
+
spec.add_dependency "rack"
|
22
23
|
spec.add_dependency "redcarpet"
|
23
24
|
spec.add_development_dependency "bundler", "~> 1.6"
|
24
25
|
spec.add_development_dependency "pry"
|
data/lib/jdoc.rb
CHANGED
@@ -4,10 +4,12 @@ require "cgi"
|
|
4
4
|
require "erubis"
|
5
5
|
require "json_schema"
|
6
6
|
require "redcarpet"
|
7
|
+
require "rack"
|
7
8
|
require "uri"
|
8
9
|
|
9
10
|
require "jdoc/generator"
|
10
11
|
require "jdoc/link"
|
12
|
+
require 'jdoc/request/multipart'
|
11
13
|
require "jdoc/property"
|
12
14
|
require "jdoc/resource"
|
13
15
|
require "jdoc/schema"
|
data/lib/jdoc/link.rb
CHANGED
@@ -62,6 +62,14 @@ module Jdoc
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
# @return [String] request content type
|
66
|
+
# @note default value is "application/json"
|
67
|
+
def content_type
|
68
|
+
type = @raw_link.enc_type
|
69
|
+
type += "; #{Request::Multipart.boundary}" if content_type_multipart?
|
70
|
+
type
|
71
|
+
end
|
72
|
+
|
65
73
|
# Adds query string if a link has a schema property and method is GET
|
66
74
|
# @return [String, nil] A query string prefixed with `?` only to GET request
|
67
75
|
# @example
|
@@ -74,7 +82,25 @@ module Jdoc
|
|
74
82
|
|
75
83
|
# @return [String, nil] Example request body in JSON format
|
76
84
|
def request_body
|
77
|
-
|
85
|
+
body = case
|
86
|
+
when content_type_multipart?
|
87
|
+
request_body_in_multipart
|
88
|
+
when content_type_json?
|
89
|
+
request_body_in_json
|
90
|
+
else
|
91
|
+
""
|
92
|
+
end
|
93
|
+
body + "\n"
|
94
|
+
end
|
95
|
+
|
96
|
+
# @return [true, false] True if encType of request is multipart/form-data
|
97
|
+
def content_type_multipart?
|
98
|
+
Rack::Mime.match?(@raw_link.enc_type, "multipart/form-data")
|
99
|
+
end
|
100
|
+
|
101
|
+
# @return [true, false] True if encType of request is multipart/form-data
|
102
|
+
def content_type_json?
|
103
|
+
Rack::Mime.match?(@raw_link.enc_type, "application/json")
|
78
104
|
end
|
79
105
|
|
80
106
|
# @return [Hash] Example request parameters for this endpoint
|
@@ -138,6 +164,16 @@ module Jdoc
|
|
138
164
|
ResponseGenerator.call(response_schema.properties)
|
139
165
|
end
|
140
166
|
|
167
|
+
# @return [String, nil] Example request body in Multipart
|
168
|
+
def request_body_in_multipart
|
169
|
+
Request::Multipart.new(request_parameters).dump
|
170
|
+
end
|
171
|
+
|
172
|
+
# @return [String, nil] Example request body in JSON format
|
173
|
+
def request_body_in_json
|
174
|
+
JSON.pretty_generate(request_parameters)
|
175
|
+
end
|
176
|
+
|
141
177
|
# @return [Fixnum] Order score, used to sort links by preferred method order
|
142
178
|
def method_order_score
|
143
179
|
case method
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Jdoc
|
2
|
+
module Request
|
3
|
+
class Multipart
|
4
|
+
MULTIPART_BOUNDARY = "---BoundaryX"
|
5
|
+
|
6
|
+
# @return [String] returns boundary parameter for multipart content-type
|
7
|
+
def self.boundary
|
8
|
+
"boundary=#{MULTIPART_BOUNDARY}"
|
9
|
+
end
|
10
|
+
|
11
|
+
# @param params [Hash] request parameters
|
12
|
+
def initialize(params)
|
13
|
+
@params = params
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [String] request body of multipart/form-data request.
|
17
|
+
# @example
|
18
|
+
# -----BoundaryX
|
19
|
+
# Content-Disposition: form-data; name="file"
|
20
|
+
#
|
21
|
+
# ... contents of file ...
|
22
|
+
# -----BoundaryX--
|
23
|
+
def dump
|
24
|
+
contents = Rack::Multipart::Generator.new(@params, false).dump.map do |name, content|
|
25
|
+
content_part(content, name)
|
26
|
+
end.join
|
27
|
+
"#{contents}\r--#{MULTIPART_BOUNDARY}--\r"
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
# return [String] content part of multipart/form-data request
|
33
|
+
def content_part(content, name)
|
34
|
+
<<-EOF
|
35
|
+
--#{MULTIPART_BOUNDARY}\r
|
36
|
+
Content-Disposition: form-data; name="#{name}"\r
|
37
|
+
\r
|
38
|
+
#{content}
|
39
|
+
EOF
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/jdoc/version.rb
CHANGED
data/spec/fixtures/schema.yml
CHANGED
@@ -40,6 +40,11 @@ definitions:
|
|
40
40
|
items:
|
41
41
|
type: integer
|
42
42
|
example: 1
|
43
|
+
file:
|
44
|
+
description: an attachment of app
|
45
|
+
example: '... contents of file ...'
|
46
|
+
readOnly: false
|
47
|
+
type: string
|
43
48
|
links:
|
44
49
|
- description: Create a new app.
|
45
50
|
href: "/apps"
|
@@ -78,6 +83,18 @@ definitions:
|
|
78
83
|
type:
|
79
84
|
- object
|
80
85
|
title: Update
|
86
|
+
- description: Upload an attachment file for an app
|
87
|
+
href: "/apps/{(%23%2Fdefinitions%2Fapp%2Fdefinitions%2Fid)}/files"
|
88
|
+
method: POST
|
89
|
+
rel: create
|
90
|
+
encType: multipart/form-data
|
91
|
+
schema:
|
92
|
+
properties:
|
93
|
+
file:
|
94
|
+
"$ref": "#/definitions/app/definitions/file"
|
95
|
+
type:
|
96
|
+
- object
|
97
|
+
title: Create
|
81
98
|
properties:
|
82
99
|
id:
|
83
100
|
"$ref": "#/definitions/app/definitions/id"
|
data/template.md.erb
CHANGED
@@ -28,7 +28,7 @@
|
|
28
28
|
|
29
29
|
```
|
30
30
|
<%= link.method %> <%= link.path %><%= link.query_string %> HTTP/1.1
|
31
|
-
<%= "Content-Type:
|
31
|
+
<%= "Content-Type: #{link.content_type}\n" if link.has_request_body? -%>
|
32
32
|
Host: <%= schema.host_with_port %>
|
33
33
|
<%= "\n" + link.request_body if link.has_request_body? -%>
|
34
34
|
```
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jdoc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryo Nakamura
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-08-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ">="
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rack
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: redcarpet
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -143,6 +157,7 @@ files:
|
|
143
157
|
- lib/jdoc/generator.rb
|
144
158
|
- lib/jdoc/link.rb
|
145
159
|
- lib/jdoc/property.rb
|
160
|
+
- lib/jdoc/request/multipart.rb
|
146
161
|
- lib/jdoc/resource.rb
|
147
162
|
- lib/jdoc/schema.rb
|
148
163
|
- lib/jdoc/version.rb
|