qrpc 0.4.0 → 0.9.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.
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