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/lib/edi4r/standards.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding: iso-8859-1 -*-
|
1
2
|
# Classes providing access to directories of EDI standards like
|
2
3
|
# the UN Trade Data Interchange Directories (UNTDID) and Subsets,
|
3
4
|
# or ISO7389, or SAP IDoc definitions.
|
@@ -7,9 +8,15 @@
|
|
7
8
|
#
|
8
9
|
# :include: ../../AuthorCopyright
|
9
10
|
#
|
10
|
-
# $Id: standards.rb,v 1.
|
11
|
+
# $Id: standards.rb,v 1.11 2007/08/21 17:11:13 werntges Exp werntges $
|
11
12
|
#--
|
12
13
|
# $Log: standards.rb,v $
|
14
|
+
# Revision 1.11 2007/08/21 17:11:13 werntges
|
15
|
+
# Now with some SEDAS support; moving on to support ANSI X12
|
16
|
+
#
|
17
|
+
# Revision 1.10 2007/03/19 08:52:44 werntges
|
18
|
+
# Intermediate check-in: Basic subset support added, now going to add SEDAS
|
19
|
+
#
|
13
20
|
# Revision 1.9 2006/08/01 11:00:35 werntges
|
14
21
|
# EDI_NDB_PATH: Now platform independent
|
15
22
|
#
|
@@ -48,11 +55,11 @@
|
|
48
55
|
module EDI
|
49
56
|
module Dir
|
50
57
|
|
51
|
-
DE_Properties = Struct.new( :name, :format, :status, :dummy, :description)
|
58
|
+
DE_Properties = Struct.new( :name, :format, :status, :dummy, :description )
|
52
59
|
|
53
60
|
# Common structure of B)ranch (of a msg), C)DE, D)E, S)egment
|
54
61
|
#
|
55
|
-
BCDS_entry = Struct.new( :item_no, :name, :status, :maxrep)
|
62
|
+
BCDS_entry = Struct.new( :item_no, :name, :status, :maxrep )
|
56
63
|
|
57
64
|
# Named_list:
|
58
65
|
#
|
@@ -99,7 +106,7 @@ module EDI
|
|
99
106
|
# As long as we employ plain CSV files to store directories, a Directory
|
100
107
|
# can become quite memory-consuming.
|
101
108
|
# Therefore Directorys are cached after creation, so that they
|
102
|
-
# need to be created and maintained only once when there
|
109
|
+
# need to be created and maintained only once when there are several
|
103
110
|
# messages of the same type in an interchange.
|
104
111
|
#
|
105
112
|
# Turns off this caching mechanism, saving memory but costing time.
|
@@ -132,14 +139,17 @@ module EDI
|
|
132
139
|
# existing directory when already in cache.
|
133
140
|
#
|
134
141
|
# std:: The syntax standard key. Currently supported:
|
142
|
+
# - 'A' (ANSI X12),
|
135
143
|
# - 'E' (EDIFACT),
|
136
144
|
# - 'I' (SAP IDOC)
|
145
|
+
# - 'S' (SEDAS)
|
137
146
|
# params:: A hash of parameters that uniquely identify the selected dir.
|
138
147
|
# Hash parameters use following alternative key sets:
|
139
148
|
#
|
140
149
|
# ISO9735:: :d0002, :d0076 (default: "", nil)
|
141
150
|
# UN/TDID:: :d0065, :d0052, :d0054, :d0051, :d0057; :is_iedi
|
142
151
|
# SAP IDOC:: :IDOCTYPE, :SAPTYPE, :EXTENSION (see EDI_DC fields)
|
152
|
+
# SEDAS:: (none so far)
|
143
153
|
#
|
144
154
|
# UN/TDID: Elements of S009 or S320 are used:
|
145
155
|
# d0065:: Message type like "INVOIC"
|
@@ -151,15 +161,20 @@ module EDI
|
|
151
161
|
# Interactive EDI (only limited supported so far):
|
152
162
|
# is_iedi:: Flag, +true+ or +false+. Assumed +false+ if missing.
|
153
163
|
#
|
154
|
-
def Directory.create( std, params )
|
164
|
+
def Directory.create( std, params={} )
|
155
165
|
|
156
166
|
case std
|
167
|
+
when 'A' # ANSI X12
|
168
|
+
# par = { :ISA12 => '00401', :is_iedi => false }.update( params )
|
169
|
+
par = { }.update( params )
|
157
170
|
when 'E' # UN/EDIFACT
|
158
|
-
par = {:d0051 => '',
|
171
|
+
par = {:d0051 => '',
|
159
172
|
:d0057 => '',
|
160
173
|
:is_iedi => false }.update( params )
|
161
174
|
when 'I' # SAP IDocs
|
162
175
|
par = { }.update( params )
|
176
|
+
when 'S' # SEDAS
|
177
|
+
par = { }.update( params )
|
163
178
|
else
|
164
179
|
raise "Unsupported syntax standard: #{std}"
|
165
180
|
end
|
@@ -170,9 +185,11 @@ module EDI
|
|
170
185
|
#
|
171
186
|
key = par.sort {|a,b| a.to_s <=> b.to_s}.hash
|
172
187
|
obj = @@cache[key]
|
188
|
+
# warn "Looking up #{par.inspect} with key=#{key}"
|
173
189
|
return obj unless obj.nil?
|
174
190
|
|
175
191
|
obj = new( std, par )
|
192
|
+
# warn "Caching for #{par.inspect} with key=#{key}"
|
176
193
|
@@cache[key] = obj # cache & return it
|
177
194
|
|
178
195
|
else
|
@@ -213,7 +230,7 @@ module EDI
|
|
213
230
|
end
|
214
231
|
|
215
232
|
when 'E' # UN/EDIFACT
|
216
|
-
prefix = '/edifact'
|
233
|
+
prefix, subset_prefix = '/edifact', nil
|
217
234
|
if par[:d0002] # ISO9735 requested?
|
218
235
|
case par[:d0002]
|
219
236
|
when 1
|
@@ -232,16 +249,67 @@ module EDI
|
|
232
249
|
prefix += '/iso9735/SD'
|
233
250
|
ext += '.csv'
|
234
251
|
|
252
|
+
# Service messages? (AUTACK, CONTRL, KEYMAN): 2/2, D/3, 4/1 ok
|
253
|
+
elsif %w/2 D 4/.include?(par[:d0052]) && %w/2 3 1/.include?(par[:d0054])
|
254
|
+
if par[:d0052] == '2' && par[:d0054] == '2'
|
255
|
+
ext = '20000'
|
256
|
+
elsif par[:d0052] == 'D' && par[:d0054] == '3'
|
257
|
+
ext = '30000'
|
258
|
+
elsif par[:d0052] == '4' && par[:d0054] == '1'
|
259
|
+
ext = (par[:d0076] == nil) ? '40000' : '40100'
|
260
|
+
else
|
261
|
+
raise "Invalid syntax version: #{par[:d0002]}"
|
262
|
+
end
|
263
|
+
prefix += '/iso9735/SD'
|
264
|
+
ext += '.csv'
|
265
|
+
|
235
266
|
else # UN/TDID requested?
|
236
267
|
prefix += par[:is_iedi] ? '/untdid/ID' : '/untdid/ED'
|
237
|
-
ext = (par[:d0052]+par[:d0054]).downcase + '.csv'
|
268
|
+
ext = (par[:d0052].to_s+par[:d0054].to_s).downcase + '.csv'
|
269
|
+
case par[:d0057]
|
270
|
+
when /EAN\d\d\d/, /EDIT\d\d/
|
271
|
+
subset_prefix = '/edifact/eancom/ED'
|
272
|
+
when '', nil
|
273
|
+
else
|
274
|
+
# raise "Subset not supported: #{par[:d0057]}"
|
275
|
+
EDI::logger.warn "Subset not supported: #{par[:d0057]}"
|
276
|
+
end
|
277
|
+
end
|
278
|
+
when 'S' # SEDAS
|
279
|
+
prefix, subset_prefix, ext = '/sedas/ED', nil, '.csv'
|
280
|
+
|
281
|
+
when 'A' # ANSI X12
|
282
|
+
prefix, subset_prefix = '/ansi', nil
|
283
|
+
if par[:ISA12] # control segments requested?
|
284
|
+
msg = "Syntax version not supported: #{par[:ISA12]}"
|
285
|
+
case par[:ISA12]
|
286
|
+
when /00[1-5]0\d/ # , '00401', '00501' etc.
|
287
|
+
EDI::logger.warn msg if par[:ISA12] !~ /^00[45]01$/
|
288
|
+
ext = par[:ISA12]
|
289
|
+
else
|
290
|
+
raise msg
|
291
|
+
end
|
292
|
+
prefix += '/x12/SD'
|
293
|
+
ext += '.csv'
|
294
|
+
|
295
|
+
else # Standards directory requested?
|
296
|
+
prefix += '/dir/ED'
|
297
|
+
ext = par[:GS08][0,6] + '.csv' # Subset not supported
|
298
|
+
case par[:GS08][6..-1]
|
299
|
+
when 'X098', 'X098A1', 'X096A1', 'X093', 'X092', 'X091A1', 'X222A1', 'X223A2', /^X2\d\d(A[12])?/
|
300
|
+
# Conceivable support of a major subset (like HIPAA)
|
301
|
+
# subset_prefix = '/ansi/hipaa/ED'
|
302
|
+
when '', nil
|
303
|
+
else
|
304
|
+
raise "Subset not supported: <<#{par[:GS08][6..-1]}>>"
|
305
|
+
end
|
238
306
|
end
|
239
307
|
|
240
308
|
else
|
241
309
|
raise "Unsupported syntax standard: #{std}"
|
242
310
|
end
|
243
311
|
|
244
|
-
return prefix, ext
|
312
|
+
return prefix, subset_prefix, ext
|
245
313
|
end
|
246
314
|
|
247
315
|
|
@@ -251,14 +319,30 @@ module EDI
|
|
251
319
|
# Will be generalized to a lookup scheme!
|
252
320
|
#
|
253
321
|
def Directory.path_finder( prefix, ext, selector )
|
254
|
-
|
255
|
-
|
322
|
+
#
|
323
|
+
# Subset requested:
|
324
|
+
# Try subset first, warn & fall back on standard before giving up
|
325
|
+
#
|
326
|
+
if prefix.is_a? Array
|
327
|
+
raise "Only subset and regular prefix expected" if prefix.size != 2
|
328
|
+
begin
|
329
|
+
Directory.path_finder( prefix[0], ext, selector )
|
330
|
+
rescue EDILookupError
|
331
|
+
# warn "Subset data not found - falling back on standard"
|
332
|
+
# $stderr.puts prefix.inspect, ext.inspect, selector.inspect
|
333
|
+
Directory.path_finder( prefix[1], ext, selector )
|
334
|
+
end
|
335
|
+
else
|
336
|
+
filename = prefix + selector + '.' + ext
|
337
|
+
searchpath = ENV['EDI_NDB_PATH']
|
256
338
|
|
257
|
-
|
258
|
-
|
259
|
-
|
339
|
+
searchpath.split(/#{File::PATH_SEPARATOR}/).each do |datadir|
|
340
|
+
path = datadir + filename
|
341
|
+
# warn "Looking for #{path}"
|
342
|
+
return path if File.readable? path
|
343
|
+
end
|
344
|
+
raise EDILookupError, "No readable file '." + filename + "' found below any dir on '" + searchpath + "'"
|
260
345
|
end
|
261
|
-
raise "No readable file '." + filename + "' found below any dir on '" + searchpath + "'"
|
262
346
|
end
|
263
347
|
|
264
348
|
#
|
@@ -266,17 +350,19 @@ module EDI
|
|
266
350
|
#
|
267
351
|
def initialize ( std, par ) # :nodoc:
|
268
352
|
|
269
|
-
prefix, ext = Directory.prefix_ext_finder( std, par )
|
353
|
+
prefix, subset_prefix, ext = Directory.prefix_ext_finder( std, par )
|
270
354
|
|
271
355
|
# Build DE directory
|
272
356
|
|
273
357
|
prefix_ed = prefix.sub(/ID$/, 'ED') # There is no IDED.*.csv!
|
274
|
-
|
358
|
+
_prefix = subset_prefix.nil? ? prefix_ed : [subset_prefix, prefix_ed]
|
359
|
+
|
360
|
+
csvFileName = Directory.path_finder(_prefix, ext, 'ED' )
|
275
361
|
@de_dir = Hash.new
|
276
362
|
IO.foreach(csvFileName) do |line|
|
277
363
|
d = DE_Properties.new
|
278
364
|
d.name, d.format, d.dummy, d.description = line.strip.split(/;/)
|
279
|
-
|
365
|
+
EDI::logger.warn "ERR DE line: "+line if d.description.nil?
|
280
366
|
@de_dir[d.name] = d
|
281
367
|
end
|
282
368
|
|
@@ -287,9 +373,9 @@ module EDI
|
|
287
373
|
IO.foreach(csvFileName) do |line|
|
288
374
|
c = Named_list.new
|
289
375
|
c.name, c.desc, list = line.split(/;/, 3)
|
290
|
-
|
376
|
+
EDI::logger.warn "ERR CDE line: "+line if list.nil?
|
291
377
|
list.sub(/;\s*$/,'').split(/;/).each_slice(4) do |item, code, status, fmt|
|
292
|
-
|
378
|
+
EDI::logger.warn "ERR CDE list: "+line if fmt.nil?
|
293
379
|
c << BCDS_entry.new( item, code, status, 1 )
|
294
380
|
end
|
295
381
|
@cde_dir[c.name] = c
|
@@ -297,36 +383,44 @@ module EDI
|
|
297
383
|
|
298
384
|
# Build Segment directory
|
299
385
|
|
300
|
-
|
386
|
+
_prefix = subset_prefix.nil? ? prefix : [subset_prefix, prefix]
|
387
|
+
csvFileName = Directory.path_finder( _prefix, ext, 'SD' )
|
301
388
|
@seg_dir = Hash.new
|
302
389
|
IO.foreach(csvFileName) do |line|
|
303
390
|
c = Named_list.new
|
304
391
|
c.name, c.desc, list = line.split(/;/, 3)
|
305
|
-
|
392
|
+
EDI::logger.warn "ERR SEG line: "+line if list.nil?
|
306
393
|
list.sub(/;\s*$/,'').split(/;/).each_slice(4) do |item, code, status, maxrep|
|
307
|
-
|
308
|
-
|
394
|
+
EDI::logger.warn "ERR SEG list: "+line if maxrep.nil?
|
395
|
+
maxrep = maxrep=='>1' ? 1 << 30 : maxrep.to_i # Use 2**30 instead of Infinity
|
396
|
+
c << BCDS_entry.new( item, code, status, maxrep )
|
309
397
|
end
|
310
398
|
@seg_dir[c.name] = c
|
311
399
|
end
|
312
400
|
|
313
401
|
# Build Message directory
|
314
|
-
|
315
|
-
|
402
|
+
|
403
|
+
_prefix = subset_prefix.nil? ? prefix : [subset_prefix, prefix]
|
404
|
+
csvFileName = Directory.path_finder( _prefix, ext,'MD' )
|
316
405
|
@msg_dir = Hash.new
|
317
406
|
re = if par[:d0065] and par[:d0065] =~ /([A-Z]{6})/
|
318
|
-
then Regexp.new($1) else nil end
|
407
|
+
then Regexp.new($1) else nil end # UN/EDIFACT
|
408
|
+
re = if par[:ST01] and par[:ST01] =~ /(\d{3})/
|
409
|
+
then Regexp.new('^'+$1) else nil end unless re # ANSI - Try again
|
410
|
+
|
319
411
|
IO.foreach(csvFileName) do |line|
|
320
412
|
next if re and line !~ re # Only lines matching message type if given
|
321
413
|
c = Named_list.new
|
322
414
|
c.name, c.desc, list = line.split(/;/, 3)
|
323
|
-
|
415
|
+
EDI::logger.warn "ERR MSG line: "+line if list.nil?
|
324
416
|
list.sub(/;\s*$/,'').split(/;/).each_slice(3) do |code, status, maxrep|
|
325
|
-
|
326
|
-
|
417
|
+
EDI::logger.warn "ERR MSG list: "+line if maxrep.nil?
|
418
|
+
maxrep = maxrep=='>1' ? 1 << 30 : maxrep.to_i # Use 2**30 instead of Infinity
|
419
|
+
c << BCDS_entry.new( "0000", code, status, maxrep )
|
327
420
|
end
|
328
421
|
@msg_dir[c.name] = c
|
329
422
|
end
|
423
|
+
|
330
424
|
end # initialize
|
331
425
|
|
332
426
|
|
@@ -382,8 +476,16 @@ module EDI
|
|
382
476
|
# Returns CSV line of top branch for message called +name+.
|
383
477
|
#
|
384
478
|
def message( name ) # Actually, only one branch!
|
385
|
-
#
|
386
|
-
@msg_dir[name]
|
479
|
+
# p name
|
480
|
+
# p @msg_dir# [name]
|
481
|
+
rc = @msg_dir[name]
|
482
|
+
return rc unless rc.nil?
|
483
|
+
# Try without subset if nil:
|
484
|
+
# ex.: CONTRL:D:3:UN:1.3c:SG1, CONTRL:D:3:UN::
|
485
|
+
return nil unless name =~ /(.*:)([^:]{1,6})(:[^:]*)/
|
486
|
+
EDI::logger.warn "Subset not supported: #$2 - falling back on standard}" if $3==':' # warn only at top branch
|
487
|
+
# $stderr.puts "Using fallback name: #{$1+$3}"
|
488
|
+
@msg_dir[$1+$3]
|
387
489
|
end
|
388
490
|
|
389
491
|
# Returns a sorted list of names of available messages
|
@@ -407,7 +509,7 @@ module EDI
|
|
407
509
|
case id
|
408
510
|
when /^[CES]\d{3}$/ # C)omposite
|
409
511
|
list = cde(id)
|
410
|
-
|
512
|
+
|
411
513
|
when /^\d{4}$/ # Simple D)E
|
412
514
|
list = de(id)
|
413
515
|
|
@@ -481,6 +583,21 @@ if __FILE__ == $0
|
|
481
583
|
|
482
584
|
puts d.message_names; gets
|
483
585
|
|
586
|
+
# SEDAS tests
|
587
|
+
|
588
|
+
s = EDI::Dir::Directory.create('S')#,
|
589
|
+
# :d0052 =>'D',
|
590
|
+
# :d0054 =>'96A')
|
591
|
+
|
592
|
+
puts s.message_names; gets
|
593
|
+
|
594
|
+
# ANSI X12 tests
|
595
|
+
|
596
|
+
s = EDI::Dir::Directory.create('A', :ISA12 =>'00401' )
|
597
|
+
puts s.message_names; gets
|
598
|
+
s = EDI::Dir::Directory.create('A', :GS08 =>'004010X098' )
|
599
|
+
puts s.message_names; gets
|
600
|
+
|
484
601
|
# SAP IDOC tests (should fail now!)
|
485
602
|
|
486
603
|
s = EDI::Dir::Directory.create('I',
|
@@ -0,0 +1 @@
|
|
1
|
+
UNA:+.? 'UNB+UNOC:3+2965197100002:14+2165197000009:14+060501:1611+1146492687.229+++++EANCOM+1'UNH+1+ORDERS:D:01B:UN:EAN010'BGM+220+12345+9'DTM+137:20040712:102'DTM+2:200404141245200404141420:719'RFF+PD:4712'NAD+SU+2165197000009::9'RFF+YC1:23456'RFF+VA:DE1234512345'NAD+BY+2965197100002::9'RFF+VA:DE1234512345'CTA+PD+1144'NAD+IV+2965197400003::9'RFF+VA:DE1234512346'CTA+OC+223'NAD+DP+2965197200009::9'CTA+DL+6677'NAD+UC+2965197300006::9'CTA+GR+9876'CUX+2:EUR:9'LIN+1++2165197000016:SRV'PIA+1+JEBL5023:SA::91+BLJE50:IN::92'IMD+A++:::Jeans?+mehr'IMD+F+35+:::Blau'IMD+F+98+:::50'QTY+21:10'PRI+AAA:30.0::LIU'PRI+AAE:99,0::SRP:1'LIN+2++2165197000023:SRV'PIA+1+JEBL5223:SA::91+BLJE52:IN::92'IMD+A++:::Jeans'IMD+F+35+:::Blau'IMD+F+98+:::52'QTY+21:10'PRi+AAA:40::LIU'PRI+AAE:120::SRP:1'UNS+S'UNT+37+1'UNZ+1+1146492687.229'
|
data/test/eancom2webedi.rb
CHANGED
data/test/groups.edi
CHANGED
@@ -1 +1 @@
|
|
1
|
-
UNA:+.? 'UNB+UNOB:3+sender+recipient+
|
1
|
+
UNA:+.? 'UNB+UNOB:3+sender+recipient+150331:1913+1'UNG+ORDERS+sender-g+recipient-g+150331:1913+1+UN+D:96A'UNE+0+1'UNG+ORDERS+sender+recipient+150331:1913+5+UN+D:96A'UNH+1+ORDERS:D:96A:UN'BGM++220'DTM+137:20060703:102'UNS+S'UNT+5+1'UNE+1+5'UNG+INVOIC+sender+recipient+150331:1913+3+UN+D:01B:EAN010'UNH+1+INVOIC:D:01B:UN:EAN010'BGM+380'DTM+137:20150331191342:204'UNS+S'MOA+86:0'UNT+6+1'UNE+1+3'UNZ+3+1'
|
data/test/test_basics.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
|
# Load path magic...
|
@@ -21,7 +22,8 @@ class EDIFACT_Tests < Test::Unit::TestCase
|
|
21
22
|
seg = msg.new_segment('DTM')
|
22
23
|
msg.add seg
|
23
24
|
seg.cC507.d2005 = '137'
|
24
|
-
t = Time.edifact('20060703', 102)
|
25
|
+
t = EDI::Time.edifact('20060703', 102)
|
26
|
+
assert_equal('20060703', t.to_s)
|
25
27
|
seg.cC507.d2380 = t
|
26
28
|
seg.cC507.d2379 = t.format
|
27
29
|
|
@@ -41,7 +43,7 @@ class EDIFACT_Tests < Test::Unit::TestCase
|
|
41
43
|
seg = msg.new_segment('DTM')
|
42
44
|
msg.add seg
|
43
45
|
seg.cC507.d2005 = '137'
|
44
|
-
t = Time.new
|
46
|
+
t = EDI::Time.new
|
45
47
|
t.format = 204
|
46
48
|
seg.cC507.d2380 = t
|
47
49
|
seg.cC507.d2379 = t.format
|
@@ -191,19 +193,24 @@ class EDIFACT_Tests < Test::Unit::TestCase
|
|
191
193
|
assert_equal( 'PRI+AAA-\\-30.1--LIU', pri.to_s)
|
192
194
|
end
|
193
195
|
|
194
|
-
begin
|
195
196
|
def test_interchange_parsing
|
197
|
+
mode = RUBY_VERSION >= '1.9' ? 'rb:iso-8859-15' : 'rb'
|
196
198
|
assert_nothing_raised {
|
197
|
-
ic = EDI::E::Interchange.parse( File.open( './
|
199
|
+
# ic = EDI::E::Interchange.parse( File.open( './marius1.edi','r' ), true )
|
200
|
+
file = File.open './O0002248720', mode
|
201
|
+
ic = EDI::E::Interchange.parse file, false
|
202
|
+
file.close
|
198
203
|
ic.output_mode = :indented
|
199
204
|
File.open("invoic.out", "w") {|hnd| hnd.print ic}
|
200
205
|
}
|
201
|
-
assert_nothing_raised {
|
202
|
-
|
203
|
-
ic
|
206
|
+
# assert_nothing_raised {
|
207
|
+
file = File.open './remadv101.edi', mode
|
208
|
+
ic = EDI::E::Interchange.parse file
|
209
|
+
# ic.output_mode = :indented
|
210
|
+
file.close
|
204
211
|
File.open("remadv.out", "w") {|hnd| hnd.print ic}
|
205
212
|
# $stdout.write ic
|
206
|
-
|
213
|
+
ic.validate
|
214
|
+
# }
|
207
215
|
end
|
208
|
-
end
|
209
216
|
end
|
data/test/test_edi_split.rb
CHANGED
@@ -19,6 +19,7 @@ include EDI::E
|
|
19
19
|
|
20
20
|
class TestClass < Test::Unit::TestCase
|
21
21
|
|
22
|
+
=begin
|
22
23
|
def test_cde_sep
|
23
24
|
assert_equal(['a','b'], edi_split('a:b', ?:, ??) )
|
24
25
|
assert_equal(['a:b'], edi_split('a?:b', ?:, ??) )
|
@@ -45,6 +46,35 @@ class TestClass < Test::Unit::TestCase
|
|
45
46
|
assert_equal( ['TAG','SOME TEXT?', 'MORE TEXT', 'PENDING ESC ?'], edi_split('TAG+SOME TEXT??+MORE TEXT+PENDING ESC ??', ?+, ??) )
|
46
47
|
assert_raise(EDISyntaxError){edi_split('TAG+SOME TEXT??+MORE TEXT+PENDING ESC! ???', ?+, ??)}
|
47
48
|
end
|
49
|
+
=end
|
50
|
+
# New concept: Leave the unescaping to the last step (at DE level)
|
51
|
+
# to avoid accidental multiple unescaping
|
52
|
+
def test_cde_sep
|
53
|
+
assert_equal(['a','b'], edi_split('a:b', ?:, ??) )
|
54
|
+
assert_equal(['a?:b'], edi_split('a?:b', ?:, ??) )
|
55
|
+
assert_equal(['a??','b'],edi_split('a??:b', ?:, ??) )
|
56
|
+
assert_equal(['a???:b'], edi_split('a???:b', ?:, ??) )
|
57
|
+
assert_raise( EDISyntaxError) { edi_split('a:b?', ?:, ??)}
|
58
|
+
|
59
|
+
assert_equal(['a','', 'b'], edi_split('a::b', ?:, ??) )
|
60
|
+
assert_equal(['a','', '', 'b'], edi_split('a:::b', ?:, ??) )
|
61
|
+
assert_equal(['a','b'], edi_split('a:b:', ?:, ??) )
|
62
|
+
assert_equal(['a','', 'b'], edi_split('a::b::', ?:, ??) )
|
63
|
+
|
64
|
+
assert_equal(['','a','b'], edi_split(':a:b', ?:, ??) )
|
65
|
+
assert_equal(['','','', 'a','', 'b'], edi_split(':::a::b::', ?:, ??) )
|
66
|
+
|
67
|
+
assert_equal( ['123456780', 'A + B LTD' ], edi_split('123456780:A + B LTD', ?:, ??) )
|
68
|
+
assert_equal( ['', '', '', '10010099', '25', '131' ], edi_split(':::10010099:25:131', ?:, ??) )
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_de_sep
|
72
|
+
assert_equal( ['IMD', 'A','', ':::JEANS'], edi_split('IMD+A++:::JEANS', ?+, ??))
|
73
|
+
assert_equal( ['FII', 'OR','123456780:A ?+ B LTD', ':::10010099:25:131' ], edi_split('FII+OR+123456780:A ?+ B LTD+:::10010099:25:131', ?+, ??) )
|
74
|
+
assert_raise(EDISyntaxError){edi_split('TAG+SOME TEXT??+MORE TEXT+PENDING ESC! ?', ?+, ??)}
|
75
|
+
assert_equal( ['TAG','SOME TEXT??', 'MORE TEXT', 'PENDING ESC ??'], edi_split('TAG+SOME TEXT??+MORE TEXT+PENDING ESC ??', ?+, ??) )
|
76
|
+
assert_raise(EDISyntaxError){edi_split('TAG+SOME TEXT??+MORE TEXT+PENDING ESC! ???', ?+, ??)}
|
77
|
+
end
|
48
78
|
|
49
79
|
def test_seg_term
|
50
80
|
assert_equal( ['RFF+ACK:12345/678', 'FII+BF+000000000:::EUR+:::10010099:25:131', 'SEQ++1', 'FII+OR+123456780:A ?+ B LTD+:::10010099:25:131', 'RFF+RA:YOUR ACCOUNT 1234-5678 9'], edi_split('RFF+ACK:12345/678\'FII+BF+000000000:::EUR+:::10010099:25:131\'SEQ++1\'FII+OR+123456780:A ?+ B LTD+:::10010099:25:131\'RFF+RA:YOUR ACCOUNT 1234-5678 9\'', ?', ??))
|