razorrisk-razor-connectivity 0.14.10
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Rakefile +89 -0
- data/lib/razor_risk/razor/connectivity/clarite_2/config_maker.rb +162 -0
- data/lib/razor_risk/razor/connectivity/exceptions.rb +101 -0
- data/lib/razor_risk/razor/connectivity/razor_3/body_maker.rb +126 -0
- data/lib/razor_risk/razor/connectivity/razor_3/header_maker.rb +273 -0
- data/lib/razor_risk/razor/connectivity/razor_3/message_map.rb +156 -0
- data/lib/razor_risk/razor/connectivity/razor_3/razor_requester.rb +559 -0
- data/lib/razor_risk/razor/connectivity/razor_3/response.rb +224 -0
- data/lib/razor_risk/razor/connectivity/razor_3.rb +5 -0
- data/lib/razor_risk/razor/connectivity/version.rb +40 -0
- data/test/bin/razor_request_exe_empty_response.rb +28 -0
- data/test/unit/connectivity/clarite_2/tc_config_maker.rb +399 -0
- data/test/unit/connectivity/razor_3/tc_body_maker.rb +164 -0
- data/test/unit/connectivity/razor_3/tc_header_maker.rb +652 -0
- data/test/unit/connectivity/razor_3/tc_message_map.rb +125 -0
- data/test/unit/connectivity/razor_3/tc_razor_requester.rb +244 -0
- data/test/unit/connectivity/razor_3/tc_razor_requester_executable.rb +176 -0
- data/test/unit/connectivity/razor_3/tc_response.rb +239 -0
- metadata +158 -0
@@ -0,0 +1,273 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# ######################################################################## #
|
4
|
+
# File: lib/razor_risk/razor/connectivity/razor_3/header_maker.rb
|
5
|
+
#
|
6
|
+
# Purpose: ::RazorRisk::Razor::Connectivity::Razor3::HeaderMaker class
|
7
|
+
#
|
8
|
+
# Created: 26th July 2017
|
9
|
+
# Updated: 24th August 2018
|
10
|
+
#
|
11
|
+
# Author: Matthew Wilson
|
12
|
+
#
|
13
|
+
# Copyright (c) 2017-2018, Razor Risk Technologies Pty Ltd
|
14
|
+
# All rights reserved.
|
15
|
+
#
|
16
|
+
# ######################################################################## #
|
17
|
+
|
18
|
+
|
19
|
+
# ######################################################################## #
|
20
|
+
# requires
|
21
|
+
|
22
|
+
require 'pantheios'
|
23
|
+
require 'recls'
|
24
|
+
require 'xqsr3/quality/parameter_checking'
|
25
|
+
|
26
|
+
=begin
|
27
|
+
=end
|
28
|
+
|
29
|
+
module RazorRisk
|
30
|
+
module Razor
|
31
|
+
module Connectivity
|
32
|
+
module Razor3
|
33
|
+
|
34
|
+
class HeaderMaker
|
35
|
+
|
36
|
+
module HeaderMaker_Constants
|
37
|
+
|
38
|
+
def self.DefaultAttributes **options
|
39
|
+
|
40
|
+
da = {}
|
41
|
+
|
42
|
+
da[:async] = false unless options[:no_async]
|
43
|
+
da[:caller] = Recls.stat($0, Recls::DETAILS_LATER).stem unless options[:no_caller_name]
|
44
|
+
da[:callerPid] = Process.pid unless options[:no_caller_pid]
|
45
|
+
da[:callerThread] = Thread.current.object_id unless options[:no_caller_thread]
|
46
|
+
da[:replicate] = true unless options[:no_replicate]
|
47
|
+
|
48
|
+
da
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
RequestTypes_ = [ :riskQ, :razorInbound ]
|
53
|
+
public
|
54
|
+
RequestTypes = RequestTypes_ + RequestTypes_.map { |s| s.to_s }
|
55
|
+
|
56
|
+
AcceptedOptions = %w{
|
57
|
+
|
58
|
+
body
|
59
|
+
body_attributes
|
60
|
+
caller
|
61
|
+
request_mode
|
62
|
+
request_name
|
63
|
+
request_type
|
64
|
+
response_mode
|
65
|
+
return_type
|
66
|
+
server
|
67
|
+
user_id
|
68
|
+
|
69
|
+
no_async
|
70
|
+
no_caller_name
|
71
|
+
no_caller_pid
|
72
|
+
no_caller_thread
|
73
|
+
no_replicate
|
74
|
+
}.map { |s| s.to_sym }
|
75
|
+
end
|
76
|
+
|
77
|
+
include ::Pantheios
|
78
|
+
include ::Xqsr3::Quality::ParameterChecking
|
79
|
+
|
80
|
+
def initialize environment, isdodiffallow = true, **options
|
81
|
+
|
82
|
+
trace ParamNames[ :environment, :isdodiffallow, :options ], environment, isdodiffallow, options
|
83
|
+
|
84
|
+
@environment = environment
|
85
|
+
@isdodiffallow = isdodiffallow
|
86
|
+
@options = options.clone
|
87
|
+
end
|
88
|
+
|
89
|
+
attr_reader :environment
|
90
|
+
attr_reader :isdodiffallow
|
91
|
+
attr_reader :options
|
92
|
+
|
93
|
+
# See class method for explanation for options
|
94
|
+
def prepare_inbound_header **options
|
95
|
+
|
96
|
+
trace
|
97
|
+
|
98
|
+
opts = self.options.merge options
|
99
|
+
|
100
|
+
self.class.prepare_inbound_header environment, isdodiffallow, **opts
|
101
|
+
end
|
102
|
+
|
103
|
+
# Prepares a Razor inbound (XML) header, returned as either a string
|
104
|
+
# or an XML node
|
105
|
+
#
|
106
|
+
# @param environment (String) The environment name. May not be +nil+
|
107
|
+
# @param options (Hash) Options that alter the behaviour
|
108
|
+
#
|
109
|
+
# @option +:request_type+ (Symbol, String) Mandatory option that
|
110
|
+
# designates the type of the header. Currently supports the values
|
111
|
+
# +:riskQ+ and +:razorInbound+. No default
|
112
|
+
# @option +:return_type+ (Symbol, String) Determines the type of the
|
113
|
+
# return value. Must be one of { +:string+, +:string_array+, or
|
114
|
+
# +:xml+ }. Defaults to +:string+
|
115
|
+
# @option +:request+ NO LONGER SUPPORTED
|
116
|
+
# @option +:request_name+ (String, Symbol) The name of the request, e.g.
|
117
|
+
# "selectPortfolios"
|
118
|
+
# @option +:response_mode+ (String, Symbol) The response mode, e.g.
|
119
|
+
# "binary", "xml"
|
120
|
+
# @option +:body+ (::Nokogiri::XML::Element, ::String, nil) Optional
|
121
|
+
# request body. If +nil+ no <body/> element is specified. If empty an
|
122
|
+
# empty <body/> element is specified. Otherwise, the given content is
|
123
|
+
# placed within a <body> element
|
124
|
+
# @option +:body_attributes+ (Hash, nil) Optional request body
|
125
|
+
# attributes. If specified, then a <body> element will always be
|
126
|
+
# created. Current version ignores this value if +:body+ option is an
|
127
|
+
# instance of +::Nokogiri::XML::Element+
|
128
|
+
# @option +:caller+ (String, Symbol, nil) The value for the "caller"
|
129
|
+
# element in the request document node atributes
|
130
|
+
# @option +:server+ (String, Symbol, nil) The value for the "server"
|
131
|
+
# element in the request document node atributes
|
132
|
+
# @option +:no_caller_name+ (boolean) Prevents the default value for
|
133
|
+
# *callerName* from being included
|
134
|
+
# @option +:no_caller_pid+ (boolean) Prevents the default value for
|
135
|
+
# *callerPid* from being included
|
136
|
+
# @option +:no_caller_thread+ (boolean) Prevents the default value for
|
137
|
+
# *callerThread* from being included
|
138
|
+
# @option +:no_caller_version+ (boolean) Prevents the default value for
|
139
|
+
# *callerVersion* from being included
|
140
|
+
# @option +:no_replicate+ (boolean) Prevents the default value for
|
141
|
+
# *replicate* from being included
|
142
|
+
#
|
143
|
+
# @return (String, Array[String, String], Nokogiri::XML::Node) The
|
144
|
+
# inbound header, which will be a string, a pair of strings (in an
|
145
|
+
# array), or an XML node
|
146
|
+
def self.prepare_inbound_header environment, isdodiffallow = true, **options
|
147
|
+
|
148
|
+
trace ParamNames[ :environment, :isdodiffallow, :options ], environment, isdodiffallow, options
|
149
|
+
|
150
|
+
raise ArgumentError, "option :request is no longer supported; use :request_name instead" if options.has_key? :request
|
151
|
+
|
152
|
+
unrecognised = options.keys.find { |k| !HeaderMaker_Constants::AcceptedOptions.include?(k) } and raise ArgumentError, "option #{::Symbol === unrecognised ? ':' : ''}#{unrecognised} is not recognised"
|
153
|
+
|
154
|
+
request_name = check_option options, :request_name, types: [ ::Symbol, ::String ], reject_empty: true
|
155
|
+
|
156
|
+
request_type = check_option options, :request_type, types: [ ::Symbol, ::String ], values: HeaderMaker_Constants::RequestTypes, reject_empty: true
|
157
|
+
|
158
|
+
response_mode = check_option options, :response_mode, types: [ ::Symbol, ::String ], reject_empty: true
|
159
|
+
|
160
|
+
return_type = check_option options, :return_type, types: [ ::String, ::Symbol ], values: [ :string, :string_array, :xml ] || :string
|
161
|
+
|
162
|
+
body = check_option options, :body, types: [ ::Nokogiri::XML::Element, ::String ], allow_nil: true, reject_empty: false
|
163
|
+
body_attributes = check_option options, :body_attributes, type: ::Hash, allow_nil: true
|
164
|
+
caller_name = check_option options, :caller, types: [ ::Symbol, ::String ], allow_nil: true, reject_empty: true
|
165
|
+
|
166
|
+
body ||= '' if body_attributes
|
167
|
+
|
168
|
+
server = check_option options, :server, types: [ ::Symbol, ::String ], allow_nil: true, reject_empty: true
|
169
|
+
server ||= ''
|
170
|
+
user_id = check_option options, :user_id, types: [ ::String ], allow_nil: true, reject_empty: true
|
171
|
+
|
172
|
+
attributes = HeaderMaker_Constants.DefaultAttributes(**options)
|
173
|
+
|
174
|
+
attributes[:environment] = environment
|
175
|
+
attributes[:request] = request_name
|
176
|
+
attributes[:responseMode] = response_mode
|
177
|
+
attributes[:caller] = caller_name if caller_name
|
178
|
+
attributes[:server] = server if server
|
179
|
+
attributes[:userId] = user_id if user_id
|
180
|
+
attributes[:doDiffs] = isdodiffallow
|
181
|
+
|
182
|
+
attributes = Hash[attributes.sort_by { |k, v| k }]
|
183
|
+
|
184
|
+
attributes = attributes.map do |name, value|
|
185
|
+
|
186
|
+
%Q< #{name}="#{value}">
|
187
|
+
end.join "\n"
|
188
|
+
|
189
|
+
case return_type
|
190
|
+
when :string, :xml
|
191
|
+
|
192
|
+
r = []
|
193
|
+
|
194
|
+
r << <<END_OF_first
|
195
|
+
<?xml version="1.0" encoding="utf-8"?>
|
196
|
+
<#{request_type}
|
197
|
+
#{attributes}
|
198
|
+
END_OF_first
|
199
|
+
|
200
|
+
case body
|
201
|
+
when ::Nokogiri::XML::Element
|
202
|
+
|
203
|
+
r << <<END_OF_last
|
204
|
+
>
|
205
|
+
END_OF_last
|
206
|
+
|
207
|
+
r << body.to_xml
|
208
|
+
|
209
|
+
r << <<END_OF_last
|
210
|
+
</#{request_type}>
|
211
|
+
END_OF_last
|
212
|
+
when ::String
|
213
|
+
|
214
|
+
b_a = body_attributes ? body_attributes.map { |n, v| %Q< #{n}="#{v}"> }.join('') : ''
|
215
|
+
|
216
|
+
if body.empty?
|
217
|
+
|
218
|
+
r << <<END_OF_last
|
219
|
+
>
|
220
|
+
<body#{b_a} />
|
221
|
+
</#{request_type}>
|
222
|
+
END_OF_last
|
223
|
+
else
|
224
|
+
r << <<END_OF_last
|
225
|
+
>
|
226
|
+
<body#{b_a}>
|
227
|
+
#{body}
|
228
|
+
</body>
|
229
|
+
</#{request_type}>
|
230
|
+
END_OF_last
|
231
|
+
end
|
232
|
+
else
|
233
|
+
|
234
|
+
r << <<END_OF_last
|
235
|
+
/>
|
236
|
+
END_OF_last
|
237
|
+
end
|
238
|
+
|
239
|
+
r = r.join "\n"
|
240
|
+
|
241
|
+
r = ::Nokogiri.XML(r) if return_type == :xml
|
242
|
+
|
243
|
+
r
|
244
|
+
when :string_array
|
245
|
+
|
246
|
+
r = []
|
247
|
+
|
248
|
+
r << <<END_OF_first
|
249
|
+
<?xml version="1.0" encoding="utf-8"?>
|
250
|
+
<#{request_type}
|
251
|
+
#{attributes}>
|
252
|
+
END_OF_first
|
253
|
+
|
254
|
+
r << body if body
|
255
|
+
|
256
|
+
r << <<END_OF_last
|
257
|
+
</#{request_type}
|
258
|
+
END_OF_last
|
259
|
+
|
260
|
+
r
|
261
|
+
end
|
262
|
+
|
263
|
+
end
|
264
|
+
end # class HeaderMaker
|
265
|
+
|
266
|
+
end # module Razor3
|
267
|
+
end # module Connectivity
|
268
|
+
end # module Razor
|
269
|
+
end # module RazorRisk
|
270
|
+
|
271
|
+
# ############################## end of file ############################# #
|
272
|
+
|
273
|
+
|
@@ -0,0 +1,156 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
# ######################################################################## #
|
4
|
+
# File: lib/razor_risk/razor/connectivity/razor_3/message_map.rb
|
5
|
+
#
|
6
|
+
# Purpose: MessageMap class
|
7
|
+
#
|
8
|
+
# Created: 2nd January 2018
|
9
|
+
# Updated: 15th January 2019
|
10
|
+
#
|
11
|
+
# Author: Matthew Wilson
|
12
|
+
#
|
13
|
+
# Copyright (c) 2018, Razor Risk Technologies Pty Ltd
|
14
|
+
# All rights reserved.
|
15
|
+
#
|
16
|
+
# ######################################################################## #
|
17
|
+
|
18
|
+
|
19
|
+
# ######################################################################## #
|
20
|
+
# requires
|
21
|
+
|
22
|
+
require 'pantheios'
|
23
|
+
require 'recls'
|
24
|
+
require 'xqsr3/quality/parameter_checking'
|
25
|
+
|
26
|
+
=begin
|
27
|
+
=end
|
28
|
+
|
29
|
+
module RazorRisk
|
30
|
+
module Razor
|
31
|
+
module Connectivity
|
32
|
+
module Razor3
|
33
|
+
|
34
|
+
# Class that provides the corresponding server instance for a Razor (3)
|
35
|
+
# message
|
36
|
+
#
|
37
|
+
# The class supports configuration-based operation, by initialising an
|
38
|
+
# instance from a mapping object, and fixed (hard-coded) mapping using the
|
39
|
+
# DefaultInstance constant
|
40
|
+
class MessageMap
|
41
|
+
|
42
|
+
include ::Pantheios
|
43
|
+
include ::Xqsr3::Quality::ParameterChecking
|
44
|
+
|
45
|
+
module MessageMap_Constants
|
46
|
+
|
47
|
+
CreditRiskServer = 'CreditRiskServer'
|
48
|
+
DataServer = 'DataServer'
|
49
|
+
PortfolioExposureServer = 'PortfolioExposureServer'
|
50
|
+
SessionManager = 'SessionManager'
|
51
|
+
SnapshotServer = 'SnapshotServer'
|
52
|
+
|
53
|
+
DefaultMappings_Reverse = {
|
54
|
+
|
55
|
+
CreditRiskServer => %w{
|
56
|
+
|
57
|
+
selectTrades
|
58
|
+
|
59
|
+
statusEnquiry
|
60
|
+
|
61
|
+
tradeContributionEnquiry
|
62
|
+
|
63
|
+
processIntraday
|
64
|
+
batchSummaries
|
65
|
+
razorLog
|
66
|
+
},
|
67
|
+
|
68
|
+
DataServer => %w{
|
69
|
+
|
70
|
+
select
|
71
|
+
writeCapabilityStructure
|
72
|
+
writeUserProfiles
|
73
|
+
},
|
74
|
+
|
75
|
+
PortfolioExposureServer => %w{
|
76
|
+
|
77
|
+
selectNettingAgreements
|
78
|
+
|
79
|
+
deletePortfolio
|
80
|
+
insertPortfolios
|
81
|
+
selectPortfolios
|
82
|
+
updatePortfolio
|
83
|
+
|
84
|
+
lookupRiskPointRecord
|
85
|
+
selectRiskPointTree
|
86
|
+
updateRiskPointStructure
|
87
|
+
selectRiskPointRecordRequest
|
88
|
+
selectRiskPointStructure
|
89
|
+
},
|
90
|
+
|
91
|
+
SessionManager => %w{
|
92
|
+
|
93
|
+
closeSession
|
94
|
+
getSession
|
95
|
+
openSession
|
96
|
+
|
97
|
+
refreshUserProfile
|
98
|
+
},
|
99
|
+
|
100
|
+
SnapshotServer => %w{
|
101
|
+
snapshotProgressRequest
|
102
|
+
},
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
# Initialises an instance from given +mappings+
|
107
|
+
#
|
108
|
+
# @param mappings [::Hash]
|
109
|
+
# @param options [::Hash]
|
110
|
+
#
|
111
|
+
def initialize mappings, **options
|
112
|
+
|
113
|
+
trace ParamNames[ :mappings, :options ], mappings, options unless options[:no_trace]
|
114
|
+
|
115
|
+
check_parameter mappings, 'mappings', type: ::Hash, allow_nil: true
|
116
|
+
|
117
|
+
unless mappings
|
118
|
+
|
119
|
+
mappings = {}
|
120
|
+
|
121
|
+
MessageMap_Constants::DefaultMappings_Reverse.each do |server_name, message_list|
|
122
|
+
|
123
|
+
message_list.each do |message|
|
124
|
+
|
125
|
+
message_name = message.to_s.strip.downcase
|
126
|
+
|
127
|
+
mappings[message_name] = server_name
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
@mappings = mappings
|
133
|
+
end
|
134
|
+
|
135
|
+
DefaultInstance = self.new nil, no_trace: true
|
136
|
+
|
137
|
+
def lookup_server request_name, **options
|
138
|
+
|
139
|
+
trace ParamNames[ :request_name, :options ], request_name, options
|
140
|
+
|
141
|
+
check_parameter request_name, 'request_name', types: [ ::String, ::Symbol ], reject_empty: true
|
142
|
+
|
143
|
+
request_name = request_name.to_s.strip.downcase
|
144
|
+
|
145
|
+
return @mappings[request_name]
|
146
|
+
end
|
147
|
+
end # class MessageMap
|
148
|
+
|
149
|
+
end # module Razor3
|
150
|
+
end # module Connectivity
|
151
|
+
end # module Razor
|
152
|
+
end # module RazorRisk
|
153
|
+
|
154
|
+
# ############################## end of file ############################# #
|
155
|
+
|
156
|
+
|