eventq 2.0.0.rc1 → 2.0.0.rc2

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 (30) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +54 -24
  3. data/lib/eventq/aws.rb +1 -6
  4. data/lib/eventq/eventq_aws/aws_queue_worker.rb +17 -42
  5. data/lib/eventq/eventq_base/configuration.rb +2 -6
  6. data/lib/eventq/eventq_base/queue.rb +3 -0
  7. data/lib/eventq/eventq_base/serialization_providers.rb +2 -9
  8. data/lib/eventq/eventq_rabbitmq/rabbitmq_queue_client.rb +1 -6
  9. data/lib/eventq/eventq_rabbitmq/rabbitmq_queue_manager.rb +4 -12
  10. data/lib/eventq/eventq_rabbitmq/rabbitmq_queue_worker.rb +22 -56
  11. data/lib/eventq/queue_worker.rb +56 -1
  12. data/lib/eventq/rabbitmq.rb +2 -10
  13. metadata +19 -35
  14. data/lib/eventq/eventq_aws/README.md +0 -53
  15. data/lib/eventq/eventq_aws/jruby/aws_queue_worker.rb +0 -370
  16. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/array_writer.rb +0 -20
  17. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/attribute_writer.rb +0 -24
  18. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/class_writer.rb +0 -20
  19. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/date_time_writer.rb +0 -33
  20. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/date_writer.rb +0 -22
  21. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/hash_writer.rb +0 -18
  22. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/rational_writer.rb +0 -20
  23. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/serializer.rb +0 -17
  24. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/time_writer.rb +0 -18
  25. data/lib/eventq/eventq_base/serialization_providers/jruby/oj/value_writer.rb +0 -16
  26. data/lib/eventq/eventq_base/serialization_providers/jruby/oj.rb +0 -10
  27. data/lib/eventq/eventq_base/serialization_providers/jruby/oj_serialization_provider.rb +0 -25
  28. data/lib/eventq/eventq_base/serialization_providers/jruby.rb +0 -2
  29. data/lib/eventq/eventq_rabbitmq/README.md +0 -36
  30. data/lib/eventq/eventq_rabbitmq/jruby/rabbitmq_queue_worker.rb +0 -367
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: eventq
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0.rc1
4
+ version: 2.0.0.rc2
5
5
  platform: ruby
6
6
  authors:
7
7
  - SageOne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-07-20 00:00:00.000000000 Z
11
+ date: 2018-09-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: activesupport
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '4'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '4'
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: aws-sdk
85
99
  requirement: !ruby/object:Gem::Requirement
@@ -150,20 +164,6 @@ dependencies:
150
164
  - - ">="
151
165
  - !ruby/object:Gem::Version
152
166
  version: '0'
153
- - !ruby/object:Gem::Dependency
154
- name: activesupport
155
- requirement: !ruby/object:Gem::Requirement
156
- requirements:
157
- - - "~>"
158
- - !ruby/object:Gem::Version
159
- version: '4'
160
- type: :runtime
161
- prerelease: false
162
- version_requirements: !ruby/object:Gem::Requirement
163
- requirements:
164
- - - "~>"
165
- - !ruby/object:Gem::Version
166
- version: '4'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: oj
169
169
  requirement: !ruby/object:Gem::Requirement
@@ -192,7 +192,8 @@ dependencies:
192
192
  - - ">="
193
193
  - !ruby/object:Gem::Version
194
194
  version: '0'
195
- description: This is EventQ system
195
+ description: EventQ is a pub/sub system that uses async notifications and message
196
+ queues
196
197
  email:
197
198
  - sageone@sage.com
198
199
  executables: []
@@ -204,14 +205,12 @@ files:
204
205
  - bin/setup
205
206
  - lib/eventq.rb
206
207
  - lib/eventq/aws.rb
207
- - lib/eventq/eventq_aws/README.md
208
208
  - lib/eventq/eventq_aws/aws_eventq_client.rb
209
209
  - lib/eventq/eventq_aws/aws_queue_client.rb
210
210
  - lib/eventq/eventq_aws/aws_queue_manager.rb
211
211
  - lib/eventq/eventq_aws/aws_queue_worker.rb
212
212
  - lib/eventq/eventq_aws/aws_status_checker.rb
213
213
  - lib/eventq/eventq_aws/aws_subscription_manager.rb
214
- - lib/eventq/eventq_aws/jruby/aws_queue_worker.rb
215
214
  - lib/eventq/eventq_aws/sns.rb
216
215
  - lib/eventq/eventq_aws/sqs.rb
217
216
  - lib/eventq/eventq_base/configuration.rb
@@ -230,19 +229,6 @@ files:
230
229
  - lib/eventq/eventq_base/queue_worker_contract.rb
231
230
  - lib/eventq/eventq_base/serialization_providers.rb
232
231
  - lib/eventq/eventq_base/serialization_providers/binary_serialization_provider.rb
233
- - lib/eventq/eventq_base/serialization_providers/jruby.rb
234
- - lib/eventq/eventq_base/serialization_providers/jruby/oj.rb
235
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/array_writer.rb
236
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/attribute_writer.rb
237
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/class_writer.rb
238
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/date_time_writer.rb
239
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/date_writer.rb
240
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/hash_writer.rb
241
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/rational_writer.rb
242
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/serializer.rb
243
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/time_writer.rb
244
- - lib/eventq/eventq_base/serialization_providers/jruby/oj/value_writer.rb
245
- - lib/eventq/eventq_base/serialization_providers/jruby/oj_serialization_provider.rb
246
232
  - lib/eventq/eventq_base/serialization_providers/json_serialization_provider.rb
247
233
  - lib/eventq/eventq_base/serialization_providers/oj_serialization_provider.rb
248
234
  - lib/eventq/eventq_base/signature_providers.rb
@@ -250,9 +236,7 @@ files:
250
236
  - lib/eventq/eventq_base/subscription_manager_contract.rb
251
237
  - lib/eventq/eventq_base/version.rb
252
238
  - lib/eventq/eventq_base/worker_id.rb
253
- - lib/eventq/eventq_rabbitmq/README.md
254
239
  - lib/eventq/eventq_rabbitmq/default_queue.rb
255
- - lib/eventq/eventq_rabbitmq/jruby/rabbitmq_queue_worker.rb
256
240
  - lib/eventq/eventq_rabbitmq/rabbitmq_eventq_client.rb
257
241
  - lib/eventq/eventq_rabbitmq/rabbitmq_queue_client.rb
258
242
  - lib/eventq/eventq_rabbitmq/rabbitmq_queue_manager.rb
@@ -285,5 +269,5 @@ rubyforge_project:
285
269
  rubygems_version: 2.7.7
286
270
  signing_key:
287
271
  specification_version: 4
288
- summary: This is EventQ system
272
+ summary: EventQ is a pub/sub system that uses async notifications and message queues
289
273
  test_files: []
@@ -1,53 +0,0 @@
1
- # EventQ [AWS]
2
-
3
- Welcome to EventQ. This gem contains the AWS implementations of the EventQ framework components.
4
-
5
- ## Installation
6
-
7
- Add this line to your application:
8
-
9
- ```ruby
10
- require 'eventq/aws'
11
- ```
12
-
13
- ## Development
14
-
15
- After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
16
-
17
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
18
-
19
- ### Preparing the Docker images
20
-
21
- Run the setup script of eventq_aws to build the environment. This will create the `eventq/aws` image.
22
-
23
- $ cd script
24
- $ ./setup.sh
25
-
26
- ### Running the tests
27
-
28
- By default, the full test suite will run against the mock AWS services defined in the docker-compose.yml file.
29
-
30
- If you want to run the tests with AWS directly, you will need an AWS account. Put your credentials into the `.aws.env` file in the parent directory.
31
-
32
- $ cp ../.aws.env.template ../.aws.env
33
- $ vi ../.aws.env
34
-
35
- Run the whole test suite:
36
-
37
- $ cd script
38
- $ ./test.sh
39
-
40
- You can run the specs that don't depend on an AWS account with:
41
-
42
- $ cd script
43
- $ ./test.sh --tag ~integration
44
-
45
- ## Contributing
46
-
47
- Bug reports and pull requests are welcome on GitHub at https://github.com/sage/eventq. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
48
-
49
-
50
- ## License
51
-
52
- The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
53
-
@@ -1,370 +0,0 @@
1
- require 'java'
2
- java_import java.util.concurrent.Executors
3
- module EventQ
4
- module Amazon
5
- class QueueWorker
6
- include EventQ::WorkerId
7
-
8
- APPROXIMATE_RECEIVE_COUNT = 'ApproximateReceiveCount'.freeze
9
- MESSAGE = 'Message'.freeze
10
-
11
- attr_accessor :is_running
12
-
13
- def initialize
14
- @is_running = false
15
-
16
- @on_retry_exceeded_block = nil
17
- @on_retry_block = nil
18
- @on_error_block = nil
19
-
20
- @hash_helper = HashKit::Helper.new
21
- @serialization_provider_manager = EventQ::SerializationProviders::Manager.new
22
- @signature_provider_manager = EventQ::SignatureProviders::Manager.new
23
-
24
- @last_gc_flush = Time.now
25
- @gc_flush_interval = 10
26
-
27
- @queue_poll_wait = 10
28
- end
29
-
30
- def start(queue, options = {}, &block)
31
-
32
- EventQ.logger.info("[#{self.class}] - Preparing to start listening for messages.")
33
-
34
- configure(queue, options)
35
-
36
- if options[:client] == nil
37
- raise "[#{self.class}] - :client (QueueClient) must be specified."
38
- end
39
-
40
- raise "[#{self.class}] - Worker is already running." if running?
41
-
42
- client = options[:client]
43
- EventQ.logger.debug do
44
- "[#{self.class} #start] - Listening for messages on queue: #{queue.name}, Queue Url: #{client.sqs_helper.get_queue_url(queue)}, Queue arn: #{client.sqs_helper.get_queue_arn(queue)}"
45
- end
46
-
47
- EventQ.logger.info("[#{self.class}] - Listening for messages.")
48
-
49
- start_process(options, queue, block)
50
-
51
- return true
52
- end
53
-
54
- def start_process(options, queue, block)
55
-
56
- %w'INT TERM'.each do |sig|
57
- Signal.trap(sig) {
58
- stop
59
- exit
60
- }
61
- end
62
-
63
- @is_running = true
64
-
65
- @executor = java.util.concurrent.Executors::newFixedThreadPool @thread_count
66
-
67
- #loop through each thread count
68
- @thread_count.times do
69
-
70
- @executor.execute do
71
-
72
- client = options[:client]
73
- manager = EventQ::Amazon::QueueManager.new({ client: client })
74
-
75
- #begin the queue loop for this thread
76
- while true do
77
-
78
- #check if the worker is still allowed to run and break out of thread loop if not
79
- unless running?
80
- break
81
- end
82
-
83
- if @executor.is_shutdown
84
- break
85
- end
86
-
87
- has_message_received = thread_process_iteration(client, manager, queue, block)
88
-
89
- gc_flush
90
-
91
- if !has_message_received
92
- EventQ.logger.debug { "[#{self.class}] - No message received." }
93
- if @sleep > 0
94
- EventQ.logger.debug { "[#{self.class}] - Sleeping for #{@sleep} seconds" }
95
- sleep(@sleep)
96
- end
97
- end
98
-
99
- end
100
-
101
- end
102
-
103
- end
104
-
105
- if options.key?(:wait) && options[:wait] == true
106
- while running? do end
107
- end
108
-
109
- end
110
-
111
- def gc_flush
112
- if Time.now - last_gc_flush > @gc_flush_interval
113
- GC.start
114
- @last_gc_flush = Time.now
115
- end
116
- end
117
-
118
- def last_gc_flush
119
- @last_gc_flush
120
- end
121
-
122
- def thread_process_iteration(client, manager, queue, block)
123
- #get the queue
124
- q = manager.get_queue(queue)
125
-
126
- received = false
127
-
128
- begin
129
-
130
- #request a message from the queue
131
- response = client.sqs.receive_message({
132
- queue_url: q,
133
- max_number_of_messages: 1,
134
- wait_time_seconds: @queue_poll_wait,
135
- attribute_names: [APPROXIMATE_RECEIVE_COUNT]
136
- })
137
-
138
- #check that a message was received
139
- if response.messages.length > 0
140
- received = true
141
- begin
142
- tag_processing_thread
143
- process_message(response, client, queue, q, block)
144
- ensure
145
- untag_processing_thread
146
- end
147
-
148
- end
149
-
150
- rescue => e
151
- EventQ.log(:error, "[#{self.class}] - An unhandled error occurred. Error: #{e} | Backtrace: #{e.backtrace}")
152
- call_on_error_block(error: e)
153
- end
154
-
155
- return received
156
- end
157
-
158
- def call_on_error_block(error:, message: nil)
159
- if @on_error_block
160
- EventQ.logger.debug { "[#{self.class}] - Executing on_error block." }
161
- begin
162
- @on_error_block.call(error, message)
163
- rescue => e
164
- EventQ.logger.error("[#{self.class}] - An error occurred executing the on_error block. Error: #{e}")
165
- end
166
- else
167
- EventQ.logger.debug { "[#{self.class}] - No on_error block specified to execute." }
168
- end
169
- end
170
-
171
- def call_on_retry_exceeded_block(message)
172
- if @on_retry_exceeded_block != nil
173
- EventQ.logger.debug { "[#{self.class}] - Executing on_retry_exceeded block." }
174
- begin
175
- @on_retry_exceeded_block.call(message)
176
- rescue => e
177
- EventQ.logger.error("[#{self.class}] - An error occurred executing the on_retry_exceeded block. Error: #{e}")
178
- end
179
- else
180
- EventQ.logger.debug { "[#{self.class}] - No on_retry_exceeded block specified." }
181
- end
182
- end
183
-
184
- def call_on_retry_block(message)
185
- if @on_retry_block
186
- EventQ.logger.debug { "[#{self.class}] - Executing on_retry block." }
187
- begin
188
- @on_retry_block.call(message, abort)
189
- rescue => e
190
- EventQ.logger.error("[#{self.class}] - An error occurred executing the on_retry block. Error: #{e}")
191
- end
192
- else
193
- EventQ.logger.debug { "[#{self.class}] - No on_retry block specified." }
194
- end
195
- end
196
-
197
- def stop
198
- EventQ.logger.info("[#{self.class}] - Stopping.")
199
- @is_running = false
200
- @executor.shutdown
201
- return true
202
- end
203
-
204
- def on_retry_exceeded(&block)
205
- @retry_exceeded_block = block
206
- end
207
-
208
- def on_retry(&block)
209
- @on_retry_block = block
210
- return nil
211
- end
212
-
213
- def on_error(&block)
214
- @on_error_block = block
215
- return nil
216
- end
217
-
218
- def running?
219
- return @is_running
220
- end
221
-
222
- def deserialize_message(payload)
223
- provider = @serialization_provider_manager.get_provider(EventQ::Configuration.serialization_provider)
224
- return provider.deserialize(payload)
225
- end
226
-
227
- def serialize_message(msg)
228
- provider = @serialization_provider_manager.get_provider(EventQ::Configuration.serialization_provider)
229
- return provider.serialize(msg)
230
- end
231
-
232
- private
233
-
234
- def process_message(response, client, queue, q, block)
235
- msg = response.messages[0]
236
- retry_attempts = msg.attributes[APPROXIMATE_RECEIVE_COUNT].to_i - 1
237
-
238
- #deserialize the message payload
239
- payload = JSON.load(msg.body)
240
- message = deserialize_message(payload[MESSAGE])
241
-
242
- message_args = EventQ::MessageArgs.new(type: message.type,
243
- retry_attempts: retry_attempts,
244
- context: message.context,
245
- content_type: message.content_type)
246
-
247
- EventQ.logger.info("[#{self.class}] - Message received. Retry Attempts: #{retry_attempts}")
248
-
249
- @signature_provider_manager.validate_signature(message: message, queue: queue)
250
-
251
- if(!EventQ::NonceManager.is_allowed?(message.id))
252
- EventQ.logger.info("[#{self.class}] - Duplicate Message received. Dropping message.")
253
- client.sqs.delete_message({ queue_url: q, receipt_handle: msg.receipt_handle })
254
- return false
255
- end
256
-
257
- #begin worker block for queue message
258
- begin
259
-
260
- block.call(message.content, message_args)
261
-
262
- if message_args.abort == true
263
- EventQ.logger.info("[#{self.class}] - Message aborted.")
264
- else
265
- #accept the message as processed
266
- client.sqs.delete_message({ queue_url: q, receipt_handle: msg.receipt_handle })
267
- EventQ.logger.info("[#{self.class}] - Message acknowledged.")
268
- end
269
-
270
- rescue => e
271
- EventQ.logger.error("[#{self.class}] - An unhandled error happened while attempting to process a queue message. Error: #{e} | Backtrace: #{e.backtrace}")
272
- error = true
273
- call_on_error_block(error: e, message: message)
274
- end
275
-
276
- if message_args.abort || error
277
- EventQ::NonceManager.failed(message.id)
278
- reject_message(queue, client, msg, q, retry_attempts, message, message_args.abort)
279
- else
280
- EventQ::NonceManager.complete(message.id)
281
- end
282
-
283
- return true
284
- end
285
-
286
- def reject_message(queue, client, msg, q, retry_attempts, message, abort)
287
-
288
- if !queue.allow_retry || retry_attempts >= queue.max_retry_attempts
289
-
290
- EventQ.logger.info("[#{self.class}] - Message rejected removing from queue. Message: #{serialize_message(message)}")
291
-
292
- #remove the message from the queue so that it does not get retried again
293
- client.sqs.delete_message({ queue_url: q, receipt_handle: msg.receipt_handle })
294
-
295
- if retry_attempts >= queue.max_retry_attempts
296
-
297
- EventQ.logger.info("[#{self.class}] - Message retry attempt limit exceeded.")
298
- call_on_retry_exceeded_block(message)
299
-
300
- end
301
-
302
- elsif queue.allow_retry
303
-
304
- retry_attempts += 1
305
-
306
- EventQ.logger.info("[#{self.class}] - Message rejected requesting retry. Attempts: #{retry_attempts}")
307
-
308
- if queue.allow_retry_back_off == true
309
- EventQ.logger.debug { "[#{self.class}] - Calculating message back off retry delay. Attempts: #{retry_attempts} * Delay: #{queue.retry_delay}" }
310
- visibility_timeout = (queue.retry_delay * retry_attempts) / 1000
311
- if visibility_timeout > (queue.max_retry_delay / 1000)
312
- EventQ.logger.debug { "[#{self.class}] - Max message back off retry delay reached." }
313
- visibility_timeout = queue.max_retry_delay / 1000
314
- end
315
- else
316
- EventQ.logger.debug { "[#{self.class}] - Setting fixed retry delay for message." }
317
- visibility_timeout = queue.retry_delay / 1000
318
- end
319
-
320
- if visibility_timeout > 43200
321
- EventQ.logger.debug { "[#{self.class}] - AWS max visibility timeout of 12 hours has been exceeded. Setting message retry delay to 12 hours." }
322
- visibility_timeout = 43200
323
- end
324
-
325
- EventQ.logger.debug { "[#{self.class}] - Sending message for retry. Message TTL: #{visibility_timeout}" }
326
- client.sqs.change_message_visibility({
327
- queue_url: q, # required
328
- receipt_handle: msg.receipt_handle, # required
329
- visibility_timeout: visibility_timeout.to_s, # required
330
- })
331
-
332
- call_on_retry_block(message)
333
-
334
- end
335
-
336
- end
337
-
338
- def configure(queue, options = {})
339
-
340
- @queue = queue
341
-
342
- #default thread count
343
- @thread_count = 5
344
- if options.key?(:thread_count)
345
- @thread_count = options[:thread_count]
346
- end
347
-
348
- #default sleep time in seconds
349
- @sleep = 5
350
- if options.key?(:sleep)
351
- @sleep = options[:sleep]
352
- end
353
-
354
- if options.key?(:gc_flush_interval)
355
- @gc_flush_interval = options[:gc_flush_interval]
356
- end
357
-
358
- if options.key?(:queue_poll_wait)
359
- @queue_poll_wait = options[:queue_poll_wait]
360
- end
361
-
362
- EventQ.logger.info("[#{self.class}] - Configuring. Thread Count: #{@thread_count} | Interval Sleep: #{@sleep} | GC Flush Interval: #{@gc_flush_interval} | Queue Poll Wait: #{@queue_poll_wait}.")
363
-
364
- return true
365
-
366
- end
367
-
368
- end
369
- end
370
- end
@@ -1,20 +0,0 @@
1
- module EventQ
2
- module SerializationProviders
3
- module JRuby
4
- module Oj
5
- class ArrayWriter < AttributeWriter
6
- def valid?(obj)
7
- obj.is_a?(Array)
8
- end
9
- def exec(obj)
10
- array = []
11
- obj.each do |a|
12
- array << AttributeWriter.exec(a)
13
- end
14
- array
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,24 +0,0 @@
1
- module EventQ
2
- module SerializationProviders
3
- module JRuby
4
- module Oj
5
- class AttributeWriter
6
-
7
- def self.exec(obj)
8
- aw = descendants.detect { |a| a.new.valid?(obj) } || ClassWriter
9
- aw.new.exec(obj)
10
- end
11
-
12
- def self.descendants
13
- descendants = []
14
- ObjectSpace.each_object(singleton_class) do |k|
15
- next if k.singleton_class?
16
- descendants.unshift k unless k == self
17
- end
18
- descendants
19
- end
20
- end
21
- end
22
- end
23
- end
24
- end
@@ -1,20 +0,0 @@
1
- module EventQ
2
- module SerializationProviders
3
- module JRuby
4
- module Oj
5
- class ClassWriter < AttributeWriter
6
- def valid?(obj)
7
- false
8
- end
9
- def exec(obj)
10
- hash = { '^o': obj.class }
11
- obj.instance_variables.each do |key|
12
- hash[key[1..-1]] = AttributeWriter.exec(obj.instance_variable_get(key))
13
- end
14
- hash
15
- end
16
- end
17
- end
18
- end
19
- end
20
- end
@@ -1,33 +0,0 @@
1
- module EventQ
2
- module SerializationProviders
3
- module JRuby
4
- module Oj
5
- class DateTimeWriter < AttributeWriter
6
- def valid?(obj)
7
- obj.is_a?(DateTime)
8
- end
9
- def exec(obj)
10
- seconds = obj.strftime('%S%N')
11
- d = 1_000_000_000
12
- if seconds.start_with?('0')
13
- seconds[0] = ''
14
- d = 100_000_000
15
- end
16
-
17
- {
18
- '^O': 'DateTime',
19
- year: obj.year,
20
- month: obj.month,
21
- day: obj.day,
22
- hour: obj.hour,
23
- min: obj.min,
24
- sec: RationalWriter.new.exec(Rational(Integer(seconds), d)),
25
- offset: RationalWriter.new.exec(obj.offset),
26
- start: obj.start
27
- }
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,22 +0,0 @@
1
- module EventQ
2
- module SerializationProviders
3
- module JRuby
4
- module Oj
5
- class DateWriter < AttributeWriter
6
- def valid?(obj)
7
- obj.is_a?(Date) && !obj.is_a?(DateTime)
8
- end
9
- def exec(obj)
10
- {
11
- '^O': 'Date',
12
- year: obj.year,
13
- month: obj.month,
14
- day: obj.day,
15
- start: obj.start
16
- }
17
- end
18
- end
19
- end
20
- end
21
- end
22
- end
@@ -1,18 +0,0 @@
1
- module EventQ
2
- module SerializationProviders
3
- module JRuby
4
- module Oj
5
- class HashWriter < AttributeWriter
6
- def valid?(obj)
7
- obj.is_a?(Hash)
8
- end
9
- def exec(obj)
10
- obj.each do |key, value|
11
- obj[key] = AttributeWriter.exec(value)
12
- end
13
- end
14
- end
15
- end
16
- end
17
- end
18
- end