restful-riskview 0.0.4 → 0.0.5
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/razor_risk/cassini/applications/microservices/restful/risk_view/app.rb +2 -0
- data/lib/razor_risk/cassini/applications/microservices/restful/risk_view/version.rb +1 -1
- data/lib/razor_risk/cassini/applications/route_verb_adaptors/risk_view/item_get.rb +327 -305
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f6001313915f440bb2e656a9e99531c9da19d6bd
|
4
|
+
data.tar.gz: ea0ab43f6a658e7833348fc956d82281e542ce8b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b0e277c5ff7cf57d9ba6b4001ac6d4cefd4a8645ecc6e579cbce1f0c3da3363ff8deac4559e957248eae65e7692e034d60f5d85907b23369a175516801faba7b
|
7
|
+
data.tar.gz: 9145d634023da2398187864bbdb2bb5db6256d9637d25284baf20972de32da55342c4d8ff1e775ee28c61c8bb6134606ec1581bff3d6406842475e1f344c668c
|
@@ -15,6 +15,7 @@ require 'razor_risk/cassini/applications/rest_framework/route_verb_dispatcher'
|
|
15
15
|
require 'razor_risk/cassini/applications/route_verb_adaptors/risk_view'
|
16
16
|
require 'razor_risk/cassini/applications/secured_microservice'
|
17
17
|
require 'razor_risk/cassini/mixin/razor_response_validator'
|
18
|
+
require 'razor_risk/core/diagnostics/logger'
|
18
19
|
|
19
20
|
require 'pantheios'
|
20
21
|
|
@@ -48,6 +49,7 @@ class RiskViewApp < SecuredMicroservice
|
|
48
49
|
include RouteVerbAdaptors::RiskView
|
49
50
|
include RESTFramework::RouteVerbDispatch
|
50
51
|
include Cassini::Mixin::RazorResponseValidator
|
52
|
+
include ::RazorRisk::Core::Diagnostics::Logger
|
51
53
|
|
52
54
|
include ::Pantheios
|
53
55
|
|
@@ -19,6 +19,8 @@ require 'razor_risk/cassini/util/conversion_util'
|
|
19
19
|
require 'razor_risk/razor/connectivity/razor_3/razor_requester'
|
20
20
|
require 'razor_risk/razor/connectivity/razor_3/entity_connectors/portfolios_connector'
|
21
21
|
|
22
|
+
require 'razor_risk/core/diagnostics/logger'
|
23
|
+
|
22
24
|
require 'pantheios'
|
23
25
|
require 'xqsr3/conversion/integer_parser'
|
24
26
|
|
@@ -27,321 +29,341 @@ require 'xqsr3/conversion/integer_parser'
|
|
27
29
|
# module
|
28
30
|
|
29
31
|
module RazorRisk
|
30
|
-
module Cassini
|
31
|
-
module Applications
|
32
|
-
module RouteVerbAdaptors
|
33
|
-
module RiskView
|
32
|
+
module Cassini
|
33
|
+
module Applications
|
34
|
+
module RouteVerbAdaptors
|
35
|
+
module RiskView
|
34
36
|
|
35
37
|
|
36
38
|
# ##########################################################################
|
37
39
|
# classes
|
38
40
|
|
39
|
-
class ItemGet < RESTFramework::VerbHandler
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
41
|
+
class ItemGet < RESTFramework::VerbHandler
|
42
|
+
|
43
|
+
# ##########################################################
|
44
|
+
# includes
|
45
|
+
|
46
|
+
include Cassini::Mixin::RazorResponseValidator
|
47
|
+
include Cassini::Util::ConversionUtil
|
48
|
+
|
49
|
+
include Razor::Connectivity::EntityConnectors::Exceptions
|
50
|
+
include Razor::Connectivity::Razor3
|
51
|
+
include Razor::Connectivity::Razor3::EntityConnectors
|
52
|
+
|
53
|
+
include ::RazorRisk::Core::Diagnostics::Logger
|
54
|
+
include ::Pantheios
|
55
|
+
|
56
|
+
|
57
|
+
# ##########################################################
|
58
|
+
# Constants
|
59
|
+
|
60
|
+
private
|
61
|
+
module Constants
|
62
|
+
|
63
|
+
VALID_DOMAINS = [ 'Counterparty', 'Country', 'GroupCounterparty' ]
|
64
|
+
|
65
|
+
FieldXpathFormatString = 'fields/field[@id="%s"]'
|
66
|
+
|
67
|
+
RPD_YES = 'YES'
|
68
|
+
RPD_NO = 'NO'
|
69
|
+
end
|
70
|
+
|
71
|
+
public
|
72
|
+
HTTP_VERB = :get
|
73
|
+
HTTP_ACCEPTS = [
|
74
|
+
'application/xml',
|
75
|
+
'application/json',
|
76
|
+
'text/xml',
|
77
|
+
]
|
78
|
+
QUERY_PARAMETERS = [
|
79
|
+
'page-base',
|
80
|
+
'page-extent',
|
81
|
+
'group',
|
82
|
+
'facility',
|
83
|
+
]
|
84
|
+
ROUTE_VARIABLES = [
|
85
|
+
'domain',
|
86
|
+
'id',
|
87
|
+
]
|
88
|
+
|
89
|
+
def initialize *args, **options
|
90
|
+
|
91
|
+
@ptf_connector_class = options[:ptf_connector_class] || PortfoliosConnector
|
92
|
+
@rpd_connector_class = options[:rpd_connector_class] || RiskPointData::DomainsConnector
|
93
|
+
super
|
94
|
+
end
|
95
|
+
|
96
|
+
private
|
97
|
+
# Finds the ID of the group leader.
|
98
|
+
#
|
99
|
+
# @param id [String] the ID of the counterpary
|
100
|
+
#
|
101
|
+
# @return [String] the ID of the group leader if one is found
|
102
|
+
# @return [nil] if the group leader is not found
|
103
|
+
def find_group_leader_ id
|
104
|
+
|
105
|
+
domain = 'GroupLimitRelations'
|
106
|
+
cr = get_required_credentials
|
107
|
+
rr = settings.razor_requester
|
108
|
+
ec = @rpd_connector_class.new(rr, credentials: cr)
|
109
|
+
qr = ec.get_records domain, indicate_result_by: :qualified_result
|
110
|
+
|
111
|
+
validate_qualified_razor_response qr
|
112
|
+
|
113
|
+
unless qr.succeeded?
|
114
|
+
log :warning, 'Failed to get GroupLimitRelations'
|
115
|
+
error(
|
116
|
+
HTTP_STATUS_NAMES::INTERNAL_SERVER_ERROR,
|
117
|
+
'Oop! Something went wrong!'
|
118
|
+
)
|
119
|
+
end
|
120
|
+
|
121
|
+
qr.result.xpath('//record').each do |r|
|
122
|
+
parent = r.at_xpath(
|
123
|
+
Constants::FieldXpathFormatString % 'GLParentCounterparty'
|
124
|
+
).text
|
125
|
+
child = r.at_xpath(
|
126
|
+
Constants::FieldXpathFormatString % 'ChildCpty'
|
127
|
+
).text
|
128
|
+
type = r.at_xpath(
|
129
|
+
Constants::FieldXpathFormatString % 'GroupLimitType'
|
130
|
+
).text
|
131
|
+
|
132
|
+
if 'STANDARD' == type and [ parent, child ].include?(id)
|
133
|
+
return parent
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
nil
|
138
|
+
end
|
139
|
+
|
140
|
+
def get_limit_types_
|
141
|
+
|
142
|
+
domain = 'LimitType'
|
143
|
+
cr = get_required_credentials
|
144
|
+
rr = settings.razor_requester
|
145
|
+
ec = @rpd_connector_class.new(rr, credentials: cr)
|
146
|
+
qr = ec.get_records domain, indicate_result_by: :qualified_result
|
147
|
+
|
148
|
+
validate_qualified_razor_response qr
|
149
|
+
|
150
|
+
unless qr.succeeded?
|
151
|
+
log :warning, 'Failed to get LimitType'
|
152
|
+
error(
|
153
|
+
HTTP_STATUS_NAMES::INTERNAL_SERVER_ERROR,
|
154
|
+
'Oops! Something went wrong!'
|
155
|
+
)
|
156
|
+
end
|
157
|
+
|
158
|
+
records = qr.result.xpath('//record')
|
159
|
+
|
160
|
+
limit_types = {
|
161
|
+
counterparty: [],
|
162
|
+
country: [],
|
163
|
+
counterparty_group: [],
|
164
|
+
counterparty_facility_group: [],
|
165
|
+
}
|
166
|
+
#print("records: #{records}")
|
167
|
+
records.each do |record|
|
168
|
+
id = record.at_xpath('@id').value
|
169
|
+
counterparty = Constants::RPD_YES == record.at_xpath(
|
170
|
+
Constants::FieldXpathFormatString % 'IsCounterpartyRelevant'
|
171
|
+
)&.text
|
172
|
+
country = Constants::RPD_YES == record.at_xpath(
|
173
|
+
Constants::FieldXpathFormatString % 'IsCountryRelevant'
|
174
|
+
)&.text
|
175
|
+
group = Constants::RPD_YES == record.at_xpath(
|
176
|
+
Constants::FieldXpathFormatString % 'IsGroupLimitRelevant'
|
177
|
+
)&.text
|
178
|
+
|
179
|
+
limit_types[:counterparty_facility_group] = ["GLOBAL","GLGLOBAL"]
|
180
|
+
if counterparty
|
181
|
+
if group
|
182
|
+
limit_types[:counterparty_group] << id
|
183
|
+
else
|
184
|
+
limit_types[:counterparty] << id
|
185
|
+
end
|
186
|
+
elsif country
|
187
|
+
limit_types[:country] << id
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
191
|
+
limit_types
|
192
|
+
end
|
193
|
+
public
|
194
|
+
|
195
|
+
|
196
|
+
# ##########################################################
|
197
|
+
# Handler
|
198
|
+
|
199
|
+
def handle env, params, request, response
|
200
|
+
#print("params risk_view: #{params}")
|
201
|
+
|
202
|
+
trace ParamNames[ :env, :params, :request, :response ], env, params, request, response
|
203
|
+
domain = check_option(
|
204
|
+
params,
|
205
|
+
'domain',
|
206
|
+
strip_str_whitespace: true,
|
207
|
+
values: Constants::VALID_DOMAINS,
|
208
|
+
nothrow: true,
|
209
|
+
) || error(HTTP_STATUS_NAMES::UNPROCESSABLE_ENTITY, 'Invalid domain')
|
210
|
+
|
211
|
+
id = check_option(
|
212
|
+
params,
|
213
|
+
'id',
|
214
|
+
strip_str_whitespace: true,
|
215
|
+
reject_empty: true,
|
216
|
+
nothrow: true,
|
217
|
+
) || error(HTTP_STATUS_NAMES::UNPROCESSABLE_ENTITY, 'Invalid ID')
|
218
|
+
|
219
|
+
page_base = ::Xqsr3::Conversion::IntegerParser.to_integer(
|
220
|
+
params['page-base'] || 0
|
221
|
+
) do |x, arg|
|
222
|
+
error(
|
223
|
+
HTTP_STATUS_NAMES::UNPROCESSABLE_ENTITY,
|
224
|
+
"invalid page specifier: 'page-base'=#{arg}"
|
225
|
+
)
|
226
|
+
end
|
227
|
+
page_extent = ::Xqsr3::Conversion::IntegerParser.to_integer(
|
228
|
+
params['page-extent'] || 1000
|
229
|
+
) do |x, arg|
|
230
|
+
error(
|
231
|
+
HTTP_STATUS_NAMES::UNPROCESSABLE_ENTITY,
|
232
|
+
"invalid page specifier: 'page-extent'=#{arg}"
|
233
|
+
)
|
234
|
+
end
|
235
|
+
|
236
|
+
if page_base < 0 || page_extent < 1
|
237
|
+
error(
|
238
|
+
HTTP_STATUS_NAMES::RANGE_NOT_SATISFIABLE,
|
239
|
+
"invalid page specifier: 'page-base'=#{page_base}; 'page-extent'=#{page_extent}"
|
240
|
+
)
|
241
|
+
end
|
242
|
+
|
243
|
+
group = 0 == (
|
244
|
+
/^t(rue)?$/i =~ check_option(
|
245
|
+
params,
|
246
|
+
'group',
|
247
|
+
strip_str_whitespace: true,
|
248
|
+
reject_empty: true,
|
249
|
+
nothrow: true,
|
250
|
+
)
|
251
|
+
)
|
252
|
+
|
253
|
+
facility = 0 == (
|
254
|
+
/^t(rue)?$/i =~ check_option(
|
255
|
+
params,
|
256
|
+
'facility',
|
257
|
+
strip_str_whitespace: true,
|
258
|
+
reject_empty: true,
|
259
|
+
nothrow: true,
|
260
|
+
)
|
261
|
+
)
|
262
|
+
|
263
|
+
#print("new data isfacility: #{facility}")
|
264
|
+
|
265
|
+
if group
|
266
|
+
leader_id = find_group_leader_(id)
|
267
|
+
if leader_id
|
268
|
+
id = leader_id
|
269
|
+
else
|
270
|
+
log :debug1, "Counterpary #{id} is not part of a group"
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
limit_types = get_limit_types_
|
275
|
+
|
276
|
+
#print("limit_types: #{limit_types}")
|
277
|
+
# Handle Globals
|
278
|
+
risk_view = { domain => id }
|
279
|
+
if 'Counterparty' == domain
|
280
|
+
if facility
|
281
|
+
risk_view['LimitType'] = limit_types[:counterparty_facility_group]
|
282
|
+
elsif group
|
283
|
+
risk_view['LimitType'] = limit_types[:counterparty_group]
|
284
|
+
else
|
285
|
+
risk_view['LimitType'] = limit_types[:counterparty]
|
286
|
+
end
|
287
|
+
elsif 'Country' == domain
|
288
|
+
risk_view['LimitType'] = limit_types[:country]
|
289
|
+
end
|
290
|
+
|
291
|
+
rq_opts = {
|
292
|
+
:page_base => page_base,
|
293
|
+
:page_extent => page_extent,
|
294
|
+
:risk_view => risk_view,
|
295
|
+
:is_group => group,
|
296
|
+
:is_facility => facility,
|
297
|
+
}
|
298
|
+
#print("risk_view: #{risk_view}")
|
299
|
+
cr = get_required_credentials
|
300
|
+
rr = settings.razor_requester
|
301
|
+
ec = @ptf_connector_class.new(rr, credentials: cr, **rq_opts)
|
302
|
+
|
303
|
+
# TODO: allow these exceptions to be handled by the frame work. This
|
304
|
+
# will require significant change to the unit tests.
|
305
|
+
begin
|
306
|
+
qr = ec.get_hierarchy indicate_result_by: :qualified_result
|
307
|
+
rescue ::ArgumentError, ::NameError, ::NoMethodError, ::TypeError => x
|
308
|
+
log(:violation) { "(#{x.class}): #{x.message}" }
|
309
|
+
raise
|
310
|
+
rescue RazorRequester::InvalidCredentialsException => x
|
311
|
+
log(:failure) { "exception (#{x.class}): #{x}" }
|
312
|
+
error HTTP_STATUS_NAMES::UNAUTHORIZED, 'Invalid credentials'
|
313
|
+
rescue DataNotFoundException => x
|
314
|
+
log(:failure) { "exception (#{x.class}): #{x}" }
|
315
|
+
error HTTP_STATUS_NAMES::NOT_FOUND, x.message
|
316
|
+
rescue => x
|
317
|
+
log(:failure) { "exception (#{x.class}): #{x}" }
|
318
|
+
error HTTP_STATUS_NAMES::INTERNAL_SERVER_ERROR, x.message
|
319
|
+
end
|
320
|
+
|
321
|
+
log :debug1, "qr(#{qr.class})='#{qr}'"
|
322
|
+
|
323
|
+
validate_qualified_razor_response qr
|
324
|
+
|
325
|
+
unless qr.succeeded?
|
326
|
+
log :warning, "Failed to retrieve risk-view for '#{id}' for an unkown reason."
|
327
|
+
error(
|
328
|
+
HTTP_STATUS_NAMES::INTERNAL_SERVER_ERROR,
|
329
|
+
'Oops! Something went wrong!'
|
330
|
+
)
|
331
|
+
end
|
332
|
+
|
333
|
+
r = qr.result.to_s
|
334
|
+
|
335
|
+
status HTTP_STATUS_NAMES::OK
|
336
|
+
|
337
|
+
if request.accept?('application/xml')
|
338
|
+
log :debug1, 'application/xml'
|
339
|
+
content_type 'application/xml'
|
340
|
+
r
|
341
|
+
elsif request.accept?('text/xml')
|
342
|
+
log :debug1, 'text/xml'
|
343
|
+
content_type 'text/xml'
|
344
|
+
r
|
345
|
+
elsif request.accept?('application/json')
|
346
|
+
log :debug1, 'application/json'
|
347
|
+
content_type 'application/json'
|
348
|
+
convert_XML_to_JSON r, { scheme: :gdata }
|
349
|
+
else
|
350
|
+
log :violation, "unexpected failure to match given 'Accept' header '#{request.accept}'"
|
351
|
+
error(
|
352
|
+
HTTP_STATUS_NAMES::INTERNAL_SERVER_ERROR,
|
353
|
+
'Oops! Something went wrong!'
|
354
|
+
)
|
355
|
+
end
|
356
|
+
end
|
357
|
+
end # class ItemGet
|
336
358
|
|
337
359
|
|
338
360
|
# ##########################################################################
|
339
361
|
# module
|
340
362
|
|
341
|
-
end # module RiskView
|
342
|
-
end # module RouteVerbAdaptors
|
343
|
-
end # module Applications
|
344
|
-
end # module Cassini
|
363
|
+
end # module RiskView
|
364
|
+
end # module RouteVerbAdaptors
|
365
|
+
end # module Applications
|
366
|
+
end # module Cassini
|
345
367
|
end # module RazorRisk
|
346
368
|
|
347
369
|
# ############################## end of file ############################# #
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: restful-riskview
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Razor Risk
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: razorrisk-cassini-common
|