committee 1.2.2 → 1.2.3
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/lib/committee/middleware/base.rb +11 -1
- data/lib/committee/middleware/request_validation.rb +9 -12
- data/lib/committee/middleware/response_validation.rb +4 -5
- data/lib/committee/middleware/stub.rb +7 -9
- data/lib/committee/router.rb +15 -5
- data/lib/committee/test/methods.rb +2 -4
- data/test/middleware/request_validation_test.rb +7 -0
- data/test/router_test.rb +22 -11
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 80631a912a39fd3bfe5334456acb5c6dcaf8a30a
|
4
|
+
data.tar.gz: 61ded3be6affcb5f842a168a27823bc646f00776
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 51cd02c1fedb4fa660e88e3f1d56580a3d3c425e8cb0736903ed6b50a7564ff0e46a4a5aa447af7077132893f1b174e6e4becff245edd80d73da6f961adf04bb
|
7
|
+
data.tar.gz: 735ce3684a203194307b638c35201fbd59aaef38813ffa7e076fc17e6ee3ddc7fc3c954cba93930d5ef7e263149fa90c776c70beeba821e81e077e9f1052a47e
|
@@ -11,7 +11,17 @@ module Committee::Middleware
|
|
11
11
|
end
|
12
12
|
@schema = JsonSchema.parse!(data)
|
13
13
|
@schema.expand_references!
|
14
|
-
@router = Committee::Router.new(@schema)
|
14
|
+
@router = Committee::Router.new(@schema, options)
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
request = Rack::Request.new(env)
|
19
|
+
|
20
|
+
if @router.includes_request?(request)
|
21
|
+
handle(request)
|
22
|
+
else
|
23
|
+
@app.call(request.env)
|
24
|
+
end
|
15
25
|
end
|
16
26
|
|
17
27
|
private
|
@@ -2,7 +2,6 @@ module Committee::Middleware
|
|
2
2
|
class RequestValidation < Base
|
3
3
|
def initialize(app, options={})
|
4
4
|
super
|
5
|
-
@prefix = options[:prefix]
|
6
5
|
@raise = options[:raise]
|
7
6
|
@strict = options[:strict]
|
8
7
|
|
@@ -10,19 +9,17 @@ module Committee::Middleware
|
|
10
9
|
@allow_extra = options[:allow_extra]
|
11
10
|
end
|
12
11
|
|
13
|
-
def
|
14
|
-
request =
|
15
|
-
|
16
|
-
if link = @router.
|
12
|
+
def handle(request)
|
13
|
+
request.env[@params_key] = Committee::RequestUnpacker.new(request).call
|
14
|
+
|
15
|
+
if link = @router.find_request_link(request)
|
17
16
|
validator = Committee::RequestValidator.new(link)
|
18
|
-
validator.call(request, env[@params_key])
|
19
|
-
@app.call(env)
|
17
|
+
validator.call(request, request.env[@params_key])
|
18
|
+
@app.call(request.env)
|
19
|
+
elsif @strict
|
20
|
+
raise Committee::NotFound
|
20
21
|
else
|
21
|
-
|
22
|
-
raise Committee::NotFound
|
23
|
-
else
|
24
|
-
@app.call(env)
|
25
|
-
end
|
22
|
+
@app.call(request.env)
|
26
23
|
end
|
27
24
|
rescue Committee::BadRequest, Committee::InvalidRequest
|
28
25
|
raise if @raise
|
@@ -2,14 +2,13 @@ module Committee::Middleware
|
|
2
2
|
class ResponseValidation < Base
|
3
3
|
def initialize(app, options={})
|
4
4
|
super
|
5
|
-
@prefix = options[:prefix]
|
6
5
|
@raise = options[:raise]
|
7
6
|
end
|
8
7
|
|
9
|
-
def
|
10
|
-
status, headers, response = @app.call(env)
|
11
|
-
|
12
|
-
if link = @router.
|
8
|
+
def handle(request)
|
9
|
+
status, headers, response = @app.call(request.env)
|
10
|
+
|
11
|
+
if link = @router.find_request_link(request)
|
13
12
|
full_body = ""
|
14
13
|
response.each do |chunk|
|
15
14
|
full_body << chunk
|
@@ -3,23 +3,21 @@ module Committee::Middleware
|
|
3
3
|
def initialize(app, options={})
|
4
4
|
super
|
5
5
|
@cache = {}
|
6
|
-
@call
|
7
|
-
@prefix = options[:prefix]
|
6
|
+
@call = options[:call]
|
8
7
|
end
|
9
8
|
|
10
|
-
def
|
11
|
-
|
12
|
-
if link = @router.routes_request?(request, prefix: @prefix)
|
9
|
+
def handle(request)
|
10
|
+
if link = @router.find_request_link(request)
|
13
11
|
headers = { "Content-Type" => "application/json" }
|
14
12
|
data = cache(link.method, link.href) do
|
15
13
|
Committee::ResponseGenerator.new.call(link)
|
16
14
|
end
|
17
15
|
if @call
|
18
|
-
env["committee.response"] = data
|
19
|
-
call_status, call_headers, call_body = @app.call(env)
|
16
|
+
request.env["committee.response"] = data
|
17
|
+
call_status, call_headers, call_body = @app.call(request.env)
|
20
18
|
|
21
19
|
# a committee.suppress signal initiates a direct pass through
|
22
|
-
if env["committee.suppress"] == true
|
20
|
+
if request.env["committee.suppress"] == true
|
23
21
|
return call_status, call_headers, call_body
|
24
22
|
end
|
25
23
|
|
@@ -30,7 +28,7 @@ module Committee::Middleware
|
|
30
28
|
status = link.rel == "create" ? 201 : 200
|
31
29
|
[status, headers, [MultiJson.encode(data, pretty: true)]]
|
32
30
|
else
|
33
|
-
@app.call(env)
|
31
|
+
@app.call(request.env)
|
34
32
|
end
|
35
33
|
end
|
36
34
|
|
data/lib/committee/router.rb
CHANGED
@@ -1,11 +1,21 @@
|
|
1
1
|
module Committee
|
2
2
|
class Router
|
3
|
-
def initialize(schema)
|
3
|
+
def initialize(schema, options = {})
|
4
4
|
@routes = build_routes(schema)
|
5
|
+
@prefix = options[:prefix]
|
6
|
+
@prefix_regexp = /\A#{Regexp.escape(@prefix)}/.freeze if @prefix
|
5
7
|
end
|
6
8
|
|
7
|
-
def
|
8
|
-
|
9
|
+
def includes?(path)
|
10
|
+
!@prefix || path =~ @prefix_regexp
|
11
|
+
end
|
12
|
+
|
13
|
+
def includes_request?(request)
|
14
|
+
includes?(request.path)
|
15
|
+
end
|
16
|
+
|
17
|
+
def find_link(method, path)
|
18
|
+
path = path.gsub(@prefix_regexp, "") if @prefix
|
9
19
|
if method_routes = @routes[method]
|
10
20
|
method_routes.each do |pattern, link|
|
11
21
|
if path =~ pattern
|
@@ -16,8 +26,8 @@ module Committee
|
|
16
26
|
nil
|
17
27
|
end
|
18
28
|
|
19
|
-
def
|
20
|
-
|
29
|
+
def find_request_link(request)
|
30
|
+
find_link(request.request_method, request.path_info)
|
21
31
|
end
|
22
32
|
|
23
33
|
private
|
@@ -11,11 +11,9 @@ module Committee::Test
|
|
11
11
|
schema.expand_references!
|
12
12
|
schema
|
13
13
|
end
|
14
|
-
@router ||= Committee::Router.new(@schema)
|
14
|
+
@router ||= Committee::Router.new(@schema, prefix: schema_url_prefix)
|
15
15
|
|
16
|
-
link =
|
17
|
-
@router.routes_request?(last_request, prefix: schema_url_prefix)
|
18
|
-
unless link
|
16
|
+
unless link = @router.find_request_link(last_request)
|
19
17
|
response = "`#{last_request.request_method} #{last_request.path_info}` undefined in schema."
|
20
18
|
raise Committee::InvalidResponse.new(response)
|
21
19
|
end
|
@@ -46,6 +46,13 @@ describe Committee::Middleware::RequestValidation do
|
|
46
46
|
assert_equal 200, last_response.status
|
47
47
|
end
|
48
48
|
|
49
|
+
it "ignores paths outside the prefix" do
|
50
|
+
@app = new_rack_app(prefix: "/v1")
|
51
|
+
header "Content-Type", "text/html"
|
52
|
+
get "/hello"
|
53
|
+
assert_equal 200, last_response.status
|
54
|
+
end
|
55
|
+
|
49
56
|
it "warns when sending a deprecated string" do
|
50
57
|
mock(Committee).warn_deprecated.with_any_args
|
51
58
|
@app = new_rack_app(schema: File.read("./test/data/schema.json"))
|
data/test/router_test.rb
CHANGED
@@ -1,27 +1,38 @@
|
|
1
1
|
require_relative "test_helper"
|
2
2
|
|
3
3
|
describe Committee::Router do
|
4
|
-
before do
|
5
|
-
data = MultiJson.decode(File.read("./test/data/schema.json"))
|
6
|
-
schema = JsonSchema.parse!(data)
|
7
|
-
schema.expand_references!
|
8
|
-
@router = Committee::Router.new(schema)
|
9
|
-
end
|
10
|
-
|
11
4
|
it "builds routes without parameters" do
|
12
|
-
refute_nil
|
5
|
+
refute_nil router.find_link("GET", "/apps")
|
13
6
|
end
|
14
7
|
|
15
8
|
it "builds routes with parameters" do
|
16
|
-
refute_nil
|
9
|
+
refute_nil router.find_link("GET", "/apps/123")
|
17
10
|
end
|
18
11
|
|
19
12
|
it "doesn't match anything on a /" do
|
20
|
-
assert_nil
|
13
|
+
assert_nil router.find_link("GET", "/")
|
21
14
|
end
|
22
15
|
|
23
16
|
it "takes a prefix" do
|
24
17
|
# this is a sociopathic example
|
25
|
-
|
18
|
+
assert router(prefix: "/kpi").find_link("GET", "/kpi/apps/123")
|
19
|
+
end
|
20
|
+
|
21
|
+
it "includes all paths without a prefix" do
|
22
|
+
assert router.includes?("/")
|
23
|
+
assert router.includes?("/apps")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "only includes the prefix path with a prefix" do
|
27
|
+
refute router(prefix: "/kpi").includes?("/")
|
28
|
+
assert router(prefix: "/kpi").includes?("/kpi")
|
29
|
+
assert router(prefix: "/kpi").includes?("/kpi/apps")
|
30
|
+
end
|
31
|
+
|
32
|
+
def router(options = {})
|
33
|
+
data = MultiJson.decode(File.read("./test/data/schema.json"))
|
34
|
+
schema = JsonSchema.parse!(data)
|
35
|
+
schema.expand_references!
|
36
|
+
Committee::Router.new(schema, options)
|
26
37
|
end
|
27
38
|
end
|