multiwoven-integrations 0.1.47 → 0.1.48
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.
- checksums.yaml +4 -4
- data/lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/client.rb +16 -19
- data/lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/config/catalog.json +1 -2037
- data/lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/config/spec.json +15 -9
- data/lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/schema_helper.rb +130 -0
- data/lib/multiwoven/integrations/rollout.rb +1 -1
- data/lib/multiwoven/integrations/source/salesforce_consumer_goods_cloud/client.rb +6 -120
- data/lib/multiwoven/integrations/source/salesforce_consumer_goods_cloud/schema_helper.rb +130 -0
- metadata +4 -2
data/lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/config/spec.json
CHANGED
@@ -6,26 +6,27 @@
|
|
6
6
|
"title": "Salesforce Consumer Goods Cloud",
|
7
7
|
"type": "object",
|
8
8
|
"required": [
|
9
|
-
"
|
10
|
-
"
|
11
|
-
"
|
9
|
+
"username",
|
10
|
+
"password",
|
11
|
+
"host",
|
12
|
+
"security_token",
|
12
13
|
"client_id",
|
13
14
|
"client_secret"
|
14
15
|
],
|
15
16
|
"properties": {
|
16
|
-
"
|
17
|
+
"username": {
|
17
18
|
"type": "string",
|
18
|
-
"title": "
|
19
|
+
"title": "Username",
|
19
20
|
"order": 0
|
20
21
|
},
|
21
|
-
"
|
22
|
+
"password": {
|
22
23
|
"type": "string",
|
23
|
-
"title": "
|
24
|
+
"title": "Password",
|
24
25
|
"order": 1
|
25
26
|
},
|
26
|
-
"
|
27
|
+
"host": {
|
27
28
|
"type": "string",
|
28
|
-
"title": "
|
29
|
+
"title": "Host",
|
29
30
|
"order": 2
|
30
31
|
},
|
31
32
|
"client_id": {
|
@@ -37,6 +38,11 @@
|
|
37
38
|
"type": "string",
|
38
39
|
"title": "Client Secret",
|
39
40
|
"order": 4
|
41
|
+
},
|
42
|
+
"security_token": {
|
43
|
+
"type": "string",
|
44
|
+
"title": "Security Token",
|
45
|
+
"order": 5
|
40
46
|
}
|
41
47
|
}
|
42
48
|
}
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Multiwoven
|
4
|
+
module Integrations
|
5
|
+
module Source
|
6
|
+
module SalesforceConsumerGoodsCloud
|
7
|
+
module SchemaHelper
|
8
|
+
include Core::Constants
|
9
|
+
|
10
|
+
module_function
|
11
|
+
|
12
|
+
def salesforce_field_to_json_schema_type(sf_field) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
|
13
|
+
case sf_field["type"]
|
14
|
+
when "string", "Email", "Phone", "Text", "TextArea", "TextEncrypted", "URL", "Picklist (Single)"
|
15
|
+
if sf_field["nillable"]
|
16
|
+
{ "type": %w[string null] }
|
17
|
+
else
|
18
|
+
{ "type": "string" }
|
19
|
+
end
|
20
|
+
when "double", "Currency", "Percent"
|
21
|
+
if sf_field["nillable"]
|
22
|
+
{ "type": %w[number null] }
|
23
|
+
else
|
24
|
+
{ "type": "number" }
|
25
|
+
end
|
26
|
+
when "boolean", "Checkbox"
|
27
|
+
if sf_field["nillable"]
|
28
|
+
{ "type": %w[boolean null] }
|
29
|
+
else
|
30
|
+
{ "type": "boolean" }
|
31
|
+
end
|
32
|
+
when "int", "AutoNumber"
|
33
|
+
if sf_field["nillable"]
|
34
|
+
{ "type": %w[integer null] }
|
35
|
+
else
|
36
|
+
{ "type": "integer" }
|
37
|
+
end
|
38
|
+
when "date"
|
39
|
+
if sf_field["nillable"]
|
40
|
+
{ "type": %w[string null], "format": "date" }
|
41
|
+
else
|
42
|
+
{ "type": "string", "format": "date" }
|
43
|
+
end
|
44
|
+
when "datetime", "DateTime"
|
45
|
+
if sf_field["nillable"]
|
46
|
+
{ "type": %w[string null], "format": "date-time" }
|
47
|
+
else
|
48
|
+
{ "type": "string", "format": "date-time" }
|
49
|
+
end
|
50
|
+
when "time"
|
51
|
+
if sf_field["nillable"]
|
52
|
+
{ "type": %w[string null], "format": "time" }
|
53
|
+
else
|
54
|
+
{ "type": "string", "format": "time" }
|
55
|
+
end
|
56
|
+
when "textarea", "Text Area (Long)", "Text Area (Rich)"
|
57
|
+
if sf_field["nillable"]
|
58
|
+
{ "type": %w[string null] }
|
59
|
+
else
|
60
|
+
{ "type": "string" }
|
61
|
+
end
|
62
|
+
when "picklist", "multipicklist", "Picklist (Multi-select)"
|
63
|
+
if sf_field[:picklistValues] && sf_field["nillable"]
|
64
|
+
enum_values = sf_field[:picklistValues].map { |val| val["value"] }
|
65
|
+
{ "type": %w[array null], "items": { "type": "string" }, "enum": enum_values }
|
66
|
+
elsif sf_field[:picklistValues]
|
67
|
+
enum_values = sf_field[:picklistValues].map { |val| val["value"] }
|
68
|
+
{ "type": "array", "items": { "type": "string" }, "enum": enum_values }
|
69
|
+
else
|
70
|
+
{ "type": "array", "items": { "type": "string" } }
|
71
|
+
end
|
72
|
+
when "reference", "Reference (Lookup & Master-Detail)"
|
73
|
+
if sf_field["nillable"]
|
74
|
+
{ "type": %w[string null] }
|
75
|
+
else
|
76
|
+
{ "type": "string" }
|
77
|
+
end
|
78
|
+
when "location", "Geolocation"
|
79
|
+
if sf_field["nillable"]
|
80
|
+
{ "type": %w[object null], "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } } }
|
81
|
+
else
|
82
|
+
{ "type": "object", "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } } }
|
83
|
+
end
|
84
|
+
else
|
85
|
+
if sf_field["nillable"]
|
86
|
+
{ "type": %w[string null] }
|
87
|
+
else
|
88
|
+
{ "type": "string" }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_json_schema_for_object(metadata)
|
94
|
+
fields_schema = metadata["fields"].map do |field|
|
95
|
+
{
|
96
|
+
"#{field[:name]}": salesforce_field_to_json_schema_type(field)
|
97
|
+
}
|
98
|
+
end.reduce(:merge)
|
99
|
+
|
100
|
+
json_schema = {
|
101
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
102
|
+
"title": metadata["name"],
|
103
|
+
"type": "object",
|
104
|
+
"additionalProperties": true,
|
105
|
+
"properties": fields_schema
|
106
|
+
}
|
107
|
+
|
108
|
+
required = metadata["fields"].map do |field|
|
109
|
+
field["name"] if field["nillable"] == false
|
110
|
+
end.compact
|
111
|
+
primary_key = metadata["fields"].map do |field|
|
112
|
+
field["name"] if field["nillable"] == false && field["unique"] == true
|
113
|
+
end.compact
|
114
|
+
|
115
|
+
{
|
116
|
+
"name": metadata["name"],
|
117
|
+
"action": "create",
|
118
|
+
"json_schema": json_schema,
|
119
|
+
"required": required,
|
120
|
+
"supported_sync_modes": %w[full_refresh incremental],
|
121
|
+
"source_defined_cursor": true,
|
122
|
+
"default_cursor_field": ["updated"],
|
123
|
+
"source_defined_primary_key": [primary_key]
|
124
|
+
}
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require "stringio"
|
4
|
+
require_relative "schema_helper"
|
4
5
|
|
5
6
|
module Multiwoven
|
6
7
|
module Integrations
|
@@ -9,9 +10,9 @@ module Multiwoven
|
|
9
10
|
include Multiwoven::Integrations::Core
|
10
11
|
|
11
12
|
API_VERSION = "59.0"
|
12
|
-
SALESFORCE_OBJECTS = %w[Account User Visit RetailStore].freeze
|
13
|
+
SALESFORCE_OBJECTS = %w[Account User Visit RetailStore RecordType].freeze
|
13
14
|
|
14
|
-
class Client < SourceConnector
|
15
|
+
class Client < SourceConnector
|
15
16
|
prepend Multiwoven::Integrations::Core::RateLimiter
|
16
17
|
def check_connection(connection_config)
|
17
18
|
connection_config = connection_config.with_indifferent_access
|
@@ -29,11 +30,11 @@ module Multiwoven
|
|
29
30
|
streams = catalog[:streams]
|
30
31
|
SALESFORCE_OBJECTS.each do |object|
|
31
32
|
object_description = @client.describe(object)
|
32
|
-
streams << JSON.parse(create_json_schema_for_object(object_description).to_json)
|
33
|
+
streams << JSON.parse(SchemaHelper.create_json_schema_for_object(object_description).to_json)
|
33
34
|
end
|
34
35
|
catalog.to_multiwoven_message
|
35
36
|
rescue StandardError => e
|
36
|
-
handle_exception("SALESFORCE:
|
37
|
+
handle_exception("SALESFORCE:CONSUMER:GOODS:ClOUD:DISCOVER:EXCEPTION", "error", e)
|
37
38
|
end
|
38
39
|
|
39
40
|
def read(sync_config)
|
@@ -55,7 +56,7 @@ module Multiwoven
|
|
55
56
|
RecordMessage.new(data: row, emitted_at: Time.now.to_i).to_multiwoven_message
|
56
57
|
end
|
57
58
|
rescue StandardError => e
|
58
|
-
handle_exception("SALESFORCE:
|
59
|
+
handle_exception("SALESFORCE:CONSUMER:GOODS:ClOUD:WRITE:EXCEPTION", "error", e)
|
59
60
|
end
|
60
61
|
|
61
62
|
private
|
@@ -85,121 +86,6 @@ module Multiwoven
|
|
85
86
|
api_version: API_VERSION)
|
86
87
|
end
|
87
88
|
|
88
|
-
def salesforce_field_to_json_schema_type(sf_field) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
|
89
|
-
case sf_field["type"]
|
90
|
-
when "string", "Email", "Phone", "Text", "TextArea", "TextEncrypted", "URL", "Picklist (Single)"
|
91
|
-
if sf_field["nillable"]
|
92
|
-
{ "type": %w[string null] }
|
93
|
-
else
|
94
|
-
{ "type": "string" }
|
95
|
-
end
|
96
|
-
when "double", "Currency", "Percent"
|
97
|
-
if sf_field["nillable"]
|
98
|
-
{ "type": %w[number null] }
|
99
|
-
else
|
100
|
-
{ "type": "number" }
|
101
|
-
end
|
102
|
-
when "boolean", "Checkbox"
|
103
|
-
if sf_field["nillable"]
|
104
|
-
{ "type": %w[boolean null] }
|
105
|
-
else
|
106
|
-
{ "type": "boolean" }
|
107
|
-
end
|
108
|
-
when "int", "AutoNumber"
|
109
|
-
if sf_field["nillable"]
|
110
|
-
{ "type": %w[integer null] }
|
111
|
-
else
|
112
|
-
{ "type": "integer" }
|
113
|
-
end
|
114
|
-
when "date"
|
115
|
-
if sf_field["nillable"]
|
116
|
-
{ "type": %w[string null], "format": "date" }
|
117
|
-
else
|
118
|
-
{ "type": "string", "format": "date" }
|
119
|
-
end
|
120
|
-
when "datetime", "DateTime"
|
121
|
-
if sf_field["nillable"]
|
122
|
-
{ "type": %w[string null], "format": "date-time" }
|
123
|
-
else
|
124
|
-
{ "type": "string", "format": "date-time" }
|
125
|
-
end
|
126
|
-
when "time"
|
127
|
-
if sf_field["nillable"]
|
128
|
-
{ "type": %w[string null], "format": "time" }
|
129
|
-
else
|
130
|
-
{ "type": "string", "format": "time" }
|
131
|
-
end
|
132
|
-
when "textarea", "Text Area (Long)", "Text Area (Rich)"
|
133
|
-
if sf_field["nillable"]
|
134
|
-
{ "type": %w[string null] }
|
135
|
-
else
|
136
|
-
{ "type": "string" }
|
137
|
-
end
|
138
|
-
when "picklist", "multipicklist", "Picklist (Multi-select)"
|
139
|
-
if sf_field[:picklistValues] && sf_field["nillable"]
|
140
|
-
enum_values = sf_field[:picklistValues].map { |val| val["value"] }
|
141
|
-
{ "type": %w[array null], "items": { "type": "string" }, "enum": enum_values }
|
142
|
-
elsif sf_field[:picklistValues]
|
143
|
-
enum_values = sf_field[:picklistValues].map { |val| val["value"] }
|
144
|
-
{ "type": "array", "items": { "type": "string" }, "enum": enum_values }
|
145
|
-
else
|
146
|
-
{ "type": "array", "items": { "type": "string" } }
|
147
|
-
end
|
148
|
-
when "reference", "Reference (Lookup & Master-Detail)"
|
149
|
-
if sf_field["nillable"]
|
150
|
-
{ "type": %w[string null] }
|
151
|
-
else
|
152
|
-
{ "type": "string" }
|
153
|
-
end
|
154
|
-
when "location", "Geolocation"
|
155
|
-
if sf_field["nillable"]
|
156
|
-
{ "type": %w[object null], "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } } }
|
157
|
-
else
|
158
|
-
{ "type": "object", "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } } }
|
159
|
-
end
|
160
|
-
else
|
161
|
-
if sf_field["nillable"]
|
162
|
-
{ "type": %w[string null] }
|
163
|
-
else
|
164
|
-
{ "type": "string" }
|
165
|
-
end
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def create_json_schema_for_object(metadata)
|
170
|
-
fields_schema = metadata["fields"].map do |field|
|
171
|
-
{
|
172
|
-
"#{field[:name]}": salesforce_field_to_json_schema_type(field)
|
173
|
-
}
|
174
|
-
end.reduce(:merge)
|
175
|
-
|
176
|
-
json_schema = {
|
177
|
-
"$schema": "http://json-schema.org/draft-07/schema#",
|
178
|
-
"title": metadata["name"],
|
179
|
-
"type": "object",
|
180
|
-
"additionalProperties": true,
|
181
|
-
"properties": fields_schema
|
182
|
-
}
|
183
|
-
|
184
|
-
required = metadata["fields"].map do |field|
|
185
|
-
field["name"] if field["nillable"] == false
|
186
|
-
end.compact
|
187
|
-
primary_key = metadata["fields"].map do |field|
|
188
|
-
field["name"] if field["nillable"] == false && field["unique"] == true
|
189
|
-
end.compact
|
190
|
-
|
191
|
-
{
|
192
|
-
"name": metadata["name"],
|
193
|
-
"action": "create",
|
194
|
-
"json_schema": json_schema,
|
195
|
-
"required": required,
|
196
|
-
"supported_sync_modes": %w[full_refresh incremental],
|
197
|
-
"source_defined_cursor": true,
|
198
|
-
"default_cursor_field": ["updated"],
|
199
|
-
"source_defined_primary_key": [primary_key]
|
200
|
-
}
|
201
|
-
end
|
202
|
-
|
203
89
|
def authenticate_client
|
204
90
|
@client.authenticate!
|
205
91
|
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Multiwoven
|
4
|
+
module Integrations
|
5
|
+
module Destination
|
6
|
+
module SalesforceConsumerGoodsCloud
|
7
|
+
module SchemaHelper
|
8
|
+
include Core::Constants
|
9
|
+
|
10
|
+
module_function
|
11
|
+
|
12
|
+
def salesforce_field_to_json_schema_type(sf_field) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength, Metrics/PerceivedComplexity
|
13
|
+
case sf_field["type"]
|
14
|
+
when "string", "Email", "Phone", "Text", "TextArea", "TextEncrypted", "URL", "Picklist (Single)"
|
15
|
+
if sf_field["nillable"]
|
16
|
+
{ "type": %w[string null] }
|
17
|
+
else
|
18
|
+
{ "type": "string" }
|
19
|
+
end
|
20
|
+
when "double", "Currency", "Percent"
|
21
|
+
if sf_field["nillable"]
|
22
|
+
{ "type": %w[number null] }
|
23
|
+
else
|
24
|
+
{ "type": "number" }
|
25
|
+
end
|
26
|
+
when "boolean", "Checkbox"
|
27
|
+
if sf_field["nillable"]
|
28
|
+
{ "type": %w[boolean null] }
|
29
|
+
else
|
30
|
+
{ "type": "boolean" }
|
31
|
+
end
|
32
|
+
when "int", "AutoNumber"
|
33
|
+
if sf_field["nillable"]
|
34
|
+
{ "type": %w[integer null] }
|
35
|
+
else
|
36
|
+
{ "type": "integer" }
|
37
|
+
end
|
38
|
+
when "date"
|
39
|
+
if sf_field["nillable"]
|
40
|
+
{ "type": %w[string null], "format": "date" }
|
41
|
+
else
|
42
|
+
{ "type": "string", "format": "date" }
|
43
|
+
end
|
44
|
+
when "datetime", "DateTime"
|
45
|
+
if sf_field["nillable"]
|
46
|
+
{ "type": %w[string null], "format": "date-time" }
|
47
|
+
else
|
48
|
+
{ "type": "string", "format": "date-time" }
|
49
|
+
end
|
50
|
+
when "time"
|
51
|
+
if sf_field["nillable"]
|
52
|
+
{ "type": %w[string null], "format": "time" }
|
53
|
+
else
|
54
|
+
{ "type": "string", "format": "time" }
|
55
|
+
end
|
56
|
+
when "textarea", "Text Area (Long)", "Text Area (Rich)"
|
57
|
+
if sf_field["nillable"]
|
58
|
+
{ "type": %w[string null] }
|
59
|
+
else
|
60
|
+
{ "type": "string" }
|
61
|
+
end
|
62
|
+
when "picklist", "multipicklist", "Picklist (Multi-select)"
|
63
|
+
if sf_field[:picklistValues] && sf_field["nillable"]
|
64
|
+
enum_values = sf_field[:picklistValues].map { |val| val["value"] }
|
65
|
+
{ "type": %w[array null], "items": { "type": "string" }, "enum": enum_values }
|
66
|
+
elsif sf_field[:picklistValues]
|
67
|
+
enum_values = sf_field[:picklistValues].map { |val| val["value"] }
|
68
|
+
{ "type": "array", "items": { "type": "string" }, "enum": enum_values }
|
69
|
+
else
|
70
|
+
{ "type": "array", "items": { "type": "string" } }
|
71
|
+
end
|
72
|
+
when "reference", "Reference (Lookup & Master-Detail)"
|
73
|
+
if sf_field["nillable"]
|
74
|
+
{ "type": %w[string null] }
|
75
|
+
else
|
76
|
+
{ "type": "string" }
|
77
|
+
end
|
78
|
+
when "location", "Geolocation"
|
79
|
+
if sf_field["nillable"]
|
80
|
+
{ "type": %w[object null], "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } } }
|
81
|
+
else
|
82
|
+
{ "type": "object", "properties": { "latitude": { "type": "number" }, "longitude": { "type": "number" } } }
|
83
|
+
end
|
84
|
+
else
|
85
|
+
if sf_field["nillable"]
|
86
|
+
{ "type": %w[string null] }
|
87
|
+
else
|
88
|
+
{ "type": "string" }
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_json_schema_for_object(metadata)
|
94
|
+
fields_schema = metadata["fields"].map do |field|
|
95
|
+
{
|
96
|
+
"#{field[:name]}": salesforce_field_to_json_schema_type(field)
|
97
|
+
}
|
98
|
+
end.reduce(:merge)
|
99
|
+
|
100
|
+
json_schema = {
|
101
|
+
"$schema": "http://json-schema.org/draft-07/schema#",
|
102
|
+
"title": metadata["name"],
|
103
|
+
"type": "object",
|
104
|
+
"additionalProperties": true,
|
105
|
+
"properties": fields_schema
|
106
|
+
}
|
107
|
+
|
108
|
+
required = metadata["fields"].map do |field|
|
109
|
+
field["name"] if field["nillable"] == false
|
110
|
+
end.compact
|
111
|
+
primary_key = metadata["fields"].map do |field|
|
112
|
+
field["name"] if field["nillable"] == false && field["unique"] == true
|
113
|
+
end.compact
|
114
|
+
|
115
|
+
{
|
116
|
+
"name": metadata["name"],
|
117
|
+
"action": "create",
|
118
|
+
"json_schema": json_schema,
|
119
|
+
"required": required,
|
120
|
+
"supported_sync_modes": %w[full_refresh incremental],
|
121
|
+
"source_defined_cursor": true,
|
122
|
+
"default_cursor_field": ["updated"],
|
123
|
+
"source_defined_primary_key": [primary_key]
|
124
|
+
}
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: multiwoven-integrations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.48
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Subin T P
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-03-
|
11
|
+
date: 2024-03-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -423,6 +423,7 @@ files:
|
|
423
423
|
- lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/config/meta.json
|
424
424
|
- lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/config/spec.json
|
425
425
|
- lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/icon.svg
|
426
|
+
- lib/multiwoven/integrations/destination/salesforce_consumer_goods_cloud/schema_helper.rb
|
426
427
|
- lib/multiwoven/integrations/destination/salesforce_crm/client.rb
|
427
428
|
- lib/multiwoven/integrations/destination/salesforce_crm/config/catalog.json
|
428
429
|
- lib/multiwoven/integrations/destination/salesforce_crm/config/meta.json
|
@@ -468,6 +469,7 @@ files:
|
|
468
469
|
- lib/multiwoven/integrations/source/salesforce_consumer_goods_cloud/config/meta.json
|
469
470
|
- lib/multiwoven/integrations/source/salesforce_consumer_goods_cloud/config/spec.json
|
470
471
|
- lib/multiwoven/integrations/source/salesforce_consumer_goods_cloud/icon.svg
|
472
|
+
- lib/multiwoven/integrations/source/salesforce_consumer_goods_cloud/schema_helper.rb
|
471
473
|
- lib/multiwoven/integrations/source/snowflake/client.rb
|
472
474
|
- lib/multiwoven/integrations/source/snowflake/config/meta.json
|
473
475
|
- lib/multiwoven/integrations/source/snowflake/config/spec.json
|