api-transformer 0.1.0 → 0.1.1

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 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