magellan-rails 0.1.5 → 0.2.0.pre

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: aff59ea017fc9a24aed8995129eda046534287d6
4
- data.tar.gz: 2f581b6c7f596a8ed0a62127258e84891f849c5f
3
+ metadata.gz: 604d2665dd317c1f40f5e5d574bae59d5ffe7a6e
4
+ data.tar.gz: e68191c69d8f8cdd9a890bd9b9b9d7342496dd97
5
5
  SHA512:
6
- metadata.gz: e837a14ddebe97bc16d438dd825ca1a07619d676fa91a95f119002f35176d6e0ceab67301fd7ea492d4beca5b46c52fd5918039bc05ce65d232df5fb8ecf4652
7
- data.tar.gz: 49323c5a936fbbced6916b148cf958d109935e5fd10933369ae4dd48286b8ae87e9708f848ee81eb4923652a29f72d942939b81c82308c700c1f89d403c97f11
6
+ metadata.gz: a4edb4881afde675ad1fa51e1568ee60a93a7f2bf50b05d5a80a44e7d8a015220fba5baeb693c5e42c5d127e12d6330f01478a171beac989173bc561377227a9
7
+ data.tar.gz: e296de514f853ca985c84eed969340aee1da12975eba77840ba324aa1371ec24a3a448364ea6b6ff5487c6900bc3fbd982d3ff2ef575f886560edce32833a53e
@@ -22,10 +22,15 @@ class Magellan::Rails::Request
22
22
  end
23
23
 
24
24
  def parse_message(request_message)
25
- # @options = request_message['options']
25
+ # v2 からリクエストオブジェクトに "v": 2 のようにバージョンが追加されるようになりました。
26
+ @version = request_message["v"] || 1
27
+ @options = request_message['options']
26
28
  # TRから送られるメッセージのoptionsの型が本来はHash型なのですが、
27
- # 配列型になってしまっているため、暫定的に空のHashをセットします
28
- @options = {}
29
+ # 過去に配列型になってしまっていたバージョンがあったためクラスもチェックします
30
+ unless @options.is_a?(Hash)
31
+ @options = {}
32
+ end
33
+ @env = request_message["env"] || {}
29
34
  @headers = request_message['headers']
30
35
  @body_encoding = request_message['body_encoding']
31
36
  @body_encoding = (@body_encoding.present? and VALID_ENCODING.include?(@body_encoding)) ? @body_encoding.to_sym : :plain
@@ -35,8 +40,24 @@ class Magellan::Rails::Request
35
40
  def to_rack_env
36
41
  env = Hash.new
37
42
 
38
- scripe_name = @headers['Path-Info'][@headers['Path-Info'].rindex('/') + 1..-1]
39
- query_string = @headers['Query-String']
43
+ case @version
44
+ when 1
45
+ http_method = @headers["Method"]
46
+ path_info = @headers["Path-Info"]
47
+ query_string = @headers["Query-String"]
48
+ server_name = @headers["Server-Name"]
49
+ server_port = @headers['Server-Port'].to_s
50
+ when 2
51
+ http_method = @env["METHOD"]
52
+ path_info = @env["PATH_INFO"]
53
+ query_string = @env["QUERY_STRING"]
54
+ server_name = @env["SERVER_NAME"]
55
+ server_port = @env['SERVER_PORT'].to_s
56
+ else
57
+ raise "Unsupported request format version: #{@version}. Please update magellan-rails."
58
+ end
59
+
60
+ scripe_name = path_info[path_info.rindex('/') + 1..-1]
40
61
 
41
62
  # Rackにクエリーストリングを渡す時は
42
63
  query_string.slice!(0) if (query_string[0] == '?')
@@ -46,19 +67,19 @@ class Magellan::Rails::Request
46
67
  env["CONTENT_LENGTH"] = @body.bytesize
47
68
  env["CONTENT_TYPE"] = ct.dup if ct
48
69
  env["GATEWAY_INTERFACE"] = "CGI/1.1"
49
- env["PATH_INFO"] = @headers['Path-Info'] # "/hello/index",
50
- env["QUERY_STRING"] = @headers['Query-String'] #
70
+ env["PATH_INFO"] = path_info # "/hello/index",
71
+ env["QUERY_STRING"] = query_string #
51
72
 
52
73
  # TRから送られてきていないので一旦コメントアウト
53
74
  # env["REMOTE_ADDR"] = @peeraddr[3]
54
75
  # env["REMOTE_HOST"] = @peeraddr[2]
55
76
  # env["REMOTE_USER"] = @user
56
77
 
57
- env["REQUEST_METHOD"] = @headers['Method'] # GET, PUT, DELETE...
78
+ env["REQUEST_METHOD"] = http_method # GET, PUT, DELETE...
58
79
  env["REQUEST_URI"] = "#{env["PATH_INFO"]}?#{env["QUERY_STRING"]}"
59
80
  env["SCRIPT_NAME"] = '' # /scripts/sample?a=c の場合 ルートなので ''
60
- env["SERVER_NAME"] = @headers['Server-Name'] # "localhost",
61
- env["SERVER_PORT"] = @headers['Server-Port'].to_s # "3000",
81
+ env["SERVER_NAME"] = server_name # "localhost"
82
+ env["SERVER_PORT"] = server_port # "3000"
62
83
 
63
84
  # 一旦決め打ち
64
85
  env["SERVER_PROTOCOL"] = "HTTP/1.1"
@@ -2,6 +2,7 @@
2
2
  require 'magellan/rails'
3
3
 
4
4
  require 'json'
5
+ require 'msgpack'
5
6
  require 'base64'
6
7
 
7
8
  class Magellan::Rails::Response
@@ -25,7 +26,7 @@ class Magellan::Rails::Response
25
26
  status: @status,
26
27
  body: @body,
27
28
  body_encoding: @body_encoding.to_s,
28
- }.to_json
29
+ }.to_msgpack
29
30
  rescue *json_generate_errors
30
31
  @body = Base64.strict_encode64(@body)
31
32
  @body_encoding = :base64
@@ -1,5 +1,5 @@
1
1
  module Magellan
2
2
  module Rails
3
- VERSION = "0.1.5"
3
+ VERSION = "0.2.0.pre"
4
4
  end
5
5
  end
@@ -3,18 +3,30 @@ require 'magellan/rails'
3
3
  require 'set'
4
4
 
5
5
  class Magellan::Subscriber::Request
6
- attr_reader :headers, :options, :topic, :body
6
+ attr_reader :env, :headers, :options, :topic, :body
7
7
 
8
8
  def option(key)
9
9
  options[key]
10
10
  end
11
11
 
12
12
  def parse_message(request_message)
13
- # @options = request_message['options']
14
- # TRから送られるメッセージのoptionsの型が本来はHash型なのですが、配列型になってしまっているため、暫定的に空のHashをセットします
15
- @options = {}
13
+ @options = request_message['options']
14
+ @version = request_message["v"] || 1
15
+ # TRから送られるメッセージのoptionsの型が本来はHash型なのですが、
16
+ # 過去に配列になっていたバージョンがあったため、クラスをチェックします
17
+ @options = {} unless @options.is_a?(Hash)
18
+ @env = request_message["env"] || {}
16
19
  @headers = request_message['headers']
17
- @topic = request_message["headers"]["Path-Info"]
20
+
21
+ case @version
22
+ when 1
23
+ @topic = @headers["Path-Info"]
24
+ when 2
25
+ @topic = @env["PATH_INFO"]
26
+ else
27
+ raise "Unsupported request format version: #{@version}. Please update magellan-rails."
28
+ end
29
+
18
30
  case request_message["body_encoding"]
19
31
  when /\Aplain\z/i, nil
20
32
  @body = request_message["body"]
@@ -4,6 +4,7 @@ require "magellan/worker"
4
4
  require "magellan/extentions"
5
5
 
6
6
  require 'json'
7
+ require 'msgpack'
7
8
  require "bunny"
8
9
 
9
10
  class Magellan::Worker::Core
@@ -75,7 +76,7 @@ class Magellan::Worker::Core
75
76
  @channel.basic_ack(delivery_tag, false)
76
77
 
77
78
  begin
78
- request_message = JSON.parse(payload)
79
+ request_message = parse_body(payload)
79
80
  @executor.execute(reply_to, correlation_id, delivery_tag, request_message)
80
81
  rescue
81
82
  Magellan.logger.error("Magellan Worker request execution error: #{$!}\n" + $@.join("\n"))
@@ -90,4 +91,12 @@ class Magellan::Worker::Core
90
91
  Signal.trap(:TERM, @original_trap_handler)
91
92
  end
92
93
  end
94
+
95
+ def parse_body(payload)
96
+ begin
97
+ MessagePack.unpack(payload)
98
+ rescue MessagePack::UnpackError
99
+ JSON.parse(payload)
100
+ end
101
+ end
93
102
  end
@@ -21,6 +21,7 @@ Gem::Specification.new do |spec|
21
21
  spec.add_runtime_dependency "railties", '~> 4.1'
22
22
  spec.add_runtime_dependency "bunny"
23
23
  spec.add_runtime_dependency "json"
24
+ spec.add_runtime_dependency "msgpack", '~> 0.5.4'
24
25
 
25
26
  spec.add_development_dependency "bundler", "~> 1.6"
26
27
  spec.add_development_dependency "rspec"
@@ -5,9 +5,10 @@ require 'json'
5
5
 
6
6
  describe Magellan::Rails::Request do
7
7
  describe '#parse_message' do
8
- before(:all) do
9
- @request_message_base = {
10
- 'headers' => {
8
+ context "v1" do
9
+ before(:all) do
10
+ @request_message_base = {
11
+ 'headers' => {
11
12
  'Title' => 'groovenauts-app',
12
13
  'Interface-Version' => '1.0.0',
13
14
  'Title-Runtime-Version'=> '1.0.0',
@@ -21,75 +22,211 @@ describe Magellan::Rails::Request do
21
22
  "Path-Info" => "/hello/index",
22
23
  "Query-String" => "qs1=abc&qs2=def"
23
24
  },
24
- 'body' => '',
25
- 'body_encoding' => 'plain',
26
- 'options' => {
25
+ 'body' => '',
26
+ 'body_encoding' => 'plain',
27
+ 'options' => {
27
28
  # 当分実装される予定がなく、空のハッシュが渡されます
28
29
  # 'reply_ttl' => 1000
29
30
  }
30
- }
31
- end
31
+ }
32
+ end
33
+
34
+ context "valid format" do
35
+ context "body_encoding=nil" do
36
+ let(:request){ Magellan::Rails::Request.new }
37
+
38
+ before do
39
+ @request_message = @request_message_base.dup
40
+ @request_message.delete("body_encoding")
41
+ end
42
+
43
+ subject{ request }
44
+
45
+ it do
46
+ request.parse_message(@request_message)
47
+ expect(request.headers).to eq(@request_message['headers'])
48
+ expect(request.body ).to eq(@request_message['body'])
49
+ expect(request.options).to eq(@request_message['options'])
50
+
51
+ expected_env = {
52
+ "CONTENT_LENGTH" => 0,
53
+ "CONTENT_TYPE" => "application/json",
54
+ "GATEWAY_INTERFACE" => "CGI/1.1",
55
+ "HTTP_CONTENT_TYPE" => "application/json",
56
+ "HTTP_INTERFACE_VERSION" => "1.0.0",
57
+ "HTTP_OAUTH_REQUESTER_ID" => "tarou",
58
+ "HTTP_REFERENCE_ID" => "192.168.1.110",
59
+ "HTTP_TITLE" => "groovenauts-app",
60
+ "HTTP_TITLE_RUNTIME_VERSION" => "1.0.0",
61
+ "HTTP_URL" => "http://magellan-clouds.com/worker/test",
62
+ "HTTP_VERSION" => "HTTP/1.1",
63
+ "PATH_INFO" => "/hello/index",
64
+ "QUERY_STRING" => "qs1=abc&qs2=def",
65
+ "REQUEST_METHOD" => "GET",
66
+ "REQUEST_PATH" => "/hello/index",
67
+ "REQUEST_URI" => "/hello/index?qs1=abc&qs2=def",
68
+ "SCRIPT_NAME" => "",
69
+ "SERVER_NAME" => "localhost",
70
+ "SERVER_PORT" => "3000",
71
+ "SERVER_PROTOCOL" => "HTTP/1.1",
72
+ "SERVER_SOFTWARE" => "magellan",
73
+ }
74
+ request.to_rack_env.tap do |e|
75
+ expected_env.each do |k, v|
76
+ expect(e[k]).to eql(v)
77
+ end
78
+ end
79
+ end
80
+ end
81
+
82
+ context "body_encoding=plain" do
83
+ let(:request){ Magellan::Rails::Request.new }
32
84
 
33
- context "valid format" do
34
- context "body_encoding=nil" do
35
- let(:request){ Magellan::Rails::Request.new }
85
+ before do
86
+ @request_message = @request_message_base.dup
87
+ end
36
88
 
37
- before do
38
- @request_message = @request_message_base.dup
39
- @request_message.delete("body_encoding")
89
+ subject{ request }
90
+
91
+ it do
92
+ request.parse_message(@request_message)
93
+ expect(request.headers).to eq(@request_message['headers'])
94
+ expect(request.body ).to eq(@request_message['body'])
95
+ expect(request.options).to eq(@request_message['options'])
96
+ end
40
97
  end
41
98
 
42
- subject{ request }
99
+ context "body_encoding=base64" do
100
+ let(:request){ Magellan::Rails::Request.new }
101
+
102
+ before do
103
+ @request_body = "\xff"
104
+ @request_message = @request_message_base.dup
105
+ @request_message['body'] = Base64.strict_encode64(@request_body)
106
+ @request_message['body_encoding'] = 'base64'
107
+ end
108
+
109
+ subject{ request }
43
110
 
44
- it do
45
- request.parse_message(@request_message)
46
- expect(request.headers).to eq(@request_message['headers'])
47
- expect(request.body ).to eq(@request_message['body'])
48
- expect(request.options).to eq(@request_message['options'])
111
+ it do
112
+ request.parse_message(@request_message)
113
+ expect(request.headers).to eq(@request_message['headers'])
114
+ expect(request.body.inspect).to eq(@request_body.inspect)
115
+ expect(request.options).to eq(@request_message['options'])
116
+ end
49
117
  end
50
118
  end
51
119
 
52
- context "body_encoding=plain" do
53
- let(:request){ Magellan::Rails::Request.new }
120
+ context "invalid format" do
121
+ it 'raise invalid format exception'
122
+ end
123
+ end
54
124
 
55
- before do
56
- @request_message = @request_message_base.dup
125
+ context "v2" do
126
+ before(:all) do
127
+ @request_message_base = {
128
+ "v" => 2,
129
+ "env" => {
130
+ "METHOD" => "GET",
131
+ "SERVER_NAME" => "localhost",
132
+ "SERVER_PORT" => 3000,
133
+ "PATH_INFO" => "/hello/index",
134
+ "QUERY_STRING" => "qs1=abc&qs2=def",
135
+ 'REFERENCE_IP' => '192.168.1.110',
136
+ 'URL' => 'http://magellan-clouds.com/worker/test',
137
+ 'OAUTH_REQUESTER_ID' => 'tarou',
138
+ },
139
+ 'headers' => {
140
+ 'Content-Type' => 'application/json',
141
+ },
142
+ 'body' => '',
143
+ 'body_encoding' => 'plain',
144
+ 'options' => {
145
+ # 当分実装される予定がなく、空のハッシュが渡されます
146
+ # 'reply_ttl' => 1000
147
+ }
148
+ }
149
+ end
150
+
151
+ context "valid format" do
152
+ context "body_encoding=nil" do
153
+ let(:request){ Magellan::Rails::Request.new }
154
+
155
+ before do
156
+ @request_message = @request_message_base.dup
157
+ @request_message.delete("body_encoding")
158
+ end
159
+
160
+ subject{ request }
161
+
162
+ it do
163
+ request.parse_message(@request_message)
164
+ expect(request.headers).to eq(@request_message['headers'])
165
+ expect(request.body ).to eq(@request_message['body'])
166
+ expect(request.options).to eq(@request_message['options'])
167
+ expected_env = {
168
+ "CONTENT_LENGTH" => 0,
169
+ "CONTENT_TYPE" => "application/json",
170
+ "GATEWAY_INTERFACE" => "CGI/1.1",
171
+ "HTTP_CONTENT_TYPE" => "application/json",
172
+ "HTTP_VERSION" => "HTTP/1.1",
173
+ "PATH_INFO" => "/hello/index",
174
+ "QUERY_STRING" => "qs1=abc&qs2=def",
175
+ "REQUEST_METHOD" => "GET",
176
+ "REQUEST_PATH" => "/hello/index",
177
+ "REQUEST_URI" => "/hello/index?qs1=abc&qs2=def",
178
+ "SCRIPT_NAME" => "",
179
+ "SERVER_NAME" => "localhost",
180
+ "SERVER_PORT" => "3000",
181
+ "SERVER_PROTOCOL" => "HTTP/1.1",
182
+ "SERVER_SOFTWARE" => "magellan",
183
+ }
184
+ request.to_rack_env.tap do |e|
185
+ expected_env.each do |k, v|
186
+ expect(e[k]).to eql(v)
187
+ end
188
+ end
189
+ end
57
190
  end
58
191
 
59
- subject{ request }
192
+ context "body_encoding=plain" do
193
+ let(:request){ Magellan::Rails::Request.new }
60
194
 
61
- it do
62
- request.parse_message(@request_message)
63
- expect(request.headers).to eq(@request_message['headers'])
64
- expect(request.body ).to eq(@request_message['body'])
65
- expect(request.options).to eq(@request_message['options'])
66
- end
67
- end
195
+ before do
196
+ @request_message = @request_message_base.dup
197
+ end
68
198
 
69
- context "body_encoding=base64" do
70
- let(:request){ Magellan::Rails::Request.new }
199
+ subject{ request }
71
200
 
72
- before do
73
- @request_body = "\xff"
74
- @request_message = @request_message_base.dup
75
- @request_message['body'] = Base64.strict_encode64(@request_body)
76
- @request_message['body_encoding'] = 'base64'
201
+ it do
202
+ request.parse_message(@request_message)
203
+ expect(request.headers).to eq(@request_message['headers'])
204
+ expect(request.body ).to eq(@request_message['body'])
205
+ expect(request.options).to eq(@request_message['options'])
206
+ end
77
207
  end
78
208
 
79
- subject{ request }
209
+ context "body_encoding=base64" do
210
+ let(:request){ Magellan::Rails::Request.new }
211
+
212
+ before do
213
+ @request_body = "\xff"
214
+ @request_message = @request_message_base.dup
215
+ @request_message['body'] = Base64.strict_encode64(@request_body)
216
+ @request_message['body_encoding'] = 'base64'
217
+ end
218
+
219
+ subject{ request }
80
220
 
81
- it do
82
- request.parse_message(@request_message)
83
- expect(request.headers).to eq(@request_message['headers'])
84
- expect(request.body.inspect).to eq(@request_body.inspect)
85
- expect(request.options).to eq(@request_message['options'])
221
+ it do
222
+ request.parse_message(@request_message)
223
+ expect(request.headers).to eq(@request_message['headers'])
224
+ expect(request.body.inspect).to eq(@request_body.inspect)
225
+ expect(request.options).to eq(@request_message['options'])
226
+ end
86
227
  end
87
228
  end
88
229
  end
89
-
90
- context "invalid format" do
91
- it 'raise invalid format exception'
92
- end
93
230
  end
94
231
 
95
232
  describe '#option' do
@@ -2,6 +2,7 @@
2
2
 
3
3
  require "spec_helper"
4
4
  require 'json'
5
+ require 'msgpack'
5
6
  require 'base64'
6
7
 
7
8
  describe Magellan::Rails::Request do
@@ -30,7 +31,7 @@ describe Magellan::Rails::Request do
30
31
  end
31
32
  it do
32
33
  response.parse_rack_response(@response_data)
33
- data = JSON.parse(response.to_message)
34
+ data = MessagePack.unpack(response.to_message)
34
35
  expect(data["status"]).to eq(200)
35
36
  expect(data["headers"]).to eq([])
36
37
  expect(data["body"]).to eq("Hello! Magellan!")
@@ -47,11 +48,11 @@ describe Magellan::Rails::Request do
47
48
  end
48
49
  it do
49
50
  response.parse_rack_response(@response_data)
50
- data = JSON.parse(response.to_message)
51
+ data = MessagePack.unpack(response.to_message)
51
52
  expect(data["status"]).to eq(200)
52
53
  expect(data["headers"]).to eq([])
53
- expect(data["body"]).to eq(Base64.strict_encode64(@response_body))
54
- expect(data["body_encoding"]).to eq("base64")
54
+ expect(data["body"]).to eq(@response_body)
55
+ expect(data["body_encoding"]).to eq("plain")
55
56
  end
56
57
  end
57
58
  end
@@ -0,0 +1,148 @@
1
+ # -*- coding: utf-8 -*-
2
+
3
+ require "spec_helper"
4
+ require 'json'
5
+
6
+ describe Magellan::Subscriber::Request do
7
+ describe '#parse_message' do
8
+ context "v1" do
9
+ before(:all) do
10
+ @request_message_base = {
11
+ 'headers' => {
12
+ 'Method' => 'PUBLISH',
13
+ "Path-Info" => "hello/index",
14
+ },
15
+ 'body' => 'body',
16
+ 'body_encoding' => 'plain',
17
+ }
18
+ end
19
+
20
+ context "valid format" do
21
+ context "body_encoding=nil" do
22
+ let(:request){ Magellan::Subscriber::Request.new }
23
+
24
+ before do
25
+ @request_message = @request_message_base.dup
26
+ @request_message.delete("body_encoding")
27
+ end
28
+
29
+ subject{ request }
30
+
31
+ it do
32
+ request.parse_message(@request_message)
33
+ expect(request.topic).to eq("hello/index")
34
+ expect(request.body).to eq("body")
35
+ end
36
+ end
37
+
38
+ context "body_encoding=plain" do
39
+ let(:request){ Magellan::Subscriber::Request.new }
40
+
41
+ before do
42
+ @request_message = @request_message_base.dup
43
+ end
44
+
45
+ subject{ request }
46
+
47
+ it do
48
+ request.parse_message(@request_message)
49
+ expect(request.topic).to eq("hello/index")
50
+ expect(request.body).to eq("body")
51
+ end
52
+ end
53
+
54
+ context "body_encoding=base64" do
55
+ let(:request){ Magellan::Subscriber::Request.new }
56
+
57
+ before do
58
+ @request_body = "\xff"
59
+ @request_message = @request_message_base.dup
60
+ @request_message['body'] = Base64.strict_encode64(@request_body)
61
+ @request_message['body_encoding'] = 'base64'
62
+ end
63
+
64
+ subject{ request }
65
+
66
+ it do
67
+ request.parse_message(@request_message)
68
+ expect(request.topic).to eq("hello/index")
69
+ expect(request.body).to eq("\xFF".force_encoding("ASCII-8BIT"))
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ context "v2" do
76
+ before(:all) do
77
+ @request_message_base = {
78
+ "v" => 2,
79
+ 'env' => {
80
+ 'Method' => 'PUBLISH',
81
+ "PATH_INFO" => "hello/index",
82
+ },
83
+ 'headers' => {},
84
+ 'body' => 'body',
85
+ 'body_encoding' => 'plain',
86
+ 'options' => {
87
+ # 当分実装される予定がなく、空のハッシュが渡されます
88
+ # 'reply_ttl' => 1000
89
+ }
90
+ }
91
+ end
92
+
93
+ context "valid format" do
94
+ context "body_encoding=nil" do
95
+ let(:request){ Magellan::Subscriber::Request.new }
96
+
97
+ before do
98
+ @request_message = @request_message_base.dup
99
+ @request_message.delete("body_encoding")
100
+ end
101
+
102
+ subject{ request }
103
+
104
+ it do
105
+ request.parse_message(@request_message)
106
+ expect(request.topic).to eq("hello/index")
107
+ expect(request.body).to eq("body")
108
+ end
109
+ end
110
+
111
+ context "body_encoding=plain" do
112
+ let(:request){ Magellan::Subscriber::Request.new }
113
+
114
+ before do
115
+ @request_message = @request_message_base.dup
116
+ end
117
+
118
+ subject{ request }
119
+
120
+ it do
121
+ request.parse_message(@request_message)
122
+ expect(request.topic).to eq("hello/index")
123
+ expect(request.body).to eq("body")
124
+ end
125
+ end
126
+
127
+ context "body_encoding=base64" do
128
+ let(:request){ Magellan::Subscriber::Request.new }
129
+
130
+ before do
131
+ @request_body = "\xff"
132
+ @request_message = @request_message_base.dup
133
+ @request_message['body'] = Base64.strict_encode64(@request_body)
134
+ @request_message['body_encoding'] = 'base64'
135
+ end
136
+
137
+ subject{ request }
138
+
139
+ it do
140
+ request.parse_message(@request_message)
141
+ expect(request.topic).to eq("hello/index")
142
+ expect(request.body).to eq("\xFF".force_encoding("ASCII-8BIT"))
143
+ end
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
@@ -4,6 +4,7 @@ require "spec_helper"
4
4
  require 'bunny'
5
5
  require 'bunny_mock'
6
6
  require 'json'
7
+ require 'msgpack'
7
8
 
8
9
  describe Magellan::Worker::Core do
9
10
 
@@ -65,6 +66,64 @@ describe Magellan::Worker::Core do
65
66
  subject.run
66
67
  expect(Magellan.logger ).to be_a(Logger)
67
68
  end
69
+ end
70
+
71
+ context "with messagepack" do
72
+ before do
73
+ # テスト用のワーカー実行要求用メッセージ
74
+ @request_message = {
75
+ 'headers' => {
76
+ 'Title' => 'groovenauts-app',
77
+ 'Interface-Version' => '1.0.0',
78
+ 'Title-Runtime-Version'=> '1.0.0',
79
+ 'Reference-Id' =>'192.168.1.110',
80
+ 'Url' =>'http://magellan-clouds.com/worker/test',
81
+ 'Oauth-Requester-Id' =>'tarou',
82
+ 'Content-Type' =>'application/json',
83
+ },
84
+ 'body' => '',
85
+ 'options' => {
86
+ 'reply_ttl' => 1000
87
+ }
88
+ }
89
+
90
+ bunny = BunnyMock.new
91
+ channel = bunny.create_channel
92
+ exchange = bunny.exchange('test_exchange', type: :direct, durable: false, auto_delete: false)
93
+ queue = channel.queue("consumer1.sample_project.1.0.0.rails")
94
+ queue.bind(exchange)
95
+ exchange.publish(@request_message.to_msgpack, routing_key: "1.0.0.rails", reply_to: 'reply_test', correlation_id: "correlation_id_sample")
96
+ @work_pool = double "work_pool"
97
+
98
+ allow(Bunny ).to receive(:new).and_return(bunny)
99
+ allow(bunny ).to receive(:create_channel).and_return(channel)
100
+ allow(channel).to receive(:queue).with('customer1.sample_project.1.0.0.rails', no_declare: true).and_return(queue)
101
+ allow(channel).to receive(:basic_ack).and_return(queue)
102
+ allow(channel).to receive(:work_pool).and_return(@work_pool)
103
+
104
+ config = {}
105
+ config[:host] = '127.0.0.1'
106
+ config[:port] = '5672'
107
+ config[:vhost] = '/customer1.sample_project'
108
+ config[:rabbitmq_user] = 'customer1.sample_project'
109
+ config[:request_queue] = 'customer1.sample_project.1.0.0.rails'
110
+ config[:response_exchange] = 'customer1.sample_project.reply'
111
+ config[:rabbitmq_password] = 'pswd1'
112
+
113
+ allow(Magellan::Worker::Config).to receive(:load_config).and_return(config)
114
+
115
+ @executor = double('executor')
116
+ allow(Magellan::Worker::Executor).to receive(:new).and_return(@executor)
117
+ allow(@executor).to receive(:execute).and_return(nil)
118
+ end
119
+
120
+ subject{ Magellan::Worker::Core.new.initialize! }
121
+ it do
122
+ expect(Magellan::Worker::Config).to receive(:load_config).once
123
+ expect(@executor ).to receive(:execute).with('reply_test', 'correlation_id_sample', '2', @request_message).once
124
+ subject.run
125
+ expect(Magellan.logger ).to be_a(Logger)
126
+ end
68
127
 
69
128
  describe "gracefully shutdown" do
70
129
  before do
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: magellan-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.2.0.pre
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuuki Noguchi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-29 00:00:00.000000000 Z
11
+ date: 2015-02-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - ">="
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: msgpack
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 0.5.4
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 0.5.4
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: bundler
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -131,6 +145,7 @@ files:
131
145
  - spec/magellan/rails/request_spec.rb
132
146
  - spec/magellan/rails/response_spec.rb
133
147
  - spec/magellan/subscriber/mapper_spec.rb
148
+ - spec/magellan/subscriber/request_spec.rb
134
149
  - spec/magellan/worker/core_spec.rb
135
150
  - spec/spec_helper.rb
136
151
  homepage: ''
@@ -148,9 +163,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
148
163
  version: '0'
149
164
  required_rubygems_version: !ruby/object:Gem::Requirement
150
165
  requirements:
151
- - - ">="
166
+ - - ">"
152
167
  - !ruby/object:Gem::Version
153
- version: '0'
168
+ version: 1.3.1
154
169
  requirements: []
155
170
  rubyforge_project:
156
171
  rubygems_version: 2.4.5
@@ -161,5 +176,6 @@ test_files:
161
176
  - spec/magellan/rails/request_spec.rb
162
177
  - spec/magellan/rails/response_spec.rb
163
178
  - spec/magellan/subscriber/mapper_spec.rb
179
+ - spec/magellan/subscriber/request_spec.rb
164
180
  - spec/magellan/worker/core_spec.rb
165
181
  - spec/spec_helper.rb