rack-spec 0.1.7 → 0.1.8

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 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