ruby-hl7 1.1.0 → 1.1.1

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: 2a1652685f5af3d1977d1d32eda59c87bad5523b
4
- data.tar.gz: 6d995a2efccfb7fd8a0dad2d2c386b530f565824
3
+ metadata.gz: e90514f902634471c8292f6383f505718a4cd80a
4
+ data.tar.gz: 137b33f12ee152e8fe79a006e0b7c29df2f88313
5
5
  SHA512:
6
- metadata.gz: fbaab918091adf2be1062b6343b9fea752d0210091765b0725b4d5d356fb643578a279e9bf21cb8525d7ba4e58b48073196c23f97138f1c3c2bb43c4d2afe7fe
7
- data.tar.gz: fd5aaf2b829bc1cdbf3cce507312cba40d33c497915c94ba0accc09b96ca8bb60b2883188e5b7d88f6550f0b7612157811499d418424cfd73ce7242f215943f4
6
+ metadata.gz: d6050c616942ab3127d55a6bb9bff1d5b49c1388ed1ae0dc8c215d7ba74105f38f1664bb6df18d206b31be253ec0ef7c3eab3f94027506b6c2975bf076a039d2
7
+ data.tar.gz: 15f10a47853e8db45a88b852c53d7607e0c2545371f927cfdec0294ac4d53a2c03ab7f137bedfa7c80bc7a3e42b1bb103521cb038f24727b5f8ba4c6d7194cb4
data/.gitignore ADDED
@@ -0,0 +1,6 @@
1
+ .bundle
2
+ coverage
3
+ doc
4
+ pkg
5
+ .rspec
6
+ .DS_Store
data/.travis.yml ADDED
@@ -0,0 +1,15 @@
1
+ branches:
2
+ only:
3
+ - master
4
+ language: ruby
5
+ matrix:
6
+ allow_failures:
7
+ - rvm: ruby-head
8
+ rvm:
9
+ - 2.2.0
10
+ - 2.1.0
11
+ - 2.0.0
12
+ - 1.9.3
13
+ - ruby-head
14
+ - jruby-19mode # JRuby in 1.9 mode
15
+ - rbx-2.2
data/Gemfile ADDED
@@ -0,0 +1,11 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem "rake", "~> 10.0.3"
4
+ gem 'rdoc'
5
+ gem 'rubyforge'
6
+ gem 'technicalpickles-jeweler'
7
+
8
+ group :test, :development do
9
+ gem 'simplecov'
10
+ gem 'rspec', '~> 2.99.0'
11
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,37 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ diff-lcs (1.2.5)
5
+ git (1.2.5)
6
+ json_pure (1.5.0)
7
+ multi_json (1.5.0)
8
+ rake (10.0.3)
9
+ rdoc (3.9.4)
10
+ rspec (2.99.0)
11
+ rspec-core (~> 2.99.0)
12
+ rspec-expectations (~> 2.99.0)
13
+ rspec-mocks (~> 2.99.0)
14
+ rspec-core (2.99.2)
15
+ rspec-expectations (2.99.2)
16
+ diff-lcs (>= 1.1.3, < 2.0)
17
+ rspec-mocks (2.99.2)
18
+ rubyforge (2.0.4)
19
+ json_pure (>= 1.1.7)
20
+ simplecov (0.7.1)
21
+ multi_json (~> 1.0)
22
+ simplecov-html (~> 0.7.1)
23
+ simplecov-html (0.7.1)
24
+ technicalpickles-jeweler (1.2.1)
25
+ git (>= 1.2.1)
26
+ rubyforge
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ rake (~> 10.0.3)
33
+ rdoc
34
+ rspec (~> 2.99.0)
35
+ rubyforge
36
+ simplecov
37
+ technicalpickles-jeweler
data/NOTES.md ADDED
@@ -0,0 +1,53 @@
1
+ ## Overview
2
+
3
+ **Version 1.1.1**
4
+ Included in this release:
5
+
6
+ - https://github.com/ruby-hl7/ruby-hl7/pull/48
7
+ - https://github.com/ruby-hl7/ruby-hl7/pull/44
8
+
9
+ **Version 1.1.0**
10
+ Included in this release:
11
+ - https://github.com/ruby-hl7/ruby-hl7/pull/7
12
+ - https://github.com/ruby-hl7/ruby-hl7/pull/9
13
+ - https://github.com/ruby-hl7/ruby-hl7/pull/10
14
+ - https://github.com/ruby-hl7/ruby-hl7/pull/13
15
+ - https://github.com/ruby-hl7/ruby-hl7/pull/17
16
+ - https://github.com/ruby-hl7/ruby-hl7/pull/18
17
+ - https://github.com/ruby-hl7/ruby-hl7/pull/19
18
+ - https://github.com/ruby-hl7/ruby-hl7/pull/20
19
+ - https://github.com/ruby-hl7/ruby-hl7/pull/21
20
+ - https://github.com/ruby-hl7/ruby-hl7/pull/22
21
+ - https://github.com/ruby-hl7/ruby-hl7/pull/23
22
+ - https://github.com/ruby-hl7/ruby-hl7/pull/24
23
+ - https://github.com/ruby-hl7/ruby-hl7/pull/25
24
+ - https://github.com/ruby-hl7/ruby-hl7/pull/27
25
+ - https://github.com/ruby-hl7/ruby-hl7/pull/28
26
+ - https://github.com/ruby-hl7/ruby-hl7/pull/33
27
+ - https://github.com/ruby-hl7/ruby-hl7/pull/34
28
+ - https://github.com/ruby-hl7/ruby-hl7/pull/35
29
+ - https://github.com/ruby-hl7/ruby-hl7/pull/41
30
+
31
+ Thanks to:
32
+ @untoldone, @tomsabin, @patricksrobertson, @rojotek, @calebwoods and @jdee
33
+
34
+
35
+ **Version 1.0.3**
36
+ The ruby-hl7 gem removes some sample messages.
37
+
38
+ ## Release Date
39
+
40
+ January 25, 2011
41
+
42
+ ## In this release
43
+
44
+ * Sample messages from Cerner were removed.
45
+ * Some gem dependencies were updated.
46
+
47
+ ### Bug fixes
48
+
49
+ There are no bug fixes in this release.
50
+
51
+ ## Known Issues
52
+
53
+ There are currently no known open issues with the ruby-hl7 gem.
data/Rakefile ADDED
@@ -0,0 +1,149 @@
1
+ # $Id$
2
+ require 'rubygems'
3
+ require 'rake'
4
+ require 'rdoc/task'
5
+ require 'rubygems/package_task'
6
+ require 'rake/contrib/sshpublisher'
7
+ require 'rbconfig'
8
+ require 'rubyforge'
9
+ require 'rspec'
10
+ require 'rspec/core/rake_task'
11
+ require 'simplecov'
12
+
13
+ $: << './lib'
14
+ require 'ruby-hl7'
15
+ require 'message_parser'
16
+ require 'message'
17
+ require 'segment_list_storage'
18
+ require 'segment_generator'
19
+ require 'segment'
20
+
21
+ full_name = "Ruby-HL7"
22
+ short_name = full_name.downcase
23
+
24
+ # Many of these tasks were garnered from zenspider's Hoe
25
+ # just forced to work my way
26
+
27
+ desc 'Default: Run all examples'
28
+ task :default => :spec
29
+
30
+ if RUBY_VERSION < '1.9.1'
31
+ begin
32
+ require 'jeweler'
33
+ Jeweler::Tasks.new do |s|
34
+ s.name = short_name
35
+ s.full_name
36
+ s.summary = "Ruby HL7 Library"
37
+ s.authors = ["Mark Guzman"]
38
+ s.email = "ruby-hl7@googlegroups.com"
39
+ s.homepage = "http://github.com/ruby-hl7/ruby-hl7"
40
+ s.description = "A simple library to parse and generate HL7 2.x messages"
41
+ s.require_path = "lib"
42
+ s.has_rdoc = true
43
+ s.rubyforge_project = short_name
44
+ s.required_ruby_version = '>= 1.8.6'
45
+ s.extra_rdoc_files = %w[README.rdoc LICENSE]
46
+ s.files = FileList["{bin,lib,test_data}/**/*"].to_a
47
+ s.test_files = FileList["{test}/**/test*.rb"].to_a
48
+ s.add_dependency("rake", ">= #{RAKEVERSION}")
49
+ s.add_dependency("rubyforge", ">= #{::RubyForge::VERSION}")
50
+ end
51
+ rescue LoadError
52
+ puts "Jeweler, or one of its dependencies, is not available. Install it with: sudo gem install jeweler"
53
+ end
54
+ end
55
+
56
+
57
+ spec = Gem::Specification.new do |s|
58
+ s.name = short_name
59
+ s.full_name
60
+ s.version = HL7::VERSION
61
+ s.author = "Mark Guzman"
62
+ s.email = "ruby-hl7@googlegroups.com"
63
+ s.homepage = "https://github.com/ruby-hl7/ruby-hl7"
64
+ s.platform = Gem::Platform::RUBY
65
+ s.summary = "Ruby HL7 Library"
66
+ s.rubyforge_project = short_name
67
+ s.description = "A simple library to parse and generate HL7 2.x messages"
68
+ s.files = FileList["{bin,lib,test_data}/**/*"].to_a
69
+ s.require_path = "lib"
70
+ s.test_files = FileList["{test}/**/test*.rb"].to_a
71
+ s.has_rdoc = true
72
+ s.required_ruby_version = '>= 1.8.6'
73
+ s.extra_rdoc_files = %w[README.rdoc LICENSE]
74
+ s.add_dependency("rake", ">= #{RAKEVERSION}")
75
+ s.add_dependency("rubyforge", ">= #{::RubyForge::VERSION}")
76
+ end
77
+
78
+ desc "Run all examples"
79
+ RSpec::Core::RakeTask.new(:spec) do |spec|
80
+ spec.pattern = 'spec/**/*.rb'
81
+ end
82
+
83
+ desc "Run all examples with SimpleCov"
84
+ RSpec::Core::RakeTask.new(:spec_with_simplecov) do |spec|
85
+ ENV['COVERAGE'] = 'true'
86
+ spec.pattern = 'spec/**/*.rb'
87
+ end
88
+
89
+ RDoc::Task.new do |rd|
90
+ rd.main = "README.rdoc"
91
+ rd.rdoc_files.include("README.rdoc", "LICENSE", "lib/**/*.rb")
92
+ rd.title = "%s (%s) Documentation" % [ full_name, spec.version ]
93
+ rd.rdoc_dir = 'doc'
94
+ end
95
+
96
+ Gem::PackageTask.new(spec) do |pkg|
97
+ pkg.need_tar = true
98
+ end
99
+
100
+ desc 'Clean up all the extras'
101
+ task :clean => [ :clobber_rdoc, :clobber_package ] do
102
+ %w[*.gem ri coverage*].each do |pattern|
103
+ files = Dir[pattern]
104
+ rm_rf files unless files.empty?
105
+ end
106
+ end
107
+
108
+ namespace :forge do
109
+ desc 'Publish RDoc to RubyForge'
110
+ task :publish_docs => [:clean, :rdoc] do
111
+ config = YAML.load(File.read(File.expand_path("~/.rubyforge/user-config.yml")))
112
+ host = "#{config["username"]}@rubyforge.org"
113
+ remote_dir = "/var/www/gforge-projects/#{spec.rubyforge_project}"
114
+ local_dir = 'doc'
115
+ sh %{rsync -av --delete #{local_dir}/ #{host}:#{remote_dir}}
116
+ end
117
+
118
+ desc 'Package and upload the release to rubyforge.'
119
+ task :release => [:clean, :package] do |t|
120
+ v = ENV["VERSION"] or abort "Must supply VERSION=x.y.z"
121
+ abort "Versions don't match '#{v}' vs '#{spec.version}'" if v != spec.version.to_s
122
+ pkg = "pkg/#{spec.name}-#{spec.version}"
123
+
124
+ if $DEBUG then
125
+ puts "release_id = rf.add_release #{spec.rubyforge_project.inspect}, #{spec.name.inspect}, #{version.inspect}, \"#{pkg}.tgz\""
126
+ puts "rf.add_file #{spec.rubyforge_project.inspect}, #{spec.name.inspect}, release_id, \"#{pkg}.gem\""
127
+ end
128
+
129
+ rf = RubyForge.new
130
+ puts "Logging in"
131
+ rf.login
132
+
133
+ changes = open("NOTES.md").readlines.join("") if File.exists?("NOTES.md")
134
+ c = rf.userconfig
135
+ c["release_notes"] = spec.description if spec.description
136
+ c["release_changes"] = changes if changes
137
+ c["preformatted"] = true
138
+
139
+ files = ["#{pkg}.tgz", "#{pkg}.gem"].compact
140
+
141
+ puts "Releasing #{spec.name} v. #{spec.version}"
142
+ rf.add_release spec.rubyforge_project, spec.name, spec.version.to_s, *files
143
+ end
144
+ end
145
+
146
+ desc 'Install the package as a gem'
147
+ task :install_gem => [:clean, :package] do
148
+ sh "sudo gem install pkg/*.gem"
149
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 1.1.1
data/VERSION.yml ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ :major: 1
3
+ :minor: 1
4
+ :patch: 1
@@ -0,0 +1,26 @@
1
+ # $Id$
2
+ # Ruby-HL7 Proxy Server Example
3
+ require 'rubygems'
4
+ require 'ruby-hl7'
5
+ require 'thread'
6
+ require 'socket'
7
+
8
+ PORT = 2402
9
+ target_ip = "127.0.0.1"
10
+ target_port = 5900
11
+
12
+ srv = TCPServer.new(PORT)
13
+ puts "proxy_server listening on port: %i" % PORT
14
+ puts "proxying for: %s:%i" % [ target_ip, target_port ]
15
+ while true
16
+ sok = srv.accept
17
+ Thread.new( sok ) do |my_socket|
18
+ raw_inp = my_socket.readlines
19
+ msg = HL7::Message.new( raw_input )
20
+ puts "forwarding message:\n%s" % msg.to_s
21
+ soc = TCPSocket.open( target_ip, target_port )
22
+ soc.write msg.to_mllp
23
+ soc.close
24
+ end
25
+ end
26
+
data/lib/segment.rb CHANGED
@@ -5,7 +5,7 @@
5
5
  #
6
6
  # == Defining a New Segment
7
7
  # class HL7::Message::Segment::NK1 < HL7::Message::Segment
8
- # wieght 100 # segments are sorted ascendingly
8
+ # weight 100 # segments are sorted ascendingly
9
9
  # add_field :something_you_want # assumes :idx=>1
10
10
  # add_field :something_else, :idx=>6 # :idx=>6 and field count=6
11
11
  # add_field :something_more # :idx=>7
@@ -1,6 +1,6 @@
1
1
  # SegmentFields
2
2
  # class HL7::Message::Segment::NK1 < HL7::Message::Segment
3
- # wieght 100 # segments are sorted ascendingly
3
+ # weight 100 # segments are sorted ascendingly
4
4
  # add_field :something_you_want # assumes :idx=>1
5
5
  # add_field :something_else, :idx=>6 # :idx=>6 and field count=6
6
6
  module HL7::Message::SegmentFields
data/lib/segments/obr.rb CHANGED
@@ -30,8 +30,8 @@ class HL7::Message::Segment::OBR < HL7::Message::Segment
30
30
  add_field :order_callback_phone_number
31
31
  add_field :placer_field_1
32
32
  add_field :placer_field_2
33
- add_field :filer_field_1
34
- add_field :filer_field_2
33
+ add_field :filler_field_1
34
+ add_field :filler_field_2
35
35
  add_field :results_status_change_date do |value|
36
36
  convert_to_ts(value)
37
37
  end
data/ruby-hl7.gemspec ADDED
@@ -0,0 +1,44 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run `rake gemspec`
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{ruby-hl7}
8
+ s.version = "1.1.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Mark Guzman"]
12
+ s.date = %q{2014-09-09}
13
+ s.description = %q{A simple library to parse and generate HL7 2.x messages}
14
+ s.email = %q{ruby-hl7@googlegroups.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+
20
+ s.files = `git ls-files`.split "\n"
21
+ s.test_files = `git ls-files -- {spec}/*`.split "\n"
22
+ s.homepage = %q{http://github.com/ruby-hl7/ruby-hl7}
23
+ s.rdoc_options = ["--charset=UTF-8"]
24
+ s.require_paths = ["lib"]
25
+ s.required_ruby_version = Gem::Requirement.new(">= 1.8.6")
26
+ s.rubyforge_project = %q{ruby-hl7}
27
+ s.rubygems_version = %q{1.4.2}
28
+ s.summary = %q{Ruby HL7 Library}
29
+
30
+ if s.respond_to? :specification_version then
31
+ s.specification_version = 3
32
+
33
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
34
+ s.add_runtime_dependency(%q<rake>, [">= 10.0.0"])
35
+ s.add_runtime_dependency(%q<rubyforge>, [">= 2.0.4"])
36
+ else
37
+ s.add_dependency(%q<rake>, [">= 10.0.0"])
38
+ s.add_dependency(%q<rubyforge>, [">= 2.0.4"])
39
+ end
40
+ else
41
+ s.add_dependency(%q<rake>, [">= 10.0.0"])
42
+ s.add_dependency(%q<rubyforge>, [">= 2.0.4"])
43
+ end
44
+ end
@@ -0,0 +1,320 @@
1
+ # encoding: UTF-8
2
+ require 'spec_helper'
3
+
4
+ describe HL7::Message do
5
+ context 'basic parsing' do
6
+ before :all do
7
+ @simple_msh_txt = open( './test_data/test.hl7' ).readlines.first
8
+ @empty_txt = open( './test_data/empty.hl7' ).readlines.first
9
+ @empty_segments_txt = open( './test_data/empty_segments.hl7' ).readlines.first
10
+ @base_msh = "MSH|^~\\&|LAB1||DESTINATION||19910127105114||ORU^R03|LAB1003929"
11
+ @base_msh_alt_delims = "MSH$@~\\&|LAB1||DESTINATION||19910127105114||ORU^R03|LAB1003929"
12
+ end
13
+
14
+ it 'parses simple text' do
15
+ msg = HL7::Message.new
16
+ msg.parse @simple_msh_txt
17
+ msg.to_hl7.should == @simple_msh_txt
18
+ end
19
+
20
+ it 'parses delimiters properly' do
21
+ msg = HL7::Message.new( @base_msh )
22
+ msg.element_delim.should == "|"
23
+ msg.item_delim.should == "^"
24
+
25
+ msg = HL7::Message.new( @base_msh_alt_delims )
26
+ msg.element_delim.should == "$"
27
+ msg.item_delim.should == "@"
28
+ end
29
+
30
+ it 'parses via the constructor' do
31
+ msg = HL7::Message.new( @simple_msh_txt )
32
+ msg.to_hl7.should == @simple_msh_txt
33
+ end
34
+
35
+ it 'parses via the class method' do
36
+ msg = HL7::Message.parse( @simple_msh_txt )
37
+ msg.to_hl7.should == @simple_msh_txt
38
+ end
39
+
40
+ it 'only parses String and Enumerable data' do
41
+ lambda { msg = HL7::Message.parse :MSHthis_shouldnt_parse_at_all }.should raise_error(HL7::ParseError)
42
+ end
43
+
44
+ it 'parses empty strings' do
45
+ lambda { msg = HL7::Message.new @empty_txt }.should_not raise_error
46
+ end
47
+
48
+ it 'converts to strings' do
49
+ msg = HL7::Message.new
50
+ msg.parse @simple_msh_txt
51
+ orig = @simple_msh_txt.gsub( /\r/, "\n" )
52
+ msg.to_s.should == orig
53
+ end
54
+
55
+ it 'converts to a string and to HL7' do
56
+ msg = HL7::Message.new( @simple_msh_txt )
57
+ msg.to_hl7.should_not == msg.to_s
58
+ end
59
+
60
+ it 'allows access to segments by index' do
61
+ msg = HL7::Message.new
62
+ msg.parse @simple_msh_txt
63
+ msg[0].to_s.should == @base_msh
64
+ end
65
+
66
+ it 'allows access to segments by name' do
67
+ msg = HL7::Message.new
68
+ msg.parse @simple_msh_txt
69
+ msg["MSH"].to_s.should == @base_msh
70
+ end
71
+
72
+ it 'allows access to segments by symbol' do
73
+ msg = HL7::Message.new
74
+ msg.parse @simple_msh_txt
75
+ msg[:MSH].to_s.should == @base_msh
76
+ end
77
+
78
+ it 'inserts segments by index' do
79
+ msg = HL7::Message.new
80
+ msg.parse @simple_msh_txt
81
+ inp = HL7::Message::Segment::Default.new
82
+ msg[1] = inp
83
+ msg[1].should == inp
84
+
85
+ lambda { msg[2] = Class.new }.should raise_error(HL7::Exception)
86
+ end
87
+
88
+ it 'returns nil when accessing a missing segment' do
89
+ msg = HL7::Message.new
90
+ msg.parse @simple_msh_txt
91
+ lambda { msg[:does_not_exist].should be_nil }.should_not raise_error
92
+ end
93
+
94
+ it 'inserts segments by name' do
95
+ msg = HL7::Message.new
96
+ msg.parse @simple_msh_txt
97
+ inp = HL7::Message::Segment::NTE.new
98
+ msg["NTE"] = inp
99
+ msg["NTE"].should == inp
100
+ lambda { msg["NTE"] = Class.new }.should raise_error(HL7::Exception)
101
+ end
102
+
103
+ it 'inserts segments by symbol' do
104
+ msg = HL7::Message.new
105
+ msg.parse @simple_msh_txt
106
+ inp = HL7::Message::Segment::NTE.new
107
+ msg[:NTE] = inp
108
+ msg[:NTE].should == inp
109
+ lambda { msg[:NTE] = Class.new }.should raise_error(HL7::Exception)
110
+ end
111
+
112
+ it 'allows access to segment elements' do
113
+ msg = HL7::Message.new
114
+ msg.parse @simple_msh_txt
115
+ msg[:MSH].sending_app.should == "LAB1"
116
+ end
117
+
118
+ it 'allows modification of segment elements' do
119
+ msg = HL7::Message.new
120
+ msg.parse @simple_msh_txt
121
+ msg[:MSH].sending_app = "TEST"
122
+ msg[:MSH].sending_app.should == "TEST"
123
+ end
124
+
125
+ it 'raises NoMethodError when accessing a missing element' do
126
+ msg = HL7::Message.new
127
+ msg.parse @simple_msh_txt
128
+ lambda {msg[:MSH].does_not_really_exist_here}.should raise_error(NoMethodError)
129
+ end
130
+
131
+ it 'raises NoMethodError when modifying a missing element' do
132
+ msg = HL7::Message.new
133
+ msg.parse @simple_msh_txt
134
+ lambda {msg[:MSH].does_not_really_exist_here="TEST"}.should raise_error(NoMethodError)
135
+ end
136
+
137
+ it 'permits elements to be accessed via numeric names' do
138
+ msg = HL7::Message.new( @simple_msh_txt )
139
+ msg[:MSH].e2.should == "LAB1"
140
+ msg[:MSH].e3.should be_empty
141
+ end
142
+
143
+ it 'permits elements to be modified via numeric names' do
144
+ msg = HL7::Message.parse( @simple_msh_txt )
145
+ msg[:MSH].e2 = "TESTING1234"
146
+ msg[:MSH].e2.should == "TESTING1234"
147
+ end
148
+
149
+ it 'allows appending of segments' do
150
+ msg = HL7::Message.new
151
+ lambda do
152
+ msg << HL7::Message::Segment::MSH.new
153
+ msg << HL7::Message::Segment::NTE.new
154
+ end.should_not raise_error
155
+
156
+ lambda { msg << Class.new }.should raise_error(HL7::Exception)
157
+ end
158
+
159
+ it 'allows appending of an array of segments' do
160
+ msg = HL7::Message.new
161
+ lambda do
162
+ msg << [HL7::Message::Segment::MSH.new, HL7::Message::Segment::NTE.new]
163
+ end.should_not raise_error
164
+
165
+ obx = HL7::Message::Segment::OBX.new
166
+ lambda do
167
+ obx.children << [HL7::Message::Segment::NTE.new, HL7::Message::Segment::NTE.new]
168
+ end.should_not raise_error
169
+ end
170
+
171
+ it 'sorts segments' do
172
+ msg = HL7::Message.new
173
+ pv1 = HL7::Message::Segment::PV1.new
174
+ msg << pv1
175
+ msh = HL7::Message::Segment::MSH.new
176
+ msg << msh
177
+ nte = HL7::Message::Segment::NTE.new
178
+ msg << nte
179
+ nte2 = HL7::Message::Segment::NTE.new
180
+ msg << nte
181
+ msh.sending_app = "TEST"
182
+
183
+ initial = msg.to_s
184
+ sorted = msg.sort
185
+ final = sorted.to_s
186
+ initial.should_not == final
187
+ end
188
+
189
+ it 'automatically assigns a set_id to a new segment' do
190
+ msg = HL7::Message.new
191
+ msh = HL7::Message::Segment::MSH.new
192
+ msg << msh
193
+ ntea = HL7::Message::Segment::NTE.new
194
+ ntea.comment = "first"
195
+ msg << ntea
196
+ nteb = HL7::Message::Segment::NTE.new
197
+ nteb.comment = "second"
198
+ msg << nteb
199
+ ntec = HL7::Message::Segment::NTE.new
200
+ ntec.comment = "third"
201
+ msg << ntec
202
+ ntea.set_id.should == "1"
203
+ nteb.set_id.should == "2"
204
+ ntec.set_id.should == "3"
205
+ end
206
+
207
+ it 'parses Enumerable data' do
208
+ test_file = open( './test_data/test.hl7' )
209
+ test_file.should_not be_nil
210
+
211
+ msg = HL7::Message.new( test_file )
212
+ msg.to_hl7.should == @simple_msh_txt
213
+ end
214
+
215
+ it 'has a to_info method' do
216
+ msg = HL7::Message.new( @simple_msh_txt )
217
+ msg[1].to_info.should_not be_nil
218
+ end
219
+
220
+ it 'parses a raw array' do
221
+ inp = "NTE|1|ME TOO"
222
+ nte = HL7::Message::Segment::NTE.new( inp.split( '|' ) )
223
+ nte.to_s.should == inp
224
+ end
225
+
226
+ it 'produces MLLP output' do
227
+ msg = HL7::Message.new( @simple_msh_txt )
228
+ expect = "\x0b%s\x1c\r" % msg.to_hl7
229
+ msg.to_mllp.should == expect
230
+ end
231
+
232
+ it 'parses MLLP input' do
233
+ raw = "\x0b%s\x1c\r" % @simple_msh_txt
234
+ msg = HL7::Message.parse( raw )
235
+ msg.should_not be_nil
236
+ msg.to_hl7.should == @simple_msh_txt
237
+ msg.to_mllp.should == raw
238
+ end
239
+
240
+ it 'can parse its own MLLP output' do
241
+ msg = HL7::Message.parse( @simple_msh_txt )
242
+ msg.should_not be_nil
243
+ lambda do
244
+ post_mllp = HL7::Message.parse( msg.to_mllp )
245
+ post_mllp.should_not be_nil
246
+ msg.to_hl7.should == post_mllp.to_hl7
247
+ end.should_not raise_error
248
+ end
249
+
250
+ it 'can access child elements' do
251
+ obr = HL7::Message::Segment::OBR.new
252
+ lambda do
253
+ obr.children.should_not be_nil
254
+ obr.children.length.should be_zero
255
+ end.should_not raise_error
256
+ end
257
+
258
+ it 'can add child elements' do
259
+ obr = HL7::Message::Segment::OBR.new
260
+ lambda do
261
+ obr.children.length.should be_zero
262
+ (1..5).each do |x|
263
+ obr.children << HL7::Message::Segment::OBX.new
264
+ obr.children.length.should == x
265
+ end
266
+ end.should_not raise_error
267
+ end
268
+
269
+ it 'rejects invalid child segments' do
270
+ obr = HL7::Message::Segment::OBR.new
271
+ lambda { obr.children << Class.new }.should raise_error(HL7::Exception)
272
+ end
273
+
274
+ it 'supports grouped, sequenced segments' do
275
+ #multible obr's with multiple obx's
276
+ msg = HL7::Message.parse( @simple_msh_txt )
277
+ orig_output = msg.to_hl7
278
+ orig_obx_cnt = msg[:OBX].length
279
+ (1..10).each do |obr_id|
280
+ obr = HL7::Message::Segment::OBR.new
281
+ msg << obr
282
+ (1..10).each do |obx_id|
283
+ obx = HL7::Message::Segment::OBX.new
284
+ obr.children << obx
285
+ end
286
+ end
287
+
288
+ msg[:OBR].should_not be_nil
289
+ msg[:OBR].length.should == 11
290
+ msg[:OBX].should_not be_nil
291
+ msg[:OBX].length.should == 102
292
+ msg[:OBR][4].children[1].set_id.should == "2"
293
+ msg[:OBR][5].children[1].set_id.should == "2"
294
+
295
+ final_output = msg.to_hl7
296
+ orig_output.should_not == final_output
297
+ end
298
+
299
+ it "returns each segment's index" do
300
+ msg = HL7::Message.parse( @simple_msh_txt )
301
+ msg.index("PID").should == 1
302
+ msg.index(:PID).should == 1
303
+ msg.index("PV1").should == 2
304
+ msg.index(:PV1).should == 2
305
+ msg.index("TACOBELL").should be_nil
306
+ msg.index(nil).should be_nil
307
+ msg.index(1).should be_nil
308
+ end
309
+
310
+ it 'validates the PID#admin_sex element' do
311
+ pid = HL7::Message::Segment::PID.new
312
+ lambda { pid.admin_sex = "TEST" }.should raise_error(HL7::InvalidDataError)
313
+ lambda { pid.admin_sex = "F" }.should_not raise_error
314
+ end
315
+
316
+ it 'can parse an empty segment' do
317
+ lambda { msg = HL7::Message.new @empty_segments_txt }.should_not raise_error
318
+ end
319
+ end
320
+ end