x12-lite 0.3.6 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/x12 +15 -13
- data/lib/x12-lite.rb +59 -61
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 54a8c2fb07d59082d7803d063f97ac9252cbea9359a154233ca32c5890224c6e
|
4
|
+
data.tar.gz: af40d70fcb563fa5e463ebe4f48586357c804d964853ea383e8306e4ce649220
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9d9f4ffd7f32426ec208d88b7a6b84e266b391ffb4e0a31b46a753e923199f6932c1afc2d5469c659e5870020e36ae469d22288952bc178031b0903b38ddf8da
|
7
|
+
data.tar.gz: fa9466f71e763b8c70641a5b5542938b7b527ca4924879e5f4635f1ba0a11aafcf9bf63134ab7628459926340fbc3a031f94357268da4cd98e8608f30e2bf41a
|
data/bin/x12
CHANGED
@@ -26,6 +26,7 @@ OptionParser.new.instance_eval do
|
|
26
26
|
@banner = "usage: #{program_name} [options] <file> <file> ..."
|
27
27
|
|
28
28
|
on "-a", "--after <date>" , "After (date as 'YYYYMMDD' or time as 'YYYYMMDD HHMMSS')"
|
29
|
+
on "--ansi" , "Use ANSI color codes to display values"
|
29
30
|
on "-c", "--count" , "Count messages at the end"
|
30
31
|
on "-d", "--dive" , "Dive into directories recursively"
|
31
32
|
# on "--delim <char>" , "Delimiter to use"
|
@@ -36,10 +37,10 @@ OptionParser.new.instance_eval do
|
|
36
37
|
on "-l", "--lower" , "Show segment names in lowercase"
|
37
38
|
on "-m", "--message" , "Show message body"
|
38
39
|
on "-p", "--path" , "Show path for each message"
|
39
|
-
|
40
|
+
on "-q", "--query <value>" , "Query a specific value"
|
40
41
|
# on "-r", "--repeats" , "Show field repeats on their own line"
|
41
42
|
on "-s", "--spacer" , "Show an empty line between messages"
|
42
|
-
|
43
|
+
on "-t", "--tsv" , "Tab-delimit output (tsv format)"
|
43
44
|
on "-v", "--version" , "Show version" do abort "v#{::X12::VERSION}"; end
|
44
45
|
# on "-w", "--width <width>", "Width of segment names", Integer
|
45
46
|
|
@@ -54,13 +55,14 @@ require "time" if opts["after"]
|
|
54
55
|
time = Time.parse(opts["after"]) if opts["after"]
|
55
56
|
dive = opts["dive"]
|
56
57
|
only = opts["fields-only"] and opts["fields"] = true
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
quer = opts["query"].split(',').map(&:strip) if opts["query"]
|
59
|
+
from = quer.delete("-") if quer.is_a?(Array)
|
60
|
+
seps = opts["tsv"] ? "\t" : (opts["delim"] || "|")
|
61
|
+
seps = {"\\n" => "\n", "\\t" => "\t"}[seps] || seps
|
61
62
|
|
62
63
|
args = []
|
63
64
|
# args << :deep if opts["repeats"]
|
65
|
+
args << :ansi if opts["ansi"]
|
64
66
|
args << :down if opts["lower"]
|
65
67
|
args << :full if opts["message"] || opts.empty?
|
66
68
|
args << :hide if !opts["fields"]
|
@@ -126,13 +128,13 @@ list.each do |file|
|
|
126
128
|
abort "ERROR: malformed X12 file: \"#{file}\" (#{$!})" unless opts["ignore"]
|
127
129
|
next
|
128
130
|
end
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
131
|
+
if quer
|
132
|
+
hits = *x12.find(*quer)
|
133
|
+
hits.unshift file if opts["path"] || from
|
134
|
+
puts hits.join(seps)
|
135
|
+
puts if opts["path"]
|
136
|
+
next
|
137
|
+
end
|
136
138
|
x12.show(*args)
|
137
139
|
msgs += 1
|
138
140
|
rescue => e
|
data/lib/x12-lite.rb
CHANGED
@@ -45,7 +45,7 @@ end
|
|
45
45
|
# ==[ X12 ]=====================================================================
|
46
46
|
|
47
47
|
class X12
|
48
|
-
VERSION="0.
|
48
|
+
VERSION="0.4.1"
|
49
49
|
|
50
50
|
include Enumerable
|
51
51
|
|
@@ -59,6 +59,14 @@ class X12
|
|
59
59
|
! " # & ' ( ) * + , - . / : ; = ?
|
60
60
|
end
|
61
61
|
|
62
|
+
REGEX = /^
|
63
|
+
(..[^-.(]?) # seg: eb
|
64
|
+
(?:\((\d*|[+!?*]?)\))? # num: eb(3)
|
65
|
+
[-.]?(\d+)? # fld: eb(3)-4
|
66
|
+
(?:\((\d*|[+!?*]?)\))? # rep: eb(3)-4(5)
|
67
|
+
[-.]?(\d+)?$ # com: eb(3)-4(5).6
|
68
|
+
/x
|
69
|
+
|
62
70
|
# delimiter pos chr
|
63
71
|
# ---------- --- ---
|
64
72
|
# field 4 (*)
|
@@ -156,9 +164,10 @@ class X12
|
|
156
164
|
full = opts.include?(:full) # show body at top
|
157
165
|
deep = opts.include?(:deep) # dive into repeats
|
158
166
|
down = opts.include?(:down) # show segments in lowercase
|
159
|
-
list = opts.include?(:list) #
|
167
|
+
list = opts.include?(:list) # puts output or return a list
|
160
168
|
hide = opts.include?(:hide) # hide output
|
161
169
|
only = opts.include?(:only) # only show first of each segment type
|
170
|
+
ansi = opts.include?(:ansi) # highlight data using ansi color codes
|
162
171
|
left = opts.grep(Integer).first || 15 # left justify size
|
163
172
|
|
164
173
|
out = full ? [to_s] : []
|
@@ -183,7 +192,7 @@ class X12
|
|
183
192
|
end
|
184
193
|
end
|
185
194
|
tag = "#{seg}%s-#{j}" % [num > 1 && !only ? "(#{num})" : ""]
|
186
|
-
out << (tag.ljust(left) + ansi(fld, "fff", "369"))
|
195
|
+
out << (tag.ljust(left) + (ansi ? ansi(fld, "fff", "369") : fld))
|
187
196
|
end
|
188
197
|
end
|
189
198
|
end
|
@@ -224,8 +233,8 @@ class X12
|
|
224
233
|
val = args[1]
|
225
234
|
|
226
235
|
# Syntax: seg(num)-fld(rep).com
|
227
|
-
pos =~
|
228
|
-
seg = $1
|
236
|
+
pos =~ REGEX or raise "bad selector '#{pos}'"
|
237
|
+
seg = $1; want = /^#{seg}[^#{Regexp.escape(@seg)}\r\n]*/i
|
229
238
|
num = $2 && $2.to_i; new_num = $2 == "+"; ask_num = $2 == "?"; all_num = $2 == "*"
|
230
239
|
rep = $4 && $4.to_i; new_rep = $4 == "+"; ask_rep = $4 == "?"; all_rep = $4 == "*"
|
231
240
|
fld = $3 && $3.to_i; len > 1 && fld == 0 and raise "zero index on field"
|
@@ -389,6 +398,51 @@ class X12
|
|
389
398
|
end
|
390
399
|
end
|
391
400
|
|
401
|
+
def find(*ask)
|
402
|
+
return if ask.empty?
|
403
|
+
|
404
|
+
str = to_s
|
405
|
+
say = []
|
406
|
+
|
407
|
+
ask.each do |pos|
|
408
|
+
say.push(nil) && next if pos.nil?
|
409
|
+
pos =~ REGEX or raise "bad selector '#{pos}'"
|
410
|
+
seg = $1; want = /^#{seg}[^#{Regexp.escape(@seg)}\r\n]*/i
|
411
|
+
num = $2 && $2.to_i; new_num = $2 == "+"; ask_num = $2 == "?"; all_num = $2 == "*"
|
412
|
+
rep = $4 && $4.to_i; new_rep = $4 == "+"; ask_rep = $4 == "?"; all_rep = $4 == "*"
|
413
|
+
fld = $3 && $3.to_i
|
414
|
+
com = $5 && $5.to_i
|
415
|
+
|
416
|
+
if all_num
|
417
|
+
raise "multi query allows only one selector" if ask.size > 1
|
418
|
+
return str.scan(want).inject([]) do |ary, out|
|
419
|
+
out = loop do
|
420
|
+
out = out.split(@fld)[fld ] or break if fld
|
421
|
+
break out.split(@rep).size if ask_rep
|
422
|
+
out = out.split(@rep)[rep - 1] or break if rep || (com && (rep ||= 1))
|
423
|
+
out = out.split(@com)[com - 1] or break if com
|
424
|
+
break out
|
425
|
+
end
|
426
|
+
ary << out if out
|
427
|
+
ary
|
428
|
+
end
|
429
|
+
end
|
430
|
+
|
431
|
+
say << loop do
|
432
|
+
out = ""
|
433
|
+
break str.scan( want).size if ask_num && !ask_rep
|
434
|
+
out = str.scan( want)[num - 1] or break "" if num ||= 1
|
435
|
+
out = out.split(@fld)[fld ] or break "" if fld
|
436
|
+
break out.split(@rep).size if ask_rep
|
437
|
+
out = out.split(@rep)[rep - 1] or break "" if rep || (com && (rep ||= 1))
|
438
|
+
out = out.split(@com)[com - 1] or break "" if com
|
439
|
+
break out
|
440
|
+
end
|
441
|
+
end
|
442
|
+
|
443
|
+
say.size > 1 ? say : say.first
|
444
|
+
end
|
445
|
+
|
392
446
|
# def now(fmt="%Y%m%d%H%M%S")
|
393
447
|
# Time.now.strftime(fmt)
|
394
448
|
# end
|
@@ -544,62 +598,6 @@ class X12
|
|
544
598
|
# end
|
545
599
|
# end
|
546
600
|
# end
|
547
|
-
#
|
548
|
-
# def find(*ask)
|
549
|
-
# return if ask.empty?
|
550
|
-
#
|
551
|
-
# str = to_s
|
552
|
-
# say = []
|
553
|
-
#
|
554
|
-
# seg = nil
|
555
|
-
#
|
556
|
-
# ask.each do |pos|
|
557
|
-
# say.push(nil) && next if pos.nil?
|
558
|
-
# pos = pos.to_s unless pos.is_a?(String)
|
559
|
-
# pos =~ /^([A-Z]..)?(?:\((\d*|\?|\*)\))?[-.]?(\d+)?(?:\((\d*|\?|\*)\))?[-.]?(\d+)?[-.]?(\d+)?$/i or raise "bad query #{pos.inspect}"
|
560
|
-
# seg = $1 if $1; want = /^#{seg}.*/i
|
561
|
-
# num = $2 && $2.to_i; ask_num = $2 == "?"; all_num = $2 == "*"
|
562
|
-
# rep = $4 && $4.to_i; ask_rep = $4 == "?"; all_rep = $4 == "*"
|
563
|
-
# fld = $3 && $3.to_i
|
564
|
-
# com = $5 && $5.to_i
|
565
|
-
# sub = $6 && $6.to_i
|
566
|
-
#
|
567
|
-
# # p [seg, num, rep, fld, com, sub]
|
568
|
-
#
|
569
|
-
# msh = seg =~ /^MSH$/i # is this an MSH segment?
|
570
|
-
# fld -= 1 if msh && fld # MSH fields are offset by one
|
571
|
-
#
|
572
|
-
# if all_num
|
573
|
-
# raise "multi query allows only one selector" if ask.size > 1
|
574
|
-
# return str.scan(want).inject([]) do |ary, out|
|
575
|
-
# out = loop do
|
576
|
-
# out = out.split(@fld)[fld ] or break if fld
|
577
|
-
# break out.split(@rep).size if ask_rep
|
578
|
-
# out = out.split(@rep)[rep - 1] or break if rep || (com && (rep ||= 1)) # default to first
|
579
|
-
# out = out.split(@com)[com - 1] or break if com
|
580
|
-
# out = out.split(@sub)[sub - 1] or break if sub
|
581
|
-
# break out
|
582
|
-
# end
|
583
|
-
# ary << out if out
|
584
|
-
# ary
|
585
|
-
# end
|
586
|
-
# end
|
587
|
-
#
|
588
|
-
# say << loop do
|
589
|
-
# out = ""
|
590
|
-
# break str.scan( want).size if ask_num && !ask_rep
|
591
|
-
# out = str.scan( want)[num - 1] or break "" if num ||= 1 # default to first
|
592
|
-
# out = out.split(@fld)[fld ] or break "" if fld
|
593
|
-
# break out.split(@rep).size if ask_rep
|
594
|
-
# out = out.split(@rep)[rep - 1] or break "" if rep || (com && (rep ||= 1)) # default to first
|
595
|
-
# out = out.split(@com)[com - 1] or break "" if com
|
596
|
-
# out = out.split(@sub)[sub - 1] or break "" if sub
|
597
|
-
# break out
|
598
|
-
# end
|
599
|
-
# end
|
600
|
-
#
|
601
|
-
# say.size > 1 ? say : say.first
|
602
|
-
# end
|
603
601
|
end
|
604
602
|
|
605
603
|
__END__
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: x12-lite
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steve Shreeve
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-10-
|
11
|
+
date: 2024-10-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Ruby gem to parse and generate X.12 transactions
|
14
14
|
email: steve.shreeve@gmail.com
|