useless-doc 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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'
|