batch_api 0.0.8 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ v0.0.9
2
+ * Add direct support for Rails for path params
3
+ * Fix spec bugs
4
+
1
5
  v0.0.8
2
6
  * Return the results wrapped in a hash, rather than a raw array
3
7
  * Add process_start timestamp option
@@ -5,7 +5,19 @@ require 'batch_api/processor'
5
5
  require 'batch_api/middleware'
6
6
 
7
7
  module BatchApi
8
+
9
+ # Public: access the main Batch API configuration object.
10
+ #
11
+ # Returns a BatchApi::Configuration instance
8
12
  def self.config
9
13
  @config ||= Configuration.new
10
14
  end
15
+
16
+ # Public: are we in Rails? This partly exists just so that you
17
+ # can stub it in the tests.
18
+ #
19
+ # Returns true if Rails is a defined constant, false otherwise.
20
+ def rails?
21
+ defined?(Rails)
22
+ end
11
23
  end
@@ -12,7 +12,7 @@ module BatchApi
12
12
  # Public: the error details as a hash, which can be returned
13
13
  # to clients as JSON.
14
14
  def body
15
- message = if expose_backtrace?
15
+ message = if self.class.expose_backtrace?
16
16
  {
17
17
  message: @error.message,
18
18
  backtrace: @error.backtrace
@@ -37,7 +37,7 @@ module BatchApi
37
37
 
38
38
  # Internal: whether the backtrace should be exposed in the response.
39
39
  # Currently Rails-specific, needs to be generalized (to ENV["RACK_ENV"])?
40
- def expose_backtrace?
40
+ def self.expose_backtrace?
41
41
  !Rails.env.production?
42
42
  end
43
43
  end
@@ -1,74 +1,2 @@
1
- require 'batch_api/response'
2
-
3
- module BatchApi
4
- # Public: an individual batch operation.
5
- class Operation
6
- class MalformedOperationError < ArgumentError; end
7
-
8
- attr_accessor :method, :url, :params, :headers
9
- attr_accessor :env, :app, :result
10
-
11
- # Public: create a new Batch Operation given the specifications for a batch
12
- # operation (as defined above) and the request environment for the main
13
- # batch request.
14
- def initialize(op, base_env, app)
15
- @op = op
16
-
17
- @method = op["method"]
18
- @url = op["url"]
19
- @params = op["params"] || {}
20
- @headers = op["headers"] || {}
21
-
22
- raise MalformedOperationError,
23
- "BatchAPI operation must include method (received #{@method.inspect}) " +
24
- "and url (received #{@url.inspect})" unless @method && @url
25
-
26
- @app = app
27
- # deep_dup to avoid unwanted changes across requests
28
- @env = BatchApi::Utils.deep_dup(base_env)
29
- end
30
-
31
- # Execute a batch request, returning a BatchResponse object. If an error
32
- # occurs, it returns the same results as Rails would.
33
- def execute
34
- process_env
35
- begin
36
- response = @app.call(@env)
37
- rescue => err
38
- response = BatchApi::Errors::Operation.new(err).render
39
- end
40
- BatchApi::Response.new(response)
41
- end
42
-
43
- # Internal: customize the request environment. This is currently done
44
- # manually and feels clunky and brittle, but is mostly likely fine, though
45
- # there are one or two environment parameters not yet adjusted.
46
- def process_env
47
- path, qs = @url.split("?")
48
-
49
- # Headers
50
- headrs = (@headers || {}).inject({}) do |heads, (k, v)|
51
- heads.tap {|h| h["HTTP_" + k.gsub(/\-/, "_").upcase] = v}
52
- end
53
- # preserve original headers unless explicitly overridden
54
- @env.merge!(headrs)
55
-
56
- # method
57
- @env["REQUEST_METHOD"] = @method.upcase
58
-
59
- # path and query string
60
- @env["REQUEST_URI"] = @env["REQUEST_URI"].gsub(/\/batch.*/, @url)
61
- @env["REQUEST_PATH"] = path
62
- @env["ORIGINAL_FULLPATH"] = @env["PATH_INFO"] = @url
63
-
64
- @env["rack.request.query_string"] = qs
65
- @env["QUERY_STRING"] = qs
66
-
67
- # parameters
68
- @env["rack.request.form_hash"] = @params
69
- @env["action_dispatch.request.parameters"] = @params
70
- @env["action_dispatch.request.request_parameters"] = @params
71
- @env["rack.request.query_hash"] = @method == "get" ? @params : nil
72
- end
73
- end
74
- end
1
+ require 'batch_api/operation/rack'
2
+ require 'batch_api/operation/rails' if defined?(Rails)
@@ -0,0 +1,74 @@
1
+ require 'batch_api/response'
2
+
3
+ module BatchApi
4
+ # Public: an individual batch operation.
5
+ module Operation
6
+ class MalformedOperationError < ArgumentError; end
7
+
8
+ class Rack
9
+ attr_accessor :method, :url, :params, :headers
10
+ attr_accessor :env, :app, :result
11
+
12
+ # Public: create a new Batch Operation given the specifications for a batch
13
+ # operation (as defined above) and the request environment for the main
14
+ # batch request.
15
+ def initialize(op, base_env, app)
16
+ @op = op
17
+
18
+ @method = op["method"]
19
+ @url = op["url"]
20
+ @params = op["params"] || {}
21
+ @headers = op["headers"] || {}
22
+
23
+ raise MalformedOperationError,
24
+ "BatchAPI operation must include method (received #{@method.inspect}) " +
25
+ "and url (received #{@url.inspect})" unless @method && @url
26
+
27
+ @app = app
28
+ # deep_dup to avoid unwanted changes across requests
29
+ @env = BatchApi::Utils.deep_dup(base_env)
30
+ end
31
+
32
+ # Execute a batch request, returning a BatchResponse object. If an error
33
+ # occurs, it returns the same results as Rails would.
34
+ def execute
35
+ process_env
36
+ begin
37
+ response = @app.call(@env)
38
+ rescue => err
39
+ response = BatchApi::Errors::Operation.new(err).render
40
+ end
41
+ BatchApi::Response.new(response)
42
+ end
43
+
44
+ # Internal: customize the request environment. This is currently done
45
+ # manually and feels clunky and brittle, but is mostly likely fine, though
46
+ # there are one or two environment parameters not yet adjusted.
47
+ def process_env
48
+ path, qs = @url.split("?")
49
+
50
+ # Headers
51
+ headrs = (@headers || {}).inject({}) do |heads, (k, v)|
52
+ heads.tap {|h| h["HTTP_" + k.gsub(/\-/, "_").upcase] = v}
53
+ end
54
+ # preserve original headers unless explicitly overridden
55
+ @env.merge!(headrs)
56
+
57
+ # method
58
+ @env["REQUEST_METHOD"] = @method.upcase
59
+
60
+ # path and query string
61
+ @env["REQUEST_URI"] = @env["REQUEST_URI"].gsub(/\/batch.*/, @url)
62
+ @env["REQUEST_PATH"] = path
63
+ @env["ORIGINAL_FULLPATH"] = @env["PATH_INFO"] = @url
64
+
65
+ @env["rack.request.query_string"] = qs
66
+ @env["QUERY_STRING"] = qs
67
+
68
+ # parameters
69
+ @env["rack.request.form_hash"] = @params
70
+ @env["rack.request.query_hash"] = @method == "get" ? @params : nil
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,42 @@
1
+ require 'batch_api/operation/rack'
2
+
3
+ module BatchApi
4
+ # Public: an individual batch operation.
5
+ module Operation
6
+ class Rails < Operation::Rack
7
+ # Public: create a new Rails Operation. It does all that Rack does
8
+ # and also some additional Rails-specific processing.
9
+ def initialize(op, base_env, app)
10
+ super
11
+ @params = params_with_path_components
12
+ end
13
+
14
+ # Internal: customize the request environment. This is currently done
15
+ # manually and feels clunky and brittle, but is mostly likely fine, though
16
+ # there are one or two environment parameters not yet adjusted.
17
+ def process_env
18
+ # parameters
19
+ super
20
+ @env["action_dispatch.request.parameters"] = @params
21
+ @env["action_dispatch.request.request_parameters"] = @params
22
+ end
23
+
24
+ private
25
+
26
+ # Internal: process the params the Rails way, merging in the
27
+ # path_parameters. If the route can't be recognized, it will
28
+ # leave the params unchanged.
29
+ #
30
+ # Returns the updated params.
31
+ def params_with_path_components
32
+ begin
33
+ path_params = ::Rails.application.routes.recognize_path(@url, @op)
34
+ @params.merge(path_params)
35
+ rescue
36
+ @params
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+
@@ -82,11 +82,18 @@ module BatchApi
82
82
  "#{ops.length} were provided"
83
83
  else
84
84
  ops.map do |op|
85
- BatchApi::Operation.new(op, @env, @app)
85
+ self.class.operation_klass.new(op, @env, @app)
86
86
  end
87
87
  end
88
88
  end
89
89
 
90
+ # Internal: which operation class to used.
91
+ #
92
+ # Returns Batch::Operation::(Rack|Rails) depending on the environment
93
+ def self.operation_klass
94
+ BatchApi.rails? ? Operation::Rails : Operation::Rack
95
+ end
96
+
90
97
  # Internal: Processes any other provided options for validity.
91
98
  # Currently, the :sequential option is REQUIRED (until parallel
92
99
  # implementation is created).
@@ -1,3 +1,3 @@
1
1
  module BatchApi
2
- VERSION = "0.0.8"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: batch_api
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.1.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-20 00:00:00.000000000 Z
12
+ date: 2012-08-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -121,6 +121,8 @@ files:
121
121
  - lib/batch_api/errors/operation.rb
122
122
  - lib/batch_api/errors/request.rb
123
123
  - lib/batch_api/middleware.rb
124
+ - lib/batch_api/operation/rack.rb
125
+ - lib/batch_api/operation/rails.rb
124
126
  - lib/batch_api/operation.rb
125
127
  - lib/batch_api/processor/strategies/sequential.rb
126
128
  - lib/batch_api/processor.rb
@@ -147,7 +149,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
147
149
  version: '0'
148
150
  segments:
149
151
  - 0
150
- hash: -456340693841676630
152
+ hash: 4154907758036208164
151
153
  required_rubygems_version: !ruby/object:Gem::Requirement
152
154
  none: false
153
155
  requirements:
@@ -156,7 +158,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
156
158
  version: '0'
157
159
  segments:
158
160
  - 0
159
- hash: -456340693841676630
161
+ hash: 4154907758036208164
160
162
  requirements: []
161
163
  rubyforge_project:
162
164
  rubygems_version: 1.8.21