ruby_astm 1.0.3 → 1.0.4

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: 9e4d0af70a0da589dd48c3697a5563b85ba3541a
4
- data.tar.gz: 9043a7cae3b574636f58a84278c586c115a07fa7
3
+ metadata.gz: ba3587cb0b287c214f34b23f5d4675ee5078d1a5
4
+ data.tar.gz: 9aaa09bb81f96f74ecb7cf83a0e7e97a62e3e2e1
5
5
  SHA512:
6
- metadata.gz: dd4da7e2ac230d2a82e57161f9d73b2dd20f1e90baedda3760523d553097eb2c1baecc499f99efc3cd5e75e9436b3ebd8c0355e162a5a6208594faf79a3884e6
7
- data.tar.gz: cf4b50b480717534db5cb752a54d18728d2ece9bf99350dfeb9473d396166d9ad9963641c02b3fb0113a935488b00d6cc95942a8f7a2b69c1bbf87772a735a34
6
+ metadata.gz: 0c2d9545de7424d3d45eeb26e8c7275616d9c2ad8b5e28537832202aa5b6963cc45182c15527a7861436a849c764408c25e42b5fca3c2bfc94d1e2fa29206813
7
+ data.tar.gz: 49dbdffab677b6fd5fea75e8475bdc7b506b6ec0b7c9f979959510b75a72b5ca97c024c5f1f068e71aba3d6912c554fd13dc937ee620dd780890006a9d68a382
@@ -10,3 +10,4 @@ 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"
@@ -0,0 +1,57 @@
1
+ require "ruby_astm/header"
2
+ class Hl7Header < Header
3
+ ## overriding from header.
4
+ attr_accessor :date_time
5
+ attr_accessor :message_type
6
+ attr_accessor :message_control_id
7
+
8
+ 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
15
+ end
16
+
17
+ def set_machine_name(args)
18
+ if line = args[:line]
19
+ unless line.fields[2].blank?
20
+ self.machine_name = line.fields[2]
21
+ end
22
+ end
23
+ end
24
+
25
+ def set_date_time(args)
26
+ if line = args[:line]
27
+ unless line.fields[7].blank?
28
+ self.date_time = line.fields[7]
29
+ end
30
+ end
31
+ end
32
+
33
+ def set_message_type(args)
34
+ if line = args[:line]
35
+ unless line.fields[8].blank?
36
+ line.fields[8].strip.scan(/(?<message_type>[A-Z]+)\^/) { |message_type| self.message_type = message_type[0] }
37
+ end
38
+ end
39
+ end
40
+
41
+ def set_message_control_id(args)
42
+ if line = args[:line]
43
+ unless line.fields[9].blank?
44
+ self.message_control_id = line.fields[9]
45
+ end
46
+ end
47
+ end
48
+
49
+ def generate_ack_success_response
50
+
51
+ end
52
+
53
+ def generate_ack_failure_response
54
+
55
+ end
56
+
57
+ end
@@ -0,0 +1,48 @@
1
+ require "ruby_astm/result"
2
+ class Hl7Observation < Result
3
+ ## first we start with the name.
4
+ def set_name(args)
5
+ if line = args[:line]
6
+ self.name = lookup_mapping(line.fields[3].strip)
7
+ end
8
+ end
9
+
10
+ def set_value(args)
11
+ if line = args[:line]
12
+ self.value = line.fields[5].strip
13
+ if transform_expression = lookup_transform(line.fields[5].strip)
14
+ self.value = eval(transform_expression)
15
+ end
16
+ end
17
+ end
18
+
19
+ def set_flags(args)
20
+ if line = args[:line]
21
+ self.flags = line.fields[8].strip unless line.fields[8].blank?
22
+ end
23
+ end
24
+
25
+ def set_units(args)
26
+ if line = args[:line]
27
+ self.units = line.fields[6].strip unless line.fields[6].blank?
28
+ end
29
+ end
30
+
31
+ def set_timestamp(args)
32
+ if line = args[:line]
33
+ line.fields[19].strip.scan(/(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})(?<hours>\d{2})(?<minutes>\d{2})(?<seconds>\d{2})/) {|year,month,day,hours,minutes,seconds|
34
+ self.timestamp = Time.new(year,month,day,hours,minutes,seconds)
35
+ }
36
+ end
37
+ end
38
+
39
+ def set_reference_ranges(args)
40
+ if line = args[:line]
41
+ self.reference_ranges = line.fields[7].strip unless line.fields[7].blank?
42
+ end
43
+ end
44
+
45
+ def set_dilution(args)
46
+
47
+ end
48
+ end
@@ -5,18 +5,22 @@ class Header
5
5
  attr_accessor :response_sent
6
6
 
7
7
  def initialize(args)
8
+ self.patients = []
9
+ self.queries = []
10
+ self.response_sent = false
8
11
  if args[:line]
9
12
  line = args[:line]
10
- unless line.fields[4].empty?
11
- fields = line.fields[4].split(/\^/)
12
- self.machine_name = fields[0].strip
13
- end
13
+ line
14
14
  else
15
15
  super
16
16
  end
17
- self.patients = []
18
- self.queries = []
19
- self.response_sent = false
17
+ end
18
+
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
23
+ end
20
24
  end
21
25
 
22
26
  ## pushes each patient into a redis list called "patients"
@@ -33,6 +33,7 @@ module LabInterface
33
33
  end
34
34
  end
35
35
 
36
+
36
37
  def terminator
37
38
  "L|1|N\r"
38
39
  end
@@ -41,9 +42,7 @@ module LabInterface
41
42
  def checksum(input)
42
43
  strString = input
43
44
  checksum = strString.sum
44
- #puts "checksum before to_s is: #{checksum}"
45
45
  b = checksum.to_s(16)
46
- #puts "b is: #{b}"
47
46
  strCksm = b[-2..-1]
48
47
  if strCksm.length < 2
49
48
  for i in strString.length..1
@@ -59,7 +58,6 @@ module LabInterface
59
58
 
60
59
  concat = ""
61
60
 
62
-
63
61
  puts data.bytes.to_a.to_s
64
62
 
65
63
  data.bytes.to_a.each do |byte|
@@ -77,35 +75,25 @@ module LabInterface
77
75
  end
78
76
 
79
77
  #puts "concat is:"
80
- puts concat.to_s
78
+ #puts concat.to_s
81
79
  process_text(concat)
82
80
 
83
81
  if data.bytes.to_a[0] == 4
84
- puts "sent ENQ"
85
82
  send_data(ENQ)
86
83
  elsif data.bytes.to_a[0] == 6
87
- ## so now the middle part has to be
88
- =begin
89
- response = STX + "1H|\`^&||||||||||P|E 1394-97|#{Time.now.strftime("%Y%m%d%H%M%S")}\r" + terminator + ETX + checksum("1H|\`^&||||||||||P|E 1394-97|#{Time.now.strftime("%Y%m%d%H%M%S")}\r" + terminator) + "\r"
90
- response = response.bytes.to_a
91
- response << 10
92
- send_data(response.pack('c*'))
93
- =end
94
84
  self.headers[-1].build_responses.each do |response|
95
85
  message_checksum = checksum(response + terminator + ETX)
96
- puts "Calculated checksum is: #{message_checksum}"
86
+ #puts "Calculated checksum is: #{message_checksum}"
97
87
  final_resp = STX + response + terminator + ETX + message_checksum + "\r"
98
88
  final_resp_arr = final_resp.bytes.to_a
99
89
  final_resp_arr << 10
100
- puts final_resp_arr.to_s
90
+ #puts final_resp_arr.to_s
101
91
  if (self.headers[-1].response_sent == false)
102
92
  send_data(final_resp_arr.pack('c*'))
103
93
  self.headers[-1].response_sent = true
104
94
  else
105
- puts "response was already sent."
106
95
  send_data(EOT)
107
96
  end
108
-
109
97
  end
110
98
  else
111
99
  ## send the header
@@ -129,6 +117,17 @@ module LabInterface
129
117
 
130
118
  def process_type(line)
131
119
  case line.type
120
+ when "Hl7_Header"
121
+ hl7_header = Hl7Header.new({:line => line})
122
+ self.headers ||= []
123
+ self.headers << hl7_header
124
+ when "Hl7_Observation"
125
+ hl7_observation = Hl7Observation.new({:line => line})
126
+ self.headers[-1].patients[-1].orders[-1].results[hl7_observation.name] = hl7_observation
127
+ when "Hl7_Patient"
128
+ ## like a patient
129
+ when "Hl7_Patient_Visti"
130
+ ## like an order.
132
131
  when "Header"
133
132
  header = Header.new({:line => line})
134
133
  self.headers ||= []
@@ -2,6 +2,8 @@ class Line
2
2
 
3
3
  TYPES = {
4
4
  "H" => "Header",
5
+ "MSH" => "Hl7_Header",
6
+ "OBX" => "Hl7_Observation",
5
7
  "P" => "Patient",
6
8
  "Q" => "Query",
7
9
  "O" => "Order",
@@ -23,8 +25,6 @@ class Line
23
25
  ##
24
26
  ########################################################
25
27
 
26
-
27
-
28
28
  ## sets the types, and fields
29
29
  ## we can have processing based on line.
30
30
  def initialize(args)
@@ -41,23 +41,12 @@ class Line
41
41
  def detect_type
42
42
  #puts "detecting line type: #{self.text}"
43
43
  line_type = self.fields[0]
44
- line_type.scan(/(?<ltype>[A-Z])/) { |ltype|
45
- #puts "got ltype as: #{ltype[0]}"
46
- #puts Line::TYPES.to_s
44
+ line_type.scan(/(?<ltype>[A-Z]+)/) { |ltype|
47
45
  if Line::TYPES[ltype[0]]
48
46
  self.type = Line::TYPES[ltype[0]]
49
- #puts "assigning type as: #{self.type}"
50
47
  end
51
48
  }
52
-
53
- =begin
54
- if self.fields[0][1..-1] =~/#{type}/
55
- puts "got type: #{Line::TYPES[type]}"
56
- self.type = Line::TYPES[type]
57
- break
58
- end
59
- =end
60
-
49
+
61
50
  end
62
51
 
63
52
 
@@ -69,7 +69,7 @@ class Order
69
69
  #puts "no specimen type has been provided, sending SERUM"
70
70
  end
71
71
 
72
- "O|#{self.sequence_number}|#{self.id}^01||^^^#{self.tests.join('^^^')}|#{self.priority}||#{Time.now.strftime("%Y%m%d%H%M%S")}||||N||||#{self.specimen_type || 'SERUM'}\r"
72
+ "O|#{self.sequence_number}|#{self.id}^01||^^^#{self.tests.join('`^^^')}|#{self.priority}||#{Time.now.strftime("%Y%m%d%H%M%S")}||||N||||#{self.specimen_type || 'SERUM'}\r"
73
73
  end
74
74
 
75
75
  end
@@ -42,7 +42,7 @@ class Query
42
42
  sequence_number = "0"
43
43
 
44
44
  ## default patient id:
45
- patient_id = "abcde"
45
+ patient_id = "abcde#{Time.now.strftime("%b %d, %Y, %H:%M:%S"}"
46
46
 
47
47
  patient = Patient.new({:sequence_number => sequence_number, :patient_id => patient_id})
48
48
 
@@ -7,8 +7,66 @@ class Result
7
7
  attr_accessor :reference_ranges
8
8
  attr_accessor :dilution
9
9
 
10
+ def set_name(args)
11
+ if line = args[:line]
12
+ line.fields[2].scan(/\^+(?<name>[A-Za-z0-9\%\#\-\_\?\/]+)\^?(?<dilution>\d+)?/) { |name,dilution|
13
+ self.name = lookup_mapping(name)
14
+ }
15
+ end
16
+ end
17
+
18
+ def set_value(args)
19
+ if line = args[:line]
20
+ self.value = line.fields[3].strip
21
+ line.fields[2].scan(/\^+(?<name>[A-Za-z0-9\%\#\-\_\?\/]+)\^?(?<dilution>\d+)?/) { |name,dilution|
22
+ if transform_expression = lookup_transform(name)
23
+ self.value = eval(transform_expression)
24
+ end
25
+ }
26
+ end
27
+ end
28
+
29
+ def set_flags(args)
30
+ if line = args[:line]
31
+ self.flags = line.fields[6].strip
32
+ end
33
+ end
34
+
35
+ def set_units(args)
36
+
37
+ end
38
+
39
+ def set_timestamp(args)
40
+ if line = args[:line]
41
+ line.fields[12].strip.scan(/(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})(?<hours>\d{2})(?<minutes>\d{2})(?<seconds>\d{2})/) {|year,month,day,hours,minutes,seconds|
42
+ self.timestamp = Time.new(year,month,day,hours,minutes,seconds)
43
+ }
44
+ end
45
+ end
46
+
47
+ def set_reference_ranges(args)
48
+ if line = args[:line]
49
+ self.reference_ranges = line.fields[5].strip
50
+ end
51
+ end
52
+
53
+ def set_dilution(args)
54
+ if line = args[:line]
55
+ line.fields[2].scan(/\^+(?<name>[A-Za-z0-9\%\#\-\_\?\/]+)\^?(?<dilution>\d+)?/) { |name,dilution|
56
+ self.dilution = dilution
57
+ }
58
+ end
59
+ end
60
+
10
61
  ## here will call mappings and check the result correlation
11
62
  def initialize(args)
63
+ set_name(args)
64
+ set_flags(args)
65
+ set_value(args)
66
+ set_timestamp(args)
67
+ set_dilution(args)
68
+ set_units(args)
69
+ =begin
12
70
  if args[:line]
13
71
  line = args[:line]
14
72
  transform_expression = nil
@@ -18,13 +76,9 @@ class Result
18
76
  transform_expression = lookup_transform(name)
19
77
  }
20
78
  self.value = line.fields[3].strip
21
-
22
79
  if transform_expression
23
- #puts "got transform expression, now evalling it."
24
80
  self.value = eval(transform_expression)
25
- #puts "Value after eval: #{self.value}"
26
81
  end
27
- #eval(transform_expression) unless transform_expression.blank?
28
82
  self.reference_ranges = line.fields[5].strip
29
83
  self.flags = line.fields[6].strip
30
84
  line.fields[12].strip.scan(/(?<year>\d{4})(?<month>\d{2})(?<day>\d{2})(?<hours>\d{2})(?<minutes>\d{2})(?<seconds>\d{2})/) {|year,month,day,hours,minutes,seconds|
@@ -33,6 +87,7 @@ class Result
33
87
  else
34
88
  super
35
89
  end
90
+ =end
36
91
  end
37
92
 
38
93
  ## @return[String] the name defined in the mappings.json file, or the name that wqs passed in.
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.3
4
+ version: 1.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bhargav Raut
@@ -120,6 +120,8 @@ files:
120
120
  - lib/publisher/google_lab_interface.rb
121
121
  - lib/publisher/poller.rb
122
122
  - lib/ruby_astm.rb
123
+ - lib/ruby_astm/HL7/hl7_header.rb
124
+ - lib/ruby_astm/HL7/hl7_observation.rb
123
125
  - lib/ruby_astm/astm_server.rb
124
126
  - lib/ruby_astm/frame.rb
125
127
  - lib/ruby_astm/header.rb