Changeset 0a11f975ff365fd1126c45cad8b8e5f48ed94fc6

Show
Ignore:
Timestamp:
06/27/07 00:56:09 (19 months ago)
Author:
segfault <segfault@…>
Parents:
85bd278bd86d778d6470d03712e0518ad48f49a7
Children:
0f328931727ae67b2b7f9854942844792fdd24b2
git-committer:
segfault <segfault@72d81af0-b0fa-4b65-b54c-2b622d79b57a> / 2007-06-27T04:56:09Z+0000
Message:

child segment parsing seems to work
re-worked the way child segments are printed

git-svn-id: svn://hasno.info/ruby-hl7/trunk@38 72d81af0-b0fa-4b65-b54c-2b622d79b57a

Files:
6 modified

Legend:

Unmodified
Added
Removed
  • lib/ruby-hl7.rb

    r5e6f05 r0a11f9  
    9292 
    9393    if block_given? 
    94       blk.call 
     94      blk.call self 
    9595    end 
    9696  end 
     
    123123    if index.kind_of?(Range) || index.kind_of?(Fixnum) 
    124124      @segments[ index ] = value 
     125    elsif index.respond_to?(:to_sym) 
     126      (@segments_by_name[ index.to_sym ] ||= []) << value 
    125127    else 
    126       (@segments_by_name[ index.to_sym ] ||= []) << value 
    127     end 
     128      raise HL7::Exception.new( "attempting to use an indice that is not a Range, Fixnum or to_sym providing object" ) 
     129    end 
     130 
     131    value.parent = self 
    128132  end 
    129133 
     
    146150    end 
    147151 
     152    value.parent = self unless value.parent && value.parent == self # this limits us to two levels. 
    148153    (@segments ||= []) << value 
    149154    name = value.class.to_s.gsub("HL7::Message::Segment::", "").to_sym 
     
    180185 
    181186  # provide a screen-readable version of the message 
    182   def to_s                          
    183     @segments.join( '\n' ) 
     187  def to_s     
     188    @segments.join( "\n" )                                
    184189  end 
    185190 
    186191  # provide a HL7 spec version of the message 
    187192  def to_hl7 
    188     @segments.join( @segment_delim ) 
     193    segs = @segments.collect { |s| s if s.to_s.length > 0 } 
     194    segs.join( @segment_delim )  
    189195  end 
    190196 
     
    239245    raise HL7::ParseError.new unless ary.length > 0 
    240246 
     247    last_seg = nil 
    241248    ary.each do |elm| 
     249      last_seg = generate_segment( elm, last_seg ) 
     250    end 
     251  end 
     252 
     253  def generate_segment( elm, last_seg ) 
    242254      seg_parts = elm.split( @element_delim, -1 ) 
    243255      raise HL7::ParseError.new unless seg_parts && (seg_parts.length > 0) 
     
    252264      end 
    253265      new_seg = kls.new( elm ) 
     266      ret = new_seg 
     267 
     268      if last_seg && last_seg.respond_to?(:children) && last_seg.accepts?( seg_name ) 
     269        last_seg.children << new_seg 
     270        new_seg.is_child = true 
     271        ret = last_seg 
     272      end 
     273 
    254274      @segments << new_seg 
    255275 
     
    260280        @segments_by_name[ seg_sym ] << new_seg 
    261281      end 
    262     end 
    263  
     282 
     283      ret  
    264284  end 
    265285end                 
     
    284304#       
    285305class HL7::Message::Segment 
     306  attr :parent, true 
    286307  attr :element_delim 
    287308  attr :item_delim 
     
    295316    @element_delim = '|' 
    296317    @field_total = 0 
     318    @is_child = false 
    297319 
    298320    if (raw_segment.kind_of? Array) 
     
    369391  end 
    370392 
     393  # sort-compare two Segments, 0 indicates equality 
    371394  def <=>( other )  
    372395    return nil unless other.kind_of?(HL7::Message::Segment) 
     
    384407  end 
    385408 
     409 
     410  # return true if the segment has a parent  
     411  def is_child? 
     412    (@is_child ||= false) 
     413  end 
     414 
     415  # indicate whether or not the segment has a parent 
     416  def is_child=(val) 
     417    @is_child = val 
     418  end 
     419 
     420  # get the length of the segment (number of fields it contains) 
     421  def length 
     422    0 unless @elements 
     423    @elements.length 
     424  end 
     425 
     426 
    386427  private 
    387428  def self.singleton #:nodoc: 
    388429    class << self; self end 
    389430  end 
    390  
    391431 
    392432  # DSL element to define a segment's sort weight 
     
    409449  # allows a segment to store other segment objects 
    410450  # used to handle associated lists like one OBR to many OBX segments 
    411   def self.has_children 
     451  def self.has_children(child_types) 
     452    @child_types = child_types 
     453    define_method(:child_types) do 
     454      @child_types 
     455    end 
     456 
    412457    self.class_eval do 
    413458      define_method(:children) do 
    414459        unless @my_children 
     460          p = self 
    415461          @my_children ||= [] 
    416462          @my_children.instance_eval do 
     463            @parental = p 
    417464            alias :old_append :<< 
    418465 
     
    421468                raise HL7::Exception.new( "attempting to append non-segment to a segment list" ) 
    422469              end 
    423          
     470 
     471              value.parent = self  
    424472              old_append( value ) 
    425473            end 
     
    430478      end 
    431479 
    432       alias :my_to_s :to_s 
    433       define_method(:to_s) do 
    434         out = my_to_s 
    435         if @my_children 
    436           @my_children.each do |seg| 
    437             out << '\r' 
    438             out << seg.to_s 
    439           end 
    440         end 
    441         out 
    442       end 
    443     end 
    444        
    445   end 
     480      define_method('accepts?') do |t| 
     481        t = t.to_sym if t && (t.to_s.length > 0) && t.respond_to?(:to_sym) 
     482        child_types.index t 
     483      end 
     484    end  
     485  end  
    446486 
    447487  # define a field alias  
     
    531571  @elements = [] 
    532572 
    533  
    534573end 
    535574 
  • lib/segments/obr.rb

    rab3b68 r0a11f9  
    33class HL7::Message::Segment::OBR < HL7::Message::Segment 
    44  weight 89 # obr.weight-1 
    5   has_children 
     5  has_children [:OBX] 
    66  add_field :name=>:set_id 
    77  add_field :name=>:placer_order_number 
  • lib/segments/obx.rb

    rab3b68 r0a11f9  
    33class HL7::Message::Segment::OBX < HL7::Message::Segment 
    44  weight 90 
     5  has_children [:NTE] 
    56  add_field :name=>:set_id 
    67  add_field :name=>:value_type 
  • test/test_basic_parsing.rb

    r5e6f05 r0a11f9  
    4141    msg = HL7::Message.new 
    4242    msg.parse @simple_msh_txt 
    43     orig = @simple_msh_txt.gsub( /\r/, '\n' ) 
     43    orig = @simple_msh_txt.gsub( /\r/, "\n" ) 
    4444    assert_equal( orig, msg.to_s ) 
    4545  end 
  • test/test_child_segment.rb

    r85bd27 r0a11f9  
    1515    assert_equal( 3, msg[:OBR].length )  
    1616    assert_not_nil msg[:OBR].first.children 
     17    assert_equal( 5, msg[:OBR].first.children.length ) 
    1718 
    1819    msg[:OBR].first.children.each do |x| 
  • test_data/test.hl7

    r772e02 r0a11f9  
    77OBX||FT|EXAM^MICROSCOPIC||GRAM POSITIVE COCCI IN GROUPS|| 
    88  
    9