api-transformer 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87a3b324b1f0fd77ef0091e47311ef9e0029b92a
4
- data.tar.gz: 7cf42588afe1e037df1ce743e4ac2c0e4c5a2398
3
+ metadata.gz: 6c0849ff779ae501cfe99583f2d4d09165e607a8
4
+ data.tar.gz: ef8495fb1b89371bf6332311ac80402551b0760a
5
5
  SHA512:
6
- metadata.gz: ddf7f252707a1340651a815251a1597a461495cee7be30a70521c01faea1d5c1394af59c753cb34422e96a3a91d61494fd22f515ed036cd27416fa123ac622a0
7
- data.tar.gz: e670c237da02b04c635ad9b7ad76acec3612b8640afe0174257903802276d56d55852c5461324885634a41a8d5866b44190a35698f532a2f0fb89f68b1da5fcb
6
+ metadata.gz: 932f425f46f6a4d9a3bb310f8a32817cb30531c41b824801e07d7fc73f6e42d8042deb551142cc2053a0d17f6553cdaeca1f76db7c2a3b82b5e0380fa45e4d0c
7
+ data.tar.gz: e7a3fbed08c8bfd79fab20e7a43ff45c9559347db841f6cf96a103cd754504ba1847b8d052d75094f59a0d00ea66ccda4a5970fad9e523b997f9a79a14fc1f03
@@ -5,7 +5,7 @@ module ApiTransformer
5
5
  class BackendRequest
6
6
  attr_reader :name
7
7
  attr_accessor :path, :method, :query_params, :form_params, :json_params,
8
- :cookie_params
8
+ :cookie_params, :header_params
9
9
 
10
10
  def initialize(name, base_url, frontend_headers)
11
11
  @name = name
@@ -16,6 +16,7 @@ module ApiTransformer
16
16
  @form_params = {}
17
17
  @json_params = {}
18
18
  @cookie_params = {}
19
+ @header_params = {}
19
20
  end
20
21
 
21
22
  def send
@@ -45,7 +46,13 @@ module ApiTransformer
45
46
  end
46
47
 
47
48
  def headers
48
- ret = [stripped_frontend_headers, content_type, cookies].reduce(&:merge)
49
+ ret = [
50
+ stripped_frontend_headers,
51
+ @header_params,
52
+ content_type,
53
+ cookies
54
+ ].reduce(&:merge)
55
+
49
56
  ret.delete("Host")
50
57
  ret
51
58
  end
@@ -52,5 +52,9 @@ module ApiTransformer
52
52
  def cookie_param(key, value)
53
53
  @backend_request.cookie_params[key] = value
54
54
  end
55
+
56
+ def header_param(key, value)
57
+ @backend_request.header_params[key] = value
58
+ end
55
59
  end
56
60
  end
@@ -27,13 +27,25 @@ module ApiTransformer
27
27
  end
28
28
 
29
29
  def json
30
- @data ||= Data.try_convert(JSON.parse(@body))
31
- rescue JSON::ParserError
30
+ @data ||= begin
31
+ json = JSON.parse(@body)
32
+
33
+ if json.respond_to?(:keys)
34
+ Data.try_convert(json)
35
+ else
36
+ json
37
+ end
38
+ end
39
+ rescue JSON::ParserError, Encoding::InvalidByteSequenceError
32
40
  {}
33
41
  end
34
42
 
35
43
  def [](key)
36
- json[key]
44
+ if json.respond_to?(:keys)
45
+ json[key]
46
+ else
47
+ nil
48
+ end
37
49
  end
38
50
 
39
51
  def cookies
@@ -46,6 +58,14 @@ module ApiTransformer
46
58
  Data.try_convert(data)
47
59
  end
48
60
 
61
+ def content_type
62
+ @http.response_header["CONTENT_TYPE"]
63
+ end
64
+
65
+ def headers
66
+ @http.response_header
67
+ end
68
+
49
69
  def stream(&block)
50
70
  if block
51
71
  block.call(@body)
@@ -57,7 +57,11 @@ module ApiTransformer
57
57
  iterator = EM::Synchrony::Iterator.new(@backend_request_senders)
58
58
 
59
59
  iterator.each do |sender, iter|
60
- send_request(sender, iter)
60
+ if @backend_responses.values.all?(&:success?)
61
+ send_request(sender, iter)
62
+ else
63
+ iter.next
64
+ end
61
65
  end
62
66
  end
63
67
 
@@ -6,28 +6,36 @@ module ApiTransformer
6
6
  attr_accessor :status
7
7
  attr_writer :body, :content_type
8
8
 
9
+ def initialize
10
+ @hash = {}
11
+ @cookies = {}
12
+ @headers = {}
13
+ end
14
+
9
15
  def set(key, value)
10
- @hash ||= {}
11
16
  @hash[key] = value
12
17
  end
13
18
 
14
19
  def set_cookie(key, value)
15
- @cookies ||= {}
16
20
  @cookies[key] = value
17
21
  end
18
22
 
23
+ def set_header(key, value)
24
+ @headers[key] = value
25
+ end
26
+
19
27
  def body
20
- @hash && @hash.to_json || @body
28
+ @hash.any? && @hash.to_json || @body
21
29
  end
22
30
 
23
31
  def headers
24
- cookie_header.merge(content_type_header)
32
+ [@headers, cookie_header, content_type_header].reduce(&:merge)
25
33
  end
26
34
 
27
35
  private
28
36
 
29
37
  def cookie_header
30
- if @cookies
38
+ if @cookies.any?
31
39
  pairs = @cookies.map { |key, value| "#{key}=#{value}" }
32
40
  { "Set-Cookie" => pairs.join("; ") }
33
41
  else
@@ -50,6 +50,10 @@ module ApiTransformer
50
50
  @frontend_response.set_cookie(key, value)
51
51
  end
52
52
 
53
+ def header(key, value)
54
+ @frontend_response.set_header(key, value)
55
+ end
56
+
53
57
  def attribute(key, value)
54
58
  @frontend_response.set key, value
55
59
  end
@@ -1,4 +1,4 @@
1
1
  # Top-level namespace
2
2
  module ApiTransformer
3
- VERSION = "0.1.0"
3
+ VERSION = "0.1.1"
4
4
  end
data/spec/server_spec.rb CHANGED
@@ -209,6 +209,35 @@ describe ApiTransformer::Server do
209
209
  end
210
210
  end
211
211
 
212
+ it "sends header params in backend requests" do
213
+ server = extend_server echo_greeting_server do
214
+ get "/endpoint" do
215
+ request :echo do
216
+ path "/echo_header"
217
+ method :get
218
+
219
+ header_param "Range", "bytes=0-"
220
+ end
221
+
222
+ response do |data|
223
+ attribute :greeting, data[:echo].headers["Range"]
224
+ end
225
+ end
226
+
227
+ get "/echo_header" do |_, headers|
228
+ response do
229
+ success { header :Range, headers["Range"] }
230
+ end
231
+ end
232
+ end
233
+
234
+ with_api(server) do
235
+ get_request(path: "/endpoint") do |c|
236
+ c.response.must_equal '{"greeting":"bytes=0-"}'
237
+ end
238
+ end
239
+ end
240
+
212
241
  describe "json params" do
213
242
  it "sends json params in backend requests" do
214
243
  proxy_json = extend_server echo_greeting_server do
@@ -469,6 +498,22 @@ describe ApiTransformer::Server do
469
498
  end
470
499
  end
471
500
 
501
+ it "can respond with arbitrary headers" do
502
+ server = create_server do
503
+ get "/endpoint" do
504
+ response do
505
+ success { header "Range", "bytes=0-" }
506
+ end
507
+ end
508
+ end
509
+
510
+ with_api(server) do
511
+ get_request(path: "/endpoint") do |c|
512
+ c.response_header["Range"].must_equal "bytes=0-"
513
+ end
514
+ end
515
+ end
516
+
472
517
  it "makes the results of requests available to subsequent requests" do
473
518
  multiple_requests = create_server do
474
519
  get "/multi" do
@@ -488,6 +533,7 @@ describe ApiTransformer::Server do
488
533
  success do
489
534
  attribute :name, data[:two][:result]
490
535
  cookie "type", data[:two].cookies[:type]
536
+ content_type data[:one].content_type
491
537
  end
492
538
  end
493
539
  end
@@ -512,6 +558,7 @@ describe ApiTransformer::Server do
512
558
  get_request(path: "/multi") do |c|
513
559
  c.response.must_equal '{"name":"Bob"}'
514
560
  c.response_header["Set-Cookie"].must_equal "type=delicious"
561
+ c.response_header["Content-Type"].must_equal "application/json"
515
562
  end
516
563
  end
517
564
  end
@@ -685,6 +732,43 @@ describe ApiTransformer::Server do
685
732
  end
686
733
  end
687
734
 
735
+ it "does not send requests after a failed request" do
736
+ server = create_server do
737
+ get "/endpoint" do
738
+ request :fail do
739
+ path "/fail"
740
+ method :get
741
+ end
742
+
743
+ request :never_runs do
744
+ fail "should not get here"
745
+ end
746
+
747
+ response do |data|
748
+ failure true do
749
+ status 400
750
+ attribute :oh, data[:fail][:oh]
751
+ end
752
+ end
753
+ end
754
+
755
+ get "/fail" do
756
+ response do
757
+ success do
758
+ status 400
759
+ attribute :oh, "no"
760
+ end
761
+ end
762
+ end
763
+ end
764
+
765
+ with_api(server) do
766
+ get_request(path: "/endpoint") do |c|
767
+ c.response.must_equal '{"oh":"no"}'
768
+ end
769
+ end
770
+ end
771
+
688
772
  it "does not crash when there are no routes for an HTTP verb" do
689
773
  server = create_server do
690
774
  get "/ping" do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api-transformer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bruz Marzolf
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-22 00:00:00.000000000 Z
11
+ date: 2014-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack