hippo 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,8 +1,14 @@
1
+ 0.0.6 - 2011/11/09
2
+ * Add Separator module for handling segment, field, composite, and
3
+ repetition separators the same.
4
+ * Respect 'parent's separators when building/initializing components.
5
+ * Fixed parsing logic to properly handle nested groups.
6
+
1
7
  0.0.5 - 2011/09/16
2
- * Add ability to parse transaction sets.
8
+ * Add ability to parse transaction sets.
3
9
 
4
10
  0.0.4
5
- * Fix issue when no values are set in any subfield of a composite field.
6
- * Add more segment tests.
7
- * Import all segments and loops from the X12 CSV Table Data
8
- * Intial version.
11
+ * Fix issue when no values are set in any subfield of a composite field.
12
+ * Add more segment tests.
13
+ * Import all segments and loops from the X12 CSV Table Data
14
+ * Intial version.
data/LICENSE ADDED
@@ -0,0 +1,24 @@
1
+ Copyright (c) 2011, ProMedical, Inc.
2
+ All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without
5
+ modification, are permitted provided that the following conditions are met:
6
+ * Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ * Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+ * Neither the name of ProMedical, Inc. nor the
12
+ names of its contributors may be used to endorse or promote products
13
+ derived from this software without specific prior written permission.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
16
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18
+ DISCLAIMED. IN NO EVENT SHALL PROMEDICAL, INC. BE LIABLE FOR ANY
19
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
20
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
22
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
24
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README.md CHANGED
@@ -230,3 +230,9 @@ The same technique can be used to reference fields within a segment that have th
230
230
  ```
231
231
 
232
232
  For more example please review the test suite.
233
+
234
+ License
235
+ -------
236
+ Copyright 2011 by ProMedical, and licensed under the Modified BSD License. See included
237
+ [LICENSE](/promedical/hippo/blob/master/LICENSE) file for
238
+ details.
data/lib/hippo/parser.rb CHANGED
@@ -1,88 +1,73 @@
1
- require 'pp'
2
1
  require 'hippo'
3
2
 
4
3
  module Hippo
5
4
  class Parser
6
- def segments
7
- @segments ||= []
5
+ include Hippo::Separator
6
+
7
+ attr_accessor :transaction_sets, :raw_data
8
+
9
+ def initialize(options={})
10
+ setup_separators(options)
8
11
  end
9
12
 
10
13
  def read_file(filename)
11
14
  @raw_data = File.read(filename)
15
+ parse_separators(@raw_data)
12
16
  end
13
17
 
14
- def populate_segments
15
-
16
- # iterate through each line of the input data
17
- # and create Hippo::Segments for each segment
18
- @raw_data.split(Hippo::SegmentSeparator).each do |line|
19
-
20
- # get rid of any newlines or other bizarre spacing
21
- # this may cause an issue with any transactions with
22
- # some sort of whitespace delimiter
23
- line = line.strip
24
- next if line.nil? || line.empty?
25
-
26
- # each field is separated by either * or : depending
27
- # if it is a composite field. we treat them the same
28
- fields = line.split(Hippo::FieldSeparator)
29
-
30
- # grab the first field as it is the segment identifier
31
- segment_identifier = fields.shift
32
-
33
- # create a new segment object based on the identifier
34
- segment = Hippo::Segments.const_get(segment_identifier.upcase).new
35
-
36
- # populate each field from the original input
37
- fields.each_with_index do |value, index|
38
- field = segment.class.fields[index]
39
-
40
- # if the field is an array that means it is a
41
- # composite field
42
- if field.class == Array
43
- composite_fields = value.split(Hippo::CompositeSeparator)
44
-
45
- # initialize the values hash with a hash for this
46
- # composite field
47
- segment.values[index] = {}
48
-
49
- # iterate through each value present in the composite field
50
- # and save them to the appropriate sequence in the values
51
- # hash
52
- composite_fields.each_with_index do |comp_value, comp_index|
53
- segment.values[index][field[comp_index].sequence] = comp_value
54
- end
55
- else
56
- segment.values[field.sequence] = value
18
+ def initialize_segment(input)
19
+ fields = input.split(@field_separator)
20
+
21
+ segment_identifier = fields.shift
22
+ segment = Segments.const_get(segment_identifier.upcase).new
23
+
24
+ fields.each_with_index do |value, index|
25
+ field = segment.class.fields[index]
26
+
27
+ # if the field is an array that means it is a
28
+ # composite field
29
+ if field.class == Array
30
+ composite_fields = value.split(@composite_separator)
31
+ composite_sequence = field.first.composite_sequence
32
+
33
+ segment.values[composite_sequence] = {}
34
+
35
+ composite_fields.each_with_index do |comp_value, comp_index|
36
+ composite_field = field[comp_index]
37
+
38
+ segment.values[composite_sequence][composite_field.sequence] = comp_value
57
39
  end
40
+ else
41
+ segment.values[field.sequence] = value
58
42
  end
59
-
60
- # save the newly created segment to the segments accessor
61
- segments << segment
62
43
  end
63
44
 
64
- segments
45
+ segment
65
46
  end
66
47
 
67
48
  def populate_transaction_sets
68
- segments_by_transaction_set = []
49
+ raw_transaction_sets = []
69
50
 
70
- @segments.each do |segment|
71
- if segment.class == Hippo::Segments::ST
72
- segments_by_transaction_set << []
51
+ @raw_data.split(@segment_separator).each do |segment_string|
52
+ next if segment_string.strip.empty?
53
+
54
+ if segment_string =~ /\AST/
55
+ raw_transaction_sets << []
73
56
  end
74
57
 
75
- segments_by_transaction_set.last << segment if segments_by_transaction_set.last
58
+ raw_transaction_sets.last << initialize_segment(segment_string)
76
59
  end
77
60
 
78
- segments_by_transaction_set.collect do |transaction_segments|
79
- Hippo::TransactionSets.const_get(:"HIPAA_#{transaction_segments.first.ST01}")::Base.new(:segments => transaction_segments)
61
+ raw_transaction_sets.collect do |segments|
62
+ transaction_set_id = segments.first.ST01
63
+ transaction_set = Hippo::TransactionSets.constants.select{|c| c.to_s.end_with?(transaction_set_id) }.first
64
+
65
+ Hippo::TransactionSets.const_get(transaction_set)::Base.new(separators.merge(:segments => segments))
80
66
  end
81
67
  end
82
68
 
83
69
  def parse(filename)
84
70
  read_file(filename)
85
- populate_segments
86
71
  populate_transaction_sets
87
72
  end
88
73
  end
@@ -1,5 +1,7 @@
1
1
  module Hippo::Segments
2
2
  class Base
3
+ include Hippo::Separator
4
+
3
5
  class << self
4
6
  attr_accessor :fields, :identifier, :fixed_width
5
7
 
@@ -20,7 +22,7 @@ module Hippo::Segments
20
22
  f.maximum = field[:maximum]
21
23
  f.options = field[:options]
22
24
  f.restrictions = field[:restrictions]
23
- f.separator = field[:separator] || @default_separator || Hippo::FieldSeparator
25
+ f.separator = field[:separator] || @default_separator || :field_separator
24
26
 
25
27
  if @composite_block
26
28
  f.composite = true
@@ -34,10 +36,10 @@ module Hippo::Segments
34
36
 
35
37
  def composite_field(field_name)
36
38
  @composite_block = true
37
- @default_separator = Hippo::CompositeSeparator
39
+ @default_separator = :composite_separator
38
40
  fields << []
39
41
  yield
40
- @default_separator = Hippo::FieldSeparator
42
+ @default_separator = :field_separator
41
43
  @composite_block = false
42
44
  end
43
45
 
@@ -59,6 +61,8 @@ module Hippo::Segments
59
61
 
60
62
  def initialize(options = {})
61
63
  @parent = options.delete(:parent)
64
+
65
+ setup_separators(options)
62
66
  end
63
67
 
64
68
  def values
@@ -84,7 +88,7 @@ module Hippo::Segments
84
88
  end
85
89
 
86
90
  def to_s
87
- output = self.class.identifier + Hippo::FieldSeparator
91
+ output = self.class.identifier + @field_separator
88
92
 
89
93
  self.class.fields.each_with_index do |field, index|
90
94
  if field.class == Array # this is a composite field
@@ -98,15 +102,15 @@ module Hippo::Segments
98
102
  end
99
103
  field_value = field_value.ljust(comp_field.maximum) if self.class.fixed_width
100
104
 
101
- output += field_value + comp_field.separator
105
+ output += field_value + @composite_separator
102
106
  end
103
107
 
104
- output += Hippo::FieldSeparator
108
+ output += @field_separator
105
109
  else # standard field
106
110
  field_value = values[field.sequence].to_s
107
111
  field_value = field_value.ljust(field.maximum) if self.class.fixed_width
108
112
 
109
- output += field_value + field.separator
113
+ output += field_value + @field_separator
110
114
  end
111
115
  end
112
116
 
@@ -115,11 +119,10 @@ module Hippo::Segments
115
119
  output = output.gsub(/:{2,}\*/,'*').gsub(/:\*/,'*')
116
120
  end
117
121
 
118
- output += Hippo::SegmentSeparator
122
+ output += @segment_separator
119
123
  output = output.gsub(/\*+~/,'~')
120
124
  end
121
125
 
122
-
123
126
  def identifier
124
127
  self.class.identifier
125
128
  end
@@ -0,0 +1,39 @@
1
+ module Hippo
2
+ module Separator
3
+ attr_accessor :field_separator, :composite_separator, :repetition_separator, :segment_separator
4
+
5
+ def setup_separators(options = {})
6
+ [:field_separator, :repetition_separator, :composite_separator, :segment_separator].each do |sym|
7
+ value = options[sym] || parent_or_default_separator(sym)
8
+
9
+ self.send(:"#{sym}=", value)
10
+ end
11
+ end
12
+
13
+ def parent_or_default_separator(separator_type)
14
+ if defined?(parent) && parent
15
+ parent.send(separator_type.to_sym)
16
+ else
17
+ Hippo.const_get(:"DEFAULT_#{separator_type.to_s.upcase}")
18
+ end
19
+ end
20
+
21
+ def parse_separators(input)
22
+ if input =~ /\AISA/
23
+ @field_separator = input[3]
24
+ @repetition_separator = input[82]
25
+ @composite_separator = input[104]
26
+ @segment_separator = input[105]
27
+ end
28
+ end
29
+
30
+ def separators
31
+ {
32
+ :field_separator => @field_separator,
33
+ :composite_separator => @composite_separator,
34
+ :segment_separator => @segment_separator,
35
+ :repetition_separator => @repetition_separator
36
+ }
37
+ end
38
+ end
39
+ end
@@ -1,5 +1,7 @@
1
1
  module Hippo::TransactionSets
2
2
  class Base
3
+ include Hippo::Separator
4
+
3
5
  class << self
4
6
  attr_accessor :components, :identifier
5
7
 
@@ -21,12 +23,11 @@ module Hippo::TransactionSets
21
23
  attr_accessor :values, :parent, :sequences
22
24
 
23
25
  def initialize(options = {})
24
- @parent = options.delete(:parent)
26
+ @parent = options[:parent]
25
27
 
26
- if options[:segments]
27
- pp options[:segments]
28
- populate options[:segments]
29
- end
28
+ setup_separators(options)
29
+
30
+ populate(options[:segments]) if options[:segments]
30
31
  end
31
32
 
32
33
  def populate(segments)
@@ -48,7 +49,7 @@ module Hippo::TransactionSets
48
49
  segments_found << segment
49
50
  end
50
51
 
51
- segments -= segments_found
52
+ segments_found.each {|s| segments.delete(s)}
52
53
  else
53
54
  # loops
54
55
  while true do
@@ -84,12 +85,7 @@ module Hippo::TransactionSets
84
85
  subcomponent = component.initialize_component(self)
85
86
  subcomponent.populate(segments.slice!(starting_index, length))
86
87
 
87
- if component.repeating?
88
- values[component.sequence] = component.initialize_component(self)
89
- values[component.sequence] << subcomponent
90
- else
91
- values[component.sequence] = subcomponent
92
- end
88
+ values[component.sequence] = subcomponent
93
89
  end
94
90
  end
95
91
  end
@@ -36,7 +36,7 @@ module Hippo::TransactionSets
36
36
  else
37
37
  next if value.length > 1
38
38
 
39
- component.send((key + '=').to_sym, value)
39
+ component.send((key + '=').to_sym, value.first)
40
40
  end
41
41
  end
42
42
 
data/lib/hippo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Hippo
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/hippo.rb CHANGED
@@ -3,13 +3,15 @@ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
3
3
 
4
4
  module Hippo
5
5
  autoload :Exceptions, 'hippo/exceptions'
6
+ autoload :Separator, 'hippo/separator'
6
7
  autoload :Segments, 'hippo/segments'
7
8
  autoload :TransactionSets, 'hippo/transaction_sets'
8
9
  autoload :Field, 'hippo/field'
9
10
  autoload :CompositeField, 'hippo/composite_field'
10
11
  autoload :Parser, 'hippo/parser'
11
12
 
12
- FieldSeparator = '*'
13
- CompositeSeparator = ':'
14
- SegmentSeparator = '~'
13
+ DEFAULT_FIELD_SEPARATOR = '*'
14
+ DEFAULT_COMPOSITE_SEPARATOR = ':'
15
+ DEFAULT_SEGMENT_SEPARATOR = '~'
16
+ DEFAULT_REPETITION_SEPARATOR = '^'
15
17
  end
data/test/test_helper.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  require 'rubygems'
2
2
  gem 'minitest'
3
3
  require 'minitest/autorun'
4
+ require 'pp'
5
+ require 'pry'
4
6
 
5
7
  require File.expand_path(File.join('..','lib','hippo'), File.dirname(__FILE__))
6
- require 'pp'
7
8
 
8
9
  module Hippo::Segments
9
- class TestSimpleSegment < Hippo::Segments::Base
10
+ class TSS < Hippo::Segments::Base
10
11
  segment_identifier 'TSS'
11
12
 
12
13
  field :name => 'Field1'
@@ -17,7 +18,7 @@ module Hippo::Segments
17
18
  field :name => 'CommonName'
18
19
  end
19
20
 
20
- class TestCompoundSegment < Hippo::Segments::Base
21
+ class TCS < Hippo::Segments::Base
21
22
  segment_identifier 'TCS'
22
23
 
23
24
  composite_field 'CompositeField' do
@@ -43,7 +44,7 @@ module Hippo::TransactionSets
43
44
  class L0001 < Hippo::TransactionSets::Base
44
45
  loop_name 'L0001'
45
46
 
46
- segment Hippo::Segments::TestSimpleSegment,
47
+ segment Hippo::Segments::TSS,
47
48
  :name => 'Test Simple Segment #1',
48
49
  :minimum => 1,
49
50
  :maximum => 1,
@@ -53,16 +54,16 @@ module Hippo::TransactionSets
53
54
  class L0002 < Hippo::TransactionSets::Base
54
55
  loop_name 'L0002'
55
56
 
56
- segment Hippo::Segments::TestCompoundSegment,
57
+ segment Hippo::Segments::TCS,
57
58
  :name => 'Test Compound Segment #4',
58
59
  :minimum => 1,
59
60
  :maximum => 1,
60
61
  :position => 100,
61
62
  :identified_by => {
62
- 'Field7' => 'Preset Field 7'
63
+ 'Field7' => ['Preset Field 7', 'Foo2']
63
64
  }
64
65
 
65
- segment Hippo::Segments::TestSimpleSegment,
66
+ segment Hippo::Segments::TSS,
66
67
  :name => 'Test Simple Segment #5',
67
68
  :minimum => 1,
68
69
  :maximum => 1,
@@ -74,7 +75,12 @@ module Hippo::TransactionSets
74
75
 
75
76
  class Base < Hippo::TransactionSets::Base
76
77
 
77
- segment Hippo::Segments::TestSimpleSegment,
78
+ segment Hippo::Segments::ST,
79
+ :identified_by => {
80
+ 'ST01' => 'Test'
81
+ }
82
+
83
+ segment Hippo::Segments::TSS,
78
84
  :name => 'Test Simple Segment #1',
79
85
  :minimum => 1,
80
86
  :maximum => 5,
@@ -83,7 +89,7 @@ module Hippo::TransactionSets
83
89
  'TSS01' => 'Blah'
84
90
  }
85
91
 
86
- segment Hippo::Segments::TestCompoundSegment,
92
+ segment Hippo::Segments::TCS,
87
93
  :name => 'Test Compound Segment #2',
88
94
  :minimum => 1,
89
95
  :maximum => 1,
@@ -92,13 +98,13 @@ module Hippo::TransactionSets
92
98
  'Field7' => 'Preset Field 7'
93
99
  }
94
100
 
95
- segment Hippo::Segments::TestSimpleSegment,
101
+ segment Hippo::Segments::TSS,
96
102
  :name => 'Test Simple Segment #3',
97
103
  :minimum => 1,
98
104
  :maximum => 1,
99
105
  :position => 50,
100
106
  :identified_by => {
101
- 'TSS01' => 'Last Segment'
107
+ 'TSS01' => 'Last Standalone Segment'
102
108
  }
103
109
 
104
110
  loop Hippo::TransactionSets::Test::L0001,
data/test/test_parser.rb CHANGED
@@ -1,21 +1,12 @@
1
1
  require File.expand_path('test_helper', File.dirname(__FILE__))
2
2
 
3
3
  class TestParser < MiniTest::Unit::TestCase
4
- def test_populate_segments_returns_array_of_segments
5
- parser = Hippo::Parser.new
6
- parser.read_file('samples/005010X221A1_business_scenario_1.edi')
7
- parser.populate_segments
8
-
9
- assert_instance_of Array, parser.segments
10
-
11
- parser.segments.each do |segment|
12
- assert_kind_of Hippo::Segments::Base, segment
13
- end
4
+ def setup
5
+ @parser = Hippo::Parser.new
14
6
  end
15
7
 
16
8
  def test_parse_returns_array_of_transaction_sets
17
- parser = Hippo::Parser.new
18
- transaction_sets = parser.parse('samples/005010X221A1_business_scenario_1.edi')
9
+ transaction_sets = @parser.parse('samples/005010X221A1_business_scenario_1.edi')
19
10
 
20
11
  assert_instance_of Array, transaction_sets
21
12
 
@@ -23,4 +14,33 @@ class TestParser < MiniTest::Unit::TestCase
23
14
  assert_kind_of Hippo::TransactionSets::Base, ts
24
15
  end
25
16
  end
17
+
18
+ def test_raises_error_on_extra_segments
19
+ ts = Hippo::TransactionSets::Test::Base.new
20
+ ts.ST
21
+ ts.TSS.Field2 = 'Bar'
22
+ ts.TSS.Field3 = 'Baz'
23
+ ts.TCS.Field1 = 'Blah'
24
+ ts.TCS.CompositeCommonName_02 = 'CNBlah'
25
+ ts.TSS_02.Field2 = 'Boo'
26
+
27
+ # test nested block syntax on non-looping component
28
+ ts.L0001.TSS.Field2 = 'SubBar'
29
+
30
+ # test nested block syntax on non-looping component
31
+ ts.L0002 do |l0002|
32
+ l0002.TCS.Field2 = 'SubBarBlah'
33
+ l0002.TSS.Field2 = 'SubBarRepeater'
34
+ end
35
+
36
+ #'TSS*Blah*Bar*Baz~TCS*Blah*:::CNBlah*Preset Field 7~TSS*Last Segment*Boo~TSS*Foo*SubBar~TCS*:SubBarBlah**Foo2~TSS*Last Segment*SubBarRepeater~', ts.to_s
37
+
38
+ @parser.raw_data = ts.to_s
39
+ ts_result = @parser.populate_transaction_sets.first
40
+
41
+ puts ts.inspect
42
+ puts ts_result.inspect
43
+
44
+ assert_equal ts.values.inspect, ts_result.values.inspect
45
+ end
26
46
  end
@@ -5,13 +5,13 @@ class TestSegmentsBase < MiniTest::Unit::TestCase
5
5
  def teardown; end;
6
6
 
7
7
  def test_empty_segment
8
- seg = Hippo::Segments::TestSimpleSegment.new
8
+ seg = Hippo::Segments::TSS.new
9
9
 
10
10
  assert_equal 'TSS~', seg.to_s
11
11
  end
12
12
 
13
13
  def test_basic_populated_segment
14
- seg = Hippo::Segments::TestSimpleSegment.new
14
+ seg = Hippo::Segments::TSS.new
15
15
 
16
16
  seg.Field1 = 'TestField1'
17
17
  seg.Field2 = 'TestField2'
@@ -22,7 +22,7 @@ class TestSegmentsBase < MiniTest::Unit::TestCase
22
22
  end
23
23
 
24
24
  def test_empty_field_in_segment
25
- seg = Hippo::Segments::TestSimpleSegment.new
25
+ seg = Hippo::Segments::TSS.new
26
26
 
27
27
  seg.Field2 = 'TestField2'
28
28
  seg.Field3 = 'TestField3'
@@ -30,7 +30,7 @@ class TestSegmentsBase < MiniTest::Unit::TestCase
30
30
 
31
31
  assert_equal 'TSS**TestField2*TestField3*TestField4~', seg.to_s
32
32
 
33
- seg = Hippo::Segments::TestSimpleSegment.new
33
+ seg = Hippo::Segments::TSS.new
34
34
 
35
35
  seg.Field2 = 'TestField2'
36
36
 
@@ -38,7 +38,7 @@ class TestSegmentsBase < MiniTest::Unit::TestCase
38
38
  end
39
39
 
40
40
  def test_segment_orders_properly
41
- seg = Hippo::Segments::TestSimpleSegment.new
41
+ seg = Hippo::Segments::TSS.new
42
42
 
43
43
  seg.Field3 = 'TestField3'
44
44
  seg.Field2 = 'TestField2'
@@ -49,7 +49,7 @@ class TestSegmentsBase < MiniTest::Unit::TestCase
49
49
  end
50
50
 
51
51
  def test_assign_values_with_same_field_names
52
- seg = Hippo::Segments::TestSimpleSegment.new
52
+ seg = Hippo::Segments::TSS.new
53
53
  seg.CommonName = 'Value1'
54
54
  seg.CommonName_02 = 'Value2'
55
55
 
@@ -62,7 +62,7 @@ class TestSegmentsBase < MiniTest::Unit::TestCase
62
62
  end
63
63
 
64
64
  def test_compound_segment
65
- seg = Hippo::Segments::TestCompoundSegment.new
65
+ seg = Hippo::Segments::TCS.new
66
66
 
67
67
  seg.Field1 = 'Comp1Field1'
68
68
  seg.Field2 = 'Comp1Field2'
@@ -75,7 +75,7 @@ class TestSegmentsBase < MiniTest::Unit::TestCase
75
75
  end
76
76
 
77
77
  def test_compound_segment_with_empty_initial_fields
78
- seg = Hippo::Segments::TestCompoundSegment.new
78
+ seg = Hippo::Segments::TCS.new
79
79
 
80
80
  seg.Field2 = 'Comp1Field2'
81
81
 
@@ -84,7 +84,7 @@ class TestSegmentsBase < MiniTest::Unit::TestCase
84
84
 
85
85
  def test_compound_segment_assign_values_with_same_field_names
86
86
 
87
- seg = Hippo::Segments::TestCompoundSegment.new
87
+ seg = Hippo::Segments::TCS.new
88
88
 
89
89
  seg.CompositeCommonName = 'CompVal1'
90
90
  seg.CompositeCommonName_02 = 'CompVal2'
@@ -29,7 +29,6 @@ class TestTransactionSetBase < MiniTest::Unit::TestCase
29
29
  ts.L0001 {|l0001| }
30
30
 
31
31
  assert_equal 'TSS*Foo~', ts.to_s
32
-
33
32
  end
34
33
 
35
34
  def test_accessing_sements_with_same_segment_id
@@ -38,7 +37,7 @@ class TestTransactionSetBase < MiniTest::Unit::TestCase
38
37
  ts.TCS.Field1 = 'Foo'
39
38
  ts.TSS_02.Field2 = 'Baz'
40
39
 
41
- assert_equal 'TSS*Blah*Bar~TCS*Foo**Preset Field 7~TSS*Last Segment*Baz~', ts.to_s
40
+ assert_equal 'TSS*Blah*Bar~TCS*Foo**Preset Field 7~TSS*Last Standalone Segment*Baz~', ts.to_s
42
41
  end
43
42
 
44
43
  def test_assigning_segment_values_with_block_syntax
@@ -58,7 +57,7 @@ class TestTransactionSetBase < MiniTest::Unit::TestCase
58
57
  tss.Field2 = 'Boo'
59
58
  end
60
59
 
61
- assert_equal 'TSS*Blah*Bar*Baz~TCS*Blah*:::CNBlah*Preset Field 7~TSS*Last Segment*Boo~', ts.to_s
60
+ assert_equal 'TSS*Blah*Bar*Baz~TCS*Blah*:::CNBlah*Preset Field 7~TSS*Last Standalone Segment*Boo~', ts.to_s
62
61
 
63
62
  # test nexted block syntax on non-looping component
64
63
  ts.L0001 do |l0001|
@@ -67,7 +66,7 @@ class TestTransactionSetBase < MiniTest::Unit::TestCase
67
66
  end
68
67
  end
69
68
 
70
- assert_equal 'TSS*Blah*Bar*Baz~TCS*Blah*:::CNBlah*Preset Field 7~TSS*Last Segment*Boo~TSS*Foo*SubBar~', ts.to_s
69
+ assert_equal 'TSS*Blah*Bar*Baz~TCS*Blah*:::CNBlah*Preset Field 7~TSS*Last Standalone Segment*Boo~TSS*Foo*SubBar~', ts.to_s
71
70
 
72
71
  # test nexted block syntax on non-looping component
73
72
  ts.L0002 do |l0002|
@@ -80,21 +79,21 @@ class TestTransactionSetBase < MiniTest::Unit::TestCase
80
79
  end
81
80
  end
82
81
 
83
- assert_equal 'TSS*Blah*Bar*Baz~TCS*Blah*:::CNBlah*Preset Field 7~TSS*Last Segment*Boo~TSS*Foo*SubBar~TCS*:SubBarBlah**Foo2~TSS*Last Segment*SubBarRepeater~', ts.to_s
82
+ assert_equal 'TSS*Blah*Bar*Baz~TCS*Blah*:::CNBlah*Preset Field 7~TSS*Last Standalone Segment*Boo~TSS*Foo*SubBar~TCS*:SubBarBlah**Foo2~TSS*Last Segment*SubBarRepeater~', ts.to_s
84
83
  end
85
84
 
86
85
  def test_intializing_with_segment_array_populates_transaction_set
87
- tss = Hippo::Segments::TestSimpleSegment.new
86
+ tss = Hippo::Segments::TSS.new
88
87
  tss.TSS01 = 'Blah'
89
88
 
90
- tcs = Hippo::Segments::TestCompoundSegment.new
89
+ tcs = Hippo::Segments::TCS.new
91
90
  tcs.Field7 = 'Preset Field 7'
92
91
 
93
- tss2 = Hippo::Segments::TestSimpleSegment.new
94
- tss2.TSS01 = 'Last Segment'
92
+ tss2 = Hippo::Segments::TSS.new
93
+ tss2.TSS01 = 'Last Standalone Segment'
95
94
 
96
95
  # start L0001 segments
97
- tss3 = Hippo::Segments::TestSimpleSegment.new
96
+ tss3 = Hippo::Segments::TSS.new
98
97
  tss3.TSS01 = 'Foo'
99
98
 
100
99
  segment_array = [tss, tcs, tss2, tss3]
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hippo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,11 +10,11 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2011-09-16 00:00:00.000000000Z
13
+ date: 2011-11-09 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: minitest
17
- requirement: &70165157593940 !ruby/object:Gem::Requirement
17
+ requirement: &70266547233860 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :development
24
24
  prerelease: false
25
- version_requirements: *70165157593940
25
+ version_requirements: *70266547233860
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: rake
28
- requirement: &70165157593380 !ruby/object:Gem::Requirement
28
+ requirement: &70266547233360 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ~>
@@ -33,7 +33,7 @@ dependencies:
33
33
  version: 0.9.2
34
34
  type: :development
35
35
  prerelease: false
36
- version_requirements: *70165157593380
36
+ version_requirements: *70266547233360
37
37
  description: HIPAA Transaction Set Generator/Parser
38
38
  email:
39
39
  - robertj@promedicalinc.com
@@ -45,6 +45,7 @@ files:
45
45
  - CHANGELOG
46
46
  - Gemfile
47
47
  - Guardfile
48
+ - LICENSE
48
49
  - README.md
49
50
  - Rakefile
50
51
  - hippo.gemspec
@@ -138,6 +139,7 @@ files:
138
139
  - lib/hippo/segments/TS3.rb
139
140
  - lib/hippo/segments/UR.rb
140
141
  - lib/hippo/segments/base.rb
142
+ - lib/hippo/separator.rb
141
143
  - lib/hippo/transaction_sets.rb
142
144
  - lib/hippo/transaction_sets/HIPAA_276.rb
143
145
  - lib/hippo/transaction_sets/HIPAA_276/L2000A.rb
@@ -237,8 +239,6 @@ files:
237
239
  - samples/005010X221A1_tmhp_example.edi
238
240
  - samples/005010X222A1_anesthesia.edi
239
241
  - samples/005010X222A1_commercial_health_insurance.edi
240
- - samples/835_4010.edi
241
- - samples/837_4010A1.edi
242
242
  - test/test_helper.rb
243
243
  - test/test_hipaa_835.rb
244
244
  - test/test_hipaa_837.rb
@@ -265,7 +265,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
265
265
  version: '0'
266
266
  requirements: []
267
267
  rubyforge_project: hippo
268
- rubygems_version: 1.8.6
268
+ rubygems_version: 1.8.10
269
269
  signing_key:
270
270
  specification_version: 3
271
271
  summary: HIPAA Transaction Set Generator/Parser
data/samples/835_4010.edi DELETED
@@ -1 +0,0 @@
1
- ISA*00* *00* *ZZ*EMEDNYBAT *ZZ*530 *080716*1801*U*00401*198000001*0*T*:~GS*HP*EMEDNYBAT*530*20080716*18011900*198000001*X*004010X091A1~ST*835*159900001~BPR*H*0*C*NON************20080716~TRN*1*NO PAYMENT*1141797357~REF*EV*530~REF*F2*004010X091A1~DTM*405*20080716~N1*PR*NYSDOH~N3*OFFICE OF MEDICAID MANAGEMENT*CORNING TOWER, EMPIRE STATE PLAZA~N4*ALBANY*NY*122370080~N1*PE*ST ELSEWARE HSP MED CTR NY*XX*1234567890~REF*TJ*111991234~LX*1~CLP*0711000004462420*22*-123.86*-134.7**MC*0712000000015920*13*7~CAS*CR*A2*10.84*0~NM1*QC*1*PATIENT*ANNIBEL*X***MI*AA00000Z~NM1*82*1******XX*1234567890~REF*EA*607887001~REF*9A*4303~DTM*232*20070413~DTM*233*20070413~PER*CX*RETRO RATE REVERSAL~CLP*0711000004462420*1*123.86*130.7**MC*0712000000015920*13*7~CAS*CO*A2*-6.84*0~NM1*QC*1*PATIENT*ANNIBEL*X***MI*AA00000Z~NM1*82*1******XX*1234567890~REF*EA*607887001~REF*9A*4303~DTM*232*20070413~DTM*233*20070413~PER*CX*RETRO RATE CORRECTION~PLB*1234567890*20081231*FB:000000000000000000000000000000*-4~SE*32*159900001~GE*1*198000001~IEA*1*198000001~
@@ -1 +0,0 @@
1
- ISA*00* *00* *ZZ*498 *ZZ*123456789 *070814*1741*U*00401*000001234*0*P*:~GS*HC*123*123456789*20070814*1741*2353*X*004010X098A1~ST*837*0001~BHT*0019*00*1*20070814*1741*CH~REF*87*004010X098A1~NM1*41*2*John Doe Clinic*****46*498~PER*IC*John Doe Clinic*TE*1305862479~NM1*40*2*NONEBLUE CROSS OF OKLAHOMA*****00*1301112222~HL*1**20*1~NM1*85*2*John Doe Clinic*****XX*1134125735~N3*12 MAIN STREET~N4*CITY*ST*56789~REF*EI*76053151601~HL*2*1*22*1~SBR*P**702510******CI~NM1*IL*1*DOE*JOHN****ST*123456789~N3*123 DOE ST~N4*CITY*ST*12345~DMG*D8*20020202*M~NM1*PR*2*NONEBLUE CROSS OF OKLAHOMA*****PI*12345~N3*P O BOX 000000~N4*CITY*ST*77210~HL*3*2*23*0~PAT*19******01*239~NM1*QC*1*SMITH*DOE Q****MI*123456789~N3*12 MAIN STREET~N4*CITY*ST*56789~CLM*968928879*45***12::1*Y*A*Y*Y*C~REF*9F*2417401094~REF*D9*26485~HI*BK:8489~NM1*DN*1*DOE*JANE~REF*1G*F01234~LX*1~SV1*HC:E0114:NU*45.00*UN*1***1~DTP*472*RD8*20070515-20070515~NM1*DK*1*DOE*JANE~N3*1234 NOWHERE SUITE 100~N4*CITY*ST*56789~REF*1G*F12345~PER*IC*JOHN DOLITTLE*TE*1301112222~SE*40*0001~GE*1*2353~IEA*1*000001234~