ruby_astm 1.0.3 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
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