ruby_astm 1.4.4 → 1.4.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/mappings.json +18 -1
- data/lib/publisher/poller.rb +4 -0
- data/lib/publisher/real_time_db.rb +105 -22
- data/lib/ruby_astm/custom/siemens_abg_electrolyte_module.rb +16 -3
- metadata +15 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cd2c1d542ca88df2907a1ced3c504be478562cc1
|
4
|
+
data.tar.gz: 9498ee9636238cf9320c2d7da27ac3dd117eca40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c33a3270c4e96663b714eef93522f282474f77ab220bc4dd53eccc625eac332c224944403237469c93f5cc2b95f7c0063102c2be2fa80a43408d6287665a34e7
|
7
|
+
data.tar.gz: feca986fc7ade45225533c15671aa221e8285b30d5a1868a7ab46c92c385e584a738dae65ddb07c239d7e238f141b752242d1f2fcd86e4134544e2f0a96e568b
|
data/lib/mappings.json
CHANGED
@@ -529,6 +529,23 @@
|
|
529
529
|
"REPORT_NAME" : "kidney_function_tests",
|
530
530
|
"PACKAGE_COMPONENTS" : ["CRE", "UREA", "BUN"],
|
531
531
|
"TYPE" : "BIOCHEM"
|
532
|
+
},
|
533
|
+
"SPT" : {
|
534
|
+
"LIS_CODE" : "SPT",
|
535
|
+
"TUBE" : "SERUM",
|
536
|
+
"REPORT_NAME" : "PTAPTT",
|
537
|
+
"TYPE" : "BIOCHEM-EXL"
|
538
|
+
},
|
539
|
+
"SAPTT" : {
|
540
|
+
"LIS_CODE" : "SAPTT",
|
541
|
+
"TUBE" : "SERUM",
|
542
|
+
"REPORT_NAME" : "PTAPTT",
|
543
|
+
"TYPE" : "BIOCHEM-EXL"
|
544
|
+
},
|
545
|
+
"SINR" : {
|
546
|
+
"LIS_CODE" : "SINR",
|
547
|
+
"TUBE" : "SERUM",
|
548
|
+
"REPORT_NAME" : "PTAPTT",
|
549
|
+
"TYPE" : "BIOCHEM-EXL"
|
532
550
|
}
|
533
|
-
|
534
551
|
}
|
data/lib/publisher/poller.rb
CHANGED
@@ -235,8 +235,12 @@ class Poller
|
|
235
235
|
tests.keys.each do |tube_barcode|
|
236
236
|
## in this hash we want the key to be only the specimen id.
|
237
237
|
## and not prefixed by the tube type like FLUORIDE etc.
|
238
|
+
## i don't want the individual tests,
|
239
|
+
## i want the report name.
|
240
|
+
## prefixed to it.
|
238
241
|
tube_barcode.scan(/:(?<barcode>.*)$/) { |barcode|
|
239
242
|
$redis.hset REQUISITIONS_HASH, barcode, JSON.generate(tests[tube_barcode])
|
243
|
+
$real_time_db.assign_test(barcode,tests[tube_barcode],$mappings) unless $real_time_db.blank?
|
240
244
|
}
|
241
245
|
end
|
242
246
|
end
|
@@ -1,11 +1,27 @@
|
|
1
1
|
require 'rest-firebase'
|
2
2
|
require "resolv-replace"
|
3
|
+
require "jwt"
|
4
|
+
require "net/http"
|
5
|
+
|
6
|
+
RestFirebase.class_eval do
|
7
|
+
def query
|
8
|
+
{:access_token => auth}
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
3
12
|
class RealTimeDb
|
4
13
|
|
5
14
|
SITE_URL = ENV["FIREBASE_SITE"]
|
6
15
|
SECRET = ENV["FIREBASE_SECRET"]
|
16
|
+
ENDPOINT = "pathofast"
|
17
|
+
ACCESSION_DONE = "ACCESSION_DONE"
|
18
|
+
PROCESSING = "PROCESSING"
|
19
|
+
|
20
|
+
|
7
21
|
attr_accessor :connection
|
8
22
|
attr_accessor :work_allotment_hash
|
23
|
+
attr_accessor :private_key_hash
|
24
|
+
|
9
25
|
WORK_TYPES = {
|
10
26
|
"IMMUNO" => "",
|
11
27
|
"BIOCHEM" => "",
|
@@ -16,15 +32,50 @@ class RealTimeDb
|
|
16
32
|
"OUTSOURCE" => ""
|
17
33
|
}
|
18
34
|
|
19
|
-
|
20
|
-
|
35
|
+
|
36
|
+
def get_jwt
|
37
|
+
puts Base64.encode64(JSON.generate(self.private_key_hash))
|
38
|
+
# Get your service account's email address and private key from the JSON key file
|
39
|
+
$service_account_email = self.private_key_hash["client_email"]
|
40
|
+
$private_key = OpenSSL::PKey::RSA.new self.private_key_hash["private_key"]
|
41
|
+
now_seconds = Time.now.to_i
|
42
|
+
payload = {:iss => $service_account_email,
|
43
|
+
:sub => $service_account_email,
|
44
|
+
:aud => self.private_key_hash["token_uri"],
|
45
|
+
:iat => now_seconds,
|
46
|
+
:exp => now_seconds+(60*60), # Maximum expiration time is one hour
|
47
|
+
:scope => 'https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/firebase.database'
|
48
|
+
|
49
|
+
}
|
50
|
+
JWT.encode payload, $private_key, "RS256"
|
51
|
+
|
52
|
+
end
|
53
|
+
|
54
|
+
def generate_access_token
|
55
|
+
uri = URI.parse(self.private_key_hash["token_uri"])
|
56
|
+
https = Net::HTTP.new(uri.host, uri.port)
|
57
|
+
https.use_ssl = true
|
58
|
+
req = Net::HTTP::Post.new(uri.path)
|
59
|
+
req['Cache-Control'] = "no-store"
|
60
|
+
req.set_form_data({
|
61
|
+
grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
|
62
|
+
assertion: get_jwt
|
63
|
+
})
|
64
|
+
|
65
|
+
resp = JSON.parse(https.request(req).body)
|
66
|
+
puts "response is:"
|
67
|
+
puts resp.to_s
|
68
|
+
resp["access_token"]
|
69
|
+
end
|
21
70
|
|
22
71
|
## @param[Hash] work_allotment_hash :
|
23
72
|
## key => one of the work types
|
24
73
|
## value => name of a worker
|
25
|
-
def initialize(work_allotment_hash)
|
74
|
+
def initialize(work_allotment_hash,private_key_hash)
|
75
|
+
self.private_key_hash = private_key_hash
|
76
|
+
raise "please provide the private key hash, from firebase service account -> create private key " if private_key_hash.blank?
|
26
77
|
self.connection = RestFirebase.new :site => SITE_URL,
|
27
|
-
:secret => SECRET
|
78
|
+
:secret => SECRET, :auth =>generate_access_token
|
28
79
|
puts "initialized"
|
29
80
|
self.work_allotment_hash = work_allotment_hash || WORK_TYPES
|
30
81
|
end
|
@@ -46,31 +97,63 @@ class RealTimeDb
|
|
46
97
|
self.connection.wait
|
47
98
|
end
|
48
99
|
|
100
|
+
## if the barcode exists,
|
101
|
+
## otherwise create it.
|
102
|
+
def barcode_exists?(barcode)
|
103
|
+
begin
|
104
|
+
self.connection.get(ENDPOINT, :orderBy => 'barcode', :equalTo => barcode)
|
105
|
+
rescue
|
106
|
+
## reestablish the connection
|
107
|
+
self.connection = RestFirebase.new :site => SITE_URL,
|
108
|
+
:secret => SECRET, :auth =>generate_access_token
|
109
|
+
true
|
110
|
+
end
|
111
|
+
end
|
49
112
|
|
50
|
-
|
113
|
+
## idea is simple
|
114
|
+
## send the image -> to one collection, as a post
|
115
|
+
## take it -> analyze it -> update the result
|
116
|
+
## to another collection
|
117
|
+
## show it in the UI.
|
118
|
+
## knock off the earlier one.
|
51
119
|
|
52
120
|
## we pass the real_time_data instance into the
|
53
|
-
|
54
121
|
def assign_test(barcode,tests,mappings)
|
55
122
|
## so do we get the name of the worker.
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
123
|
+
if barcode_exists?(barcode[0]).blank?
|
124
|
+
|
125
|
+
worker_hash = {}
|
126
|
+
tests.each do |machine_code|
|
127
|
+
worker_name = "NO_ONE"
|
128
|
+
|
129
|
+
unless mappings[machine_code].blank?
|
130
|
+
test_type = mappings[machine_code]["TYPE"]
|
131
|
+
worker_name = self.work_allotment_hash[test_type]
|
132
|
+
|
133
|
+
worker_hash[worker_name] ||= []
|
134
|
+
|
135
|
+
#puts "worker name: #{worker_name}"
|
136
|
+
#puts "lis code: #{machine_code}"
|
137
|
+
#puts mappings[machine_code].to_s
|
138
|
+
worker_hash[worker_name] << mappings[machine_code]["REPORT_NAME"]
|
139
|
+
else
|
140
|
+
worker_hash[worker_name] ||= []
|
141
|
+
worker_hash[worker_name] << machine_code
|
142
|
+
end
|
143
|
+
|
144
|
+
|
67
145
|
end
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
146
|
+
|
147
|
+
#puts "this is the workers hash"
|
148
|
+
#puts worker_hash.to_s
|
149
|
+
worker_hash.keys.each do |worker_name|
|
150
|
+
k = self.connection.post(ENDPOINT, :tests => worker_hash[worker_name].uniq, :barcode => barcode[0], :timestamp => Time.now.strftime("%b %-d %Y %I:%M %P"), :worker_name => worker_name, :status => ACCESSION_DONE, :next_step => PROCESSING, :combi_key => worker_name + "_pending")
|
151
|
+
#puts k.to_s
|
152
|
+
end
|
153
|
+
else
|
154
|
+
puts "this barcode: #{barcode[0]} already exists."
|
73
155
|
end
|
156
|
+
|
74
157
|
end
|
75
158
|
|
76
159
|
end
|
@@ -124,6 +124,7 @@ module SiemensAbgElectrolyteModule
|
|
124
124
|
p.patient_id = patient_id
|
125
125
|
p.orders ||= []
|
126
126
|
o = Order.new
|
127
|
+
o.id = patient_id
|
127
128
|
o.results ||= {}
|
128
129
|
if sodium = get_na
|
129
130
|
r = Result.new
|
@@ -158,7 +159,7 @@ module SiemensAbgElectrolyteModule
|
|
158
159
|
if ph = get_ph
|
159
160
|
r = Result.new
|
160
161
|
r.name = "pH"
|
161
|
-
r.report_name = "
|
162
|
+
r.report_name = "ABG"
|
162
163
|
r.value = ph
|
163
164
|
r.units = "mmol/L"
|
164
165
|
r.timestamp = Time.now.to_i
|
@@ -168,7 +169,7 @@ module SiemensAbgElectrolyteModule
|
|
168
169
|
if po2 = get_po2
|
169
170
|
r = Result.new
|
170
171
|
r.name = "po2"
|
171
|
-
r.report_name = "
|
172
|
+
r.report_name = "ABG"
|
172
173
|
r.value = po2
|
173
174
|
r.units = "mmHg"
|
174
175
|
r.timestamp = Time.now.to_i
|
@@ -178,7 +179,7 @@ module SiemensAbgElectrolyteModule
|
|
178
179
|
if pco2 = get_pco2
|
179
180
|
r = Result.new
|
180
181
|
r.name = "pco2"
|
181
|
-
r.report_name = "
|
182
|
+
r.report_name = "ABG"
|
182
183
|
r.value = pco2
|
183
184
|
r.units = "mmHg"
|
184
185
|
r.timestamp = Time.now.to_i
|
@@ -190,6 +191,12 @@ module SiemensAbgElectrolyteModule
|
|
190
191
|
end
|
191
192
|
end
|
192
193
|
|
194
|
+
if self.headers.size > 0
|
195
|
+
self.headers[-1].commit
|
196
|
+
clear
|
197
|
+
#send_data(self.headers[-1].generate_ack_success_response)
|
198
|
+
end
|
199
|
+
|
193
200
|
end
|
194
201
|
|
195
202
|
def process_text_file(full_file_path)
|
@@ -197,6 +204,12 @@ module SiemensAbgElectrolyteModule
|
|
197
204
|
process_electrolytes(k.bytes)
|
198
205
|
end
|
199
206
|
|
207
|
+
def clear
|
208
|
+
self.data_buffer = ''
|
209
|
+
self.test_data_bytes = []
|
210
|
+
self.data_bytes = []
|
211
|
+
end
|
212
|
+
|
200
213
|
|
201
214
|
def receive_data(data)
|
202
215
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_astm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bhargav Raut
|
@@ -136,6 +136,20 @@ dependencies:
|
|
136
136
|
- - ">="
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: '0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: jwt
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - ">="
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0'
|
146
|
+
type: :runtime
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
139
153
|
description: This gem provides a server that can handle communication from medical
|
140
154
|
instruments that send/receive information on the ASTM protocol.
|
141
155
|
email: bhargav.r.raut@gmail.com
|