Skip to content

Commit 90b8da9

Browse files
authored
[Feature] Allow configuring payload converter, codecs and failure converter on the client (#59)
1 parent a9238bf commit 90b8da9

File tree

7 files changed

+109
-18
lines changed

7 files changed

+109
-18
lines changed

lib/temporal/client.rb

Lines changed: 29 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
require 'json'
22
require 'securerandom'
33
require 'socket'
4-
require 'temporal/errors'
5-
require 'temporal/data_converter'
6-
require 'temporal/client/workflow_handle'
74
require 'temporal/client/implementation'
5+
require 'temporal/client/workflow_handle'
6+
require 'temporal/data_converter'
7+
require 'temporal/errors'
8+
require 'temporal/failure_converter'
9+
require 'temporal/payload_converter'
810
require 'temporal/workflow/id_reuse_policy'
911

1012
module Temporal
@@ -18,9 +20,31 @@ class Client
1820
# @param namespace [String] Namespace to use for client calls.
1921
# @param interceptors [Array<Temporal::Interceptor::Client>] List of interceptors for
2022
# intercepting client calls. Executed in their original order.
21-
def initialize(connection, namespace, interceptors: [])
23+
# @param payload_converter [Temporal::PayloadConverter::Base] A custom payload converter for
24+
# converting Ruby values to/from protos. See {Temporal::PayloadConverter::Base} for the
25+
# interface definition.
26+
# @param payload_codecs [Array<Temporal::PayloadCodec::Base>] A list of payload codecs to
27+
# transform payload protos. See {Temporal::PayloadCodec::Base} for the interface definition.
28+
# @param failure_converter [Temporal::FailureConverter::Base] A custom failure converter for
29+
# converting Exceptions to/from protos. See {Temporal::FailureConverter::Base} for the
30+
# interface definition.
31+
#
32+
# @see https://docs.temporal.io/concepts/what-is-a-data-converter for more information on
33+
# payload converters and codecs.
34+
def initialize(
35+
connection,
36+
namespace,
37+
interceptors: [],
38+
payload_converter: Temporal::PayloadConverter::DEFAULT,
39+
payload_codecs: [],
40+
failure_converter: Temporal::FailureConverter::DEFAULT
41+
)
2242
@namespace = namespace
23-
data_converter = DataConverter.new
43+
data_converter = DataConverter.new(
44+
payload_converter: payload_converter,
45+
payload_codecs: payload_codecs,
46+
failure_converter: failure_converter,
47+
)
2448
@implementation = Client::Implementation.new(connection, namespace, data_converter, interceptors)
2549
end
2650

lib/temporal/data_converter.rb

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
require 'temporal/api/common/v1/message_pb'
22
require 'temporal/errors'
3-
require 'temporal/payload_converter'
4-
require 'temporal/failure_converter'
53

64
module Temporal
75
class DataConverter
86
class MissingPayload < Temporal::Error; end
97

10-
def initialize(
11-
payload_converter: Temporal::PayloadConverter::DEFAULT,
12-
payload_codecs: [],
13-
failure_converter: Temporal::FailureConverter::DEFAULT
14-
)
8+
def initialize(payload_converter:, payload_codecs:, failure_converter:)
159
@payload_converter = payload_converter
1610
@payload_codecs = payload_codecs
1711
@failure_converter = failure_converter

sig/temporal/client.rbs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ module Temporal
55
def initialize: (
66
Temporal::Connection connection,
77
String | Symbol namespace,
8-
?interceptors: Array[Temporal::Interceptor::Client]
8+
?interceptors: Array[Temporal::Interceptor::Client],
9+
?payload_converter: Temporal::PayloadConverter::_PayloadConverter,
10+
?payload_codecs: Array[Temporal::PayloadCodec::_PayloadCodec],
11+
?failure_converter: Temporal::FailureConverter::_FailureConverter
912
) -> void
1013
def start_workflow: (
1114
String workflow,

sig/temporal/data_converter.rbs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ module Temporal
44
end
55

66
def initialize: (
7-
?payload_converter: Temporal::PayloadConverter::_PayloadConverter,
8-
?payload_codecs: Array[Temporal::PayloadCodec::_PayloadCodec],
9-
?failure_converter: Temporal::FailureConverter::_FailureConverter,
7+
payload_converter: Temporal::PayloadConverter::_PayloadConverter,
8+
payload_codecs: Array[Temporal::PayloadCodec::_PayloadCodec],
9+
failure_converter: Temporal::FailureConverter::_FailureConverter,
1010
) -> void
1111
def to_payloads: (Array[untyped]? data) -> Temporal::Api::Common::V1::Payloads?
1212
def to_payload_map: (Hash[String | Symbol, untyped] data) -> Hash[String, Temporal::Api::Common::V1::Payload]

spec/unit/temporal/client/implementation_spec.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,21 @@
66
require 'temporal/connection'
77
require 'temporal/data_converter'
88
require 'temporal/errors'
9+
require 'temporal/failure_converter'
10+
require 'temporal/payload_converter'
911

1012
describe Temporal::Client::Implementation do
1113
subject { described_class.new(connection, namespace, converter, interceptors) }
1214

1315
let(:connection) { instance_double(Temporal::Connection) }
1416
let(:namespace) { 'test-namespace' }
15-
let(:converter) { Temporal::DataConverter.new }
17+
let(:converter) do
18+
Temporal::DataConverter.new(
19+
payload_converter: Temporal::PayloadConverter::DEFAULT,
20+
payload_codecs: [],
21+
failure_converter: Temporal::FailureConverter::DEFAULT,
22+
)
23+
end
1624
let(:interceptors) { [] }
1725
let(:id) { SecureRandom.uuid }
1826
let(:run_id) { SecureRandom.uuid }

spec/unit/temporal/client_spec.rb

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
require 'temporal/client/workflow_handle'
55
require 'temporal/connection'
66
require 'temporal/data_converter'
7+
require 'temporal/failure_converter'
8+
require 'temporal/payload_codec/base'
9+
require 'temporal/payload_converter'
710
require 'temporal/retry_policy'
811

912
describe Temporal::Client do
@@ -24,6 +27,57 @@
2427
.and_return(client_impl)
2528
end
2629

30+
describe '#initialize' do
31+
before { allow(Temporal::DataConverter).to receive(:new).and_call_original }
32+
33+
context 'with a custom payload converter' do
34+
let(:payload_converter) { instance_double(Temporal::PayloadConverter::Base) }
35+
36+
it 'passes it to a data converter' do
37+
described_class.new(connection, namespace, payload_converter: payload_converter)
38+
39+
expect(Temporal::DataConverter).to have_received(:new).with(
40+
payload_converter: payload_converter,
41+
payload_codecs: [],
42+
failure_converter: Temporal::FailureConverter::DEFAULT,
43+
)
44+
end
45+
end
46+
47+
context 'with custom payload codecs' do
48+
let(:payload_codecs) do
49+
[
50+
instance_double(Temporal::PayloadCodec::Base),
51+
instance_double(Temporal::PayloadCodec::Base),
52+
]
53+
end
54+
55+
it 'passes it to a data converter' do
56+
described_class.new(connection, namespace, payload_codecs: payload_codecs)
57+
58+
expect(Temporal::DataConverter).to have_received(:new).with(
59+
payload_converter: Temporal::PayloadConverter::DEFAULT,
60+
payload_codecs: payload_codecs,
61+
failure_converter: Temporal::FailureConverter::DEFAULT,
62+
)
63+
end
64+
end
65+
66+
context 'with a custom failure converter' do
67+
let(:failure_converter) { instance_double(Temporal::FailureConverter::Base) }
68+
69+
it 'passes it to a data converter' do
70+
described_class.new(connection, namespace, failure_converter: failure_converter)
71+
72+
expect(Temporal::DataConverter).to have_received(:new).with(
73+
payload_converter: Temporal::PayloadConverter::DEFAULT,
74+
payload_codecs: [],
75+
failure_converter: failure_converter,
76+
)
77+
end
78+
end
79+
end
80+
2781
describe '#start_workflow' do
2882
let(:handle) do
2983
Temporal::Client::WorkflowHandle.new(

spec/unit/temporal/workflow/execution_info_spec.rb

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,21 @@
11
require 'securerandom'
22
require 'temporal/api/workflowservice/v1/request_response_pb'
33
require 'temporal/data_converter'
4+
require 'temporal/failure_converter'
5+
require 'temporal/payload_converter'
46
require 'temporal/workflow/execution_info'
57
require 'temporal/workflow/execution_status'
68

79
describe Temporal::Workflow::ExecutionInfo do
810
subject { described_class.from_raw(proto, converter) }
911

10-
let(:converter) { Temporal::DataConverter.new }
12+
let(:converter) do
13+
Temporal::DataConverter.new(
14+
payload_converter: Temporal::PayloadConverter::DEFAULT,
15+
payload_codecs: [],
16+
failure_converter: Temporal::FailureConverter::DEFAULT,
17+
)
18+
end
1119
let(:id) { SecureRandom.uuid }
1220
let(:run_id) { SecureRandom.uuid }
1321
let(:time_now) { Time.now }

0 commit comments

Comments
 (0)