qrpc 0.4.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/CHANGES.txt +9 -6
  2. data/Gemfile +10 -4
  3. data/Gemfile.lock +34 -12
  4. data/LICENSE.txt +1 -1
  5. data/README.md +92 -25
  6. data/Rakefile +2 -1
  7. data/TODO.md +1 -3
  8. data/VERSION +1 -1
  9. data/lib/qrpc/client.rb +13 -5
  10. data/lib/qrpc/client/dispatcher.rb +66 -50
  11. data/lib/qrpc/client/exception.rb +8 -37
  12. data/lib/qrpc/client/job.rb +49 -16
  13. data/lib/qrpc/general.rb +61 -1
  14. data/lib/qrpc/generator/object-id.rb +43 -0
  15. data/lib/qrpc/generator/uuid.rb +43 -0
  16. data/lib/qrpc/locator.rb +11 -85
  17. data/lib/qrpc/locator/em-jack.rb +160 -0
  18. data/lib/qrpc/locator/evented-queue.rb +101 -0
  19. data/lib/qrpc/protocol/abstract.rb +119 -0
  20. data/lib/qrpc/protocol/abstract/error.rb +54 -0
  21. data/lib/qrpc/protocol/abstract/object.rb +81 -0
  22. data/lib/qrpc/protocol/abstract/request.rb +126 -0
  23. data/lib/qrpc/protocol/abstract/response.rb +103 -0
  24. data/lib/qrpc/protocol/json-rpc.rb +32 -0
  25. data/lib/qrpc/protocol/json-rpc/error.rb +71 -0
  26. data/lib/qrpc/protocol/json-rpc/native/exception-data.rb +247 -0
  27. data/lib/qrpc/protocol/json-rpc/native/qrpc-object.rb +137 -0
  28. data/lib/qrpc/protocol/json-rpc/request.rb +140 -0
  29. data/lib/qrpc/protocol/json-rpc/response.rb +146 -0
  30. data/lib/qrpc/protocol/object.rb +32 -0
  31. data/lib/qrpc/protocol/object/error.rb +46 -0
  32. data/lib/qrpc/protocol/object/request.rb +111 -0
  33. data/lib/qrpc/protocol/object/response.rb +93 -0
  34. data/lib/qrpc/server.rb +63 -48
  35. data/lib/qrpc/server/dispatcher.rb +5 -107
  36. data/lib/qrpc/server/job.rb +69 -19
  37. data/qrpc.gemspec +55 -19
  38. data/test-both.rb +85 -0
  39. data/test-client.rb +36 -8
  40. data/test-server.rb +17 -12
  41. metadata +181 -31
  42. data/lib/qrpc/protocol/exception-data.rb +0 -227
  43. data/lib/qrpc/protocol/qrpc-object.rb +0 -103
  44. data/lib/qrpc/protocol/request.rb +0 -46
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qrpc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.9.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,44 +9,123 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-02-19 00:00:00.000000000 Z
12
+ date: 2012-05-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: json-rpc-objects
16
- requirement: &19394600 !ruby/object:Gem::Requirement
16
+ requirement: !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
20
20
  - !ruby/object:Gem::Version
21
- version: 0.3.3
21
+ version: 0.4.1
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *19394600
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: 0.4.1
25
30
  - !ruby/object:Gem::Dependency
26
- name: depq
27
- requirement: &19392680 !ruby/object:Gem::Requirement
31
+ name: PriorityQueue
32
+ requirement: !ruby/object:Gem::Requirement
28
33
  none: false
29
34
  requirements:
30
35
  - - ! '>='
31
36
  - !ruby/object:Gem::Version
32
- version: '0.4'
37
+ version: 0.1.2
33
38
  type: :runtime
34
39
  prerelease: false
35
- version_requirements: *19392680
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: 0.1.2
36
46
  - !ruby/object:Gem::Dependency
37
- name: em-jack
38
- requirement: &19391280 !ruby/object:Gem::Requirement
47
+ name: unified-queues
48
+ requirement: !ruby/object:Gem::Requirement
39
49
  none: false
40
50
  requirements:
41
51
  - - ! '>='
42
52
  - !ruby/object:Gem::Version
43
- version: 0.1.3
53
+ version: '0'
44
54
  type: :runtime
45
55
  prerelease: false
46
- version_requirements: *19391280
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: evented-queue
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
47
78
  - !ruby/object:Gem::Dependency
48
79
  name: eventmachine
49
- requirement: &19389520 !ruby/object:Gem::Requirement
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :runtime
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: hash-utils
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: 1.1.0
102
+ type: :runtime
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: 1.1.0
110
+ - !ruby/object:Gem::Dependency
111
+ name: em-wrapper
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: abstract
128
+ requirement: !ruby/object:Gem::Requirement
50
129
  none: false
51
130
  requirements:
52
131
  - - ! '>='
@@ -54,21 +133,63 @@ dependencies:
54
133
  version: '0'
55
134
  type: :runtime
56
135
  prerelease: false
57
- version_requirements: *19389520
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: em-jack
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: 0.1.3
150
+ type: :runtime
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: 0.1.3
158
+ - !ruby/object:Gem::Dependency
159
+ name: hashie
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - ! '>='
164
+ - !ruby/object:Gem::Version
165
+ version: 1.0.0
166
+ type: :runtime
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - ! '>='
172
+ - !ruby/object:Gem::Version
173
+ version: 1.0.0
58
174
  - !ruby/object:Gem::Dependency
59
175
  name: uuid
60
- requirement: &19407260 !ruby/object:Gem::Requirement
176
+ requirement: !ruby/object:Gem::Requirement
61
177
  none: false
62
178
  requirements:
63
179
  - - ! '>='
64
180
  - !ruby/object:Gem::Version
65
- version: 2.3.2
181
+ version: 2.0.0
66
182
  type: :runtime
67
183
  prerelease: false
68
- version_requirements: *19407260
184
+ version_requirements: !ruby/object:Gem::Requirement
185
+ none: false
186
+ requirements:
187
+ - - ! '>='
188
+ - !ruby/object:Gem::Version
189
+ version: 2.0.0
69
190
  - !ruby/object:Gem::Dependency
70
191
  name: bundler
71
- requirement: &19406280 !ruby/object:Gem::Requirement
192
+ requirement: !ruby/object:Gem::Requirement
72
193
  none: false
73
194
  requirements:
74
195
  - - ! '>='
@@ -76,10 +197,15 @@ dependencies:
76
197
  version: 1.0.0
77
198
  type: :development
78
199
  prerelease: false
79
- version_requirements: *19406280
200
+ version_requirements: !ruby/object:Gem::Requirement
201
+ none: false
202
+ requirements:
203
+ - - ! '>='
204
+ - !ruby/object:Gem::Version
205
+ version: 1.0.0
80
206
  - !ruby/object:Gem::Dependency
81
207
  name: jeweler2
82
- requirement: &19405460 !ruby/object:Gem::Requirement
208
+ requirement: !ruby/object:Gem::Requirement
83
209
  none: false
84
210
  requirements:
85
211
  - - ! '>='
@@ -87,7 +213,12 @@ dependencies:
87
213
  version: 2.0.0
88
214
  type: :development
89
215
  prerelease: false
90
- version_requirements: *19405460
216
+ version_requirements: !ruby/object:Gem::Requirement
217
+ none: false
218
+ requirements:
219
+ - - ! '>='
220
+ - !ruby/object:Gem::Version
221
+ version: 2.0.0
91
222
  description:
92
223
  email: martinkozak@martinkozak.net
93
224
  executables: []
@@ -110,20 +241,39 @@ files:
110
241
  - lib/qrpc/client/exception.rb
111
242
  - lib/qrpc/client/job.rb
112
243
  - lib/qrpc/general.rb
244
+ - lib/qrpc/generator/object-id.rb
245
+ - lib/qrpc/generator/uuid.rb
113
246
  - lib/qrpc/locator.rb
114
- - lib/qrpc/protocol/exception-data.rb
115
- - lib/qrpc/protocol/qrpc-object.rb
116
- - lib/qrpc/protocol/request.rb
247
+ - lib/qrpc/locator/em-jack.rb
248
+ - lib/qrpc/locator/evented-queue.rb
249
+ - lib/qrpc/protocol/abstract.rb
250
+ - lib/qrpc/protocol/abstract/error.rb
251
+ - lib/qrpc/protocol/abstract/object.rb
252
+ - lib/qrpc/protocol/abstract/request.rb
253
+ - lib/qrpc/protocol/abstract/response.rb
254
+ - lib/qrpc/protocol/json-rpc.rb
255
+ - lib/qrpc/protocol/json-rpc/error.rb
256
+ - lib/qrpc/protocol/json-rpc/native/exception-data.rb
257
+ - lib/qrpc/protocol/json-rpc/native/qrpc-object.rb
258
+ - lib/qrpc/protocol/json-rpc/request.rb
259
+ - lib/qrpc/protocol/json-rpc/response.rb
260
+ - lib/qrpc/protocol/object.rb
261
+ - lib/qrpc/protocol/object/error.rb
262
+ - lib/qrpc/protocol/object/request.rb
263
+ - lib/qrpc/protocol/object/response.rb
117
264
  - lib/qrpc/server.rb
118
265
  - lib/qrpc/server/dispatcher.rb
119
266
  - lib/qrpc/server/job.rb
120
267
  - qrpc.gemspec
268
+ - test-both.rb
121
269
  - test-client.rb
122
270
  - test-server.rb
123
271
  homepage: http://github.com/martinkozak/qrpc
124
272
  licenses:
125
273
  - MIT
126
- post_install_message:
274
+ post_install_message: ! "\nQRPC: API of the 0.9.x version (and 1.0 in future) is partialy
275
+ incompatible with the older versions. Modifications of your current applications
276
+ may be necessary for upgrading them to the latest version. \n\n"
127
277
  rdoc_options: []
128
278
  require_paths:
129
279
  - lib
@@ -135,7 +285,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
135
285
  version: '0'
136
286
  segments:
137
287
  - 0
138
- hash: -3804582272102704456
288
+ hash: -3326613635152724256
139
289
  required_rubygems_version: !ruby/object:Gem::Requirement
140
290
  none: false
141
291
  requirements:
@@ -144,11 +294,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
144
294
  version: '0'
145
295
  requirements: []
146
296
  rubyforge_project:
147
- rubygems_version: 1.8.17
297
+ rubygems_version: 1.8.24
148
298
  signing_key:
149
299
  specification_version: 3
150
- summary: Queued JSON-RPC client and server. Works as normal RPC server, but through
151
- queue interface, so allows highly scalable, distributed and asynchronous remote
152
- API implementation and fast data processing. It's based on eventmachine and beanstalkd,
300
+ summary: Queued RPC client and server. Works as normal RPC server, but through queue
301
+ interface, so allows highly scalable, distributed and asynchronous remote API implementation
302
+ and fast data processing. It's based on EventMachine and typically on Beanstalk,
153
303
  so it's fast and thread safe.
154
304
  test_files: []
@@ -1,227 +0,0 @@
1
- # encoding: utf-8
2
- require "json-rpc-objects/generic/object"
3
- require "qrpc/protocol/qrpc-object"
4
- require "base64"
5
-
6
- ##
7
- # General QRPC module.
8
- #
9
-
10
- module QRPC
11
-
12
- ##
13
- # JSON RPC helper module.
14
- # @since 0.2.0
15
- #
16
-
17
- module Protocol
18
-
19
- ##
20
- # Exception data QRPC JSON-RPC object.
21
- # @since 0.2.0
22
- #
23
-
24
- class ExceptionData < JsonRpcObjects::Generic::Object
25
-
26
- ##
27
- # Holds JSON-RPC version indication.
28
- #
29
-
30
- VERSION = QRPC::Protocol::QrpcObject::VERSION
31
-
32
- ##
33
- # Holds exception name.
34
- # @return [Symbol]
35
- #
36
-
37
- attr_accessor :name
38
- @name
39
-
40
- ##
41
- # Holds exception message.
42
- # @return [String]
43
- #
44
-
45
- attr_accessor :message
46
- @message
47
-
48
- ##
49
- # Holds backtrace. See readme for structure details.
50
- # @return [Array]
51
- #
52
-
53
- attr_accessor :backtrace
54
- @backtrace
55
-
56
- ##
57
- # Holds native dump. See readme for structure details.
58
- # @return [Class]
59
- #
60
-
61
- attr_accessor :dump
62
- @dump
63
-
64
- ##
65
- # Indicates, data are encoded and should be decoded.
66
- #
67
-
68
- @__encoded
69
-
70
- ##
71
- # Creates new QRPC JSON-RPC object.
72
- #
73
- # @overload create(exception, nil, opts = { })
74
- # Creates from exception.
75
- # @param [Exception] exception exception object
76
- # @param [NilClass] nil (not applicable)
77
- # @param [Hash] opts optional members of object
78
- # @overload create(name, message, opts = { })
79
- # Creates from exception description.
80
- # @param [Symbol, String] name exception name
81
- # @param [Object] exception message
82
- # @param [Hash] opts optional members of object
83
- # @return [QRPC::Protocol::ExceptionData] new instance
84
- #
85
-
86
- def self.create(arg1, message = nil, opts = { })
87
- if arg1.kind_of? ::Exception
88
- mode = :decoded
89
- data = {
90
- :name => arg1.class.name,
91
- :message => arg1.message,
92
- :backtrace => arg1.backtrace,
93
- :dump => {
94
- "format" => "ruby",
95
- "object" => arg1
96
- }
97
- }
98
- else
99
- mode = :encoded
100
- data = {
101
- :name => arg1,
102
- :message => message
103
- }
104
- end
105
-
106
- data.merge! opts
107
- return self::new(data, mode)
108
- end
109
-
110
- ##
111
- # Constructor.
112
- # @param [Hash] data for initializing the object
113
- #
114
-
115
- def initialize(data, mode = :encoded)
116
- @__encoded = (mode == :encoded)
117
- super(data)
118
- end
119
-
120
- ##
121
- # Checks correctness of the object data.
122
- #
123
-
124
- def check!
125
- self.normalize!
126
-
127
- if not @name.kind_of? Symbol
128
- raise Exception::new("Exception name is expected to be Symbol or convertable to symbol.")
129
- end
130
-
131
- if not @backtrace.nil? and not @backtrace.kind_of? Array
132
- raise Exception::new("Backtrace is expected to be an Array.")
133
- end
134
-
135
- if not @dump.nil?
136
- if @dump.object.nil? and @dump.raw.nil?
137
- raise Exception::new("Either object or RAW form of the dump must be set if dump is set.")
138
- elsif @dump.format.nil? or not @dump.format.kind_of? Symbol
139
- raise Exception::new("Dump format must be set and must be Symbol.")
140
- end
141
- end
142
- end
143
-
144
- ##
145
- # Renders data to output form.
146
- # @return [Hash] with data of object
147
- #
148
-
149
- def output
150
- result = {
151
- :name => @name.to_s,
152
- :message => @message,
153
- }
154
-
155
- # Backtrace
156
- if @backtrace.kind_of? Array
157
- result[:backtrace] = @backtrace.map { |i| Base64.encode64(i) }
158
- end
159
-
160
- # Dump
161
- if not @dump.nil?
162
- result[:dump] = {
163
- :format => @dump.format,
164
- }
165
-
166
- if not dump.object.nil?
167
- raw = Base64.encode64(Marshal.dump(dump.object))
168
- else
169
- raw = dump.raw
170
- end
171
-
172
- result[:dump][:raw] = raw
173
- end
174
-
175
- return result
176
- end
177
-
178
-
179
- protected
180
-
181
- ##
182
- # Assigns data.
183
- #
184
-
185
- def data=(value, mode = nil)
186
- data = __convert_data(value, mode)
187
-
188
- # Required
189
- @name = data[:name]
190
- @message = data[:message]
191
-
192
- # Backtrace
193
- backtrace = data[:backtrace]
194
-
195
- if @__encoded and (backtrace.kind_of? Array)
196
- @backtrace = backtrace.map { |i| Base64.decode64(i) }
197
- end
198
-
199
- # Dump
200
- dump = data[:dump]
201
-
202
- if dump.kind_of? Hash
203
- @dump = Struct::new(:format, :raw, :object)::new(dump["format"].downcase.to_sym, dump["raw"], dump["object"])
204
-
205
- if not @dump.raw.nil? and @dump.object.nil? and (@dump.format == :ruby)
206
- @dump.object = Marshal.load(Base64.decode64(@dump.raw))
207
- end
208
- end
209
-
210
- end
211
-
212
- ##
213
- # Converts data to standard (defined) format.
214
- #
215
-
216
- def normalize!
217
- @name = @name.to_sym
218
-
219
- if not @dump.nil?
220
- @dump.format = @dump.format.to_sym
221
- end
222
- end
223
-
224
- end
225
-
226
- end
227
- end