grape-batch 2.2.2 → 2.3.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: df308f71fe53aead3f537e40c78c90a6ae3a9a8a
4
- data.tar.gz: c444a1b9cb617a0fb1a7463e8004a89ab2d5bb75
3
+ metadata.gz: 583bc57ae53b64c0cc53821e877304bb47cd9b35
4
+ data.tar.gz: 14017133fe2585ee354c727be4b5489ba9fae277
5
5
  SHA512:
6
- metadata.gz: 8bc203bfe21a3166def35fada33e9b483a0c37098743a768be84362db63f717398907f2a7c93734e510d44fb25f13aeef37ad2641b443c131d3b36860e5d8728
7
- data.tar.gz: e535cfcb31a6cf68b9c1fabbf426d3878c3dfc2d23196bb24b5812c1f319e6ddba9306dfec3c76acb878fc66294624d85f3009a56219e83e3d5e2cf811bff76f
6
+ metadata.gz: 77f43acc1c9b95c13254cdc4bc2b8f434a1ddf3988e6e3c1e824680a2ceb04bac86dbebdfc36ff0ade1dd9789a97636429cbb2d9c4b7477d0dc556a70ea38b90
7
+ data.tar.gz: 0dcb7894c03a989116613554104c6c4e091fe1602b97610ccd9add986a9f487fd39431936b79aaf784a9a31e0cf493af5f153b3c9cf24b5093eea04473516e5b
@@ -1,3 +1,7 @@
1
+ # 2.3.0 (22nd March 2016)
2
+ * Remove request session and token headers from response headers
3
+ * Code refactor
4
+
1
5
  # 2.2.2 (22nd March 2016)
2
6
  * SESSION_HEADER is no longer duplicated because when the header contains an ActiveRecord object or something similar, it changes the object id
3
7
 
data/README.md CHANGED
@@ -136,13 +136,13 @@ module Twitter
136
136
  resource :session do
137
137
  get do
138
138
  # route logic
139
- header 'HTTP_X_API_TOKEN', 'my_fresh_token'
139
+ request.env['HTTP_X_API_TOKEN'] = 'my_fresh_token'
140
140
  # some other logic
141
141
  end
142
142
  end
143
143
  end
144
144
 
145
- # This route will return a token header. The header will be kept and passed to the following requests by Grape::Batch. The header will not be added to the final batch response.
145
+ # This route will register a token. The header will be kept and passed to the following requests by Grape::Batch.
146
146
  ```
147
147
 
148
148
  ```ruby
@@ -156,14 +156,14 @@ module Twitter
156
156
 
157
157
  resource :session do
158
158
  get do
159
- # route logic
160
- header 'api.session', OpenStruct(id: '123456')
159
+ # route logic
160
+ request.env['api.session'] = OpenStruct(id: '123456')
161
161
  # some other logic
162
162
  end
163
163
  end
164
164
  end
165
165
 
166
- # This route will return a session object. The header will be kept and passed to the following requests by Grape::Batch. The header will not be added to the final batch response.
166
+ # This route will return a session object. The session object will be kept and passed to the following requests by Grape::Batch.
167
167
  ```
168
168
 
169
169
  ## Contributing
@@ -5,79 +5,11 @@ require 'grape/batch/request'
5
5
  require 'grape/batch/response'
6
6
  require 'grape/batch/validator'
7
7
  require 'grape/batch/version'
8
+ require 'grape/batch/base'
8
9
  require 'multi_json'
9
10
 
10
11
  module Grape
11
12
  module Batch
12
- # Gem main class
13
- class Base
14
- SESSION_HEADER = 'api.session'.freeze
15
- TOKEN_HEADER = 'HTTP_X_API_TOKEN'.freeze
16
13
 
17
- def initialize(app)
18
- @app = app
19
- @response_klass = Grape::Batch.configuration.formatter
20
- @batch_size_limit = Grape::Batch.configuration.limit
21
- @api_path = Grape::Batch.configuration.path
22
- @session_proc = Grape::Batch.configuration.session_proc
23
- @logger = Grape::Batch::Logger.new
24
- end
25
-
26
- def call(env)
27
- return @app.call(env) unless batch_request?(env)
28
- @logger.prepare(env).batch_begin
29
- batch_call(env)
30
- end
31
-
32
- def batch_call(env)
33
- begin
34
- status = 200
35
- batch_requests = Grape::Batch::Validator.parse(env, @batch_size_limit)
36
- body = MultiJson.encode(dispatch(env, batch_requests))
37
- rescue Grape::Batch::RequestBodyError, Grape::Batch::TooManyRequestsError => e
38
- e.class == TooManyRequestsError ? status = 429 : status = 400
39
- body = e.message
40
- end
41
-
42
- @logger.batch_end
43
- Rack::Response.new(body, status, 'Content-Type' => 'application/json')
44
- end
45
-
46
- private
47
-
48
- def batch_request?(env)
49
- env['PATH_INFO'].start_with?(@api_path) &&
50
- env['REQUEST_METHOD'] == 'POST' &&
51
- env['CONTENT_TYPE'] == 'application/json'
52
- end
53
-
54
- def dispatch(env, batch_requests)
55
- # Prepare batch request env
56
- @request_env = env.dup
57
- # Call session proc
58
- @request_env[SESSION_HEADER] = @session_proc.call(@request_env)
59
-
60
- # Call batch request
61
- batch_requests.map do |batch_request|
62
- batch_env = Grape::Batch::Request.new(@request_env, batch_request).build
63
- status, headers, response = @app.call(batch_env)
64
-
65
- update_request_env_session_from_headers(headers)
66
- update_request_env_token_from_headers(headers)
67
-
68
- @response_klass.format(status, headers, response)
69
- end
70
- end
71
-
72
- def update_request_env_session_from_headers(headers)
73
- return if !headers[SESSION_HEADER] || @request_env[SESSION_HEADER]
74
- @request_env[SESSION_HEADER] = headers[SESSION_HEADER]
75
- end
76
-
77
- def update_request_env_token_from_headers(headers)
78
- return if !headers[TOKEN_HEADER] || @request_env[TOKEN_HEADER]
79
- @request_env[TOKEN_HEADER] = headers[TOKEN_HEADER].dup
80
- end
81
- end
82
14
  end
83
15
  end
@@ -0,0 +1,60 @@
1
+ module Grape
2
+ module Batch
3
+ class Base
4
+ SESSION_HEADER = 'api.session'.freeze
5
+ TOKEN_HEADER = 'HTTP_X_API_TOKEN'.freeze
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ @logger = Grape::Batch::Logger.new
10
+ end
11
+
12
+ def call(env)
13
+ return @app.call(env) unless batch_request?(env)
14
+
15
+ # Handle batch requests
16
+ @logger.prepare(env).batch_begin
17
+ body, status = batch_call(env)
18
+ @logger.batch_end
19
+
20
+ # Return Rack formatted response
21
+ Rack::Response.new(body, status, 'Content-Type' => 'application/json')
22
+ end
23
+
24
+ def batch_call(env)
25
+ batch_requests = Grape::Batch::Validator.parse(env, Grape::Batch.configuration.limit)
26
+ [MultiJson.encode(dispatch(env, batch_requests)), 200]
27
+
28
+ rescue Grape::Batch::RequestBodyError, Grape::Batch::TooManyRequestsError => e
29
+ [e.message, e.class == TooManyRequestsError ? 429 : 400]
30
+ end
31
+
32
+ def dispatch(env, batch_requests)
33
+ call_api_session_proc(env)
34
+
35
+ # Call batch request
36
+ batch_requests.map do |batch_request|
37
+ batch_env = Grape::Batch::Request.new(env, batch_request).build
38
+ call_batched_request(batch_env)
39
+ end
40
+ end
41
+
42
+ def call_batched_request(env)
43
+ status, headers, response = @app.call(env)
44
+ Grape::Batch.configuration.formatter.format(status, headers, response)
45
+ end
46
+
47
+ private
48
+
49
+ def batch_request?(env)
50
+ env['PATH_INFO'].start_with?(Grape::Batch.configuration.path) &&
51
+ env['REQUEST_METHOD'] == 'POST' && env['CONTENT_TYPE'] == 'application/json'
52
+ end
53
+
54
+ def call_api_session_proc(env)
55
+ return unless Grape::Batch.configuration.session_proc
56
+ env[SESSION_HEADER] = Grape::Batch.configuration.session_proc.call(env)
57
+ end
58
+ end
59
+ end
60
+ end
@@ -10,7 +10,7 @@ module Grape
10
10
  @limit = 10
11
11
  @formatter = Grape::Batch::Response
12
12
  @logger = nil
13
- @session_proc = proc {}
13
+ @session_proc = nil
14
14
  end
15
15
  end
16
16
 
@@ -1,6 +1,6 @@
1
1
  module Grape
2
2
  # Gem main module
3
3
  module Batch
4
- VERSION = '2.2.2'
4
+ VERSION = '2.3.0'
5
5
  end
6
6
  end
@@ -59,7 +59,7 @@ module Twitter
59
59
 
60
60
  resource :login do
61
61
  get do
62
- header 'HTTP_X_API_TOKEN', 'user_token'
62
+ request.env['HTTP_X_API_TOKEN'] = 'user_token'
63
63
 
64
64
  'login successful'
65
65
  end
@@ -75,7 +75,7 @@ module Twitter
75
75
 
76
76
  resource :session do
77
77
  get do
78
- header 'api.session', OpenStruct.new(nick: 'Bob')
78
+ request.env['api.session'] = OpenStruct.new(nick: 'Bob')
79
79
 
80
80
  'session reloaded'
81
81
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-batch
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.2
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Lionel Oto
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-03-22 00:00:00.000000000 Z
13
+ date: 2016-05-12 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: multi_json
@@ -146,6 +146,7 @@ files:
146
146
  - Rakefile
147
147
  - grape-batch.gemspec
148
148
  - lib/grape/batch.rb
149
+ - lib/grape/batch/base.rb
149
150
  - lib/grape/batch/configuration.rb
150
151
  - lib/grape/batch/converter.rb
151
152
  - lib/grape/batch/errors.rb
@@ -177,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
178
  version: '0'
178
179
  requirements: []
179
180
  rubyforge_project:
180
- rubygems_version: 2.4.8
181
+ rubygems_version: 2.4.5
181
182
  signing_key:
182
183
  specification_version: 4
183
184
  summary: Extends Grape::API to support request batching