ruby_astm 1.0.5 → 1.0.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ace8154322b2f7d82e9b73d16abfba0781e419a9
4
- data.tar.gz: f6e234ae0f2e806c74f331a1e544de7c83ff754d
3
+ metadata.gz: 2ca559f093f64b83516605cf9e8f258e0d22fb13
4
+ data.tar.gz: 40b5a1d881488650d4fe3c12ae558b33f27d8767
5
5
  SHA512:
6
- metadata.gz: 53cbfc57cdad5bf1fd99213ea567630e31e6103646b0d6205f85125b25eae4e0fa4875be4f73765deada631b7712134e099b2608c59638fce07bbc63ec3be979
7
- data.tar.gz: efbd01f4cc48b1bb9cb3f79dfe2f1653615ba526c0cae415310c7e6b49c953ff41cd2c1633a17b7e28a5a414b6c56df9797594c9924aff11e61ee9775bdeff9a
6
+ metadata.gz: e93d576aed5cadabc970410e761f1f003525b7a3b79b990904af3c45c08c317d6d9f064461c56ade9a8ece1a013103e9b79f3ffc6197ddef3984b563efccb92a
7
+ data.tar.gz: cc6bf2ff832d15deec84c8e39b67f94723c703f5aec0ee406bba53cc2d145c242dcdca3f90942541047b3f9ba9e103e81ec71ab5f38de9adc9f78ad59b4cb352
data/lib/mappings.json CHANGED
@@ -193,5 +193,53 @@
193
193
  "ESR" : {
194
194
  "LIS_CODE" : "ESR",
195
195
  "TUBE" : "ESR"
196
+ },
197
+ "GLU" : {
198
+ "LIS_CODE" : "GLU",
199
+ "TUBE" : "URINE_CONTAINER"
200
+ },
201
+ "BIL" : {
202
+ "LIS_CODE" : "BIL",
203
+ "TUBE" : "URINE_CONTAINER"
204
+ },
205
+ "KET" : {
206
+ "LIS_CODE" : "KET",
207
+ "TUBE" : "URINE_CONTAINER"
208
+ },
209
+ "SG" : {
210
+ "LIS_CODE" : "SG",
211
+ "TUBE" : "URINE_CONTAINER"
212
+ },
213
+ "BLO" : {
214
+ "LIS_CODE" : "BLO",
215
+ "TUBE" : "URINE_CONTAINER"
216
+ },
217
+ "pH" : {
218
+ "LIS_CODE" : "pH",
219
+ "TUBE" : "URINE_CONTAINER"
220
+ },
221
+ "PRO" : {
222
+ "LIS_CODE" : "PRO",
223
+ "TUBE" : "URINE_CONTAINER"
224
+ },
225
+ "URO" : {
226
+ "LIS_CODE" : "URO",
227
+ "TUBE" : "URINE_CONTAINER"
228
+ },
229
+ "NIT" : {
230
+ "LIS_CODE" : "NIT",
231
+ "TUBE" : "URINE_CONTAINER"
232
+ },
233
+ "LEU" : {
234
+ "LIS_CODE" : "LEU",
235
+ "TUBE" : "URINE_CONTAINER"
236
+ },
237
+ "COL" : {
238
+ "LIS_CODE" : "COL",
239
+ "TUBE" : "URINE_CONTAINER"
240
+ },
241
+ "CLA" : {
242
+ "LIS_CODE" : "CLA",
243
+ "TUBE" : "URINE_CONTAINER"
196
244
  }
197
245
  }
@@ -5,13 +5,16 @@ class Hl7Header < Header
5
5
  attr_accessor :message_type
6
6
  attr_accessor :message_control_id
7
7
 
8
+ def set_protocol(args)
9
+ self.protocol = "HL7"
10
+ end
11
+
8
12
  def initialize(args)
9
- super.tap do |r|
10
- set_machine_name(args)
11
- set_date_time(args)
12
- set_message_type(args)
13
- set_message_control_id(args)
14
- end
13
+ super
14
+ set_machine_name(args)
15
+ set_date_time(args)
16
+ set_message_type(args)
17
+ set_message_control_id(args)
15
18
  end
16
19
 
17
20
  def set_machine_name(args)
@@ -46,8 +49,76 @@ class Hl7Header < Header
46
49
  end
47
50
  end
48
51
 
52
+ ################################################################################
53
+ ##
54
+ ##
55
+ ## METHODS FOR generating the acknowledgement to an HL7 Message
56
+ ##
57
+ ##
58
+ ################################################################################
59
+
60
+ def seperator
61
+ "|"
62
+ end
63
+
64
+ def header
65
+ "MSH"
66
+ end
67
+
68
+ def field_seperators
69
+ "^~\\&"
70
+ end
71
+
72
+ def sending_application_name
73
+ "Pathofast_LIS"
74
+ end
75
+
76
+ def sending_facility_name
77
+ "Pathofast"
78
+ end
79
+
80
+ def sending_date_time
81
+ Time.now.strftime("%Y%m%d%H%M%S")
82
+ end
83
+
84
+ def ack_message
85
+ "ACK"
86
+ end
87
+
88
+ def nack_message
89
+ "NACK"
90
+ end
91
+
92
+ def hl7_version
93
+ "2.4"
94
+ end
95
+
49
96
  def generate_ack_success_response
50
97
 
98
+ ack_msg = ""
99
+ ack_msg += header + seperator
100
+ ack_msg += field_seperators + seperator
101
+ ack_msg += sending_application_name + seperator
102
+ ack_msg += sending_facility_name + seperator
103
+ ack_msg += seperator
104
+ ack_msg += seperator
105
+ ack_msg += sending_date_time + seperator
106
+ ack_msg += seperator
107
+ ack_msg += ack_msg + seperator
108
+ ack_msg += self.message_control_id + seperator
109
+ ack_msg += seperator
110
+ ack_msg += hl7_version + seperator
111
+ ack_msg += seperator
112
+ ack_msg += seperator
113
+ ack_msg += seperator
114
+ ack_msg += seperator
115
+ ack_msg += seperator
116
+ ack_msg += seperator
117
+ ack_msg += seperator
118
+ ack_msg += "AA" + seperator
119
+ ack_msg += sending_date_time + seperator
120
+ ack_msg
121
+
51
122
  end
52
123
 
53
124
  def generate_ack_failure_response
@@ -0,0 +1,6 @@
1
+ require "ruby_astm/order"
2
+ class Hl7Order < Order
3
+ def set_id(args)
4
+ self.id = args[:patient_id]
5
+ end
6
+ end
@@ -0,0 +1,14 @@
1
+ require "ruby_astm/patient"
2
+ class Hl7Patient < Patient
3
+ def set_sequence_number(args)
4
+
5
+ end
6
+
7
+ def set_patient_id(args)
8
+ if line = args[:line]
9
+ unless line.fields[3].blank?
10
+ self.patient_id = line.fields[3].strip
11
+ end
12
+ end
13
+ end
14
+ end
@@ -3,30 +3,46 @@ class Header
3
3
  attr_accessor :patients
4
4
  attr_accessor :queries
5
5
  attr_accessor :response_sent
6
+ attr_accessor :protocol
7
+
8
+ def is_astm?
9
+ self.protocol == "ASTM"
10
+ end
11
+
12
+ def is_hl7?
13
+ self.protocol == "HL7"
14
+ end
15
+
16
+
17
+ def set_protocol(args)
18
+ self.protocol = "ASTM"
19
+ end
6
20
 
7
21
  def initialize(args)
8
22
  self.patients = []
9
23
  self.queries = []
10
24
  self.response_sent = false
11
- if args[:line]
12
- line = args[:line]
13
- line
25
+ if line = args[:line]
26
+ set_machine_name(args)
27
+ set_protocol(args)
14
28
  else
15
29
  super
16
30
  end
17
31
  end
18
32
 
19
- def set_machine_name(line)
20
- unless line.fields[4].empty?
21
- fields = line.fields[4].split(/\^/)
22
- self.machine_name = fields[0].strip
33
+ def set_machine_name(args)
34
+ if line = args[:line]
35
+ unless line.fields[4].empty?
36
+ fields = line.fields[4].split(/\^/)
37
+ self.machine_name = fields[0].strip
38
+ end
23
39
  end
24
40
  end
25
41
 
26
42
  ## pushes each patient into a redis list called "patients"
27
43
  def commit
28
44
  self.patients.map{|patient| $redis.lpush("patients",patient.to_json)}
29
- #puts JSON.pretty_generate(JSON.parse(self.to_json))
45
+ puts JSON.pretty_generate(JSON.parse(self.to_json))
30
46
  end
31
47
 
32
48
  ## used to respond to queries.
@@ -29,7 +29,9 @@ module LabInterface
29
29
  def process_text_file(full_file_path)
30
30
  #full_file_path ||= File.join root,'../test','resources','sysmex_550_sample.txt'
31
31
  IO.read(full_file_path).each_line do |line|
32
- process_text(line)
32
+ line.split('\\r').each do |txt|
33
+ process_text(txt)
34
+ end
33
35
  end
34
36
  end
35
37
 
@@ -98,7 +100,15 @@ module LabInterface
98
100
  else
99
101
  ## send the header
100
102
  puts "--------- SENT ACK -----------"
101
- send_data(ACK)
103
+ if self.headers[-1].is_astm?
104
+ send_data(ACK)
105
+ elsif self.headers[-1].is_hl7?
106
+ if self.headers.size > 0
107
+ ## commit should return the jsonified thing, if possible.
108
+ self.headers[-1].commit
109
+ send_data(self.headers[-1].generate_ack_success_response)
110
+ end
111
+ end
102
112
  end
103
113
  end
104
114
 
@@ -109,6 +119,8 @@ module LabInterface
109
119
  end
110
120
 
111
121
  def process_text(text)
122
+ ## should replace carriage returns with new lines, before processing any file.
123
+ ## or text.
112
124
  text.split("\n").each do |l|
113
125
  line = Line.new({:text => l})
114
126
  process_type(line)
@@ -125,9 +137,11 @@ module LabInterface
125
137
  hl7_observation = Hl7Observation.new({:line => line})
126
138
  self.headers[-1].patients[-1].orders[-1].results[hl7_observation.name] = hl7_observation
127
139
  when "Hl7_Patient"
128
- ## like a patient
129
- when "Hl7_Patient_Visti"
130
- ## like an order.
140
+ hl7_patient = Hl7Patient.new({:line => line})
141
+ self.headers[-1].patients << hl7_patient
142
+ when "Hl7_Order"
143
+ hl7_order = Hl7Order.new({:line => line, :patient_id => self.headers[-1].patients[-1].patient_id})
144
+ self.headers[-1].patients[-1].orders << hl7_order
131
145
  when "Header"
132
146
  header = Header.new({:line => line})
133
147
  self.headers ||= []
@@ -145,6 +159,7 @@ module LabInterface
145
159
  result = Result.new({:line => line})
146
160
  self.headers[-1].patients[-1].orders[-1].results[result.name] = result
147
161
  when "Terminator"
162
+ ## it didn't terminate so there was no commit being called.
148
163
  self.headers[-1].commit
149
164
  end
150
165
  end
@@ -4,6 +4,8 @@ class Line
4
4
  "H" => "Header",
5
5
  "MSH" => "Hl7_Header",
6
6
  "OBX" => "Hl7_Observation",
7
+ "PID" => "Hl7_Patient",
8
+ "OBR" => "Hl7_Order",
7
9
  "P" => "Patient",
8
10
  "Q" => "Query",
9
11
  "O" => "Order",
@@ -34,7 +34,55 @@ class Order
34
34
  ## index (11)
35
35
  attr_accessor :action_code
36
36
 
37
+ def set_id(args)
38
+ if line = args[:line]
39
+ if !line.fields[2].strip.blank?
40
+ line.fields[2].strip.scan(/(?<specimen_id>[^\^]+)/) { |specimen_id|
41
+ self.id ||= specimen_id
42
+ }
43
+ elsif !line.fields[3].strip.blank?
44
+ ## for the sysmex xn-550 this is the regex.
45
+ line.fields[3].strip.scan(/(?<tube_rack>\d+\^)+(?<patient_id>.+)\^/) { |tube_rack,patient_id| self.id = patient_id.strip}
46
+ end
47
+ else
48
+ self.id = args[:specimen_id]
49
+ end
50
+ end
51
+
52
+ def set_sequence_number(args)
53
+ self.sequence_number = args[:sequence_number]
54
+ end
55
+
56
+ def set_tests(args)
57
+ self.tests = args[:tests]
58
+ end
59
+
60
+ def set_specimen_type(args)
61
+ self.specimen_type = args[:specimen_type]
62
+ end
63
+
64
+ def set_date_time(args)
65
+ self.date_time = args[:date_time]
66
+ end
67
+
68
+ def set_priority(args)
69
+ self.priority = args[:priority]
70
+ end
71
+
72
+ def set_action_Code(args)
73
+ self.action_code = args[:args]
74
+ end
75
+
37
76
  def initialize(args)
77
+ set_id(args)
78
+ set_priority(args)
79
+ set_sequence_number(args)
80
+ set_tests(args)
81
+ set_specimen_type(args)
82
+ set_date_time(args)
83
+ set_priority(args)
84
+ set_action_Code(args)
85
+ =begin
38
86
  if args[:line]
39
87
  line = args[:line]
40
88
  if !line.fields[2].strip.blank?
@@ -50,11 +98,11 @@ class Order
50
98
  self.tests = args[:tests]
51
99
  self.id = args[:specimen_id]
52
100
  self.specimen_type = args[:specimen_type]
53
- self.tests = args[:tests]
54
101
  self.date_time = args[:date_time]
55
102
  self.priority = args[:priority]
56
103
  self.action_code = args[:action_code]
57
104
  end
105
+ =end
58
106
  self.results = {}
59
107
  end
60
108
 
@@ -5,17 +5,24 @@ class Patient
5
5
  attr_accessor :patient_id
6
6
  attr_accessor :orders
7
7
 
8
- def initialize(args)
9
- if args[:line]
10
- line = args[:line]
11
- self.sequence_number = line.fields[1].to_i
12
- self.orders = []
8
+ def set_sequence_number(args)
9
+ if line = args[:line]
10
+ self.sequence_number = line.fields[-1].to_i
13
11
  else
14
12
  self.sequence_number = args[:sequence_number]
15
- self.patient_id = args[:patient_id]
16
13
  end
17
14
  end
18
15
 
16
+ def set_patient_id(args)
17
+ self.patient_id = args[:patient_id]
18
+ end
19
+
20
+ def initialize(args)
21
+ set_sequence_number(args)
22
+ set_patient_id(args)
23
+ self.orders = []
24
+ end
25
+
19
26
  ## patient id.
20
27
  def build_response
21
28
  "P|#{self.sequence_number}|#{self.patient_id}|||||||||||||||\r"
data/lib/ruby_astm.rb CHANGED
@@ -10,4 +10,7 @@ require "ruby_astm/astm_server"
10
10
  require "publisher/adapter"
11
11
  require "publisher/google_lab_interface"
12
12
  require "publisher/poller"
13
- require "ruby_astm/HL7/hl7_header"
13
+ require "ruby_astm/HL7/hl7_header"
14
+ require "ruby_astm/HL7/hl7_patient"
15
+ require "ruby_astm/HL7/hl7_order"
16
+ require "ruby_astm/HL7/hl7_observation"
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.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bhargav Raut
@@ -122,6 +122,8 @@ files:
122
122
  - lib/ruby_astm.rb
123
123
  - lib/ruby_astm/HL7/hl7_header.rb
124
124
  - lib/ruby_astm/HL7/hl7_observation.rb
125
+ - lib/ruby_astm/HL7/hl7_order.rb
126
+ - lib/ruby_astm/HL7/hl7_patient.rb
125
127
  - lib/ruby_astm/astm_server.rb
126
128
  - lib/ruby_astm/frame.rb
127
129
  - lib/ruby_astm/header.rb
@@ -155,4 +157,6 @@ rubygems_version: 2.6.14.1
155
157
  signing_key:
156
158
  specification_version: 4
157
159
  summary: A Ruby gem to interface with Medical instruments that work on the ASTM protocol
160
+ and HL7 protocol. Offers limited bidirectionality for ASTM. Bidirectionality is
161
+ currently not supported for HL7
158
162
  test_files: []