hyperdrive 0.0.6 → 0.0.7
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 +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
|
+
[](http://badge.fury.io/rb/hyperdrive) [](https://travis-ci.org/styleseek/hyperdrive) [](https://codeclimate.com/github/styleseek/hyperdrive) [](https://codeclimate.com/github/styleseek/hyperdrive) [](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: [](http://badge.fury.io/rb/hyperdrive)
|
|
123
|
-
- Build: [](https://travis-ci.org/styleseek/hyperdrive)
|
|
124
|
-
- Code Quality: [](https://codeclimate.com/github/styleseek/hyperdrive)
|
|
125
|
-
- Dependencies: [](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
|