edi4r 0.9.4.1 → 0.9.6.2
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 +7 -0
- data/AuthorCopyright +3 -3
- data/{ChangeLog → Changelog} +60 -0
- data/README +15 -10
- data/Tutorial +2 -3
- data/VERSION +1 -1
- data/bin/edi2xml.rb +12 -16
- data/bin/editool.rb +9 -5
- data/bin/sedas2eancom02.rb +1385 -0
- data/bin/xml2edi.rb +7 -12
- data/data/edifact/iso9735/SDCD.20000.csv +1 -0
- data/data/edifact/iso9735/SDCD.3for2.csv +1 -0
- data/data/edifact/iso9735/SDED.20000.csv +6 -0
- data/data/edifact/iso9735/SDED.30000.csv +43 -43
- data/data/edifact/iso9735/SDED.3for2.csv +6 -0
- data/data/edifact/iso9735/SDED.40000.csv +129 -129
- data/data/edifact/iso9735/SDED.40100.csv +130 -130
- data/data/edifact/iso9735/SDMD.20000.csv +6 -0
- data/data/edifact/iso9735/SDMD.30000.csv +6 -6
- data/data/edifact/iso9735/SDMD.3for2.csv +6 -0
- data/data/edifact/iso9735/SDMD.40000.csv +17 -17
- data/data/edifact/iso9735/SDMD.40100.csv +17 -17
- data/data/edifact/iso9735/SDSD.20000.csv +5 -0
- data/data/edifact/iso9735/SDSD.3for2.csv +5 -0
- data/data/edifact/untdid/EDMD.d01b.csv +1 -1
- data/data/sedas/EDCD..csv +0 -0
- data/data/sedas/EDED..csv +859 -0
- data/data/sedas/EDMD..csv +16 -0
- data/data/sedas/EDSD..csv +44 -0
- data/lib/edi4r.rb +147 -67
- data/lib/edi4r/ansi_x12-rexml.rb +91 -0
- data/lib/edi4r/ansi_x12.rb +1684 -0
- data/lib/edi4r/diagrams.rb +75 -14
- data/lib/edi4r/edifact-rexml.rb +4 -3
- data/lib/edi4r/edifact.rb +505 -202
- data/lib/edi4r/rexml.rb +13 -7
- data/lib/edi4r/sedas.rb +854 -0
- data/lib/edi4r/standards.rb +150 -33
- data/test/damaged_file.edi +1 -0
- data/test/eancom2webedi.rb +1 -0
- data/test/groups.edi +1 -1
- data/test/test_basics.rb +16 -9
- data/test/test_edi_split.rb +30 -0
- data/test/test_loopback.rb +7 -2
- data/test/test_rexml.rb +34 -2
- data/test/test_service_messages.rb +190 -0
- data/test/test_streaming.rb +167 -0
- data/test/test_tut_examples.rb +3 -1
- data/test/webedi2eancom.rb +1 -0
- metadata +121 -77
    
        data/test/test_loopback.rb
    CHANGED
    
    | @@ -1,7 +1,12 @@ | |
| 1 | 
            -
            #!/usr/bin/env ruby
         | 
| 1 | 
            +
            # #!/usr/bin/env ruby
         | 
| 2 | 
            +
            # -*- encoding: iso-8859-1 -*-
         | 
| 2 3 | 
             
            # :include: ../AuthorCopyright
         | 
| 3 4 |  | 
| 4 5 | 
             
            require 'test/unit'
         | 
| 6 | 
            +
            require 'rbconfig'
         | 
| 7 | 
            +
            $ruby_cmd = File.join(RbConfig::CONFIG["bindir"],
         | 
| 8 | 
            +
            			RbConfig::CONFIG["RUBY_INSTALL_NAME"] + RbConfig::CONFIG["EXEEXT"])
         | 
| 9 | 
            +
            $ruby_cmd << " -E iso-8859-1" if RUBY_VERSION >= '1.9'
         | 
| 5 10 |  | 
| 6 11 | 
             
            #######################################################################
         | 
| 7 12 | 
             
            # Test the accompanying standalone mapping tools
         | 
| @@ -13,7 +18,7 @@ class EDIFACT_Tests < Test::Unit::TestCase | |
| 13 18 | 
             
              def test_loopback
         | 
| 14 19 | 
             
                s1 = nil
         | 
| 15 20 | 
             
                File.open('in1.inh') {|hnd| hnd.binmode; s1 = hnd.read}
         | 
| 16 | 
            -
                s2 =  | 
| 21 | 
            +
                s2 = `#$ruby_cmd ./webedi2eancom.rb -a in1.inh | #$ruby_cmd ./eancom2webedi.rb`
         | 
| 17 22 | 
             
                assert_equal( 0, $? )
         | 
| 18 23 | 
             
                assert_match( s1, s2 )
         | 
| 19 24 | 
             
              end
         | 
    
        data/test/test_rexml.rb
    CHANGED
    
    | @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
            # *-* encoding: iso-8859-1 -*-
         | 
| 2 3 | 
             
            # :include: ../AuthorCopyright
         | 
| 3 4 |  | 
| 4 5 | 
             
            #######################################################################
         | 
| @@ -10,9 +11,13 @@ | |
| 10 11 | 
             
            # Include statement during test setup:
         | 
| 11 12 |  | 
| 12 13 | 
             
            $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
         | 
| 14 | 
            +
            $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'tdid', 'lib')
         | 
| 15 | 
            +
             | 
| 13 16 | 
             
            require 'edi4r'
         | 
| 14 17 | 
             
            require 'edi4r/edifact'
         | 
| 15 18 | 
             
            require 'edi4r/rexml'
         | 
| 19 | 
            +
            require 'edi4r-tdid'
         | 
| 20 | 
            +
            require 'edi4r/edifact-rexml'
         | 
| 16 21 |  | 
| 17 22 | 
             
            # Regular include statements:
         | 
| 18 23 |  | 
| @@ -62,14 +67,41 @@ class EDIFACT_REXML_Tests < Test::Unit::TestCase | |
| 62 67 | 
             
              end
         | 
| 63 68 |  | 
| 64 69 |  | 
| 70 | 
            +
              def test_joko
         | 
| 71 | 
            +
                icx = nil
         | 
| 72 | 
            +
                assert_nothing_raised do
         | 
| 73 | 
            +
                  icx = EDI::Interchange.parse(File.open("joko2.xml"))
         | 
| 74 | 
            +
                  assert_equal( 0, icx.validate )
         | 
| 75 | 
            +
                end
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                ice = EDI::Interchange.parse(File.open("joko_in.edi"))
         | 
| 78 | 
            +
                assert_equal( ice.to_s, icx.to_s )  # EDIFACT representations equal?
         | 
| 79 | 
            +
                
         | 
| 80 | 
            +
                se = StringIO.new
         | 
| 81 | 
            +
                xdoc_e = REXML::Document.new
         | 
| 82 | 
            +
                ice.to_xml(xdoc_e)
         | 
| 83 | 
            +
                xdoc_e.write( se, 0 )
         | 
| 84 | 
            +
                xdoc_e.write( File.open('joko2a.xml','w'), 0 )
         | 
| 85 | 
            +
             | 
| 86 | 
            +
                sx = StringIO.new
         | 
| 87 | 
            +
                xdoc_x = REXML::Document.new
         | 
| 88 | 
            +
                icx.to_xml(xdoc_x)
         | 
| 89 | 
            +
                xdoc_x.write( sx, 0 )
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                ie = EDI::E::Interchange.parse_xml( xdoc_e )
         | 
| 92 | 
            +
                ix = EDI::E::Interchange.parse_xml( xdoc_x )
         | 
| 93 | 
            +
                assert_equal( ie.to_s, ix.to_s )
         | 
| 94 | 
            +
              end
         | 
| 95 | 
            +
             | 
| 96 | 
            +
             | 
| 65 97 | 
             
              def test_groups
         | 
| 66 98 |  | 
| 67 99 | 
             
                xdoc = REXML::Document.new
         | 
| 68 100 | 
             
                assert_nothing_raised{ @icg.to_xml( xdoc ) }
         | 
| 69 101 |  | 
| 70 102 | 
             
                sg = StringIO.new
         | 
| 71 | 
            -
                xdoc.write( sg | 
| 72 | 
            -
            #    xdoc.write( File.open("groups2.xml",'w') | 
| 103 | 
            +
                xdoc.write( sg )
         | 
| 104 | 
            +
            #    xdoc.write( File.open("groups2.xml",'w') )
         | 
| 73 105 |  | 
| 74 106 | 
             
                ic = nil
         | 
| 75 107 | 
             
                assert_nothing_raised do
         | 
| @@ -0,0 +1,190 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
            # -*- encoding: iso-8859-1 -*-
         | 
| 3 | 
            +
            # :include: ../AuthorCopyright
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            # Load path magic...
         | 
| 6 | 
            +
            $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
         | 
| 7 | 
            +
             | 
| 8 | 
            +
            require 'test/unit'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            require 'edi4r'
         | 
| 11 | 
            +
            # require 'edi4r-tdid'
         | 
| 12 | 
            +
            require 'edi4r/edifact'
         | 
| 13 | 
            +
             | 
| 14 | 
            +
            class EDIFACT_Tests < Test::Unit::TestCase
         | 
| 15 | 
            +
             | 
| 16 | 
            +
              # edi@energy sample:
         | 
| 17 | 
            +
              # UCI+10001+4078901000029:14+4012345000023:14+4'
         | 
| 18 | 
            +
              # Dieses Beispiel identifiziert die Übertragung 10001 vom Absender
         | 
| 19 | 
            +
              # 4078901000029 (ILN) an den Empfänger 4012345000023 (ILN). 
         | 
| 20 | 
            +
              # In der empfangenen Datei wurde ein Syntaxfehler festgestellt.
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              def fill_CONTRL( msg )
         | 
| 23 | 
            +
                seg = msg.new_segment('UCI')
         | 
| 24 | 
            +
                msg.add seg
         | 
| 25 | 
            +
                seg.d0020 = '10001'
         | 
| 26 | 
            +
                seg.cS002.d0004 = '4078901000029'
         | 
| 27 | 
            +
                seg.cS002.d0007 = '14'
         | 
| 28 | 
            +
                seg.cS003.d0010 = '4012345000023'
         | 
| 29 | 
            +
                seg.cS003.d0007 = '14'
         | 
| 30 | 
            +
                seg.d0083 = '4'
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
             | 
| 33 | 
            +
              # Sample data from EANCOM 2002 example 2:
         | 
| 34 | 
            +
              #
         | 
| 35 | 
            +
              # UNH+AUT0001+AUTACK:4:1:UN:EAN001'
         | 
| 36 | 
            +
              # USH+7+1+3+1+2+1++++1:20020102:100522:0100'
         | 
| 37 | 
            +
              # USA+1:16:1:6:1:7:1'
         | 
| 38 | 
            +
              # USC+AXZ4711+4::541234500006:2+3'
         | 
| 39 | 
            +
              # USA+6:16:1:10:1:7:1'
         | 
| 40 | 
            +
              # USB+1++5412345678908:14+8798765432106:14'
         | 
| 41 | 
            +
              # USX+INT12435+5412345678908:14+8798765432106:14'
         | 
| 42 | 
            +
              # USY+1+1:139B7CB..........7C72B03CE5F'
         | 
| 43 | 
            +
              # UST+1+5'
         | 
| 44 | 
            +
              # UNT+10+AUT0001
         | 
| 45 | 
            +
              #
         | 
| 46 | 
            +
              def fill_AUTACK( msg )
         | 
| 47 | 
            +
                msg.header.d0062 = 'AUT0001'
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                seg = msg.new_segment('USH')
         | 
| 50 | 
            +
                msg.add seg
         | 
| 51 | 
            +
                seg.d0501 = 7
         | 
| 52 | 
            +
                seg.d0534 = 1
         | 
| 53 | 
            +
                seg.d0541 = 3
         | 
| 54 | 
            +
                seg.d0503 = 1
         | 
| 55 | 
            +
                seg.d0505 = 2
         | 
| 56 | 
            +
                seg.d0507 = 1
         | 
| 57 | 
            +
                seg.cS501.d0517 = 1
         | 
| 58 | 
            +
                seg.cS501.d0338 = '20020102'
         | 
| 59 | 
            +
                seg.cS501.d0314 = '100522'
         | 
| 60 | 
            +
                seg.cS501.d0336 = '0100'
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                seg = msg.new_segment('USA')
         | 
| 63 | 
            +
                msg.add seg
         | 
| 64 | 
            +
                seg.cS502.d0523 = 1
         | 
| 65 | 
            +
                seg.cS502.d0525 = 16
         | 
| 66 | 
            +
                seg.cS502.d0533 = 6
         | 
| 67 | 
            +
                seg.cS502.d0527 = 1
         | 
| 68 | 
            +
                seg.cS502.d0529 = 6
         | 
| 69 | 
            +
                seg.cS502.d0591 = 7
         | 
| 70 | 
            +
                seg.cS502.d0601 = 1
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                seg = msg.new_segment('USC')
         | 
| 73 | 
            +
                msg.add seg
         | 
| 74 | 
            +
                seg.d0536 = 'AXZ4711'
         | 
| 75 | 
            +
                seg.cS500.d0577 = 4
         | 
| 76 | 
            +
                seg.cS500.d0511 = '541234500006'
         | 
| 77 | 
            +
                seg.cS500.d0513 = 2
         | 
| 78 | 
            +
                seg.d0545 = 3
         | 
| 79 | 
            +
             | 
| 80 | 
            +
                seg = msg.new_segment('USA')
         | 
| 81 | 
            +
                msg.add seg
         | 
| 82 | 
            +
                seg.cS502.d0523 = 6
         | 
| 83 | 
            +
                seg.cS502.d0525 = 16
         | 
| 84 | 
            +
                seg.cS502.d0533 = 1
         | 
| 85 | 
            +
                seg.cS502.d0527 = 10
         | 
| 86 | 
            +
                seg.cS502.d0529 = 1
         | 
| 87 | 
            +
                seg.cS502.d0591 = 7
         | 
| 88 | 
            +
                seg.cS502.d0601 = 1
         | 
| 89 | 
            +
             | 
| 90 | 
            +
                seg = msg.new_segment('USB')
         | 
| 91 | 
            +
                msg.add seg
         | 
| 92 | 
            +
                seg.d0503 = 1
         | 
| 93 | 
            +
                seg.cS002.d0004 = '5412345678908'
         | 
| 94 | 
            +
                seg.cS002.d0007 = 14
         | 
| 95 | 
            +
                seg.cS003.d0010 = '8798765432106'
         | 
| 96 | 
            +
                seg.cS003.d0007 = 14
         | 
| 97 | 
            +
             | 
| 98 | 
            +
                seg = msg.new_segment('USX')
         | 
| 99 | 
            +
                msg.add seg
         | 
| 100 | 
            +
                seg.d0020 = 'INT12435'
         | 
| 101 | 
            +
                seg.cS002.d0004 = '5412345678908'
         | 
| 102 | 
            +
                seg.cS002.d0007 = 14
         | 
| 103 | 
            +
                seg.cS003.d0010 = '8798765432106'
         | 
| 104 | 
            +
                seg.cS003.d0007 = 14
         | 
| 105 | 
            +
             | 
| 106 | 
            +
                seg = msg.new_segment('USY')
         | 
| 107 | 
            +
                msg.add seg
         | 
| 108 | 
            +
                seg.d0534 = 1
         | 
| 109 | 
            +
                seg.cS508.d0563 = 1
         | 
| 110 | 
            +
                seg.cS508.d0560 = '139B7CB..........7C72B03CE5F'
         | 
| 111 | 
            +
             | 
| 112 | 
            +
                seg = msg.new_segment('UST')
         | 
| 113 | 
            +
                msg.add seg
         | 
| 114 | 
            +
                seg.d0534 = 1
         | 
| 115 | 
            +
                seg.d0588 = 5
         | 
| 116 | 
            +
              end
         | 
| 117 | 
            +
             | 
| 118 | 
            +
             | 
| 119 | 
            +
             | 
| 120 | 
            +
              def test_CONTRL_creation
         | 
| 121 | 
            +
             | 
| 122 | 
            +
                test_set = [
         | 
| 123 | 
            +
            	    {:sv => 2, :version => '2', :release => '2'}, # Can't work - segments missing?
         | 
| 124 | 
            +
            	    {:sv => 3, :version => 'D', :release => '3'},
         | 
| 125 | 
            +
            	    {:sv => 3, :version => 'D', :release => '3', :assigned_code => '1.3c'},
         | 
| 126 | 
            +
            #	    {:sv => 3, :version => 'D', :release => '96A', :assigned_code => 'EAN002'},
         | 
| 127 | 
            +
                ]
         | 
| 128 | 
            +
                test_set.each do |testcase|
         | 
| 129 | 
            +
                  ic = nil
         | 
| 130 | 
            +
                  assert_nothing_raised { ic = EDI::E::Interchange.new(
         | 
| 131 | 
            +
            	      :version => testcase[:sv],
         | 
| 132 | 
            +
            	      :charset => testcase[:sv] == 2 ? 'UNOB' : 'UNOC') }
         | 
| 133 | 
            +
                  ic.header.d0035 = 1  # Test indicator
         | 
| 134 | 
            +
                  msg = ic.new_message(:msg_type => 'CONTRL',
         | 
| 135 | 
            +
            			   :version => testcase[:version],
         | 
| 136 | 
            +
            			   :release => testcase[:release],
         | 
| 137 | 
            +
                 			   :assigned_code => testcase[:assigned_code])
         | 
| 138 | 
            +
                  fill_CONTRL(msg)
         | 
| 139 | 
            +
                  ic.add msg
         | 
| 140 | 
            +
                  assert_equal( 1, msg.header.first.value ) # value of DE 0062
         | 
| 141 | 
            +
                  s009 = ['CONTRL', testcase[:version], testcase[:release], 'UN'].join ic.una.ce_sep
         | 
| 142 | 
            +
                  s009 << ":#{testcase[:assigned_code]}" unless testcase[:assigned_code].nil?
         | 
| 143 | 
            +
                  assert_equal( s009, msg.header[1].to_s ) # S009
         | 
| 144 | 
            +
                  assert_equal( ['UNH', 1, s009].join(ic.una.de_sep), msg.header.to_s ) # UNH
         | 
| 145 | 
            +
            #     puts ic
         | 
| 146 | 
            +
                end
         | 
| 147 | 
            +
              end
         | 
| 148 | 
            +
             | 
| 149 | 
            +
              def test_AUTACK_creation
         | 
| 150 | 
            +
             | 
| 151 | 
            +
                test_set = [
         | 
| 152 | 
            +
            	    {:sv => 4, :version => '4', :release => '1'},
         | 
| 153 | 
            +
            	    {:sv => 4, :version => '4', :release => '1', :assigned_code => 'EAN008'},
         | 
| 154 | 
            +
            	    {:sv => 3, :version => '4', :release => '1', :should_fail => true}
         | 
| 155 | 
            +
                ]
         | 
| 156 | 
            +
                test_set.each do |testcase|
         | 
| 157 | 
            +
                  ic = nil
         | 
| 158 | 
            +
                  assert_nothing_raised { ic = EDI::E::Interchange.new(
         | 
| 159 | 
            +
            	      :version => testcase[:sv], :charset => 'UNOA') }
         | 
| 160 | 
            +
                  unb = ic.header 
         | 
| 161 | 
            +
                  unb.d0020 = 'INT12435'
         | 
| 162 | 
            +
                  unb.cS002.d0004 = '5412345678908'
         | 
| 163 | 
            +
                  unb.cS002.d0007 = 14
         | 
| 164 | 
            +
                  unb.cS003.d0010 = '8798765432106'
         | 
| 165 | 
            +
                  unb.cS003.d0007 = 14
         | 
| 166 | 
            +
                  msg = ic.new_message(:msg_type => 'AUTACK',
         | 
| 167 | 
            +
            			   :version => testcase[:version],
         | 
| 168 | 
            +
            			   :release => testcase[:release],
         | 
| 169 | 
            +
                 			   :assigned_code => testcase[:assigned_code])
         | 
| 170 | 
            +
                  if testcase[:should_fail]
         | 
| 171 | 
            +
                    assert_raise(RuntimeError, EDI::EDILookupError) do
         | 
| 172 | 
            +
            	  fill_AUTACK(msg) # Lookup error?
         | 
| 173 | 
            +
            	  ic.add msg       # Validation error?
         | 
| 174 | 
            +
            	end
         | 
| 175 | 
            +
                  else
         | 
| 176 | 
            +
                    assert_nothing_raised do
         | 
| 177 | 
            +
            	  fill_AUTACK(msg)
         | 
| 178 | 
            +
            	  ic.add msg
         | 
| 179 | 
            +
            	end
         | 
| 180 | 
            +
                  end
         | 
| 181 | 
            +
             | 
| 182 | 
            +
                  assert_equal( 'AUT0001', msg.header.first.value ) # value of DE 0062
         | 
| 183 | 
            +
                  s009 = "AUTACK:#{testcase[:version]}:#{testcase[:release]}:UN"
         | 
| 184 | 
            +
                  s009 << ":#{testcase[:assigned_code]}" unless testcase[:assigned_code].nil?
         | 
| 185 | 
            +
                  assert_equal( s009, msg.header[1].to_s ) # S009
         | 
| 186 | 
            +
                  assert_equal( "UNH+AUT0001+"+s009, msg.header.to_s ) # UNH
         | 
| 187 | 
            +
                end
         | 
| 188 | 
            +
              end
         | 
| 189 | 
            +
             | 
| 190 | 
            +
            end
         | 
| @@ -0,0 +1,167 @@ | |
| 1 | 
            +
            #!/usr/bin/env ruby
         | 
| 2 | 
            +
            # :include: ../AuthorCopyright
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            # Load path magic...
         | 
| 5 | 
            +
            $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            require 'test/unit'
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            require 'edi4r'
         | 
| 10 | 
            +
            require 'edi4r/edifact'
         | 
| 11 | 
            +
             | 
| 12 | 
            +
            #######################################################################
         | 
| 13 | 
            +
            # Test the streaming parser with a large interchange
         | 
| 14 | 
            +
            #
         | 
| 15 | 
            +
            # Instead of mapping, we derive some statistics:
         | 
| 16 | 
            +
            #   Count number of line items, report no. of messages
         | 
| 17 | 
            +
             | 
| 18 | 
            +
            module MyParserAddons
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              attr_accessor :lin, :all
         | 
| 21 | 
            +
             | 
| 22 | 
            +
              def on_other( s )
         | 
| 23 | 
            +
                $stderr.puts "other: #{s}"
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def on_segment( s, tag )
         | 
| 27 | 
            +
                case tag
         | 
| 28 | 
            +
                when 'LIN'
         | 
| 29 | 
            +
                  self.lin += 1
         | 
| 30 | 
            +
                  self.all += 1
         | 
| 31 | 
            +
                else
         | 
| 32 | 
            +
                  self.all += 1
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
                super
         | 
| 35 | 
            +
              end
         | 
| 36 | 
            +
             | 
| 37 | 
            +
              def to_s
         | 
| 38 | 
            +
                "Found %d LIN segments, %d total segments" % [self.lin, self.all]
         | 
| 39 | 
            +
              end
         | 
| 40 | 
            +
            end
         | 
| 41 | 
            +
             | 
| 42 | 
            +
             | 
| 43 | 
            +
            class MyParser < EDI::E::StreamingParser
         | 
| 44 | 
            +
              include MyParserAddons
         | 
| 45 | 
            +
             | 
| 46 | 
            +
              def initialize
         | 
| 47 | 
            +
                @lin = @all = 0
         | 
| 48 | 
            +
                super
         | 
| 49 | 
            +
              end
         | 
| 50 | 
            +
            end
         | 
| 51 | 
            +
             | 
| 52 | 
            +
             | 
| 53 | 
            +
            class MyLWBuilder < EDI::E::StreamingBuilder
         | 
| 54 | 
            +
              include MyParserAddons
         | 
| 55 | 
            +
             | 
| 56 | 
            +
              def initialize( validate )
         | 
| 57 | 
            +
                @lin = @all = 0
         | 
| 58 | 
            +
                super
         | 
| 59 | 
            +
              end
         | 
| 60 | 
            +
             | 
| 61 | 
            +
              def on_segment( s, tag )
         | 
| 62 | 
            +
                case tag
         | 
| 63 | 
            +
                when 'LIN'
         | 
| 64 | 
            +
                  self.lin += 1
         | 
| 65 | 
            +
                  self.all += 1
         | 
| 66 | 
            +
                else
         | 
| 67 | 
            +
                  self.all += 1
         | 
| 68 | 
            +
                end
         | 
| 69 | 
            +
                # super
         | 
| 70 | 
            +
              end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
              def on_interchange_end
         | 
| 73 | 
            +
            #    @ic.validate
         | 
| 74 | 
            +
            #    super
         | 
| 75 | 
            +
              end
         | 
| 76 | 
            +
            end
         | 
| 77 | 
            +
             | 
| 78 | 
            +
             | 
| 79 | 
            +
            class MyBuilder < EDI::E::StreamingBuilder
         | 
| 80 | 
            +
              include MyParserAddons
         | 
| 81 | 
            +
             | 
| 82 | 
            +
              def initialize( validate )
         | 
| 83 | 
            +
                @lin = @all = 0
         | 
| 84 | 
            +
                super
         | 
| 85 | 
            +
              end
         | 
| 86 | 
            +
            end
         | 
| 87 | 
            +
             | 
| 88 | 
            +
             | 
| 89 | 
            +
            class MyDemoParser < EDI::E::StreamingParser
         | 
| 90 | 
            +
              attr_reader :counters
         | 
| 91 | 
            +
              
         | 
| 92 | 
            +
              def initialize
         | 
| 93 | 
            +
                @counters = Hash.new(0)
         | 
| 94 | 
            +
                super
         | 
| 95 | 
            +
              end
         | 
| 96 | 
            +
              
         | 
| 97 | 
            +
              def on_segment( s, tag )
         | 
| 98 | 
            +
                @counters[tag] += 1
         | 
| 99 | 
            +
              end
         | 
| 100 | 
            +
            end
         | 
| 101 | 
            +
              
         | 
| 102 | 
            +
             | 
| 103 | 
            +
            class StreamParser_Tests < Test::Unit::TestCase
         | 
| 104 | 
            +
             | 
| 105 | 
            +
              def test_streaming_parser
         | 
| 106 | 
            +
                parser = MyParser.new
         | 
| 107 | 
            +
                assert_nothing_raised{ parser.go File.open('in1.edi') }
         | 
| 108 | 
            +
                assert_equal( 2, parser.lin )
         | 
| 109 | 
            +
                assert_equal( 35, parser.all )
         | 
| 110 | 
            +
             | 
| 111 | 
            +
                # Syntax check
         | 
| 112 | 
            +
                #
         | 
| 113 | 
            +
                parser = EDI::E::StreamingParser.new
         | 
| 114 | 
            +
                assert_raise(EDI::E::EDISyntaxError){ parser.go( File.open('damaged_file.edi') ) }
         | 
| 115 | 
            +
              end
         | 
| 116 | 
            +
             | 
| 117 | 
            +
              def test_sample_code
         | 
| 118 | 
            +
                assert_nothing_raised {
         | 
| 119 | 
            +
                  parser = MyDemoParser.new
         | 
| 120 | 
            +
                  parser.go( File.open( 'remadv101.edi' ) )
         | 
| 121 | 
            +
                  # parser.go( File.open( 'I0002352726' ) ) # Huge interchange, 5MB
         | 
| 122 | 
            +
                  puts "Segment tag statistics:"
         | 
| 123 | 
            +
                  parser.counters.keys.sort.each do |tag|
         | 
| 124 | 
            +
                    print "%03s: %4d\n" % [ tag, parser.counters[tag] ]
         | 
| 125 | 
            +
                  end
         | 
| 126 | 
            +
                }
         | 
| 127 | 
            +
                parser = EDI::E::StreamingParser.new
         | 
| 128 | 
            +
                def parser.on_segment( s, tag ) # singleton
         | 
| 129 | 
            +
                  if tag == 'AJT'
         | 
| 130 | 
            +
                    puts "Interchange in '#{self.path}' contains at least one segment AJT."
         | 
| 131 | 
            +
                    puts "Here is its contents: #{s}"
         | 
| 132 | 
            +
                    throw :done   # Skip further parsing
         | 
| 133 | 
            +
                  end
         | 
| 134 | 
            +
                end
         | 
| 135 | 
            +
                def parser.on_unz_uiz( s, tag )
         | 
| 136 | 
            +
                  puts "Interchange in '#{self.path}' does NOT contain a segment AJT!"
         | 
| 137 | 
            +
                end
         | 
| 138 | 
            +
                assert_nothing_raised do
         | 
| 139 | 
            +
                  parser.go( File.open( 'in1.edi' ) )
         | 
| 140 | 
            +
                  parser.go( File.open( 'remadv101.edi' ) )
         | 
| 141 | 
            +
                end
         | 
| 142 | 
            +
             | 
| 143 | 
            +
              end
         | 
| 144 | 
            +
             | 
| 145 | 
            +
              def test_streaming_lightweight_builder
         | 
| 146 | 
            +
                builder = MyLWBuilder.new( false )
         | 
| 147 | 
            +
                assert_nothing_raised{ builder.go File.open('I0002352726') }
         | 
| 148 | 
            +
                ic = builder.interchange
         | 
| 149 | 
            +
                assert_equal( 35679, builder.lin )
         | 
| 150 | 
            +
                assert_equal( 290947, builder.all )
         | 
| 151 | 
            +
                assert_equal( 28, ic.size )
         | 
| 152 | 
            +
              end
         | 
| 153 | 
            +
             | 
| 154 | 
            +
              def test_streaming_builder
         | 
| 155 | 
            +
                builder = MyBuilder.new( false )
         | 
| 156 | 
            +
                assert_nothing_raised{ builder.go File.open('in1.edi') }
         | 
| 157 | 
            +
                ic = builder.interchange
         | 
| 158 | 
            +
                assert_equal( 2, builder.lin )
         | 
| 159 | 
            +
                assert_equal( 35, builder.all )
         | 
| 160 | 
            +
                assert_equal( 1, ic.size )
         | 
| 161 | 
            +
                assert_nothing_raised{ assert(ic.validate) }
         | 
| 162 | 
            +
             | 
| 163 | 
            +
                builder = MyBuilder.new( true )
         | 
| 164 | 
            +
                assert_nothing_raised{ builder.go File.open('groups.edi') }
         | 
| 165 | 
            +
              end
         | 
| 166 | 
            +
             | 
| 167 | 
            +
            end
         | 
    
        data/test/test_tut_examples.rb
    CHANGED
    
    | @@ -3,11 +3,13 @@ | |
| 3 3 |  | 
| 4 4 | 
             
            # Load path magic...
         | 
| 5 5 | 
             
            $:.unshift File.join(File.dirname(__FILE__), '..', 'lib')
         | 
| 6 | 
            +
            $:.unshift File.join(File.dirname(__FILE__), '..', '..', 'tdid', 'lib')
         | 
| 6 7 |  | 
| 7 8 | 
             
            require 'test/unit'
         | 
| 8 9 |  | 
| 9 10 | 
             
            require 'edi4r'
         | 
| 10 11 | 
             
            require 'edi4r/edifact'
         | 
| 12 | 
            +
            require 'edi4r-tdid'
         | 
| 11 13 |  | 
| 12 14 | 
             
            # require "rubygems"
         | 
| 13 15 | 
             
            # require_gem "edi4r"
         | 
| @@ -119,7 +121,7 @@ class Tutorial_Tests < Test::Unit::TestCase | |
| 119 121 | 
             
                last_msg = ic.last
         | 
| 120 122 | 
             
                d = last_msg['DTM']  # Array of all DTM segments, any segment group
         | 
| 121 123 | 
             
                assert( d. is_a?( Array ) )
         | 
| 122 | 
            -
                d =  | 
| 124 | 
            +
                d = last_msg.find_all {|seg| seg.name == 'DTM' && seg.sg_name == 'SG4'}
         | 
| 123 125 | 
             
                assert_equal( 11, d.size )
         | 
| 124 126 |  | 
| 125 127 | 
             
                doc1 = last_msg['DOC'].first
         |