api-transformer 0.1.1 → 0.2.0

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: 6c0849ff779ae501cfe99583f2d4d09165e607a8
4
- data.tar.gz: ef8495fb1b89371bf6332311ac80402551b0760a
3
+ metadata.gz: 956c01e6033f4197c83758b8bd20d63c10d96843
4
+ data.tar.gz: 32c0db4245df8c1c976abfa5797e42d7dc4bb187
5
5
  SHA512:
6
- metadata.gz: 932f425f46f6a4d9a3bb310f8a32817cb30531c41b824801e07d7fc73f6e42d8042deb551142cc2053a0d17f6553cdaeca1f76db7c2a3b82b5e0380fa45e4d0c
7
- data.tar.gz: e7a3fbed08c8bfd79fab20e7a43ff45c9559347db841f6cf96a103cd754504ba1847b8d052d75094f59a0d00ea66ccda4a5970fad9e523b997f9a79a14fc1f03
6
+ metadata.gz: 3d694ca4314b5139c2b7b0991f563fb578aa4cace652ad7d335dd3b148d2b01c06a46046268a8b9e87129ceb9705832be27b78a36c14a86d8b58be0cc6bc9676
7
+ data.tar.gz: 7773e131d6d087192fe37f1d7707d3d2702783852099df62b6f2910219b582ffab083d792b10d0cd39072da84bd026e2dff5e60dd23b7b12d545a3ad02e7462e
@@ -8,6 +8,7 @@ require_relative "./api_transformer/backend_response"
8
8
  require_relative "./api_transformer/frontend_response"
9
9
  require_relative "./api_transformer/frontend_response_builder"
10
10
  require_relative "./api_transformer/params"
11
+ require_relative "./api_transformer/route"
11
12
  require_relative "./api_transformer/routes"
12
13
  require_relative "./api_transformer/rack/cookie_params"
13
14
 
@@ -45,29 +46,14 @@ module ApiTransformer
45
46
  route, path_params = @@routes.find(env["REQUEST_METHOD"], path)
46
47
 
47
48
  if route
48
- run_route(route, path_params, env)
49
+ all_params = params.merge(path_params)
50
+ response = route.run(@@base_url, all_params, env)
51
+ streaming_response(response.status, response.headers)
49
52
  else
50
53
  [404, {}, "nope"]
51
54
  end
52
55
  end
53
56
 
54
- def run_route(route, path_params, env)
55
- indifferent_params = Params.try_convert(params.merge(path_params))
56
- endpoint = Endpoint.new(@@base_url, env, route)
57
- headers = env["client-headers"]
58
-
59
- route[:helper_blocks].each { |block| endpoint.instance_eval(&block) }
60
- endpoint.instance_exec(indifferent_params, headers, &route[:block])
61
-
62
- status, headers = endpoint.run
63
-
64
- EM.next_tick do
65
- endpoint.complete
66
- end
67
-
68
- streaming_response(status, headers)
69
- end
70
-
71
57
  class << self
72
58
  def inherited(klass)
73
59
  klass.use Goliath::Rack::Params
@@ -94,6 +80,22 @@ module ApiTransformer
94
80
  helper_blocks.unshift(block)
95
81
  end
96
82
 
83
+ def shared_endpoints(name, &block)
84
+ if shared_endpoint_blocks[name]
85
+ fail "shared_endpoints already defined for \"#{name}\""
86
+ else
87
+ shared_endpoint_blocks[name] = block
88
+ end
89
+ end
90
+
91
+ def include_endpoints(name)
92
+ if shared_endpoint_blocks[name]
93
+ instance_eval(&shared_endpoint_blocks[name])
94
+ else
95
+ fail "missing shared_endpoints for \"#{name}\""
96
+ end
97
+ end
98
+
97
99
  def get(path = "", options = {}, &block)
98
100
  add_route(:get, path, options, block)
99
101
  end
@@ -110,8 +112,8 @@ module ApiTransformer
110
112
  add_route(:delete, path, options, block)
111
113
  end
112
114
 
113
- def reset_routes
114
- @@routes = Routes.new
115
+ def reset
116
+ @@routes = @failure_handlers = @helper_blocks = @shared_endpoints = nil
115
117
  end
116
118
 
117
119
  private
@@ -133,15 +135,9 @@ module ApiTransformer
133
135
  @helper_blocks ||= []
134
136
  end
135
137
 
136
- def server
137
- superclass
138
+ def shared_endpoint_blocks
139
+ @shared_endpoints ||= {}
138
140
  end
139
141
  end
140
-
141
- private
142
-
143
- def server
144
- self.class
145
- end
146
142
  end
147
143
  end
@@ -0,0 +1,26 @@
1
+ require "ostruct"
2
+
3
+ module ApiTransformer
4
+ # A route
5
+ class Route < OpenStruct
6
+ # For passing back a header and status
7
+ class Response < Struct.new(:status, :headers); end
8
+
9
+ def run(base_url, params, env)
10
+ indifferent_params = Params.try_convert(params)
11
+ endpoint = Endpoint.new(base_url, env, self)
12
+ headers = env["client-headers"]
13
+
14
+ helper_blocks.each { |block| endpoint.instance_eval(&block) }
15
+ endpoint.instance_exec(indifferent_params, headers, &self.block)
16
+
17
+ status, headers = endpoint.run
18
+
19
+ EM.next_tick do
20
+ endpoint.complete
21
+ end
22
+
23
+ Response.new(status, headers)
24
+ end
25
+ end
26
+ end
@@ -1,11 +1,6 @@
1
- require "ostruct"
2
-
3
1
  module ApiTransformer
4
2
  # Collection of routes
5
3
  class Routes
6
- # A route
7
- class Route < OpenStruct; end
8
-
9
4
  def initialize
10
5
  @routes = {}
11
6
  end
@@ -1,4 +1,4 @@
1
1
  # Top-level namespace
2
2
  module ApiTransformer
3
- VERSION = "0.1.1"
3
+ VERSION = "0.2.0"
4
4
  end
@@ -35,7 +35,7 @@ describe ApiTransformer::Server do
35
35
  let(:err) { proc { |c| fail "HTTP Request failed #{c.response}" } }
36
36
 
37
37
  before do
38
- ApiTransformer::Server.reset_routes
38
+ ApiTransformer::Server.reset
39
39
  end
40
40
 
41
41
  it "works without any backend requests" do
@@ -827,4 +827,26 @@ describe ApiTransformer::Server do
827
827
  end
828
828
  end
829
829
  end
830
+
831
+ it "allows shared endpoints" do
832
+ server = create_server do
833
+ shared_endpoints "ping" do
834
+ get "/ping" do
835
+ response do
836
+ success { body "pong" }
837
+ end
838
+ end
839
+ end
840
+
841
+ namespace "/games" do
842
+ include_endpoints "ping"
843
+ end
844
+ end
845
+
846
+ with_api(server) do
847
+ get_request(path: "/games/ping") do |c|
848
+ c.response.must_equal "pong"
849
+ end
850
+ end
851
+ end
830
852
  end
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.1
4
+ version: 0.2.0
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-30 00:00:00.000000000 Z
11
+ date: 2014-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rack
@@ -165,6 +165,7 @@ files:
165
165
  - lib/api_transformer/frontend_response_builder.rb
166
166
  - lib/api_transformer/params.rb
167
167
  - lib/api_transformer/rack/cookie_params.rb
168
+ - lib/api_transformer/route.rb
168
169
  - lib/api_transformer/routes.rb
169
170
  - lib/api_transformer/version.rb
170
171
  - spec/server_spec.rb