useless-doc 0.2.3 → 0.3.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.
- data/lib/useless/doc/client.rb +62 -0
- data/lib/useless/doc/core/api.rb +6 -2
- data/lib/useless/doc/core/domain.rb +34 -0
- data/lib/useless/doc/dsl.rb +30 -0
- data/lib/useless/doc/rack/{stylesheet.rb → css.rb} +8 -8
- data/lib/useless/doc/rack/html.rb +26 -0
- data/lib/useless/doc/rack/subject.rb +40 -0
- data/lib/useless/doc/rack/ui.rb +12 -11
- data/lib/useless/doc/rack/url.rb +33 -0
- data/lib/useless/doc/rack.rb +46 -0
- data/lib/useless/doc/router.rb +62 -0
- data/lib/useless/doc/serialization/dump.rb +17 -0
- data/lib/useless/doc/serialization/load.rb +35 -0
- data/lib/useless/doc/sinatra.rb +4 -3
- data/lib/useless/doc/ui/godel/api.mustache +24 -24
- data/lib/useless/doc/ui/godel/domain.mustache +26 -0
- data/lib/useless/doc/ui/godel/resource.mustache +151 -155
- data/lib/useless/doc/ui/godel/stylesheet.css +156 -1
- data/lib/useless/doc/ui/godel.rb +54 -12
- data/lib/useless/doc/ui.rb +24 -0
- data/lib/useless/doc/version.rb +1 -1
- data/lib/useless/doc.rb +20 -2
- data/spec/config.ru +19 -0
- data/spec/documents/api.json +1 -0
- data/spec/documents/domain.json +17 -0
- data/spec/useless/doc/client_spec.rb +59 -0
- data/spec/useless/doc/dsl_spec.rb +28 -2
- data/spec/useless/doc/rack/{stylesheet_spec.rb → css_spec.rb} +3 -9
- data/spec/useless/doc/rack/html_spec.rb +39 -0
- data/spec/useless/doc/rack/subject_spec.rb +44 -0
- data/spec/useless/doc/rack/ui_spec.rb +1 -1
- data/spec/useless/doc/rack/url_spec.rb +35 -0
- data/spec/useless/doc/{rack/application_spec.rb → rack_spec.rb} +22 -11
- data/spec/useless/doc/router_spec.rb +38 -0
- data/spec/useless/doc/serialization/dump_spec.rb +29 -0
- data/spec/useless/doc/serialization/load_spec.rb +37 -0
- data/spec/useless/doc/sinatra_spec.rb +3 -1
- data/spec/useless/doc/ui/godel_spec.rb +136 -96
- data/useless-doc.gemspec +1 -1
- metadata +34 -21
- data/lib/useless/doc/rack/application.rb +0 -47
- data/lib/useless/doc/rack/proxy.rb +0 -62
- data/lib/useless/doc/rack/retriever.rb +0 -68
- data/lib/useless/doc/rack/transform.rb +0 -46
- data/spec/useless/doc/rack/proxy_spec.rb +0 -56
- data/spec/useless/doc/rack/retriever_spec.rb +0 -82
- data/spec/useless/doc/rack/transform_spec.rb +0 -57
@@ -0,0 +1,17 @@
|
|
1
|
+
{
|
2
|
+
"name": "Useless",
|
3
|
+
"url": "http://useless.io",
|
4
|
+
"description": "A collection of useless APIs.",
|
5
|
+
"apis": [
|
6
|
+
{
|
7
|
+
"name": "The Jah API",
|
8
|
+
"url": "http://jah.useless.io",
|
9
|
+
"description": "Jah, jah, jah."
|
10
|
+
},
|
11
|
+
{
|
12
|
+
"name": "The Twonk API",
|
13
|
+
"url": "http://twonk.useless.io",
|
14
|
+
"description": "TWONK!!!"
|
15
|
+
}
|
16
|
+
]
|
17
|
+
}
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
require 'useless/doc/client'
|
4
|
+
|
5
|
+
describe Useless::Doc::Client::Standard do
|
6
|
+
before(:each) do
|
7
|
+
@client = Useless::Doc::Client.standard
|
8
|
+
@client.instance_variable_set(:@cache, {})
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'should make a normal request if the cache is empty.' do
|
12
|
+
Typhoeus.should_receive(:options).
|
13
|
+
with('http://some-api.granmal.com/some/resource', headers: { 'Accept' => 'application/json' }).
|
14
|
+
and_return(mock(:response, response_code: 200, response_body: load_document('twonk.json').read))
|
15
|
+
|
16
|
+
resource = @client.get('http://some-api.granmal.com/some/resource')
|
17
|
+
resource.path.should == '/twonks/:id'
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should return an API if that is what\'s returned' do
|
21
|
+
Typhoeus.should_receive(:options).
|
22
|
+
with('http://some-api.granmal.com/', headers: { 'Accept' => 'application/json' }).
|
23
|
+
and_return(mock(:response, response_code: 200, response_body: load_document('api.json').read))
|
24
|
+
|
25
|
+
api = @client.get('http://some-api.granmal.com/')
|
26
|
+
api.url.should == 'twonk.useless.io'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should make a request with a cache control header if there is a cache hit.' do
|
30
|
+
now = Time.now
|
31
|
+
Time.should_receive(:now).once.and_return(now)
|
32
|
+
|
33
|
+
Typhoeus.should_receive(:options).once.
|
34
|
+
with('http://some-api.granmal.com/some/resource', headers: { 'Accept' => 'application/json' }).
|
35
|
+
and_return(mock(:response, response_code: 200, response_body: load_document('twonk.json').read))
|
36
|
+
|
37
|
+
Typhoeus.should_receive(:options).once.
|
38
|
+
with('http://some-api.granmal.com/some/resource', headers: { 'Accept' => 'application/json', 'If-Modified-Since' => now.httpdate}).
|
39
|
+
and_return(mock(:response, response_code: 304, response_body: ''))
|
40
|
+
|
41
|
+
@client.get('http://some-api.granmal.com/some/resource')
|
42
|
+
resource = @client.get('http://some-api.granmal.com/some/resource')
|
43
|
+
resource.path.should == '/twonks/:id'
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe Useless::Doc::Client::Stub do
|
48
|
+
it 'should serve files from the spec/documents directory' do
|
49
|
+
client = Useless::Doc::Client.stub
|
50
|
+
resource = client.get('http://anything.useless.io/twonk')
|
51
|
+
resource.path.should == '/twonks/:id'
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should return nil if the corresponding file doesn\'t exist' do
|
55
|
+
client = Useless::Doc::Client.stub
|
56
|
+
resource = client.get('http://anything.useless.io/nonexistant')
|
57
|
+
resource.should be_nil
|
58
|
+
end
|
59
|
+
end
|
@@ -5,10 +5,35 @@ require 'rack/test'
|
|
5
5
|
require 'useless/doc'
|
6
6
|
require 'useless/doc/dsl'
|
7
7
|
|
8
|
-
describe Useless::Doc::DSL do
|
8
|
+
describe Useless::Doc::DSL::Domain do
|
9
|
+
describe '.build' do
|
10
|
+
it 'should provide a DSL for building a domain (through Useless::Doc.domain)' do
|
11
|
+
domain = Useless::Doc.domain 'useless.io' do
|
12
|
+
url 'http://useless.io'
|
13
|
+
description 'A collection of useless APIs.'
|
14
|
+
|
15
|
+
api 'Twonk' do
|
16
|
+
url 'twonk.useless.io'
|
17
|
+
description 'Twonk stuff'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
domain.name.should == 'useless.io'
|
22
|
+
domain.url.should == 'http://useless.io'
|
23
|
+
domain.description.should == 'A collection of useless APIs.'
|
24
|
+
|
25
|
+
domain.apis.first.name.should == 'Twonk'
|
26
|
+
domain.apis.first.url.should == 'twonk.useless.io'
|
27
|
+
domain.apis.first.description.should == 'Twonk stuff'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe Useless::Doc::DSL::API do
|
9
33
|
describe '.build' do
|
10
34
|
it 'should provide a terse DSL for building API documentation (through Useless::Doc.api)' do
|
11
|
-
api = Useless::Doc.api '
|
35
|
+
api = Useless::Doc.api 'Widget API' do
|
36
|
+
url 'widget.useless.io'
|
12
37
|
description 'The canonical source of worldwide widgets.'
|
13
38
|
|
14
39
|
resource('/widgets').description 'The whole kit and kaboodle.'
|
@@ -64,6 +89,7 @@ describe Useless::Doc::DSL do
|
|
64
89
|
timestamp '2013-01-12 12:44 AM'
|
65
90
|
end
|
66
91
|
|
92
|
+
api.name.should == 'Widget API'
|
67
93
|
api.url.should == 'widget.useless.io'
|
68
94
|
api.description.should == 'The canonical source of worldwide widgets.'
|
69
95
|
api.timestamp.should == Time.parse('2013-01-12 12:44 AM')
|
@@ -1,10 +1,10 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
2
|
|
3
3
|
require 'rack/test'
|
4
|
-
require 'useless/doc/rack/
|
4
|
+
require 'useless/doc/rack/css'
|
5
5
|
require 'useless/doc/ui/godel'
|
6
6
|
|
7
|
-
describe Useless::Doc::Rack::
|
7
|
+
describe Useless::Doc::Rack::CSS do
|
8
8
|
include Rack::Test::Methods
|
9
9
|
|
10
10
|
def base_app
|
@@ -16,16 +16,10 @@ describe Useless::Doc::Rack::Stylesheet do
|
|
16
16
|
def app
|
17
17
|
@app ||= lambda do |env|
|
18
18
|
env['useless.doc.ui'] = Useless::Doc::UI::Godel
|
19
|
-
Useless::Doc::Rack::
|
19
|
+
Useless::Doc::Rack::CSS.new(base_app).call(env)
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
it 'should raise an error if a UI is not specified' do
|
24
|
-
app = Useless::Doc::Rack::Stylesheet.new(base_app)
|
25
|
-
request = Rack::MockRequest.new(app)
|
26
|
-
lambda { request.get('http://some-api.granmal.com/doc.css') }.should raise_error(RuntimeError, 'No UI specified.')
|
27
|
-
end
|
28
|
-
|
29
23
|
it 'should proxy requests if the path is not doc.css' do
|
30
24
|
get 'http://some-api.granmal.com/not/doc.css'
|
31
25
|
last_response.body.should == 'Not a stylesheet request.'
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
require 'rack/test'
|
4
|
+
require 'useless/doc/ui/godel'
|
5
|
+
require 'useless/doc/core/api'
|
6
|
+
require 'useless/doc/rack/html'
|
7
|
+
|
8
|
+
describe Useless::Doc::Rack::HTML do
|
9
|
+
include Rack::Test::Methods
|
10
|
+
|
11
|
+
before(:all) do
|
12
|
+
@ui = Useless::Doc::UI::Godel.new(nil)
|
13
|
+
@subject = Useless::Doc::Core::API.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def app
|
17
|
+
@app ||= lambda do |env|
|
18
|
+
env['useless.doc.ui'] = @ui
|
19
|
+
env['useless.doc.subject'] = @subject
|
20
|
+
|
21
|
+
Useless::Doc::Rack::HTML.call(env)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'should transform the subject to HTML via the specified UI' do
|
26
|
+
@ui.should_receive(:html).with(@subject).and_return('html')
|
27
|
+
|
28
|
+
get 'http://some-api.doc.useless.io/some/resource'
|
29
|
+
last_response.should be_ok
|
30
|
+
last_response.body.should == 'html'
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'should return a 404 if the UI cannot render the HTML' do
|
34
|
+
@ui.should_receive(:html).with(@subject).and_return(nil)
|
35
|
+
|
36
|
+
get 'http://some-api.doc.useless.io/some/resource'
|
37
|
+
last_response.should be_not_found
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
require 'rack/test'
|
4
|
+
require 'useless/doc/rack/subject'
|
5
|
+
|
6
|
+
describe Useless::Doc::Rack::Subject do
|
7
|
+
include Rack::Test::Methods
|
8
|
+
|
9
|
+
def app
|
10
|
+
@app ||= lambda do |env|
|
11
|
+
base_app = lambda do |env|
|
12
|
+
[200, {'Content-Type' => 'text/plain'}, [env['useless.doc.subject']]]
|
13
|
+
end
|
14
|
+
|
15
|
+
env['useless.doc.url'] = 'some.api.com'
|
16
|
+
Useless::Doc::Rack::Subject.new(base_app).call(env)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should retrieve the subject from the stub client in a non-production environment' do
|
21
|
+
Useless::Doc::Client.stub.should_receive(:get).with('some.api.com').and_return('test subject')
|
22
|
+
get 'some.doc.api.com'
|
23
|
+
last_response.should be_ok
|
24
|
+
last_response.body.should == 'test subject'
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should retrieve the subject from the standard client in a production environment' do
|
28
|
+
begin
|
29
|
+
ENV['RACK_ENV'] = 'production'
|
30
|
+
Useless::Doc::Client.standard.should_receive(:get).with('some.api.com').and_return('production subject')
|
31
|
+
get 'some.doc.api.com'
|
32
|
+
last_response.should be_ok
|
33
|
+
last_response.body.should == 'production subject'
|
34
|
+
ensure
|
35
|
+
ENV['RACK_ENV'] = 'test'
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'should return a 404 if no subject is returned' do
|
40
|
+
Useless::Doc::Client.stub.should_receive(:get).with('some.api.com').and_return(nil)
|
41
|
+
get 'some.doc.api.com'
|
42
|
+
last_response.should be_not_found
|
43
|
+
end
|
44
|
+
end
|
@@ -9,7 +9,7 @@ describe Useless::Doc::Rack::UI do
|
|
9
9
|
def app
|
10
10
|
@app ||= begin
|
11
11
|
base_app = lambda do |env|
|
12
|
-
[200, {'Content-Type' => 'text/plain'}, [env['useless.doc.ui'].name]]
|
12
|
+
[200, {'Content-Type' => 'text/plain'}, [env['useless.doc.ui'].class.name]]
|
13
13
|
end
|
14
14
|
|
15
15
|
Useless::Doc::Rack::UI.new(base_app)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
|
+
|
3
|
+
require 'rack/test'
|
4
|
+
require 'useless/doc/router'
|
5
|
+
require 'useless/doc/rack/url'
|
6
|
+
|
7
|
+
describe Useless::Doc::Rack::URL do
|
8
|
+
include Rack::Test::Methods
|
9
|
+
|
10
|
+
def app
|
11
|
+
@app ||= lambda do |env|
|
12
|
+
base_app = lambda do |env|
|
13
|
+
[200, {'Content-Type' => 'text/plain'}, [env['useless.doc.url']]]
|
14
|
+
end
|
15
|
+
|
16
|
+
env['useless.doc.router'] = Useless::Doc::Router.default
|
17
|
+
Useless::Doc::Rack::URL.new(base_app).call(env)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
it 'should ask the router for the api URL' do
|
22
|
+
Useless::Doc::Router.default.should_receive(:api_for_doc).
|
23
|
+
with('http://some.doc.api.com/').and_return('http://some.api.com/')
|
24
|
+
get 'http://some.doc.api.com/'
|
25
|
+
last_response.should be_ok
|
26
|
+
last_response.body.should == 'http://some.api.com/'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should return a 404 if the URL could not be determined' do
|
30
|
+
Useless::Doc::Router.default.should_receive(:api_for_doc).
|
31
|
+
with('http://some.doc.api.com/').and_return(nil)
|
32
|
+
get 'http://some.doc.api.com/'
|
33
|
+
last_response.should be_not_found
|
34
|
+
end
|
35
|
+
end
|
@@ -1,18 +1,19 @@
|
|
1
|
-
require File.dirname(__FILE__) + '
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
2
|
|
3
3
|
require 'rack/test'
|
4
|
-
require 'useless/doc
|
5
|
-
require 'useless/doc/rack
|
4
|
+
require 'useless/doc'
|
5
|
+
require 'useless/doc/rack'
|
6
|
+
require 'useless/doc/client'
|
6
7
|
|
7
|
-
describe Useless::Doc::Rack
|
8
|
+
describe Useless::Doc::Rack do
|
8
9
|
include Rack::Test::Methods
|
9
10
|
|
10
11
|
def app
|
11
|
-
|
12
|
+
Useless::Doc::Rack.new
|
12
13
|
end
|
13
14
|
|
14
15
|
it 'should return a 404 if the JSON cannot be retrieved' do
|
15
|
-
Useless::Doc::
|
16
|
+
Useless::Doc::Client.stub.should_receive(:get).
|
16
17
|
with('http://some-api.useless.io/some/non-existant/resource').
|
17
18
|
and_return(nil)
|
18
19
|
|
@@ -25,20 +26,30 @@ describe Useless::Doc::Rack::Application do
|
|
25
26
|
last_response.should be_not_found
|
26
27
|
end
|
27
28
|
|
29
|
+
it 'should return domain HTML for the root path' do
|
30
|
+
Useless::Doc::Client.stub.should_receive(:get).
|
31
|
+
with('http://useless.io/').
|
32
|
+
and_return(Useless::Doc.load.domain(load_document('domain.json').read))
|
33
|
+
|
34
|
+
get 'http://doc.useless.io/'
|
35
|
+
last_response.should be_ok
|
36
|
+
last_response.body.should =~ /<h1>Useless<\/h1>/
|
37
|
+
end
|
38
|
+
|
28
39
|
it 'should return API HTML if proper JSON is retrieved' do
|
29
|
-
Useless::Doc::
|
40
|
+
Useless::Doc::Client.stub.should_receive(:get).
|
30
41
|
with('http://some-api.useless.io/').
|
31
|
-
and_return(load_document('api.json'))
|
42
|
+
and_return(Useless::Doc.load.api(load_document('api.json').read))
|
32
43
|
|
33
44
|
get 'http://some-api.doc.useless.io/'
|
34
45
|
last_response.should be_ok
|
35
|
-
last_response.body.should =~ /<h1>
|
46
|
+
last_response.body.should =~ /<h1>Twonk API<\/h1>/
|
36
47
|
end
|
37
48
|
|
38
49
|
it 'should return resource HTML if proper JSON is retrieved' do
|
39
|
-
Useless::Doc::
|
50
|
+
Useless::Doc::Client.stub.should_receive(:get).
|
40
51
|
with('http://some-api.useless.io/some/resource').
|
41
|
-
and_return(load_document('twonk.json'))
|
52
|
+
and_return(Useless::Doc.load.resource(load_document('twonk.json').read))
|
42
53
|
|
43
54
|
get 'http://some-api.doc.useless.io/some/resource'
|
44
55
|
last_response.should be_ok
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../../spec_helper'
|
2
|
+
|
3
|
+
require 'rack/test'
|
4
|
+
require 'useless/doc'
|
5
|
+
require 'useless/doc/router'
|
6
|
+
|
7
|
+
describe Useless::Doc::Router::Default do
|
8
|
+
before(:all) do
|
9
|
+
@router = Useless::Doc::Router::Default.new('api.domain.com', 'useless.io')
|
10
|
+
end
|
11
|
+
|
12
|
+
describe '.doc_for_api' do
|
13
|
+
it 'should add a \'doc\' subdomain before the existing subdomain' do
|
14
|
+
@router.doc_for_api('http://api.domain.com/some/path').
|
15
|
+
should == 'http://api.doc.domain.com/some/path'
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'should return nil if the specified URL is not part of the domain' do
|
19
|
+
@router.doc_for_api('http://nonexistant.domain.com/some/path').should be_nil
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
describe '.api_for_doc' do
|
24
|
+
it 'should remove the \'doc\' subdomain' do
|
25
|
+
@router.api_for_doc('http://api.doc.domain.com/some/path').
|
26
|
+
should == 'http://api.domain.com/some/path'
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should remove the \'doc\' subdomain, even if it\'s the only subdomain' do
|
30
|
+
@router.api_for_doc('http://doc.useless.io').
|
31
|
+
should == 'http://useless.io'
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'should return nil if the resulting URL is not part of the domain' do
|
35
|
+
@router.api_for_doc('http://nonexistant.doc.domain.com/some/path').should be_nil
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -2,6 +2,7 @@ require File.dirname(__FILE__) + '/../../../spec_helper'
|
|
2
2
|
|
3
3
|
require 'useless/doc/core/api'
|
4
4
|
require 'useless/doc/core/body'
|
5
|
+
require 'useless/doc/core/domain'
|
5
6
|
require 'useless/doc/core/header'
|
6
7
|
require 'useless/doc/core/request'
|
7
8
|
require 'useless/doc/core/resource'
|
@@ -22,6 +23,32 @@ describe Useless::Doc::Serialization::Dump do
|
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
26
|
+
describe '.domain' do
|
27
|
+
it 'should convert the specified Core::Domain instance to JSON' do
|
28
|
+
api = Useless::Doc::Core::API.new \
|
29
|
+
name: 'Twiddles API',
|
30
|
+
url: 'twiddles.useless.io',
|
31
|
+
description: 'Pretty much, like, everything you\'re looking for'
|
32
|
+
|
33
|
+
domain = Useless::Doc::Core::Domain.new \
|
34
|
+
name: 'Useless',
|
35
|
+
url: 'http://useless.io',
|
36
|
+
description: 'A collection of useless APIs.',
|
37
|
+
apis: [api]
|
38
|
+
|
39
|
+
json = Useless::Doc::Serialization::Dump.domain(domain)
|
40
|
+
hash = Useless::Doc::Serialization::Load.json_to_hash(json)
|
41
|
+
hash['name'].should == 'Useless'
|
42
|
+
hash['url'].should == 'http://useless.io'
|
43
|
+
hash['description'].should == 'A collection of useless APIs.'
|
44
|
+
|
45
|
+
api_hash = Useless::Doc::Serialization::Load.json_to_hash(hash['apis'][0])
|
46
|
+
api_hash['name'].should == 'Twiddles API'
|
47
|
+
api_hash['url'].should == 'twiddles.useless.io'
|
48
|
+
api_hash['description'].should == 'Pretty much, like, everything you\'re looking for'
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
25
52
|
describe '.api' do
|
26
53
|
it 'should convert the specified Core::API instance to JSON' do
|
27
54
|
resource = Useless::Doc::Core::Resource.new \
|
@@ -30,12 +57,14 @@ describe Useless::Doc::Serialization::Dump do
|
|
30
57
|
requests: []
|
31
58
|
|
32
59
|
api = Useless::Doc::Core::API.new \
|
60
|
+
name: 'Twiddles API',
|
33
61
|
url: 'twiddles.useless.io',
|
34
62
|
description: 'Pretty much, like, everything you\'re looking for',
|
35
63
|
resources: [resource]
|
36
64
|
|
37
65
|
json = Useless::Doc::Serialization::Dump.api(api)
|
38
66
|
hash = Useless::Doc::Serialization::Load.json_to_hash(json)
|
67
|
+
hash['name'].should == 'Twiddles API'
|
39
68
|
hash['url'].should == 'twiddles.useless.io'
|
40
69
|
hash['description'].should == 'Pretty much, like, everything you\'re looking for'
|
41
70
|
|
@@ -1,6 +1,9 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/../../../spec_helper'
|
2
2
|
|
3
3
|
require 'useless/doc/serialization/load'
|
4
|
+
require 'useless/doc/core/domain'
|
5
|
+
require 'useless/doc/core/api'
|
6
|
+
require 'useless/doc/core/resource'
|
4
7
|
|
5
8
|
describe Useless::Doc::Serialization::Load do
|
6
9
|
describe '.json_to_hash' do
|
@@ -16,10 +19,44 @@ describe Useless::Doc::Serialization::Load do
|
|
16
19
|
end
|
17
20
|
end
|
18
21
|
|
22
|
+
describe '.load' do
|
23
|
+
it 'should return a Domain instance if domain JSON is provided' do
|
24
|
+
document = load_document('domain.json')
|
25
|
+
api = Useless::Doc::Serialization::Load.load document.read
|
26
|
+
api.should be_an_instance_of(Useless::Doc::Core::Domain)
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'should return an API instance if API JSON is provided' do
|
30
|
+
document = load_document('api.json')
|
31
|
+
api = Useless::Doc::Serialization::Load.load document.read
|
32
|
+
api.should be_an_instance_of(Useless::Doc::Core::API)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'should return a Resource instance if resource JSON is provided' do
|
36
|
+
document = load_document('twonk.json')
|
37
|
+
resource = Useless::Doc::Serialization::Load.load document.read
|
38
|
+
resource.should be_an_instance_of(Useless::Doc::Core::Resource)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe '.domain' do
|
43
|
+
it 'should parse the specified JSON into a Domain instance' do
|
44
|
+
document = load_document('domain.json')
|
45
|
+
domain = Useless::Doc::Serialization::Load.domain document.read
|
46
|
+
domain.name.should == 'Useless'
|
47
|
+
domain.url.should == 'http://useless.io'
|
48
|
+
domain.description.should == 'A collection of useless APIs.'
|
49
|
+
domain.apis.first.name.should == 'The Jah API'
|
50
|
+
domain.apis.first.url.should == 'http://jah.useless.io'
|
51
|
+
domain.apis.first.description.should == 'Jah, jah, jah.'
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
19
55
|
describe '.api' do
|
20
56
|
it 'should parse the specified JSON into an API instance' do
|
21
57
|
document = load_document('api.json')
|
22
58
|
api = Useless::Doc::Serialization::Load.api document.read
|
59
|
+
api.name.should == 'Twonk API'
|
23
60
|
api.url.should == 'twonk.useless.io'
|
24
61
|
api.description.should == 'Twonk information. Duh.'
|
25
62
|
api.resources.first.path.should == '/twonks/:id'
|
@@ -9,7 +9,8 @@ describe Useless::Doc::Sinatra do
|
|
9
9
|
class DocApp < Sinatra::Base
|
10
10
|
register Useless::Doc::Sinatra
|
11
11
|
|
12
|
-
doc '
|
12
|
+
doc 'Resoruce API' do
|
13
|
+
url 'resource.useless.io'
|
13
14
|
description 'A resource repository'
|
14
15
|
timestamp '2013-01-01 12:00 PM'
|
15
16
|
end
|
@@ -69,6 +70,7 @@ describe Useless::Doc::Sinatra do
|
|
69
70
|
options 'http://some-api.granmal.com/'
|
70
71
|
api = Useless::Doc::Serialization::Load.api(last_response.body)
|
71
72
|
|
73
|
+
api.name.should == 'Resoruce API'
|
72
74
|
paths = api.resources.map { |resource| resource.path }
|
73
75
|
paths.length.should == 2
|
74
76
|
paths.should include '/some-resources'
|