tcd_x12 1.6.2 → 1.6.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +28 -0
- data/CHANGELOG.md +3 -0
- data/README.md +9 -2
- data/Rakefile +10 -1
- data/lib/x12/base.rb +14 -5
- data/lib/x12/parser.rb +4 -1
- data/lib/x12/segment.rb +7 -2
- data/lib/x12/table.rb +2 -0
- data/lib/x12/version.rb +1 -1
- data/lib/x12/xmldefinitions.rb +4 -4
- data/misc/850.xml +1 -2
- data/misc/855.xml +47 -0
- data/x12.gemspec +9 -2
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f7b6f52dcf0d6a34ee6992f9d310e8e9e6376ebe8e834d033467994b815d709d
|
4
|
+
data.tar.gz: c8cdc729f70ec8b5dd9014a37b09f8b80f25060f9c5fbde20cd2feb1cd7f3ec4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b961effa4a173323f3871df5a77f5c41a9174a658d30b2effbe5b2b97d7e43e7ec7bd8ef811c20762909cfd0b355ec213a0b19613d4d74baaaaac715a45ecccd
|
7
|
+
data.tar.gz: e249eb024b282bff8fd8c82ca18524decb81d3064fcad02ba439abe95b27da15900123b3b6e9523396d9062a6dcaa6b2b77f95e3337ea43dad4f7beaa8cd3521
|
data/.rubocop.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
AllCops:
|
2
|
+
TargetRubyVersion: 2.6.0
|
3
|
+
|
4
|
+
Style/Documentation:
|
5
|
+
Enabled: true
|
6
|
+
Exclude:
|
7
|
+
- 'test/**/*.rb'
|
8
|
+
|
9
|
+
Style/DocumentationMethod:
|
10
|
+
Enabled: true
|
11
|
+
Exclude:
|
12
|
+
- 'test/**/*.rb'
|
13
|
+
|
14
|
+
# Don't leave calls to pry lying around.
|
15
|
+
Lint/Debugger:
|
16
|
+
Enabled: true
|
17
|
+
|
18
|
+
Metrics/LineLength:
|
19
|
+
Max: 150
|
20
|
+
|
21
|
+
Style/StringLiterals:
|
22
|
+
EnforcedStyle: single_quotes
|
23
|
+
|
24
|
+
Style/FormatString:
|
25
|
+
EnforcedStyle: sprintf
|
26
|
+
|
27
|
+
Style/CommentedKeyword:
|
28
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -1,8 +1,15 @@
|
|
1
1
|
# X12
|
2
2
|
|
3
|
+
[![Gem](https://img.shields.io/gem/v/tcd_x12)][gem]
|
3
4
|
![Ruby Version](https://img.shields.io/badge/Ruby->=1.9.1-red.svg)
|
4
|
-
[![
|
5
|
-
![
|
5
|
+
[![Inline docs](http://inch-ci.org/github/tcd/x12.svg?branch=master)][inch-ci]
|
6
|
+
[![License](https://img.shields.io/github/license/tcd/x12)][license]
|
7
|
+
[![Documentation](http://img.shields.io/badge/docs-rubydoc.info-blue.svg)][docs]
|
8
|
+
|
9
|
+
[gem]: https://rubygems.org/gems/tcd_x12
|
10
|
+
[inch-ci]: http://inch-ci.org/github/tcd/x12
|
11
|
+
[license]: https://github.com/tcd/x12/blob/master/LICENSE
|
12
|
+
[docs]: https://www.rubydoc.info/gems/tcd_x12/1.6.2
|
6
13
|
|
7
14
|
Changes welcome, especially new document types or better tests.
|
8
15
|
|
data/Rakefile
CHANGED
@@ -11,4 +11,13 @@ Rake::TestTask.new(:test) do |t|
|
|
11
11
|
t.verbose = true
|
12
12
|
end
|
13
13
|
|
14
|
-
|
14
|
+
# desc 'Test the plugin, and run benchmarks'
|
15
|
+
# Rake::TestTask.new(:benchmark) do |t|
|
16
|
+
# ENV['BENCH'] = 'true'
|
17
|
+
# t.libs << 'lib'
|
18
|
+
# t.libs << 'test'
|
19
|
+
# t.test_files = FileList['test/**/*_test.rb']
|
20
|
+
# t.verbose = true
|
21
|
+
# end
|
22
|
+
|
23
|
+
task(default: :test)
|
data/lib/x12/base.rb
CHANGED
@@ -1,13 +1,16 @@
|
|
1
1
|
module X12
|
2
2
|
|
3
|
-
# Base class for Segment, Composite, and Loop.
|
3
|
+
# Base class for {Segment}, {Composite}, and {Loop}.
|
4
4
|
# Contains setable segment_separator, field_separator, and composite_separator fields.
|
5
5
|
class Base
|
6
6
|
|
7
7
|
attr_reader :name, :repeats
|
8
|
-
attr_accessor :segment_separator, :field_separator, :composite_separator
|
8
|
+
attr_accessor :segment_separator, :field_separator, :composite_separator
|
9
|
+
attr_accessor :next_repeat, :parsed_str, :nodes
|
9
10
|
|
10
11
|
# Creates a new base element with a given name, array of sub-elements, and array of repeats if any.
|
12
|
+
#
|
13
|
+
# @return [void]
|
11
14
|
def initialize(name, arr, repeats = nil)
|
12
15
|
@nodes = arr
|
13
16
|
@name = name
|
@@ -23,12 +26,15 @@ module X12
|
|
23
26
|
end
|
24
27
|
|
25
28
|
# Formats a printable string containing the base element's content.
|
29
|
+
#
|
26
30
|
# @return [String]
|
27
31
|
def inspect
|
28
32
|
"#{self.class.to_s.sub(/^.*::/, '')} (#{name}) #{repeats} #{super.inspect[1..-2]} =<#{parsed_str}, #{next_repeat.inspect}> ".gsub(/\\*\"/, '"')
|
29
33
|
end
|
30
34
|
|
31
35
|
# Prints a tree-like representation of the element.
|
36
|
+
#
|
37
|
+
# @return [void]
|
32
38
|
def show(ind = '')
|
33
39
|
count = 0
|
34
40
|
self.to_a.each{|i|
|
@@ -48,8 +54,8 @@ module X12
|
|
48
54
|
}
|
49
55
|
end
|
50
56
|
|
51
|
-
# Try to parse the current element one more time if required.
|
52
|
-
# or the same string if no more repeats are found or required.
|
57
|
+
# Try to parse the current element one more time if required.
|
58
|
+
# Returns the rest of the string or the same string if no more repeats are found or required.
|
53
59
|
def do_repeats(s)
|
54
60
|
if self.repeats.end > 1
|
55
61
|
possible_repeat = self.dup
|
@@ -63,6 +69,8 @@ module X12
|
|
63
69
|
end
|
64
70
|
|
65
71
|
# Empty out the current element.
|
72
|
+
#
|
73
|
+
# @return [void]
|
66
74
|
def set_empty!
|
67
75
|
@next_repeat = nil
|
68
76
|
@parsed_str = nil
|
@@ -170,7 +178,8 @@ module X12
|
|
170
178
|
self.nodes.find{ |i| i.has_content? }
|
171
179
|
end
|
172
180
|
|
173
|
-
# Adds a repeat to a segment or loop.
|
181
|
+
# Adds a repeat to a segment or loop.
|
182
|
+
# Returns a new segment/loop or self if empty.
|
174
183
|
def repeat
|
175
184
|
res = if self.has_content? # Do not repeat an empty segment
|
176
185
|
last_repeat = self.to_a[-1]
|
data/lib/x12/parser.rb
CHANGED
@@ -20,8 +20,11 @@ module X12
|
|
20
20
|
].freeze
|
21
21
|
|
22
22
|
# Creates a parser out of a definition.
|
23
|
+
#
|
24
|
+
# @param file_name [String]
|
25
|
+
# @return [void]
|
23
26
|
def initialize(file_name)
|
24
|
-
save_definition = @x12_definition
|
27
|
+
save_definition = @x12_definition if defined? @x12_definition
|
25
28
|
|
26
29
|
# Deal with Microsoft devices
|
27
30
|
# get the current working directory
|
data/lib/x12/segment.rb
CHANGED
@@ -2,8 +2,13 @@ module X12
|
|
2
2
|
|
3
3
|
# Implements a segment containing fields or composites
|
4
4
|
class Segment < Base
|
5
|
+
attr_accessor :fields
|
6
|
+
|
5
7
|
# Parses this segment out of a string, puts the match into value,
|
6
8
|
# returns the rest of the string - nil if cannot parse.
|
9
|
+
#
|
10
|
+
# @param str [String]
|
11
|
+
# @return [nil]
|
7
12
|
def parse(str)
|
8
13
|
s = str
|
9
14
|
# puts "Parsing segment #{name} from #{s} with regexp [#{regexp.source}]"
|
@@ -38,7 +43,7 @@ module X12
|
|
38
43
|
|
39
44
|
# Returns a regexp that matches this particular segment.
|
40
45
|
def regexp
|
41
|
-
unless @regexp
|
46
|
+
unless defined? @regexp
|
42
47
|
if self.nodes.find { |i| i.type =~ /^".+"$/ }
|
43
48
|
# It's a very special regexp if there are constant fields
|
44
49
|
re_str = self.nodes.inject("^#{name}#{Regexp.escape(field_separator)}") { |s, i|
|
@@ -68,7 +73,7 @@ module X12
|
|
68
73
|
# puts field_num
|
69
74
|
|
70
75
|
# Parse the segment if not parsed already
|
71
|
-
unless @fields
|
76
|
+
unless defined? @fields
|
72
77
|
@fields = self.to_s.chop.split(Regexp.new(Regexp.escape(field_separator)))
|
73
78
|
self.nodes.each_index { |i| self.nodes[i].content = @fields[i + 1] }
|
74
79
|
end
|
data/lib/x12/table.rb
CHANGED
@@ -2,9 +2,11 @@ module X12
|
|
2
2
|
|
3
3
|
# This just a named hash to store validation tables.
|
4
4
|
class Table < Hash
|
5
|
+
# @return [String]
|
5
6
|
attr_reader :name
|
6
7
|
|
7
8
|
# Create a new table with given name and hash content.
|
9
|
+
# @return [void]
|
8
10
|
def initialize(name, name_values)
|
9
11
|
@name = name
|
10
12
|
self.merge!(name_values)
|
data/lib/x12/version.rb
CHANGED
data/lib/x12/xmldefinitions.rb
CHANGED
@@ -99,7 +99,7 @@ module X12
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def parse_table(e)
|
102
|
-
name,
|
102
|
+
name, _min, _max, _type, _required, _validation = parse_attributes(e)
|
103
103
|
|
104
104
|
content = e.find('Entry').inject({}) { |t, entry|
|
105
105
|
t[entry.attributes['name']] = entry.attributes['value']
|
@@ -109,7 +109,7 @@ module X12
|
|
109
109
|
end
|
110
110
|
|
111
111
|
def parse_segment(e)
|
112
|
-
name, min, max,
|
112
|
+
name, min, max, _type, _required, _validation = parse_attributes(e)
|
113
113
|
|
114
114
|
fields = e.find('Field').inject([]) { |f, field|
|
115
115
|
f << parse_field(field)
|
@@ -118,7 +118,7 @@ module X12
|
|
118
118
|
end
|
119
119
|
|
120
120
|
def parse_composite(e)
|
121
|
-
name,
|
121
|
+
name, _min, _max, _type, _required, _validation = parse_attributes(e)
|
122
122
|
|
123
123
|
fields = e.find('Field').inject([]) { |f, field|
|
124
124
|
f << parse_field(field)
|
@@ -127,7 +127,7 @@ module X12
|
|
127
127
|
end
|
128
128
|
|
129
129
|
def parse_loop(e)
|
130
|
-
name, min, max,
|
130
|
+
name, min, max, _type, _required, _validation = parse_attributes(e)
|
131
131
|
|
132
132
|
components = e.find('*').to_a.inject([]) { |r, element|
|
133
133
|
r << case element.name
|
data/misc/850.xml
CHANGED
data/misc/855.xml
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
<!--
|
2
|
+
(c) 2019 Clay Dunston
|
3
|
+
The code in this file is licensed under the MIT license.
|
4
|
+
-->
|
5
|
+
|
6
|
+
<!--
|
7
|
+
This is an example of a message definition spread among several
|
8
|
+
files: main loop is here, all other definitions, i.e., segments,
|
9
|
+
composites, validation tables live in separate files.
|
10
|
+
-->
|
11
|
+
|
12
|
+
<Definition>
|
13
|
+
<Loop name="855" comment="">
|
14
|
+
<Segment name="ISA" max="1" required="y" />
|
15
|
+
<Segment name="GS" max="1" required="y" />
|
16
|
+
|
17
|
+
<Segment name="ST" max="1" required="y">
|
18
|
+
<Field name="TransactionSetIdentifierCode" const="855" min="3" max="3" comment="Code uniquely identifying a Transaction Set" />
|
19
|
+
<Field name="TransactionSetControlNumber" min="4" max="9" comment="Identifying control number that must be unique within the transaction set functional group assigned by the originator for a transaction set" />
|
20
|
+
</Segment>
|
21
|
+
<Segment name="BAK" max="1" required="y" />
|
22
|
+
|
23
|
+
<Loop name="L1000" max="200">
|
24
|
+
<Segment name="N1" max="1" required="n" />
|
25
|
+
<Segment name="N3" max="2" required="n" />
|
26
|
+
<Segment name="N4" min="1" required="n" />
|
27
|
+
</Loop>
|
28
|
+
|
29
|
+
<Loop name="L1010" max="100000">
|
30
|
+
<Segment name="PO1" max="1" required="y" />
|
31
|
+
<Loop name="L1020" min="1">
|
32
|
+
<Segment name="PID" max="1" required="n" />
|
33
|
+
</Loop>
|
34
|
+
<Loop name="L1030" max="104">
|
35
|
+
<Segment name="ACK" max="1" required="y" />
|
36
|
+
</Loop>
|
37
|
+
</Loop>
|
38
|
+
|
39
|
+
<Loop name="L1040" max="1">
|
40
|
+
<Segment name="CTT" max="1" required="y" />
|
41
|
+
</Loop>
|
42
|
+
|
43
|
+
<Segment name="SE" max="1" required="y" />
|
44
|
+
|
45
|
+
<Segment name="GE" max="1" required="y" />
|
46
|
+
<Segment name="IEA" max="1" required="y" />
|
47
|
+
</Definition>
|
data/x12.gemspec
CHANGED
@@ -11,8 +11,14 @@ Gem::Specification.new do |gem|
|
|
11
11
|
gem.summary = 'A gem to handle parsing and generation of ANSI X12 documents'
|
12
12
|
gem.homepage = 'https://github.com/tcd/x12'
|
13
13
|
gem.licenses = 'GPL-2.0-or-later'
|
14
|
-
|
15
|
-
gem.metadata
|
14
|
+
|
15
|
+
gem.metadata = {
|
16
|
+
'homepage_uri' => gem.homepage,
|
17
|
+
'source_code_uri' => gem.homepage,
|
18
|
+
'documentation_uri' => "https://www.rubydoc.info/gems/tcd_x12/#{gem.version}",
|
19
|
+
'changelog_uri' => 'https://github.com/tcd/tcd_x12/blob/master/CHANGELOG.md',
|
20
|
+
'yard.run' => 'yri' # use "yard" to build full HTML docs.
|
21
|
+
}
|
16
22
|
|
17
23
|
# Specify which files should be added to the gem when it is released.
|
18
24
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
@@ -22,6 +28,7 @@ Gem::Specification.new do |gem|
|
|
22
28
|
gem.require_paths = ['lib']
|
23
29
|
|
24
30
|
gem.add_dependency 'libxml-ruby', '~> 3.1'
|
31
|
+
|
25
32
|
gem.add_development_dependency 'minitest', '~> 5.0'
|
26
33
|
gem.add_development_dependency 'rake', '~> 10.0'
|
27
34
|
gem.add_development_dependency 'simplecov'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tcd_x12
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marty Petersen
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-11-26 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: libxml-ruby
|
@@ -78,6 +78,7 @@ extra_rdoc_files: []
|
|
78
78
|
files:
|
79
79
|
- ".editorconfig"
|
80
80
|
- ".gitignore"
|
81
|
+
- ".rubocop.yml"
|
81
82
|
- CHANGELOG.md
|
82
83
|
- Gemfile
|
83
84
|
- LICENSE
|
@@ -106,6 +107,7 @@ files:
|
|
106
107
|
- misc/837p.xml
|
107
108
|
- misc/850.xml
|
108
109
|
- misc/850dsd.xml
|
110
|
+
- misc/855.xml
|
109
111
|
- misc/997.xml
|
110
112
|
- misc/997single.xml
|
111
113
|
- misc/999.xml
|
@@ -1927,6 +1929,9 @@ licenses:
|
|
1927
1929
|
metadata:
|
1928
1930
|
homepage_uri: https://github.com/tcd/x12
|
1929
1931
|
source_code_uri: https://github.com/tcd/x12
|
1932
|
+
documentation_uri: https://www.rubydoc.info/gems/tcd_x12/1.6.3
|
1933
|
+
changelog_uri: https://github.com/tcd/tcd_x12/blob/master/CHANGELOG.md
|
1934
|
+
yard.run: yri
|
1930
1935
|
post_install_message:
|
1931
1936
|
rdoc_options: []
|
1932
1937
|
require_paths:
|