hyperdrive 0.0.6 → 0.0.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -8
- data/Gemfile +5 -0
- data/README.md +3 -7
- data/hyperdrive.gemspec +2 -2
- data/lib/hyperdrive/dsl.rb +4 -0
- data/lib/hyperdrive/endpoint.rb +13 -1
- data/lib/hyperdrive/errors/dsl/unknown_argument.rb +1 -1
- data/lib/hyperdrive/errors/http_error.rb +4 -0
- data/lib/hyperdrive/errors/method_not_allowed.rb +1 -1
- data/lib/hyperdrive/hateoas.rb +2 -2
- data/lib/hyperdrive/middleware/error.rb +17 -12
- data/lib/hyperdrive/middleware/pagination.rb +21 -0
- data/lib/hyperdrive/middleware.rb +1 -0
- data/lib/hyperdrive/server.rb +2 -1
- data/lib/hyperdrive/values.rb +2 -1
- data/lib/hyperdrive/version.rb +1 -1
- data/lib/hyperdrive.rb +1 -1
- data/spec/hyperdrive/errors/bad_request_spec.rb +17 -0
- data/spec/hyperdrive/errors/dsl/unknown_argument_spec.rb +15 -0
- data/spec/hyperdrive/errors/http_error_spec.rb +17 -0
- data/spec/hyperdrive/errors/internal_server_error_spec.rb +17 -0
- data/spec/hyperdrive/errors/method_not_allowed_spec.rb +17 -0
- data/spec/hyperdrive/errors/missing_required_param_spec.rb +17 -0
- data/spec/hyperdrive/errors/not_acceptable_spec.rb +17 -0
- data/spec/hyperdrive/errors/not_found_spec.rb +17 -0
- data/spec/hyperdrive/errors/not_implemented_spec.rb +17 -0
- data/spec/hyperdrive/errors/unauthorized_spec.rb +17 -0
- data/spec/hyperdrive/hateoas_spec.rb +1 -1
- data/spec/hyperdrive/middleware/error_spec.rb +30 -12
- data/spec/hyperdrive/middleware/pagination_spec.rb +45 -0
- data/spec/spec_helper.rb +1 -0
- metadata +26 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0310c3ea9e2400fb9bb5527017453871e14b37e7
|
4
|
+
data.tar.gz: 2e6ae40c0d160e91f9c5b71587d9c69c6741b760
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 197285ed590fd3808b0fdec8f52418ef1bfaf6c55c7fd20dd8e5526450c37ffe4c99b127d8762212d46ca2a389472d7f821f2d0e1b1e082af9ffd73bc1b0458a
|
7
|
+
data.tar.gz: 9b37a124b0a2da5911ce56b13b64b16f6c76af173c348c78c1cf986227c5580e2e2d6c58d86babf5e2be42708a2f2bc80671400f068f9b52d1a0b19a81e57b12
|
data/.travis.yml
CHANGED
@@ -1,13 +1,10 @@
|
|
1
1
|
language: ruby
|
2
|
+
cache: bundler
|
2
3
|
rvm:
|
3
|
-
- 2.1.1
|
4
|
-
- 1.9.3
|
5
|
-
- jruby-head
|
6
|
-
- rbx
|
7
|
-
matrix:
|
8
|
-
allow_failures:
|
9
|
-
- rvm: jruby-head
|
10
|
-
- rvm: rbx-2.1.1
|
4
|
+
- 2.1.1
|
5
|
+
- 1.9.3
|
6
|
+
- jruby-head
|
7
|
+
- rbx
|
11
8
|
env:
|
12
9
|
global:
|
13
10
|
secure: Tl3oBsBZRI5bMrtNH5mtTDvSTlTxNbsKaAnQ7KQ2KMyiH/eHolOSIbUYB9NB3GRMC6XSyFShRCaYPA/ET36HI+Jw3PFT/XADdiOdFqlk6VyJEUPznNQ1nlp8AsyNn+IexZXIl8DdqmZxGHlY6YKDbQV/U1v+FeW8X5j3TLN1mcw=
|
data/Gemfile
CHANGED
@@ -1,6 +1,10 @@
|
|
1
1
|
source 'https://rubygems.org'
|
2
2
|
gemspec
|
3
3
|
|
4
|
+
group :development, :test do
|
5
|
+
gem 'oj' unless defined?(JRUBY_VERSION)
|
6
|
+
end
|
7
|
+
|
4
8
|
group :development do
|
5
9
|
gem 'gem-release', require: false
|
6
10
|
gem 'pry', require: false
|
@@ -21,4 +25,5 @@ group :test do
|
|
21
25
|
gem 'rack-test', require: false
|
22
26
|
gem 'rubinius-coverage', require: false, platforms: :rbx
|
23
27
|
gem 'codeclimate-test-reporter', require: false
|
28
|
+
gem 'mocha', require: false
|
24
29
|
end
|
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Hyperdrive
|
2
2
|
|
3
|
+
[![Gem Version](https://badge.fury.io/rb/hyperdrive.png)](http://badge.fury.io/rb/hyperdrive) [![Build Status](https://secure.travis-ci.org/styleseek/hyperdrive.png?branch=master)](https://travis-ci.org/styleseek/hyperdrive) [![Code Climate](https://codeclimate.com/github/styleseek/hyperdrive.png)](https://codeclimate.com/github/styleseek/hyperdrive) [![Test Coverage](https://codeclimate.com/github/styleseek/hyperdrive/coverage.png)](https://codeclimate.com/github/styleseek/hyperdrive) [![Dependency Status](https://gemnasium.com/styleseek/hyperdrive.png)](https://gemnasium.com/styleseek/hyperdrive)
|
4
|
+
|
5
|
+
|
3
6
|
Ruby DSL for defining self-documenting, HATEOAS™ complaint, Hypermedia endpoints.
|
4
7
|
|
5
8
|
## Installation
|
@@ -117,13 +120,6 @@ You can also provide a `--output` option and specify a destination for your docu
|
|
117
120
|
|
118
121
|
If the `--output` option is not provided the generated documentation will be written to `docs/doc.md` by default.
|
119
122
|
|
120
|
-
## Project Status
|
121
|
-
|
122
|
-
- Version: [![Gem Version](https://badge.fury.io/rb/hyperdrive.png)](http://badge.fury.io/rb/hyperdrive)
|
123
|
-
- Build: [![Build Status](https://secure.travis-ci.org/styleseek/hyperdrive.png?branch=master)](https://travis-ci.org/styleseek/hyperdrive)
|
124
|
-
- Code Quality: [![Code Climate](https://codeclimate.com/github/styleseek/hyperdrive.png)](https://codeclimate.com/github/styleseek/hyperdrive)
|
125
|
-
- Dependencies: [![Dependency Status](https://gemnasium.com/styleseek/hyperdrive.png)](https://gemnasium.com/styleseek/hyperdrive)
|
126
|
-
|
127
123
|
## Contributing
|
128
124
|
|
129
125
|
1. Fork it ( http://github.com/styleseek/hyperdrive/fork )
|
data/hyperdrive.gemspec
CHANGED
@@ -17,9 +17,9 @@ Gem::Specification.new do |gem|
|
|
17
17
|
gem.executables = ['hyperdrive']
|
18
18
|
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
19
|
gem.require_paths = ["lib"]
|
20
|
-
|
20
|
+
|
21
21
|
gem.add_dependency 'linguistics'
|
22
|
-
gem.add_dependency '
|
22
|
+
gem.add_dependency 'multi_json'
|
23
23
|
gem.add_dependency 'rack'
|
24
24
|
gem.add_dependency 'rack-cache'
|
25
25
|
gem.add_dependency 'rack-ssl'
|
data/lib/hyperdrive/dsl.rb
CHANGED
data/lib/hyperdrive/endpoint.rb
CHANGED
@@ -30,10 +30,22 @@ module Hyperdrive
|
|
30
30
|
media_type =~ /xml$/
|
31
31
|
end
|
32
32
|
|
33
|
+
def self.page
|
34
|
+
env['hyperdrive.page']
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.per_page
|
38
|
+
env['hyperdrive.per_page']
|
39
|
+
end
|
40
|
+
|
33
41
|
def self.render(body)
|
34
42
|
case body
|
35
43
|
when Array, Hash
|
36
|
-
|
44
|
+
if json?
|
45
|
+
MultiJson.dump(body)
|
46
|
+
else
|
47
|
+
$stderr.puts "can't serialize response automatically"
|
48
|
+
end
|
37
49
|
when String
|
38
50
|
body
|
39
51
|
else
|
data/lib/hyperdrive/hateoas.rb
CHANGED
@@ -28,9 +28,9 @@ module Hyperdrive
|
|
28
28
|
media_types += %w(application/hal+json application/json)
|
29
29
|
content_type = env['hyperdrive.accept'].best_of(media_types)
|
30
30
|
body = if content_type =~ /json$/
|
31
|
-
|
31
|
+
MultiJson.dump(api)
|
32
32
|
else
|
33
|
-
raise
|
33
|
+
raise Errors::NotAcceptable.new(env['HTTP_ACCEPT'])
|
34
34
|
end
|
35
35
|
|
36
36
|
status = 200
|
@@ -4,31 +4,36 @@ module Hyperdrive
|
|
4
4
|
module Middleware
|
5
5
|
class Error
|
6
6
|
include Hyperdrive::Values
|
7
|
-
|
7
|
+
|
8
8
|
def initialize(app)
|
9
9
|
@app = app
|
10
10
|
end
|
11
11
|
|
12
12
|
def call(env)
|
13
13
|
@app.call(env)
|
14
|
-
rescue
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
14
|
+
rescue => e
|
15
|
+
headers = { 'Content-Type' => 'application/json' }
|
16
|
+
if e.respond_to?(:http_status_code)
|
17
|
+
status = e.http_status_code
|
18
|
+
body = [json_error(e)]
|
19
|
+
else
|
20
|
+
env['rack.errors'] << e
|
21
|
+
status = 500
|
22
|
+
body = json_error(Hyperdrive::Errors::HTTPError.new)
|
23
|
+
end
|
24
|
+
[status, headers, body]
|
20
25
|
end
|
21
26
|
|
22
27
|
private
|
23
|
-
|
24
|
-
def
|
25
|
-
{
|
28
|
+
|
29
|
+
def json_error(e)
|
30
|
+
MultiJson.dump({
|
26
31
|
_links: { root: { href: '/', title: 'API Root' } },
|
27
|
-
error: {
|
32
|
+
error: {
|
28
33
|
type: "#{e.class.to_s.split('::').last}",
|
29
34
|
message: e.message
|
30
35
|
}
|
31
|
-
}
|
36
|
+
})
|
32
37
|
end
|
33
38
|
end
|
34
39
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
module Hyperdrive
|
4
|
+
module Middleware
|
5
|
+
class Pagination
|
6
|
+
def initialize(app)
|
7
|
+
@app = app
|
8
|
+
end
|
9
|
+
|
10
|
+
def call(env)
|
11
|
+
if %(GET HEAD).include? env['REQUEST_METHOD']
|
12
|
+
env['hyperdrive.page'] = env['hyperdrive.params'].delete(:page) { 1 }
|
13
|
+
env['hyperdrive.page'] = 1 if env['hyperdrive.page'].to_i < 1
|
14
|
+
env['hyperdrive.per_page'] = env['hyperdrive.params'].delete(:per_page) { hyperdrive.config.fetch(:per_page) { 20 } }
|
15
|
+
env['hyperdrive.per_page'] = 20 if env['hyperdrive.per_page'].to_i == 0
|
16
|
+
end
|
17
|
+
@app.call(env)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -4,6 +4,7 @@ require 'hyperdrive/middleware/accept'
|
|
4
4
|
require 'hyperdrive/middleware/cors'
|
5
5
|
require 'hyperdrive/middleware/content_negotiation'
|
6
6
|
require 'hyperdrive/middleware/error'
|
7
|
+
require 'hyperdrive/middleware/pagination'
|
7
8
|
require 'hyperdrive/middleware/resource'
|
8
9
|
require 'hyperdrive/middleware/request_method'
|
9
10
|
require 'hyperdrive/middleware/required_params'
|
data/lib/hyperdrive/server.rb
CHANGED
@@ -24,11 +24,12 @@ module Hyperdrive
|
|
24
24
|
run Hyperdrive::HATEOAS
|
25
25
|
end
|
26
26
|
|
27
|
-
hyperdrive.resources.each do |key, resource|
|
27
|
+
hyperdrive.resources.each do |key, resource|
|
28
28
|
map resource.endpoint do
|
29
29
|
use Hyperdrive::Middleware::Resource, resource
|
30
30
|
use Hyperdrive::Middleware::RequestMethod
|
31
31
|
use Hyperdrive::Middleware::SanitizeParams
|
32
|
+
use Hyperdrive::Middleware::Pagination
|
32
33
|
use Hyperdrive::Middleware::RequiredParams
|
33
34
|
use Hyperdrive::Middleware::CORS, hyperdrive.config[:cors]
|
34
35
|
use Hyperdrive::Middleware::ContentNegotiation
|
data/lib/hyperdrive/values.rb
CHANGED
data/lib/hyperdrive/version.rb
CHANGED
data/lib/hyperdrive.rb
CHANGED
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::BadRequest do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::BadRequest.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 400 status code" do
|
11
|
+
@error.http_status_code.must_equal 400
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/bad syntax/)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::DSL::UnknownArgument do
|
6
|
+
it 'has a message' do
|
7
|
+
error = Hyperdrive::Errors::DSL::UnknownArgument.new('trace', 'request')
|
8
|
+
error.message.must_match(/DSL/)
|
9
|
+
end
|
10
|
+
|
11
|
+
it "formats Symbol arguments with a `:'" do
|
12
|
+
error = Hyperdrive::Errors::DSL::UnknownArgument.new(:trace, 'request')
|
13
|
+
error.message.must_match(/:trace/)
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::HTTPError do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::HTTPError.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 500 status code" do
|
11
|
+
@error.http_status_code.must_equal 500
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/Unknown/)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::InternalServerError do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::InternalServerError.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 500 status code" do
|
11
|
+
@error.http_status_code.must_equal 500
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/unexpected/)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::MethodNotAllowed do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::MethodNotAllowed.new('GET')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 405 status code" do
|
11
|
+
@error.http_status_code.must_equal 405
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/GET/)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::MissingRequiredParam do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::MissingRequiredParam.new('parent_id', 'GET')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 400 status code" do
|
11
|
+
@error.http_status_code.must_equal 400
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/GET/)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::NotAcceptable do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::NotAcceptable.new('application/xml')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 406 status code" do
|
11
|
+
@error.http_status_code.must_equal 406
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/xml/)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::NotFound do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::NotFound.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 404 status code" do
|
11
|
+
@error.http_status_code.must_equal 404
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/not be found/)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::NotImplemented do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::NotImplemented.new('TRACE')
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 501 status code" do
|
11
|
+
@error.http_status_code.must_equal 501
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/TRACE/)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Errors::Unauthorized do
|
6
|
+
before do
|
7
|
+
@error = Hyperdrive::Errors::Unauthorized.new
|
8
|
+
end
|
9
|
+
|
10
|
+
it "returns a 401 status code" do
|
11
|
+
@error.http_status_code.must_equal 401
|
12
|
+
end
|
13
|
+
|
14
|
+
it "has a message" do
|
15
|
+
@error.message.must_match(/authentication/)
|
16
|
+
end
|
17
|
+
end
|
@@ -36,7 +36,7 @@ describe Hyperdrive::HATEOAS do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
it "responds with a description of all resources" do
|
39
|
-
last_response.body.must_equal %Q({"_links":{"self":{"href":"/"}},"name":"Hyperdrive API","description":"
|
39
|
+
last_response.body.must_equal %Q({"_links":{"self":{"href":"/"}},"name":"Hyperdrive API","description":"v#{Hyperdrive::VERSION}","vendor":"hyperdrive","resources":[{"_links":{"self":{"href":"/things"}},"id":"hyperdrive:things","name":"Thing Resource","description":"Description of Thing Resource","methods":["OPTIONS","GET","HEAD","POST","PUT","PATCH","DELETE"],"params":[{"name":"id","description":"Identifier","type":"String","constraints":"Required for: PUT, PATCH, DELETE. "},{"name":"name","description":"50 Chars or less","type":"String","constraints":"Required for: POST, PUT, PATCH. "}],"filters":[{"name":"id","description":"Resource Identifier","type":"String","constraints":" "},{"name":"parent_id","description":"Parent ID of Thing","type":"String","constraints":"Required for: GET, HEAD. "}],"media_types":[["application/vnd.hyperdrive.things.v1+hal+json","application/vnd.hyperdrive.things+hal+json","application/vnd.hyperdrive+hal+json","application/vnd.hyperdrive.things.v1+json","application/vnd.hyperdrive.things+json","application/vnd.hyperdrive+json"]]}]})
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -3,23 +3,41 @@
|
|
3
3
|
require 'spec_helper'
|
4
4
|
|
5
5
|
describe Hyperdrive::Middleware::Error do
|
6
|
-
def app
|
7
|
-
Rack::Builder.new do
|
8
|
-
use Hyperdrive::Middleware::Error
|
9
|
-
run ->(env) { raise Hyperdrive::Errors::HTTPError }
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
6
|
before do
|
14
|
-
@response = %Q({"_links":{"root":{"href":"/","title":"API Root"}},"error":{"type":"HTTPError","message":"Hyperdrive::Errors::HTTPError"}})
|
15
7
|
get '/'
|
16
8
|
end
|
9
|
+
|
10
|
+
context "Known Error" do
|
11
|
+
def app
|
12
|
+
Rack::Builder.new do
|
13
|
+
use Hyperdrive::Middleware::Error
|
14
|
+
run ->(env) { raise Hyperdrive::Errors::MethodNotAllowed.new('GET') }
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
it "traps errors" do
|
19
|
+
last_response.status.must_equal 405
|
20
|
+
end
|
17
21
|
|
18
|
-
|
19
|
-
|
22
|
+
it "returns a formatted error message" do
|
23
|
+
last_response.body.must_match(/error/)
|
24
|
+
end
|
20
25
|
end
|
21
26
|
|
22
|
-
|
23
|
-
|
27
|
+
context "Unknown Error" do
|
28
|
+
def app
|
29
|
+
Rack::Builder.new do
|
30
|
+
use Hyperdrive::Middleware::Error
|
31
|
+
run ->(env) { raise 'Woah there, fella!' }
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
it "traps errors" do
|
36
|
+
last_response.status.must_equal 500
|
37
|
+
end
|
38
|
+
|
39
|
+
it "returns a formatted error message" do
|
40
|
+
last_response.body.must_match(/Unknown Error/)
|
41
|
+
end
|
24
42
|
end
|
25
43
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'spec_helper'
|
4
|
+
|
5
|
+
describe Hyperdrive::Middleware::Pagination do
|
6
|
+
def app
|
7
|
+
inner_app = ->(env) { [200, {}, [[env['hyperdrive.page'],env['hyperdrive.per_page'],env['hyperdrive.params'][:page],env['hyperdrive.params'][:per_page]].join(",")]] }
|
8
|
+
Hyperdrive::Middleware::Pagination.new(inner_app)
|
9
|
+
end
|
10
|
+
|
11
|
+
after do
|
12
|
+
hyperdrive.send(:reset!)
|
13
|
+
end
|
14
|
+
|
15
|
+
it "sets default values for page and per_page and removes them from hyperdrive.params" do
|
16
|
+
env = default_rack_env.merge('hyperdrive.params' => {})
|
17
|
+
get '/', {}, env
|
18
|
+
last_response.body.must_equal '1,20,,'
|
19
|
+
end
|
20
|
+
|
21
|
+
it "sets page to 1 if value is less than 1" do
|
22
|
+
env = default_rack_env.merge('hyperdrive.params' => { page: '' })
|
23
|
+
get '/', {}, env
|
24
|
+
last_response.body.must_equal '1,20,,'
|
25
|
+
end
|
26
|
+
|
27
|
+
it "returns per_page value if supplied" do
|
28
|
+
env = default_rack_env.merge('hyperdrive.params' => { per_page: 42 })
|
29
|
+
get '/', {}, env
|
30
|
+
last_response.body.must_equal '1,42,,'
|
31
|
+
end
|
32
|
+
|
33
|
+
it "uses configured per_page value if per_page is not supplied" do
|
34
|
+
hyperdrive.config[:per_page] = 13
|
35
|
+
env = default_rack_env.merge('hyperdrive.params' => {})
|
36
|
+
get '/', {}, env
|
37
|
+
last_response.body.must_equal '1,13,,'
|
38
|
+
end
|
39
|
+
|
40
|
+
it "sets per_page to 20 if value is 0" do
|
41
|
+
env = default_rack_env.merge('hyperdrive.params' => { per_page: '' })
|
42
|
+
get '/', {}, env
|
43
|
+
last_response.body.must_equal '1,20,,'
|
44
|
+
end
|
45
|
+
end
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: hyperdrive
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- StyleSeek Engineering
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-05-
|
11
|
+
date: 2014-05-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: linguistics
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: multi_json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -149,6 +149,7 @@ files:
|
|
149
149
|
- lib/hyperdrive/middleware/content_negotiation.rb
|
150
150
|
- lib/hyperdrive/middleware/cors.rb
|
151
151
|
- lib/hyperdrive/middleware/error.rb
|
152
|
+
- lib/hyperdrive/middleware/pagination.rb
|
152
153
|
- lib/hyperdrive/middleware/request_method.rb
|
153
154
|
- lib/hyperdrive/middleware/required_params.rb
|
154
155
|
- lib/hyperdrive/middleware/resource.rb
|
@@ -163,12 +164,23 @@ files:
|
|
163
164
|
- spec/hyperdrive/dsl/resource_spec.rb
|
164
165
|
- spec/hyperdrive/dsl_spec.rb
|
165
166
|
- spec/hyperdrive/endpoint_spec.rb
|
167
|
+
- spec/hyperdrive/errors/bad_request_spec.rb
|
168
|
+
- spec/hyperdrive/errors/dsl/unknown_argument_spec.rb
|
169
|
+
- spec/hyperdrive/errors/http_error_spec.rb
|
170
|
+
- spec/hyperdrive/errors/internal_server_error_spec.rb
|
171
|
+
- spec/hyperdrive/errors/method_not_allowed_spec.rb
|
172
|
+
- spec/hyperdrive/errors/missing_required_param_spec.rb
|
173
|
+
- spec/hyperdrive/errors/not_acceptable_spec.rb
|
174
|
+
- spec/hyperdrive/errors/not_found_spec.rb
|
175
|
+
- spec/hyperdrive/errors/not_implemented_spec.rb
|
176
|
+
- spec/hyperdrive/errors/unauthorized_spec.rb
|
166
177
|
- spec/hyperdrive/filter_spec.rb
|
167
178
|
- spec/hyperdrive/hateoas_spec.rb
|
168
179
|
- spec/hyperdrive/middleware/accept_spec.rb
|
169
180
|
- spec/hyperdrive/middleware/content_negotiation_spec.rb
|
170
181
|
- spec/hyperdrive/middleware/cors_spec.rb
|
171
182
|
- spec/hyperdrive/middleware/error_spec.rb
|
183
|
+
- spec/hyperdrive/middleware/pagination_spec.rb
|
172
184
|
- spec/hyperdrive/middleware/request_method_spec.rb
|
173
185
|
- spec/hyperdrive/middleware/required_params_spec.rb
|
174
186
|
- spec/hyperdrive/middleware/resource_spec.rb
|
@@ -208,12 +220,23 @@ test_files:
|
|
208
220
|
- spec/hyperdrive/dsl/resource_spec.rb
|
209
221
|
- spec/hyperdrive/dsl_spec.rb
|
210
222
|
- spec/hyperdrive/endpoint_spec.rb
|
223
|
+
- spec/hyperdrive/errors/bad_request_spec.rb
|
224
|
+
- spec/hyperdrive/errors/dsl/unknown_argument_spec.rb
|
225
|
+
- spec/hyperdrive/errors/http_error_spec.rb
|
226
|
+
- spec/hyperdrive/errors/internal_server_error_spec.rb
|
227
|
+
- spec/hyperdrive/errors/method_not_allowed_spec.rb
|
228
|
+
- spec/hyperdrive/errors/missing_required_param_spec.rb
|
229
|
+
- spec/hyperdrive/errors/not_acceptable_spec.rb
|
230
|
+
- spec/hyperdrive/errors/not_found_spec.rb
|
231
|
+
- spec/hyperdrive/errors/not_implemented_spec.rb
|
232
|
+
- spec/hyperdrive/errors/unauthorized_spec.rb
|
211
233
|
- spec/hyperdrive/filter_spec.rb
|
212
234
|
- spec/hyperdrive/hateoas_spec.rb
|
213
235
|
- spec/hyperdrive/middleware/accept_spec.rb
|
214
236
|
- spec/hyperdrive/middleware/content_negotiation_spec.rb
|
215
237
|
- spec/hyperdrive/middleware/cors_spec.rb
|
216
238
|
- spec/hyperdrive/middleware/error_spec.rb
|
239
|
+
- spec/hyperdrive/middleware/pagination_spec.rb
|
217
240
|
- spec/hyperdrive/middleware/request_method_spec.rb
|
218
241
|
- spec/hyperdrive/middleware/required_params_spec.rb
|
219
242
|
- spec/hyperdrive/middleware/resource_spec.rb
|