ruby-hl7 1.2.3 → 1.3.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.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +7 -0
  3. data/.rubocop.yml +127 -0
  4. data/.travis.yml +20 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +58 -0
  7. data/NOTES.md +121 -0
  8. data/README.rdoc +5 -0
  9. data/Rakefile +77 -0
  10. data/VERSION +1 -0
  11. data/VERSION.yml +4 -0
  12. data/examples/proxy_server.rb +26 -0
  13. data/lib/ruby-hl7.rb +1 -1
  14. data/lib/segments/pid.rb +13 -1
  15. data/ruby-hl7.gemspec +38 -0
  16. data/spec/ail_segment_spec.rb +28 -0
  17. data/spec/aip_segment_spec.rb +31 -0
  18. data/spec/basic_parsing_spec.rb +319 -0
  19. data/spec/batch_parsing_spec.rb +52 -0
  20. data/spec/child_segment_spec.rb +66 -0
  21. data/spec/core_ext/date_time_spec.rb +43 -0
  22. data/spec/default_segment_spec.rb +31 -0
  23. data/spec/dg1_spec.rb +42 -0
  24. data/spec/dynamic_segment_def_spec.rb +37 -0
  25. data/spec/err_segment_spec.rb +26 -0
  26. data/spec/evn_segment_spec.rb +23 -0
  27. data/spec/fts_segment_spec.rb +19 -0
  28. data/spec/in1_segment_spec.rb +34 -0
  29. data/spec/message_spec.rb +53 -0
  30. data/spec/messages_spec.rb +24 -0
  31. data/spec/mfe_segment_spec.rb +28 -0
  32. data/spec/mfi_segment_spec.rb +28 -0
  33. data/spec/msa_segment_spec.rb +27 -0
  34. data/spec/msh_segment_spec.rb +28 -0
  35. data/spec/nk1_segment_spec.rb +26 -0
  36. data/spec/obr_segment_spec.rb +45 -0
  37. data/spec/obx_segment_spec.rb +68 -0
  38. data/spec/orc_segment_spec.rb +27 -0
  39. data/spec/pid_segment_spec.rb +78 -0
  40. data/spec/prd_segment_spec.rb +29 -0
  41. data/spec/pv1_segment_spec.rb +23 -0
  42. data/spec/rf1_segment_spec.rb +29 -0
  43. data/spec/sch_segment_spec.rb +32 -0
  44. data/spec/segment_field_spec.rb +110 -0
  45. data/spec/segment_generator_spec.rb +32 -0
  46. data/spec/segment_list_storage_spec.rb +47 -0
  47. data/spec/segment_spec.rb +38 -0
  48. data/spec/sft_segment_spec.rb +26 -0
  49. data/spec/spec_helper.rb +13 -0
  50. data/spec/speed_parsing_spec.rb +19 -0
  51. data/spec/spm_segment_spec.rb +26 -0
  52. metadata +117 -13
  53. data/lib/segments/zcf.rb +0 -22
@@ -0,0 +1,52 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe HL7::Message do
5
+ context 'batch parsing' do
6
+ it 'should have a class method HL7::Message.parse_batch' do
7
+ expect(HL7::Message).to respond_to(:parse_batch)
8
+ end
9
+
10
+ it 'should raise an exception when parsing an empty batch' do
11
+ # :empty_batch message contains a valid batch envelope with no
12
+ # contents
13
+ expect do
14
+ HL7::Message.parse_batch HL7MESSAGES[:empty_batch]
15
+ end.to raise_exception(HL7::ParseError, 'empty_batch_message')
16
+ end
17
+
18
+ it 'should raise an exception when parsing a single message as a batch' do
19
+ expect do
20
+ HL7::Message.parse_batch HL7MESSAGES[:realm_minimal_message]
21
+ end.to raise_exception(HL7::ParseError, 'badly_formed_batch_message')
22
+ end
23
+
24
+ it 'should yield multiple messages from a valid batch' do
25
+ count = 0
26
+ HL7::Message.parse_batch(HL7MESSAGES[:realm_batch]) do |m|
27
+ count += 1
28
+ end
29
+ expect(count).to eq 2
30
+ end
31
+ end
32
+ end
33
+
34
+ describe 'String extension' do
35
+ before :all do
36
+ @batch_message = HL7MESSAGES[:realm_batch]
37
+ @plain_message = HL7MESSAGES[:realm_minimal_message]
38
+ end
39
+
40
+ it 'should respond_to :hl7_batch?' do
41
+ expect(@batch_message.hl7_batch?).to be true
42
+ expect(@plain_message).to respond_to(:hl7_batch?)
43
+ end
44
+
45
+ it 'should return true when passed a batch message' do
46
+ expect(@batch_message).to be_an_hl7_batch
47
+ end
48
+
49
+ it 'should return false when passed a plain message' do
50
+ expect(@plain_message).not_to be_an_hl7_batch
51
+ end
52
+ end
@@ -0,0 +1,66 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe HL7::Message do
5
+ context 'child segments' do
6
+ before :all do
7
+ @base = open( './test_data/obxobr.hl7' ).readlines
8
+ end
9
+
10
+ it 'allows access to child segments' do
11
+ msg = HL7::Message.new @base
12
+ expect(msg).not_to be_nil
13
+ expect(msg[:OBR]).not_to be_nil
14
+ expect(msg[:OBR].length).to eq 3
15
+ expect(msg[:OBR][0].children).not_to be_nil
16
+ expect(msg[:OBR][0].children.length).to eq 6
17
+ expect(msg[:OBR][1].children).not_to be_nil
18
+ expect(msg[:OBR][1].children.length).to eq 3
19
+ expect(msg[:OBR][2].children).not_to be_nil
20
+ expect(msg[:OBR][2].children.length).to eq 1
21
+ expect(msg[:OBX][0].children).not_to be_nil
22
+ expect(msg[:OBX][0].children.length).to eq 1
23
+
24
+ msg[:OBR][0].children.each do |x|
25
+ expect(x).not_to be_nil
26
+ end
27
+ msg[:OBR][1].children.each do |x|
28
+ expect(x).not_to be_nil
29
+ end
30
+ msg[:OBR][2].children.each do |x|
31
+ expect(x).not_to be_nil
32
+ end
33
+ end
34
+
35
+ it 'allows adding child segments' do
36
+ msg = HL7::Message.new @base
37
+ expect(msg).not_to be_nil
38
+ expect(msg[:OBR]).not_to be_nil
39
+ ob = HL7::Message::Segment::OBR.new
40
+ expect(ob).not_to be_nil
41
+
42
+ msg << ob
43
+ expect(ob.children).not_to be_nil
44
+ expect(ob.segment_parent).not_to be_nil
45
+ expect(ob.segment_parent).to eq msg
46
+ orig_cnt = msg.length
47
+
48
+ (1..4).each do |x|
49
+ m = HL7::Message::Segment::OBX.new
50
+ m.observation_value = "taco"
51
+ expect(m).not_to be_nil
52
+ expect(/taco/.match(m.to_s)).not_to be_nil
53
+ ob.children << m
54
+ expect(ob.children.length).to eq x
55
+ expect(m.segment_parent).not_to be_nil
56
+ expect(m.segment_parent).to eq ob
57
+ end
58
+
59
+ expect(@base).not_to eq msg.to_hl7
60
+ expect(msg.length).not_to eq orig_cnt
61
+ text_ver = msg.to_hl7
62
+ expect(/taco/.match(text_ver)).not_to be_nil
63
+ end
64
+ end
65
+ end
66
+
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Date do
4
+
5
+ subject{ Date.parse('2013-12-02').to_hl7 }
6
+
7
+ it "should respond to the HL7 timestamp" do
8
+ expect(subject).to eq "20131202"
9
+ end
10
+ end
11
+
12
+ describe "to_hl7 for time related classes" do
13
+
14
+ let(:formated_time){ time_now.strftime('%Y%m%d%H%M%S') }
15
+ let(:fraction_3){ "." + sprintf('%06d', time_now.to_time.usec)[0, 3] }
16
+ let(:fraction_9){ "." + sprintf('%06d', time_now.to_time.usec) + ("0" * 3) }
17
+
18
+ shared_examples "a time to_hl7" do
19
+ context "without fraction" do
20
+ it { expect(time_now.to_time.to_hl7).to eq formated_time }
21
+ end
22
+
23
+ context "with_fraction" do
24
+ it { expect(time_now.to_time.to_hl7(3)).to eq formated_time + fraction_3 }
25
+
26
+ it { expect(time_now.to_time.to_hl7(9)).to eq formated_time + fraction_9 }
27
+ end
28
+ end
29
+
30
+ describe Time do
31
+ let(:time_now){ Time.now }
32
+
33
+ it_should_behave_like "a time to_hl7"
34
+ end
35
+
36
+ describe DateTime do
37
+ let(:time_now){ DateTime.now }
38
+
39
+ it_should_behave_like "a time to_hl7"
40
+ end
41
+
42
+ end
43
+
@@ -0,0 +1,31 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe HL7::Message::Segment::Default do
5
+ context 'general' do
6
+
7
+ before :all do
8
+ @base_msa = "MSA|AR|ZZ9380 ERR"
9
+ end
10
+
11
+ it 'stores an existing segment' do
12
+ seg = HL7::Message::Segment::Default.new( @base_msa )
13
+ expect(seg.to_s).to eq @base_msa
14
+ end
15
+
16
+ it 'converts to a string' do
17
+ seg = HL7::Message::Segment::Default.new( @base_msa )
18
+ expect(seg.to_s).to eq @base_msa
19
+ expect(seg.to_hl7).to eq seg.to_s
20
+ end
21
+
22
+ it 'creates a raw segment' do
23
+ seg = HL7::Message::Segment::Default.new
24
+ seg.e0 = "NK1"
25
+ seg.e1 = "INFO"
26
+ seg.e2 = "MORE INFO"
27
+ seg.e5 = "LAST INFO"
28
+ expect(seg.to_s).to eq "NK1|INFO|MORE INFO|||LAST INFO"
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: UTF-8
2
+ require "spec_helper"
3
+
4
+ describe HL7::Message::Segment::DG1 do
5
+ context "reading" do
6
+ let(:base_string) do
7
+ "DG1|1|I9|71596^OSTEOARTHROS NOS-L/LEG ^I9|OSTEOARTHROS NOS-L/LEG |20170615140551-0800||A|"
8
+ end
9
+ let(:segment){ HL7::Message::Segment::DG1.new(base_string) }
10
+
11
+ it "allows access to an DG1 segment" do
12
+ expect(segment.set_id).to eq("1")
13
+ expect(segment.diagnosis_coding_method).to eq("I9")
14
+ expect(segment.diagnosis_code).to eq("71596^OSTEOARTHROS NOS-L/LEG ^I9")
15
+ expect(segment.diagnosis_description).to eq("OSTEOARTHROS NOS-L/LEG ")
16
+ expect(segment.diagnosis_date_time).to eq("20170615140551-0800")
17
+ expect(segment.diagnosis_type).to eq("")
18
+ expect(segment.major_diagnostic_category).to eq("A")
19
+ expect(segment.diagnosis_related_group).to eq("")
20
+ expect(segment.drg_approval_indicator).to eq(nil)
21
+ expect(segment.drg_grouper_review_code).to eq(nil)
22
+ expect(segment.outlier_type).to eq(nil)
23
+ expect(segment.outlier_days).to eq(nil)
24
+ expect(segment.outlier_cost).to eq(nil)
25
+ expect(segment.grouper_version_and_type).to eq(nil)
26
+ expect(segment.diagnosis_priority).to eq(nil)
27
+ expect(segment.diagnosis_clinician).to eq(nil)
28
+ expect(segment.diagnosis_classification).to eq(nil)
29
+ expect(segment.confidential_indicator).to eq(nil)
30
+ expect(segment.attestation_date_time).to eq(nil)
31
+ end
32
+ end
33
+
34
+ context "creating" do
35
+ let(:segment){ HL7::Message::Segment::DG1.new }
36
+
37
+ it "allows creation of an DGH segment" do
38
+ segment.set_id = "2"
39
+ expect(segment.set_id).to eq("2")
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe 'dynamic segment definition' do
5
+ context 'general' do
6
+ it 'accepts a block with a parameter' do
7
+ seg = HL7::Message::Segment.new do |s|
8
+ s.e0 = "MSK"
9
+ s.e1 = "1234"
10
+ s.e2 = "5678"
11
+ end
12
+
13
+ expect(seg.to_s).to eq "MSK|1234|5678"
14
+ end
15
+
16
+ it 'accepts a block without a parameter' do
17
+ seg = HL7::Message::Segment.new do
18
+ e0 "MSK"
19
+ e1 "1234"
20
+ e2 "5678"
21
+ end
22
+
23
+ expect(seg.to_s).to eq "MSK|1234|5678"
24
+ end
25
+
26
+ it "doesn't pollute the caller namespace" do
27
+ seg = HL7::Message::Segment.new do |s|
28
+ s.e0 = "MSK"
29
+ s.e1 = "1234"
30
+ s.e2 = "5678"
31
+ end
32
+
33
+ expect { e3 "TEST" }.to raise_error(NoMethodError)
34
+ expect(seg.to_s).to eq "MSK|1234|5678"
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe HL7::Message::Segment::ERR do
5
+ context 'general' do
6
+ before :all do
7
+ @base_err = 'ERR||OBR^1|100^Segment sequence error^HL70357|E|||Missing required OBR segment|Email help desk for further information on this error||||^NET^Internet^helpdesk@hl7.org'
8
+ end
9
+
10
+ it 'creates an ERR segment' do
11
+ expect do
12
+ err = HL7::Message::Segment::ERR.new( @base_err )
13
+ expect(err).not_to be_nil
14
+ expect(err.to_s).to eq @base_err
15
+ end.not_to raise_error
16
+ end
17
+
18
+ it 'allows access to an ERR segment' do
19
+ expect do
20
+ err = HL7::Message::Segment::ERR.new( @base_err )
21
+ expect(err.severity).to eq 'E'
22
+ expect(err.error_location).to eq 'OBR^1'
23
+ end.not_to raise_error
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe HL7::Message::Segment::EVN do
5
+ context 'general' do
6
+ before :all do
7
+ @base = "EVN|A04|20060705000000"
8
+ end
9
+
10
+ it 'allows access to an EVN segment' do
11
+ evn = HL7::Message::Segment::EVN.new @base
12
+ expect(evn.type_code).to eq "A04"
13
+ end
14
+
15
+ it 'allows creation of an EVN segment' do
16
+ evn = HL7::Message::Segment::EVN.new
17
+ evn.event_facility="A Facility"
18
+ expect(evn.event_facility).to eq 'A Facility'
19
+ evn.recorded_date = Date.new 2001,2,3
20
+ expect(evn.recorded_date).to eq "20010203"
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe HL7::Message::Segment::FTS do
4
+ context 'general' do
5
+ before :all do
6
+ base_string = 'FTS||End of File'
7
+ @fts = HL7::Message::Segment::FTS.new(base_string)
8
+ end
9
+
10
+ it 'creates an FTS segment' do
11
+ expect(@fts).to_not be_nil
12
+ end
13
+
14
+ it 'allows access to an FTS segment' do
15
+ expect(@fts.file_batch_count).to eq('')
16
+ expect(@fts.file_trailer_comment).to eq('End of File')
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,34 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe HL7::Message::Segment::IN1 do
5
+ context 'general' do
6
+ before :all do
7
+ @base_in1 = 'IN1|1||752|ACORDIA NATIONAL||||A|GRP|||||||SMITH^JOHN|19|19700102||||||||||||||||||WC23732763278A|||||||||||||||||X'
8
+ end
9
+
10
+ it 'creates an IN1 segment' do
11
+ expect do
12
+ in1 = HL7::Message::Segment::IN1.new( @base_in1 )
13
+ expect(in1).not_to be_nil
14
+ expect(in1.to_s).to eq @base_in1
15
+ end.not_to raise_error
16
+ end
17
+
18
+ it 'allows access to an IN1 segment' do
19
+ expect do
20
+ in1 = HL7::Message::Segment::IN1.new( @base_in1 )
21
+ expect(in1.set_id).to eq '1'
22
+ expect(in1.insurance_company_id).to eq '752'
23
+ expect(in1.insurance_company_name).to eq 'ACORDIA NATIONAL'
24
+ expect(in1.group_number).to eq 'A'
25
+ expect(in1.group_name).to eq 'GRP'
26
+ expect(in1.name_of_insured).to eq 'SMITH^JOHN'
27
+ expect(in1.insureds_relationship_to_patient).to eq '19'
28
+ expect(in1.insureds_date_of_birth).to eq '19700102'
29
+ expect(in1.policy_number).to eq 'WC23732763278A'
30
+ expect(in1.vip_indicator).to eq 'X'
31
+ end.not_to raise_error
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,53 @@
1
+ require 'spec_helper'
2
+
3
+ describe HL7::Message do
4
+ describe "#correction?" do
5
+ let(:hl7) { HL7::Message.new data }
6
+ subject { hl7.correction? }
7
+
8
+ context "when is a correction" do
9
+ let(:data) {
10
+ [
11
+ 'OBR|1|A241Z^LAB||123456^A TEST^L|||201508181431||1234||||None|201502181432||||OMG123||||20150818143300', # "F" final
12
+ 'OBX|1|ST|123456^AA OBSERVATION^L^4567890^FIRST OBSERVATION^LN||42|ug/dL^Micrograms per Deciliter^UCUM|<10 ug/dL|H|||F||||OMG',
13
+ 'NTE|1||SOME',
14
+ 'NTE|2||THOUGHTS',
15
+ 'OBR|2|A241Z^LAB||123456^A TEST^L|||201508181431||1234||||None|201502181432||||OMG123||||20150818143300', # "C" corrected
16
+ 'OBX|1|ST|123456^AA OBSERVATION^L^4567890^FIRST OBSERVATION^LN||42|ug/dL^Micrograms per Deciliter^UCUM|<10 ug/dL|H|||C||||OMG',
17
+ 'NTE|1||SOME',
18
+ 'NTE|2||THOUGHTS',
19
+ ].join("\r")
20
+ }
21
+
22
+ it { is_expected.to be true }
23
+ end
24
+
25
+ context "when is not a correction" do
26
+ let(:data) {
27
+ [
28
+ 'OBR|1|A241Z^LAB||123456^A TEST^L|||201508181431||1234||||None|201502181432||||OMG123||||20150818143300', # "F" final
29
+ 'OBX|1|ST|123456^AA OBSERVATION^L^4567890^FIRST OBSERVATION^LN||42|ug/dL^Micrograms per Deciliter^UCUM|<10 ug/dL|H|||F||||OMG',
30
+ 'NTE|1||SOME',
31
+ 'NTE|2||THOUGHTS',
32
+ 'OBR|2|A241Z^LAB||123456^A TEST^L|||201508181431||1234||||None|201502181432||||OMG123||||20150818143300', # "F" final
33
+ 'OBX|1|ST|123456^AA OBSERVATION^L^4567890^FIRST OBSERVATION^LN||42|ug/dL^Micrograms per Deciliter^UCUM|<10 ug/dL|H|||F||||OMG',
34
+ 'NTE|1||SOME',
35
+ 'NTE|2||THOUGHTS',
36
+ ].join("\r")
37
+ }
38
+
39
+ it { is_expected.to be false }
40
+ end
41
+
42
+ context "when there are no results (OBX) segments" do
43
+ let(:data) {
44
+ [
45
+ 'OBR|1|A241Z^LAB||123456^A TEST^L|||201508181431||1234||||None|201502181432||||OMG123||||20150818143300',
46
+ 'OBR|2|A241Z^LAB||123456^A TEST^L|||201508181431||1234||||None|201502181432||||OMG123||||20150818143300'
47
+ ].join("\r")
48
+ }
49
+
50
+ it { is_expected.to be false }
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ describe "HL7 Messages" do
4
+ it 'processes multiple known messages without failing' do
5
+ expect do
6
+ HL7MESSAGES.each_pair do |key, hl7|
7
+ HL7::Message.new(hl7)
8
+ end
9
+ end.not_to raise_exception
10
+ end
11
+
12
+ describe 'MFN M13 Messages' do
13
+ it "extracts the MSH" do
14
+ expect(HL7::Message.new(HL7MESSAGES[:mfn_m13])[:MSH].sending_app).to eq 'HL7REG'
15
+ end
16
+ it 'extracts the MFI' do
17
+ expect(HL7::Message.new(HL7MESSAGES[:mfn_m13])[:MFI].master_file_identifier).to eq 'HL70006^RELIGION^HL70175'
18
+ end
19
+ it 'extracts the MFE' do
20
+ expect(HL7::Message.new(HL7MESSAGES[:mfn_m13])[:MFE][0].mfn_control_id).to eq '6772333'
21
+ expect(HL7::Message.new(HL7MESSAGES[:mfn_m13])[:MFE][1].mfn_control_id).to eq '6772334'
22
+ end
23
+ end
24
+ end