acidic_job 1.0.0.pre26 → 1.0.0.pre27

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 12ef46783f7518f53f6f92384087761abecfa81576e72c6c9f8facdec94182a3
4
- data.tar.gz: c39ab11338a29020c6700d7cb9707b0ac9a28a7971f9125247cfbb35eee06b21
3
+ metadata.gz: 2b41d1bacc6dc699e4e70e38c535795039f7dbfd5ed4b7ea3671809d7658fc5d
4
+ data.tar.gz: 53641ee78275b54defdae3ab1c4ca0087d6e193009c0d3df758114019a5a3efb
5
5
  SHA512:
6
- metadata.gz: 4560e80dbfcac6f59efee5cae6236e430cae66ef54928e0f8258180752fdbc78161b421e39d9df46cdc67a528b170589d08db78a609ad52d263cae3b63387c8d
7
- data.tar.gz: 8c23139c2f27dda273bb504a13d45afcf60e5ffec1ad9351cbf984da0ffb2de399cc693f0f98d1edbb053f1b62e2d0a46ba9bac6baa3c43a9d8dd2458cb79eb5
6
+ metadata.gz: d383cde62b69a013979df927ff64d1c99ff591261a103b3694733f65f0fa0d44c1216bf3b7e8638b746a59754efbc32afd410c9039bda9f88a89926e552ee1d9
7
+ data.tar.gz: ced115b0b7607c60b48a51d2fd4e2db6442fd0daa44b2a9b648a1ced7598ca3e0f05dd8894359ed163c27287146769d37aebe9e464c989e46ebabfa6ba07d41d
data/.gitignore CHANGED
@@ -12,3 +12,5 @@ slides.md
12
12
  /test/dummy
13
13
  /test/log
14
14
  /database.sqlite
15
+ /test/combustion/log/test.log
16
+ /test/combustion/database.sqlite
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- acidic_job (1.0.0.pre26)
4
+ acidic_job (1.0.0.pre27)
5
5
  activerecord
6
6
  activesupport
7
7
  database_cleaner
@@ -47,7 +47,7 @@ module AcidicJob
47
47
  arguments = args || @args
48
48
  arguments += [kwargs] unless kwargs.empty?
49
49
  normalized_args = ::Sidekiq.load_json(::Sidekiq.dump_json(arguments))
50
- item = { "class" => self.class, "args" => normalized_args, "jid" => jid }
50
+ item = { "class" => self.class.name, "args" => normalized_args, "jid" => jid }
51
51
  sidekiq_options = sidekiq_options_hash || {}
52
52
 
53
53
  sidekiq_options.merge(item)
@@ -3,6 +3,7 @@
3
3
  require "active_record"
4
4
  require "global_id"
5
5
  require "active_support/core_ext/object/with_options"
6
+ require_relative "./serializer"
6
7
 
7
8
  module AcidicJob
8
9
  class Run < ActiveRecord::Base
@@ -17,11 +18,11 @@ module AcidicJob
17
18
 
18
19
  after_create_commit :enqueue_staged_job, if: :staged?
19
20
 
20
- serialize :error_object
21
- serialize :serialized_job
22
- serialize :workflow
23
- serialize :returning_to
24
- store :attr_accessors
21
+ serialize :serialized_job, JSON
22
+ serialize :error_object, Serializer
23
+ serialize :workflow, Serializer
24
+ serialize :returning_to, Serializer
25
+ store :attr_accessors, coder: Serializer
25
26
 
26
27
  validates :staged, inclusion: { in: [true, false] } # uses database default
27
28
  validates :serialized_job, presence: true
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_job/serializers"
4
+ require "active_job/arguments"
5
+ require "json"
6
+
7
+ class WorkerSerializer < ActiveJob::Serializers::ObjectSerializer
8
+ def serialize(worker)
9
+ # {"_aj_serialized"=>"WorkerSerializer", "class"=>"SuccessfulArgWorker", "args"=>[123], "kwargs"=>{}}]
10
+ super(
11
+ "class" => worker.class.name,
12
+ "args" => worker.instance_variable_get(:@__acidic_job_args),
13
+ "kwargs" => worker.instance_variable_get(:@__acidic_job_kwargs)
14
+ )
15
+ end
16
+
17
+ def deserialize(hash)
18
+ worker_class = hash["class"].constantize
19
+ worker_class.new(*hash["args"], **hash["kwargs"])
20
+ end
21
+
22
+ def serialize?(argument)
23
+ defined?(Sidekiq) && argument.class.include?(Sidekiq::Worker)
24
+ end
25
+ end
26
+
27
+ class ExceptionSerializer < ActiveJob::Serializers::ObjectSerializer
28
+ def serialize(exception)
29
+ hash = {
30
+ "class" => exception.class.name,
31
+ "message" => exception.message,
32
+ "cause" => exception.cause,
33
+ "backtrace" => {}
34
+ }
35
+
36
+ exception.backtrace.map do |trace|
37
+ path, _, location = trace.rpartition("/")
38
+
39
+ next if hash["backtrace"].key?(path)
40
+
41
+ hash["backtrace"][path] = location
42
+ end
43
+
44
+ super(hash)
45
+ end
46
+
47
+ def deserialize(hash)
48
+ exception_class = hash["class"].constantize
49
+ exception = exception_class.new(hash["message"])
50
+ exception.set_backtrace(hash["backtrace"].map do |path, location|
51
+ [path, location].join("/")
52
+ end)
53
+ exception
54
+ end
55
+
56
+ def serialize?(argument)
57
+ defined?(Exception) && argument.is_a?(Exception)
58
+ end
59
+ end
60
+
61
+ class FinishedPointSerializer < ActiveJob::Serializers::ObjectSerializer
62
+ def serialize(finished_point)
63
+ super(
64
+ "class" => finished_point.class.name
65
+ )
66
+ end
67
+
68
+ def deserialize(hash)
69
+ finished_point_class = hash["class"].constantize
70
+ finished_point_class.new
71
+ end
72
+
73
+ def serialize?(argument)
74
+ defined?(::AcidicJob::FinishedPoint) && argument.is_a?(::AcidicJob::FinishedPoint)
75
+ end
76
+ end
77
+
78
+ class RecoveryPointSerializer < ActiveJob::Serializers::ObjectSerializer
79
+ def serialize(recovery_point)
80
+ super(
81
+ "class" => recovery_point.class.name,
82
+ "name" => recovery_point.name
83
+ )
84
+ end
85
+
86
+ def deserialize(hash)
87
+ recovery_point_class = hash["class"].constantize
88
+ recovery_point_class.new(hash["name"])
89
+ end
90
+
91
+ def serialize?(argument)
92
+ defined?(::AcidicJob::RecoveryPoint) && argument.is_a?(::AcidicJob::RecoveryPoint)
93
+ end
94
+ end
95
+
96
+ ActiveJob::Serializers.add_serializers WorkerSerializer, ExceptionSerializer, FinishedPointSerializer,
97
+ RecoveryPointSerializer
98
+
99
+ # ...
100
+ module AcidicJob
101
+ module Arguments
102
+ include ActiveJob::Arguments
103
+ extend self # rubocop:disable Style/ModuleFunction
104
+
105
+ # `ActiveJob` will throw an error if it tries to deserialize a GlobalID record.
106
+ # However, this isn't the behavior that we want for our custom `ActiveRecord` serializer.
107
+ # Since `ActiveRecord` does _not_ reset instance record state to its pre-transactional state
108
+ # on a transaction ROLLBACK, we can have GlobalID entries in a serialized column that point to
109
+ # non-persisted records. This is ok. We should simply return `nil` for that portion of the
110
+ # serialized field.
111
+ def deserialize_global_id(hash)
112
+ GlobalID::Locator.locate hash[GLOBALID_KEY]
113
+ rescue ActiveRecord::RecordNotFound
114
+ nil
115
+ end
116
+ end
117
+
118
+ class Serializer
119
+ # Used for `serialize` method in ActiveRecord
120
+ class << self
121
+ def load(json)
122
+ return if json.nil? || json.empty?
123
+
124
+ data = JSON.parse(json)
125
+ Arguments.deserialize(data).first
126
+ end
127
+
128
+ def dump(obj)
129
+ data = Arguments.serialize [obj]
130
+ data.to_json
131
+ end
132
+ end
133
+ end
134
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module AcidicJob
4
- VERSION = "1.0.0.pre26"
4
+ VERSION = "1.0.0.pre27"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: acidic_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.pre26
4
+ version: 1.0.0.pre27
5
5
  platform: ruby
6
6
  authors:
7
7
  - fractaledmind
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-07-20 00:00:00.000000000 Z
11
+ date: 2022-07-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -300,6 +300,7 @@ files:
300
300
  - lib/acidic_job/recovery_point.rb
301
301
  - lib/acidic_job/rspec_configuration.rb
302
302
  - lib/acidic_job/run.rb
303
+ - lib/acidic_job/serializer.rb
303
304
  - lib/acidic_job/staging.rb
304
305
  - lib/acidic_job/step.rb
305
306
  - lib/acidic_job/test_case.rb