rack-spec 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 277859642681598d0b7da69a7c16e6248ddb4793
4
- data.tar.gz: 4fa89bf9a124ff8346192e7f4354e63f60f88285
3
+ metadata.gz: f9795c070d0186c9a6438b83e16f99d451efd2e0
4
+ data.tar.gz: 9bc28b54878df5ff26bea3d3db7f4162ccaa39c0
5
5
  SHA512:
6
- metadata.gz: 5e76e95ba99636e4691bcc608eef9d69851b3d9ecc20a2378ee0eb0fb3cf82746b4a2ed68de87229aa9807aac0a10105d9125d08d92c36cc314af90e425fcf33
7
- data.tar.gz: e16f969d4e18f0e61eb2162a9c5e9e9a164e1a40cee3cc6693008121325aa56431846d714fc30a0edafbcb9ca10860b84dd82fce1266abc40ef19f41d690f9e6
6
+ metadata.gz: ddea8433e0f5c03b399acd9e3e6d91c73d24ad8c56ed6a9ce0409b022d1683a1464123e337257f0e5baf5124331899475aed2498afbc199172124f2d99bc8b7a
7
+ data.tar.gz: b49bd48bd82e0387e64496cf9ac599b633937fa4bad9b5323607208eb66853dbfb096c47e904f883dd9d5c088ea05e06d41342d5a10a89afd49ae2d890606474
@@ -1,3 +1,6 @@
1
+ ## 0.1.8
2
+ * Add Rack::Spec::Docs
3
+
1
4
  ## 0.1.7
2
5
  * Reveal `Rack::Spec::Schema#links`
3
6
 
data/README.md CHANGED
@@ -6,6 +6,7 @@
6
6
  str = File.read("schema.json")
7
7
  schema = JSON.parse(str)
8
8
 
9
+ use Rack::Spec::Docs, schema: schema
9
10
  use Rack::Spec::ErrorHandler
10
11
  use Rack::Spec::RequestValidation, schema: schema
11
12
  use Rack::Spec::ResponseValidation, schema: schema if ENV["RACK_ENV"] == "test"
@@ -146,3 +147,54 @@ Rack::Spec::Error
146
147
  |
147
148
  `--Rack::Spec::ResponseValidation::InvalidResponseType
148
149
  ```
150
+
151
+ ### Rack::Spec::Docs
152
+ Returns API documentation as a text/plain content, rendered in GitHub flavored Markdown.
153
+
154
+ * You can give `path` option to change default path: `GET /docs`
155
+ * API documentation is powered by [jdoc](https://github.com/r7kamura/jdoc) gem
156
+ * This middleware is also bundled in the `specup` executable command
157
+
158
+ ```sh
159
+ $ specup schema.json
160
+ [2014-06-06 23:01:35] INFO WEBrick 1.3.1
161
+ [2014-06-06 23:01:35] INFO ruby 2.0.0 (2013-06-27) [x86_64-darwin12.5.0]
162
+ [2014-06-06 23:01:35] INFO WEBrick::HTTPServer#start: pid=24303 port=8080
163
+
164
+ $ curl :8080/docs -i
165
+ HTTP/1.1 200 OK
166
+ Content-Type: text/plain; charset=utf-8
167
+ Server: WEBrick/1.3.1 (Ruby/2.1.1/2014-02-24)
168
+ Date: Sat, 07 Jun 2014 19:58:04 GMT
169
+ Content-Length: 2175
170
+ Connection: Keep-Alive
171
+
172
+ # Example API
173
+ * [App](#app)
174
+ * [GET /apps](#get-apps)
175
+ * [POST /apps](#post-apps)
176
+ * [GET /apps/:id](#get-appsid)
177
+ * [PATCH /apps/:id](#patch-appsid)
178
+ * [DELETE /apps/:id](#delete-appsid)
179
+ * [Recipe](#recipe)
180
+ * [GET /recipes](#get-recipes)
181
+
182
+ ## App
183
+ An app is a program to be deployed.
184
+
185
+ ### Properties
186
+ * id - unique identifier of app
187
+ * Example: `01234567-89ab-cdef-0123-456789abcdef`
188
+ * Type: string
189
+ * Format: uuid
190
+ * ReadOnly: true
191
+ * name - unique name of app
192
+ * Example: `example`
193
+ * Type: string
194
+ * Patern: `(?-mix:^[a-z][a-z0-9-]{3,50}$)`
195
+
196
+ ### GET /apps
197
+ List existing apps.
198
+
199
+ ...
200
+ ```
data/bin/specup CHANGED
@@ -20,6 +20,7 @@ else
20
20
  end
21
21
 
22
22
  app = Rack::Builder.new do
23
+ use Rack::Spec::Docs, schema: schema
23
24
  use Rack::Spec::ErrorHandler
24
25
  use Rack::Spec::Mock, schema: schema
25
26
  run ->(env) { [404, {}, ["Not found"]] }
@@ -1,3 +1,4 @@
1
+ require "jdoc"
1
2
  require "json"
2
3
  require "json_schema"
3
4
  require "multi_json"
@@ -5,6 +6,7 @@ require "rack"
5
6
 
6
7
  require "rack/spec/base_request_handler"
7
8
  require "rack/spec/error"
9
+ require "rack/spec/docs"
8
10
  require "rack/spec/error_handler"
9
11
  require "rack/spec/mock"
10
12
  require "rack/spec/request_validation"
@@ -0,0 +1,38 @@
1
+ module Rack
2
+ module Spec
3
+ class Docs
4
+ DEFAULT_PATH = "/docs"
5
+
6
+ # Behaves as a rack-middleware
7
+ # @param app [Object] Rack application
8
+ # @param path [String, nil] URL path to return document (default: /docs)
9
+ # @param schema [Hash] Schema object written in JSON schema format
10
+ def initialize(app, path: nil, schema: nil)
11
+ @app = app
12
+ @path = path
13
+ @document = Jdoc::Generator.call(schema)
14
+ end
15
+
16
+ # Returns rendered document for document request
17
+ # @param env [Hash] Rack env
18
+ def call(env)
19
+ if env["REQUEST_METHOD"] == "GET" && env["PATH_INFO"] == path
20
+ [
21
+ 200,
22
+ { "Content-Type" => "text/plain; charset=utf-8" },
23
+ [@document],
24
+ ]
25
+ else
26
+ @app.call(env)
27
+ end
28
+ end
29
+
30
+ private
31
+
32
+ # @return [String] Path to return document
33
+ def path
34
+ @path || DEFAULT_PATH
35
+ end
36
+ end
37
+ end
38
+ end
@@ -1,5 +1,5 @@
1
1
  module Rack
2
2
  module Spec
3
- VERSION = "0.1.7"
3
+ VERSION = "0.1.8"
4
4
  end
5
5
  end
@@ -17,6 +17,7 @@ Gem::Specification.new do |spec|
17
17
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
18
  spec.require_paths = ["lib"]
19
19
 
20
+ spec.add_dependency "jdoc", ">= 0.0.3"
20
21
  spec.add_dependency "json_schema"
21
22
  spec.add_dependency "multi_json"
22
23
  spec.add_dependency "rack"
@@ -108,6 +108,7 @@
108
108
  "description": "unique identifier of recipe",
109
109
  "format": "uuid",
110
110
  "readOnly": true,
111
+ "example": 1,
111
112
  "type": [
112
113
  "string"
113
114
  ]
@@ -0,0 +1,93 @@
1
+ require "spec_helper"
2
+
3
+ describe Rack::Spec::Docs do
4
+ include Rack::Test::Methods
5
+
6
+ let(:app) do
7
+ local_docs_path = docs_path
8
+ local_schema = schema
9
+ Rack::Builder.app do
10
+ use Rack::Spec::Docs, path: local_docs_path, schema: local_schema
11
+ run ->(env) do
12
+ [
13
+ 200,
14
+ {},
15
+ ["dummy"],
16
+ ]
17
+ end
18
+ end
19
+ end
20
+
21
+ let(:schema) do
22
+ str = File.read(schema_path)
23
+ JSON.parse(str)
24
+ end
25
+
26
+ let(:schema_path) do
27
+ File.expand_path("../../../fixtures/schema.json", __FILE__)
28
+ end
29
+
30
+ let(:docs_path) do
31
+ nil
32
+ end
33
+
34
+ let(:response) do
35
+ last_response
36
+ end
37
+
38
+ let(:env) do
39
+ {}
40
+ end
41
+
42
+ let(:params) do
43
+ {}
44
+ end
45
+
46
+ subject do
47
+ send(verb, path, params, env)
48
+ response.status
49
+ end
50
+
51
+ describe "#call" do
52
+ let(:verb) do
53
+ :get
54
+ end
55
+
56
+ context "without :path option" do
57
+ let(:path) do
58
+ "/docs"
59
+ end
60
+
61
+ it "generates API documentation and returns it to request to GET /docs" do
62
+ should == 200
63
+ response.body.should include("Example API")
64
+ end
65
+ end
66
+
67
+ context "with :path option" do
68
+ let(:docs_path) do
69
+ "/api_document"
70
+ end
71
+
72
+ let(:path) do
73
+ "/api_document"
74
+ end
75
+
76
+ it "responds to specified path" do
77
+ should == 200
78
+ response.body.should_not == "dummy"
79
+ end
80
+ end
81
+
82
+ context "without targeted request" do
83
+ let(:path) do
84
+ "/apps"
85
+ end
86
+
87
+ it "delegates request to inner app" do
88
+ should == 200
89
+ response.body.should == "dummy"
90
+ end
91
+ end
92
+ end
93
+ end
@@ -102,6 +102,10 @@ describe Rack::Spec::Mock do
102
102
  end
103
103
 
104
104
  context "without example" do
105
+ before do
106
+ schema["definitions"]["recipe"]["definitions"]["id"].delete("example")
107
+ end
108
+
105
109
  let(:verb) do
106
110
  :get
107
111
  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.1.7
4
+ version: 0.1.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryo Nakamura
@@ -10,6 +10,20 @@ bindir: bin
10
10
  cert_chain: []
11
11
  date: 2014-06-07 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: jdoc
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 0.0.3
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 0.0.3
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: json_schema
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -168,6 +182,7 @@ files:
168
182
  - lib/rack-spec.rb
169
183
  - lib/rack/spec.rb
170
184
  - lib/rack/spec/base_request_handler.rb
185
+ - lib/rack/spec/docs.rb
171
186
  - lib/rack/spec/error.rb
172
187
  - lib/rack/spec/error_handler.rb
173
188
  - lib/rack/spec/mock.rb
@@ -177,6 +192,7 @@ files:
177
192
  - lib/rack/spec/version.rb
178
193
  - rack-spec.gemspec
179
194
  - spec/fixtures/schema.json
195
+ - spec/rack/spec/docs_spec.rb
180
196
  - spec/rack/spec/mock_spec.rb
181
197
  - spec/rack/spec_spec.rb
182
198
  - spec/spec_helper.rb
@@ -206,6 +222,7 @@ specification_version: 4
206
222
  summary: JSON Schema based Rack middlewares
207
223
  test_files:
208
224
  - spec/fixtures/schema.json
225
+ - spec/rack/spec/docs_spec.rb
209
226
  - spec/rack/spec/mock_spec.rb
210
227
  - spec/rack/spec_spec.rb
211
228
  - spec/spec_helper.rb