cqm-parsers 4.1.0.2 → 4.1.1.0
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/Gemfile +4 -4
- data/lib/measure-loader/vsac_value_set_loader.rb +2 -3
- data/lib/util/vsac_api.rb +23 -79
- metadata +9 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ab2f0fafb17c1c9415e34a3732ed3c941c57c5efe3efc87509baa866b1df0cb
|
4
|
+
data.tar.gz: 821f980170ae280b0bb604a2cb8fe6b577ac1f4d21d6b23ec9deb3bc31c1dcfa
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6ef8af2c1fa8bdd7a6e3abcffb6a01c0ff531a6540cb04bf2a362dc8065d75caf682c0c95efa559ec3e926cdd1ecc52411d65df85e66f6724212da9e63678304
|
7
|
+
data.tar.gz: 441a018ffe31ead27d482d0fa70c019739de1ac96dab583cd0c317553af0e4c118c0c4f5e1c9ab62160c052e36630a40c7d45de0db6f99b5a6678eb56978969f
|
data/Gemfile
CHANGED
@@ -2,15 +2,15 @@ source 'https://rubygems.org'
|
|
2
2
|
|
3
3
|
gemspec :development_group => :test
|
4
4
|
|
5
|
-
gem 'mongoid', '> 6.0.5', '<
|
5
|
+
gem 'mongoid', '> 6.0.5', '< 9.0.0'
|
6
6
|
|
7
7
|
# gem 'cqm-models', git: 'https://github.com/projecttacoma/cqm-models.git', branch: 'master'
|
8
8
|
# gem 'cqm-models', :path => '../cqm-models'
|
9
9
|
|
10
10
|
group :development, :test do
|
11
11
|
gem 'bundler-audit'
|
12
|
-
gem 'rubocop', '~> 0.
|
13
|
-
gem 'byebug'
|
12
|
+
gem 'rubocop', '~> 0.63.0', require: false
|
13
|
+
gem 'byebug'
|
14
14
|
gem 'pry'
|
15
15
|
gem 'pry-nav'
|
16
16
|
end
|
@@ -20,7 +20,7 @@ group :development do
|
|
20
20
|
end
|
21
21
|
|
22
22
|
group :test do
|
23
|
-
gem '
|
23
|
+
gem 'factory_bot'
|
24
24
|
gem 'tailor', '~> 1.1.2'
|
25
25
|
gem 'cane', '~> 2.3.0'
|
26
26
|
gem 'codecov'
|
@@ -6,8 +6,7 @@ module Measures
|
|
6
6
|
def initialize(options)
|
7
7
|
options.symbolize_keys!
|
8
8
|
@vsac_options = options[:options]
|
9
|
-
@
|
10
|
-
@vsac_api_key = options[:api_key]
|
9
|
+
@vsac_api_key = options[:vsac_api_key]
|
11
10
|
@vs_model_cache = {}
|
12
11
|
end
|
13
12
|
|
@@ -47,7 +46,7 @@ module Measures
|
|
47
46
|
|
48
47
|
def load_api
|
49
48
|
return @api if @api.present?
|
50
|
-
@api = Util::VSAC::VSACAPI.new(config: APP_CONFIG['vsac'],
|
49
|
+
@api = Util::VSAC::VSACAPI.new(config: APP_CONFIG['vsac'], api_key: @vsac_api_key)
|
51
50
|
return @api
|
52
51
|
end
|
53
52
|
|
data/lib/util/vsac_api.rb
CHANGED
@@ -40,13 +40,6 @@ module Util
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
# Raised when the ticket granting ticket has expired.
|
44
|
-
class VSACTicketExpiredError < VSACError
|
45
|
-
def initialize
|
46
|
-
super('VSAC session expired. Please re-enter credentials and try again.')
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
43
|
# Raised when the user credentials were invalid.
|
51
44
|
class VSACInvalidCredentialsError < VSACError
|
52
45
|
def initialize
|
@@ -69,14 +62,13 @@ module Util
|
|
69
62
|
# The default program to use for get_program_details and get_program_release_names calls.
|
70
63
|
# This can be overriden by providing a :program in the config or by the single optional parameter for those
|
71
64
|
# methods.
|
72
|
-
DEFAULT_PROGRAM = "CMS eCQM"
|
65
|
+
DEFAULT_PROGRAM = "CMS eCQM and Hybrid Measure"
|
73
66
|
|
74
67
|
# This is the value of the service parameter passed when getting a ticket. This never changes.
|
75
68
|
TICKET_SERVICE_PARAM = "http://umlsks.nlm.nih.gov"
|
76
69
|
|
77
|
-
#
|
78
|
-
|
79
|
-
attr_reader :ticket_granting_ticket
|
70
|
+
# Requester UMLS API KEY
|
71
|
+
attr_reader :api_key
|
80
72
|
|
81
73
|
##
|
82
74
|
# Creates a new VSACAPI. If credentials were provided they are checked now. If no credentials
|
@@ -91,24 +83,17 @@ module Util
|
|
91
83
|
unless check_config @config
|
92
84
|
raise VSACArgumentError.new("Required param :config is missing required URLs.")
|
93
85
|
end
|
86
|
+
@api_key = options[:api_key]
|
87
|
+
validate_api_key_vsac unless options[:api_key].nil?
|
88
|
+
end
|
94
89
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
raise VSACTicketExpiredError.new if Time.now > provided_ticket_granting_ticket[:expires]
|
104
|
-
|
105
|
-
@ticket_granting_ticket = { ticket: provided_ticket_granting_ticket[:ticket],
|
106
|
-
expires: provided_ticket_granting_ticket[:expires] }
|
107
|
-
|
108
|
-
# if api key was provided use it to get a ticket granting ticket
|
109
|
-
elsif !options[:api_key].nil?
|
110
|
-
@ticket_granting_ticket = get_ticket_granting_ticket(options[:api_key])
|
111
|
-
end
|
90
|
+
##
|
91
|
+
# Attempt to retrieve the ONC Admin Sex VS to verify
|
92
|
+
# VSAC connectivity with the supplied UMLS API Key.
|
93
|
+
def validate_api_key_vsac
|
94
|
+
response = get_multiple_valueset_raw_responses([{value_set: {oid: "2.16.840.1.113762.1.4.1"}, vs_vsac_options: {}}])[0]
|
95
|
+
raise VSACInvalidCredentialsError.new if !response.body || response.response_code == 401
|
96
|
+
validate_http_status(response.response_code)
|
112
97
|
end
|
113
98
|
|
114
99
|
##
|
@@ -204,8 +189,7 @@ module Util
|
|
204
189
|
# hash = {vs_vsac_options: ___, value_set: {oid: ___} }
|
205
190
|
#
|
206
191
|
def get_multiple_valuesets(needed_value_sets)
|
207
|
-
raise VSACNoCredentialsError.new unless @
|
208
|
-
raise VSACTicketExpiredError.new if Time.now > @ticket_granting_ticket[:expires]
|
192
|
+
raise VSACNoCredentialsError.new unless @api_key
|
209
193
|
|
210
194
|
vs_responses = get_multiple_valueset_raw_responses(needed_value_sets)
|
211
195
|
vs_datas = [needed_value_sets,vs_responses].transpose.map do |needed_vs,vs_response|
|
@@ -221,7 +205,7 @@ module Util
|
|
221
205
|
# Given a raw valueset response, process and validate
|
222
206
|
def process_and_validate_vsac_response(vs_response, expected_oid)
|
223
207
|
raise VSNotFoundError.new(expected_oid) if vs_response.response_code == 404
|
224
|
-
|
208
|
+
validate_http_status_for_apikey_based_request(vs_response.response_code)
|
225
209
|
|
226
210
|
vs_data = vs_response.body.force_encoding("utf-8")
|
227
211
|
begin
|
@@ -240,11 +224,9 @@ module Util
|
|
240
224
|
|
241
225
|
# Execute bulk requests for valuesets, return the raw Typheous responses (requests executed in parallel)
|
242
226
|
def get_multiple_valueset_raw_responses(needed_value_sets)
|
243
|
-
service_tickets = get_service_tickets(needed_value_sets.size)
|
244
|
-
|
245
227
|
hydra = Typhoeus::Hydra.new(max_concurrency: 1) # Hydra executes multiple HTTP requests at once
|
246
228
|
requests = needed_value_sets.map do |n|
|
247
|
-
request = create_valueset_request(n[:value_set][:oid],
|
229
|
+
request = create_valueset_request(n[:value_set][:oid], n[:vs_vsac_options])
|
248
230
|
hydra.queue(request)
|
249
231
|
request
|
250
232
|
end
|
@@ -254,28 +236,8 @@ module Util
|
|
254
236
|
return responses
|
255
237
|
end
|
256
238
|
|
257
|
-
# Bulk get an amount of service tickets (requests executed in parallel)
|
258
|
-
def get_service_tickets(amount)
|
259
|
-
raise VSACNoCredentialsError.new unless @ticket_granting_ticket
|
260
|
-
raise VSACTicketExpiredError.new if Time.now > @ticket_granting_ticket[:expires]
|
261
|
-
|
262
|
-
hydra = Typhoeus::Hydra.new # Hydra executes multiple HTTP requests at once
|
263
|
-
requests = amount.times.map do
|
264
|
-
request = create_service_ticket_request
|
265
|
-
hydra.queue(request)
|
266
|
-
request
|
267
|
-
end
|
268
|
-
|
269
|
-
hydra.run
|
270
|
-
tickets = requests.map do |request|
|
271
|
-
validate_http_status_for_ticket_based_request(request.response.response_code)
|
272
|
-
request.response.body
|
273
|
-
end
|
274
|
-
return tickets
|
275
|
-
end
|
276
|
-
|
277
239
|
# Create a typheous request for a valueset (this must be executed later)
|
278
|
-
def create_valueset_request(oid,
|
240
|
+
def create_valueset_request(oid, options = {})
|
279
241
|
# base parameter oid is always needed
|
280
242
|
params = { id: oid }
|
281
243
|
# release parameter, should be used moving forward
|
@@ -292,34 +254,16 @@ module Util
|
|
292
254
|
|
293
255
|
# version parameter, rarely used
|
294
256
|
params[:version] = options[:version] unless options[:version].nil?
|
295
|
-
params[:ticket] = ticket
|
296
257
|
|
297
|
-
return Typhoeus::Request.new("#{@config[:content_url]}/RetrieveMultipleValueSets",
|
258
|
+
return Typhoeus::Request.new("#{@config[:content_url]}/RetrieveMultipleValueSets",
|
259
|
+
params: params,
|
260
|
+
userpwd: "apikey:#{@api_key}")
|
298
261
|
end
|
299
262
|
|
300
|
-
#
|
301
|
-
def
|
302
|
-
return Typhoeus::Request.new("#{@config[:auth_url]}/Ticket/#{@ticket_granting_ticket[:ticket]}",
|
303
|
-
method: :post,
|
304
|
-
params: { service: TICKET_SERVICE_PARAM})
|
305
|
-
end
|
306
|
-
|
307
|
-
# Use your API Key to retrive a ticket granting ticket from VSAC
|
308
|
-
def get_ticket_granting_ticket(api_key)
|
309
|
-
response = Typhoeus.post(
|
310
|
-
"#{@config[:auth_url]}/Ticket",
|
311
|
-
body: URI.encode_www_form(apikey: api_key)
|
312
|
-
)
|
313
|
-
raise VSACInvalidCredentialsError.new if response.response_code == 401
|
314
|
-
validate_http_status(response.response_code)
|
315
|
-
return { ticket: String.new(response.body), expires: Time.now + 8.hours }
|
316
|
-
end
|
317
|
-
|
318
|
-
# Raise errors if http_status is not OK (200), and expire TGT if auth fails
|
319
|
-
def validate_http_status_for_ticket_based_request(http_status)
|
263
|
+
# Raise errors if http_status is not OK (200)
|
264
|
+
def validate_http_status_for_apikey_based_request(http_status)
|
320
265
|
if http_status == 401
|
321
|
-
|
322
|
-
raise VSACTicketExpiredError.new
|
266
|
+
raise VSACInvalidCredentialsError.new
|
323
267
|
end
|
324
268
|
validate_http_status(http_status)
|
325
269
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cqm-parsers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.1.0
|
4
|
+
version: 4.1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The MITRE Corporation
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2024-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: cqm-models
|
@@ -61,7 +61,7 @@ dependencies:
|
|
61
61
|
version: 6.0.5
|
62
62
|
- - "<"
|
63
63
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
64
|
+
version: 9.0.0
|
65
65
|
type: :runtime
|
66
66
|
prerelease: false
|
67
67
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -71,21 +71,21 @@ dependencies:
|
|
71
71
|
version: 6.0.5
|
72
72
|
- - "<"
|
73
73
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
74
|
+
version: 9.0.0
|
75
75
|
- !ruby/object:Gem::Dependency
|
76
76
|
name: mongoid-tree
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
78
78
|
requirements:
|
79
79
|
- - "~>"
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: 2.
|
81
|
+
version: 2.2.0
|
82
82
|
type: :runtime
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - "~>"
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: 2.
|
88
|
+
version: 2.2.0
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: activesupport
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
@@ -134,20 +134,14 @@ dependencies:
|
|
134
134
|
requirements:
|
135
135
|
- - ">="
|
136
136
|
- !ruby/object:Gem::Version
|
137
|
-
version: 1.
|
138
|
-
- - "<"
|
139
|
-
- !ruby/object:Gem::Version
|
140
|
-
version: 1.15.0
|
137
|
+
version: 1.16.2
|
141
138
|
type: :runtime
|
142
139
|
prerelease: false
|
143
140
|
version_requirements: !ruby/object:Gem::Requirement
|
144
141
|
requirements:
|
145
142
|
- - ">="
|
146
143
|
- !ruby/object:Gem::Version
|
147
|
-
version: 1.
|
148
|
-
- - "<"
|
149
|
-
- !ruby/object:Gem::Version
|
150
|
-
version: 1.15.0
|
144
|
+
version: 1.16.2
|
151
145
|
- !ruby/object:Gem::Dependency
|
152
146
|
name: highline
|
153
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -335,7 +329,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
335
329
|
- !ruby/object:Gem::Version
|
336
330
|
version: '0'
|
337
331
|
requirements: []
|
338
|
-
rubygems_version: 3.1.
|
332
|
+
rubygems_version: 3.1.4
|
339
333
|
signing_key:
|
340
334
|
specification_version: 4
|
341
335
|
summary: A library for parsing HQMF documents.
|