tediparse 2.0.0

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.
Files changed (176) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +319 -0
  3. data/LICENSE +26 -0
  4. data/README.md +308 -0
  5. data/Rakefile +33 -0
  6. data/bin/tediparse +102 -0
  7. data/doc/Defining.md +97 -0
  8. data/doc/Generating-Grammars.md +241 -0
  9. data/doc/Generating.md +332 -0
  10. data/doc/Navigating.md +670 -0
  11. data/doc/Parsing.md +133 -0
  12. data/doc/README.md +51 -0
  13. data/doc/Serializing.md +100 -0
  14. data/doc/Tokenizing.md +136 -0
  15. data/doc/Validating.md +140 -0
  16. data/lib/ruby/array.rb +226 -0
  17. data/lib/ruby/blank.rb +52 -0
  18. data/lib/ruby/exception.rb +14 -0
  19. data/lib/ruby/hash.rb +14 -0
  20. data/lib/ruby/module.rb +60 -0
  21. data/lib/ruby/object.rb +56 -0
  22. data/lib/ruby/string.rb +89 -0
  23. data/lib/ruby/to_d.rb +82 -0
  24. data/lib/ruby/to_date.rb +26 -0
  25. data/lib/ruby/to_time.rb +21 -0
  26. data/lib/ruby/try.rb +46 -0
  27. data/lib/stupidedi/builder.rb +6 -0
  28. data/lib/stupidedi/color.rb +94 -0
  29. data/lib/stupidedi/config/code_list_config.rb +45 -0
  30. data/lib/stupidedi/config/functional_group_config.rb +72 -0
  31. data/lib/stupidedi/config/interchange_config.rb +86 -0
  32. data/lib/stupidedi/config/transaction_set_config.rb +73 -0
  33. data/lib/stupidedi/config.rb +100 -0
  34. data/lib/stupidedi/either.rb +286 -0
  35. data/lib/stupidedi/exceptions/invalid_element_error.rb +7 -0
  36. data/lib/stupidedi/exceptions/invalid_schema_error.rb +7 -0
  37. data/lib/stupidedi/exceptions/missing_grammar_error.rb +50 -0
  38. data/lib/stupidedi/exceptions/output_error.rb +7 -0
  39. data/lib/stupidedi/exceptions/parse_error.rb +7 -0
  40. data/lib/stupidedi/exceptions/stupidedi_error.rb +7 -0
  41. data/lib/stupidedi/exceptions/tokenize_error.rb +7 -0
  42. data/lib/stupidedi/exceptions/zipper_error.rb +7 -0
  43. data/lib/stupidedi/exceptions.rb +13 -0
  44. data/lib/stupidedi/inspect.rb +26 -0
  45. data/lib/stupidedi/interchanges/element_types/separator_val.rb +79 -0
  46. data/lib/stupidedi/interchanges/element_types/special_val.rb +48 -0
  47. data/lib/stupidedi/interchanges/element_types.rb +11 -0
  48. data/lib/stupidedi/interchanges.rb +21 -0
  49. data/lib/stupidedi/parser/builder_dsl.rb +292 -0
  50. data/lib/stupidedi/parser/constraint_table.rb +566 -0
  51. data/lib/stupidedi/parser/generation.rb +147 -0
  52. data/lib/stupidedi/parser/identifier_stack.rb +248 -0
  53. data/lib/stupidedi/parser/instruction.rb +112 -0
  54. data/lib/stupidedi/parser/instruction_table.rb +222 -0
  55. data/lib/stupidedi/parser/navigation.rb +786 -0
  56. data/lib/stupidedi/parser/state_machine.rb +62 -0
  57. data/lib/stupidedi/parser/states/abstract_state.rb +385 -0
  58. data/lib/stupidedi/parser/states/failure_state.rb +69 -0
  59. data/lib/stupidedi/parser/states/functional_group_state.rb +101 -0
  60. data/lib/stupidedi/parser/states/initial_state.rb +62 -0
  61. data/lib/stupidedi/parser/states/interchange_state.rb +96 -0
  62. data/lib/stupidedi/parser/states/loop_state.rb +74 -0
  63. data/lib/stupidedi/parser/states/table_state.rb +90 -0
  64. data/lib/stupidedi/parser/states/transaction_set_state.rb +120 -0
  65. data/lib/stupidedi/parser/states/transmission_state.rb +59 -0
  66. data/lib/stupidedi/parser/tokenization.rb +195 -0
  67. data/lib/stupidedi/parser.rb +32 -0
  68. data/lib/stupidedi/reader/input/abstract_input.rb +137 -0
  69. data/lib/stupidedi/reader/input/delegated_input.rb +112 -0
  70. data/lib/stupidedi/reader/input/file_input.rb +157 -0
  71. data/lib/stupidedi/reader/input.rb +31 -0
  72. data/lib/stupidedi/reader/position.rb +78 -0
  73. data/lib/stupidedi/reader/result.rb +172 -0
  74. data/lib/stupidedi/reader/segment_dict.rb +176 -0
  75. data/lib/stupidedi/reader/separators.rb +90 -0
  76. data/lib/stupidedi/reader/stream_reader.rb +173 -0
  77. data/lib/stupidedi/reader/token_reader.rb +465 -0
  78. data/lib/stupidedi/reader/tokens/component_element_tok.rb +71 -0
  79. data/lib/stupidedi/reader/tokens/composite_element_tok.rb +85 -0
  80. data/lib/stupidedi/reader/tokens/repeated_element_tok.rb +74 -0
  81. data/lib/stupidedi/reader/tokens/segment_tok.rb +74 -0
  82. data/lib/stupidedi/reader/tokens/simple_element_tok.rb +76 -0
  83. data/lib/stupidedi/reader.rb +121 -0
  84. data/lib/stupidedi/schema/abstract_def.rb +76 -0
  85. data/lib/stupidedi/schema/abstract_element_def.rb +35 -0
  86. data/lib/stupidedi/schema/abstract_element_use.rb +47 -0
  87. data/lib/stupidedi/schema/abstract_use.rb +79 -0
  88. data/lib/stupidedi/schema/code_list.rb +99 -0
  89. data/lib/stupidedi/schema/component_element_use.rb +76 -0
  90. data/lib/stupidedi/schema/composite_element_def.rb +103 -0
  91. data/lib/stupidedi/schema/composite_element_use.rb +78 -0
  92. data/lib/stupidedi/schema/element_req.rb +57 -0
  93. data/lib/stupidedi/schema/functional_group_def.rb +124 -0
  94. data/lib/stupidedi/schema/generation/definition_generator.rb +139 -0
  95. data/lib/stupidedi/schema/generation/element_generator.rb +221 -0
  96. data/lib/stupidedi/schema/generation/flat_file_reader.rb +551 -0
  97. data/lib/stupidedi/schema/generation/functional_group_generator.rb +64 -0
  98. data/lib/stupidedi/schema/generation/interchange_generator.rb +145 -0
  99. data/lib/stupidedi/schema/generation/master_loader_generator.rb +121 -0
  100. data/lib/stupidedi/schema/generation/models.rb +85 -0
  101. data/lib/stupidedi/schema/generation/module_loader_generator.rb +64 -0
  102. data/lib/stupidedi/schema/generation/registration_generator.rb +230 -0
  103. data/lib/stupidedi/schema/generation/runner.rb +161 -0
  104. data/lib/stupidedi/schema/generation/segment_generator.rb +130 -0
  105. data/lib/stupidedi/schema/generation/support.rb +78 -0
  106. data/lib/stupidedi/schema/generation/support_modules_generator.rb +126 -0
  107. data/lib/stupidedi/schema/generation/version_modules.rb +35 -0
  108. data/lib/stupidedi/schema/generation.rb +94 -0
  109. data/lib/stupidedi/schema/interchange_def.rb +103 -0
  110. data/lib/stupidedi/schema/loop_def.rb +156 -0
  111. data/lib/stupidedi/schema/repeat_count.rb +86 -0
  112. data/lib/stupidedi/schema/segment_def.rb +122 -0
  113. data/lib/stupidedi/schema/segment_req.rb +46 -0
  114. data/lib/stupidedi/schema/segment_use.rb +99 -0
  115. data/lib/stupidedi/schema/simple_element_def.rb +51 -0
  116. data/lib/stupidedi/schema/simple_element_use.rb +83 -0
  117. data/lib/stupidedi/schema/syntax_note.rb +52 -0
  118. data/lib/stupidedi/schema/table_def.rb +178 -0
  119. data/lib/stupidedi/schema/transaction_set_def.rb +125 -0
  120. data/lib/stupidedi/schema.rb +30 -0
  121. data/lib/stupidedi/sets.rb +42 -0
  122. data/lib/stupidedi/transaction_sets/builder/dsl.rb +192 -0
  123. data/lib/stupidedi/transaction_sets/builder.rb +188 -0
  124. data/lib/stupidedi/transaction_sets/common/implementations/element_reqs.rb +37 -0
  125. data/lib/stupidedi/transaction_sets/common/implementations/segment_reqs.rb +31 -0
  126. data/lib/stupidedi/transaction_sets/common/implementations.rb +11 -0
  127. data/lib/stupidedi/transaction_sets/common.rb +8 -0
  128. data/lib/stupidedi/transaction_sets/validation/ambiguity.rb +395 -0
  129. data/lib/stupidedi/transaction_sets/validation/implementation.rb +12 -0
  130. data/lib/stupidedi/transaction_sets/validation.rb +9 -0
  131. data/lib/stupidedi/transaction_sets.rb +25 -0
  132. data/lib/stupidedi/values/abstract_element_val.rb +19 -0
  133. data/lib/stupidedi/values/abstract_val.rb +133 -0
  134. data/lib/stupidedi/values/composite_element_val.rb +102 -0
  135. data/lib/stupidedi/values/functional_group_val.rb +105 -0
  136. data/lib/stupidedi/values/interchange_val.rb +102 -0
  137. data/lib/stupidedi/values/invalid_envelope_val.rb +61 -0
  138. data/lib/stupidedi/values/invalid_segment_val.rb +89 -0
  139. data/lib/stupidedi/values/loop_val.rb +73 -0
  140. data/lib/stupidedi/values/repeated_element_val.rb +113 -0
  141. data/lib/stupidedi/values/segment_val.rb +105 -0
  142. data/lib/stupidedi/values/segment_val_group.rb +20 -0
  143. data/lib/stupidedi/values/simple_element_val.rb +80 -0
  144. data/lib/stupidedi/values/table_val.rb +69 -0
  145. data/lib/stupidedi/values/transaction_set_val.rb +69 -0
  146. data/lib/stupidedi/values/transmission_val.rb +56 -0
  147. data/lib/stupidedi/values.rb +22 -0
  148. data/lib/stupidedi/version.rb +4 -0
  149. data/lib/stupidedi/versions/common/element_reqs.rb +13 -0
  150. data/lib/stupidedi/versions/common/element_types/an.rb +386 -0
  151. data/lib/stupidedi/versions/common/element_types/dt.rb +572 -0
  152. data/lib/stupidedi/versions/common/element_types/id.rb +304 -0
  153. data/lib/stupidedi/versions/common/element_types/nn.rb +312 -0
  154. data/lib/stupidedi/versions/common/element_types/operators.rb +128 -0
  155. data/lib/stupidedi/versions/common/element_types/r.rb +342 -0
  156. data/lib/stupidedi/versions/common/element_types/simple_element.rb +73 -0
  157. data/lib/stupidedi/versions/common/element_types/tm.rb +347 -0
  158. data/lib/stupidedi/versions/common/element_types.rb +29 -0
  159. data/lib/stupidedi/versions/common/segment_reqs.rb +15 -0
  160. data/lib/stupidedi/versions/common/syntax_notes.rb +172 -0
  161. data/lib/stupidedi/versions/common.rb +11 -0
  162. data/lib/stupidedi/versions.rb +25 -0
  163. data/lib/stupidedi/writer/claredi.rb +178 -0
  164. data/lib/stupidedi/writer/default.rb +119 -0
  165. data/lib/stupidedi/writer.rb +7 -0
  166. data/lib/stupidedi/zipper/abstract_cursor.rb +351 -0
  167. data/lib/stupidedi/zipper/dangling_cursor.rb +103 -0
  168. data/lib/stupidedi/zipper/edited_cursor.rb +157 -0
  169. data/lib/stupidedi/zipper/memoized_cursor.rb +133 -0
  170. data/lib/stupidedi/zipper/path.rb +132 -0
  171. data/lib/stupidedi/zipper/root_cursor.rb +120 -0
  172. data/lib/stupidedi/zipper/stack_cursor.rb +107 -0
  173. data/lib/stupidedi/zipper.rb +45 -0
  174. data/lib/stupidedi.rb +69 -0
  175. data/lib/tediparse.rb +1 -0
  176. metadata +249 -0
@@ -0,0 +1,73 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Values
6
+ #
7
+ # @see X222.pdf B.1.1.3.12.2 Data Segment Groups
8
+ # @see X222.pdf B.1.1.3.12.4 Loops of Data Segments
9
+ #
10
+ class LoopVal < AbstractVal
11
+ include SegmentValGroup
12
+
13
+ # @return [LoopDef]
14
+ attr_reader :definition
15
+
16
+ def_delegators :definition, :descriptor
17
+
18
+ # @return [Array<SegmentVal, LoopVal>]
19
+ attr_reader :children
20
+
21
+ def_delegators "@children.head", :position
22
+
23
+ def initialize(definition, children)
24
+ @definition, @children =
25
+ definition, children
26
+ end
27
+
28
+ # @return [LoopVal]
29
+ def copy(changes = {})
30
+ LoopVal.new \
31
+ changes.fetch(:definition, @definition),
32
+ changes.fetch(:children, @children)
33
+ end
34
+
35
+ # (see AbstractVal#loop?)
36
+ # @return true
37
+ def loop?
38
+ true
39
+ end
40
+
41
+ # @return [void]
42
+ def pretty_print(q)
43
+ id = @definition.try do |d|
44
+ ansi.bold("[#{d.id.to_s}]")
45
+ end
46
+
47
+ q.text(ansi.loop("LoopVal#{id}"))
48
+ q.group(2, "(", ")") do
49
+ q.breakable ""
50
+ @children.each do |e|
51
+ unless q.current_group.first?
52
+ q.text ","
53
+ q.breakable
54
+ end
55
+ q.pp e
56
+ end
57
+ end
58
+ end
59
+
60
+ # @return [String]
61
+ def inspect
62
+ ansi.loop("Loop") + "(#{@children.map(&:inspect).join(", ")})"
63
+ end
64
+
65
+ # @return [Boolean]
66
+ def ==(other)
67
+ eql?(other) or
68
+ (other.definition == @definition and
69
+ other.children == @children)
70
+ end
71
+ end
72
+ end
73
+ end
@@ -0,0 +1,113 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Values
6
+ #
7
+ # @see X222.pdf B.1.1.3.2 Repeating Data Elements
8
+ #
9
+ class RepeatedElementVal < AbstractElementVal
10
+ # @return [CompositeElementDef, SimpleElementDef]
11
+ def_delegators :usage, :definition, :descriptor
12
+
13
+ # @return [Array<AbstractElementVal>]
14
+ attr_reader :children
15
+ alias element_vals children
16
+
17
+ # @return [Schema::SimpleElementUse, Schema::CompositeElementUse
18
+ attr_reader :usage
19
+
20
+ def_delegators :children, :defined_at?, :length
21
+ def_delegators "children.first", :position
22
+
23
+ def initialize(children, usage)
24
+ @children, @usage =
25
+ children, usage
26
+ end
27
+
28
+ # @return [RepeatedElementVal]
29
+ def copy(changes = {})
30
+ RepeatedElementVal.new \
31
+ changes.fetch(:children, @children),
32
+ changes.fetch(:usage, @usage)
33
+ end
34
+
35
+ # @return false
36
+ def leaf?
37
+ false
38
+ end
39
+
40
+ # @return true
41
+ def repeated?
42
+ true
43
+ end
44
+
45
+ # @return [Boolean]
46
+ def empty?
47
+ @children.empty? or @children.all?(&:empty?)
48
+ end
49
+
50
+ def element(n, o = nil)
51
+ unless n > 0
52
+ raise ArgumentError,
53
+ "n must be positive"
54
+ end
55
+
56
+ unless o.nil?
57
+ @children.at(n - 1).element(o)
58
+ else
59
+ @children.at(n - 1)
60
+ end
61
+ end
62
+
63
+ # @return [void]
64
+ # :nocov:
65
+ def pretty_print(q)
66
+ if @children.empty?
67
+ id = definition.try do |d|
68
+ ansi.bold("[#{d.id.to_s}: #{d.name.to_s}]")
69
+ end
70
+ q.text(ansi.repeated("RepeatedElementVal#{id}"))
71
+ else
72
+ q.text(ansi.repeated("RepeatedElementVal"))
73
+ q.group(2, "(", ")") do
74
+ q.breakable ""
75
+ @children.each do |e|
76
+ unless q.current_group.first?
77
+ q.text ", "
78
+ q.breakable
79
+ end
80
+ q.pp e
81
+ end
82
+ end
83
+ end
84
+ end
85
+ # :nocov:
86
+
87
+ # @return [Boolean]
88
+ def ==(other)
89
+ eql?(other) or \
90
+ (other.definition == definition and
91
+ other.children == @children)
92
+ end
93
+ end
94
+
95
+ class << RepeatedElementVal
96
+ #########################################################################
97
+ # @group Constructors
98
+
99
+ # @return [RepeatedElementVal]
100
+ def empty(element_use)
101
+ RepeatedElementVal.new([], element_use)
102
+ end
103
+
104
+ # @return [RepeatedElementVal]
105
+ def build(children, element_use)
106
+ RepeatedElementVal.new(children, element_use)
107
+ end
108
+
109
+ # @endgroup
110
+ #########################################################################
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,105 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Values
6
+ #
7
+ # @see X222 B.1.1.3.4 Data Segment
8
+ #
9
+ class SegmentVal < AbstractVal
10
+ # @return [SegmentDef]
11
+ def_delegators :usage, :definition, :descriptor, :id
12
+
13
+ # @return [Array<AbstractElementVal>]
14
+ attr_reader :children
15
+
16
+ # @return [SegmentUse]
17
+ attr_reader :usage
18
+
19
+ # @return [Position]
20
+ attr_reader :position
21
+
22
+ def initialize(children, usage, position)
23
+ @children, @usage, @position =
24
+ children, usage, position
25
+ end
26
+
27
+ # @return [SegmentVal]
28
+ def copy(changes = {})
29
+ SegmentVal.new \
30
+ changes.fetch(:children, @children),
31
+ changes.fetch(:usage, @usage),
32
+ changes.fetch(:position, @position)
33
+ end
34
+
35
+ # (see AbstractVal#size)
36
+ def size
37
+ 1
38
+ end
39
+
40
+ # @return false
41
+ def leaf?
42
+ false
43
+ end
44
+
45
+ def valid?
46
+ true
47
+ end
48
+
49
+ # (see AbstractVal#segment?)
50
+ # @return true
51
+ def segment?
52
+ true
53
+ end
54
+
55
+ # @return [AbstractElementVal]
56
+ def element(m, n = nil, o = nil)
57
+ unless m > 0
58
+ raise ArgumentError,
59
+ "m must be positive"
60
+ end
61
+
62
+ unless n.nil?
63
+ @children.at(m - 1).element(n, o)
64
+ else
65
+ @children.at(m - 1)
66
+ end
67
+ end
68
+
69
+ # @return [void]
70
+ # :nocov:
71
+ def pretty_print(q)
72
+ id = definition.try do |d|
73
+ ansi.bold("[#{d.id}: #{d.name}]")
74
+ end
75
+
76
+ q.text(ansi.segment("SegmentVal#{id}"))
77
+ q.group(2, "(", ")") do
78
+ q.breakable ""
79
+ @children.each do |e|
80
+ unless q.current_group.first?
81
+ q.text ","
82
+ q.breakable
83
+ end
84
+ q.pp e
85
+ end
86
+ end
87
+ end
88
+ # :nocov:
89
+
90
+ # @return [String]
91
+ # :nocov:
92
+ def inspect
93
+ ansi.segment(ansi.bold(definition.id.to_s))
94
+ end
95
+ # :nocov:
96
+
97
+ # @return [Boolean]
98
+ def ==(other)
99
+ eql?(other) or
100
+ (other.definition == definition and
101
+ other.children == @children)
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Values
6
+ #
7
+ # @see X222.pdf B.1.1.3.12.2 Data Segment Groups
8
+ #
9
+ module SegmentValGroup
10
+ # @return [LoopDef, TableDef]
11
+ abstract :definition
12
+
13
+ # (see AbstractVal#leaf?)
14
+ # @return false
15
+ def leaf?
16
+ false
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Values
6
+ #
7
+ # @abstract This must be subclassed to add type- and version-specific
8
+ # functionality. For instance, DateVal adds `#day`, `#month`, etc.
9
+ #
10
+ # @see X222 B.1.1.3.1 Data Element
11
+ #
12
+ class SimpleElementVal < AbstractElementVal
13
+ # @return [SimpleElementDef]
14
+ def_delegators :usage, :definition, :descriptor
15
+
16
+ abstract :valid?
17
+
18
+ # @return [String]
19
+ abstract :to_x12
20
+
21
+ abstract :too_long?
22
+
23
+ abstract :too_short?
24
+
25
+ abstract :to_s
26
+
27
+ # @return [SimpleElementUse, ComponentElementUse]
28
+ attr_reader :usage
29
+
30
+ # @return [Reader::Position]
31
+ attr_reader :position
32
+
33
+ def initialize(usage, position)
34
+ @usage, @position =
35
+ usage, position
36
+ end
37
+
38
+ # @return [SimpleElementVal]
39
+ abstract :copy, "changes={}"
40
+
41
+ # True unless this value isn't included in {Schema::SimpleElementUse#allowed_values}
42
+ def allowed?
43
+ empty? or invalid? or usage.allowed_values.include?(to_s)
44
+ end
45
+
46
+ def id?
47
+ false
48
+ end
49
+
50
+ def date?
51
+ false
52
+ end
53
+
54
+ def time?
55
+ false
56
+ end
57
+
58
+ def string?
59
+ false
60
+ end
61
+
62
+ def numeric?
63
+ false
64
+ end
65
+
66
+ # @return true
67
+ def leaf?
68
+ true
69
+ end
70
+
71
+ def component?
72
+ @usage.component?
73
+ end
74
+
75
+ def simple?
76
+ not @usage.component?
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Values
6
+ class TableVal < AbstractVal
7
+ include SegmentValGroup
8
+
9
+ # @return [TableDef]
10
+ attr_reader :definition
11
+
12
+ def_delegators :definition, :descriptor
13
+
14
+ # @return [Array<SegmentVal, LoopVal>]
15
+ attr_reader :children
16
+
17
+ def_delegators "@children.head", :position
18
+
19
+ def initialize(definition, children)
20
+ @definition, @children =
21
+ definition, children
22
+ end
23
+
24
+ # @return [TableVal]
25
+ def copy(changes = {})
26
+ TableVal.new \
27
+ changes.fetch(:definition, @definition),
28
+ changes.fetch(:children, @children)
29
+ end
30
+
31
+ # (see AbstractVal#table?)
32
+ # @return true
33
+ def table?
34
+ true
35
+ end
36
+
37
+ # @return [void]
38
+ def pretty_print(q)
39
+ id = @definition.try do |d|
40
+ ansi.bold("[#{d.id.to_s}]")
41
+ end
42
+
43
+ q.text(ansi.table("TableVal#{id}"))
44
+ q.group(2, "(", ")") do
45
+ q.breakable ""
46
+ @children.each do |e|
47
+ unless q.current_group.first?
48
+ q.text ","
49
+ q.breakable
50
+ end
51
+ q.pp e
52
+ end
53
+ end
54
+ end
55
+
56
+ # @return [String]
57
+ def inspect
58
+ ansi.table("Table") + "(#{@children.map(&:inspect).join(", ")})"
59
+ end
60
+
61
+ # @return [Boolean]
62
+ def ==(other)
63
+ eql?(other) or
64
+ (other.definition == @definition and
65
+ other.children == @children)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,69 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Values
6
+ class TransactionSetVal < AbstractVal
7
+ include SegmentValGroup
8
+
9
+ # @return [TransactionSetDef]
10
+ attr_reader :definition
11
+
12
+ def_delegators :definition, :descriptor
13
+
14
+ # @return [Array<TableVal>]
15
+ attr_reader :children
16
+
17
+ def_delegators "@children.head", :position
18
+
19
+ def initialize(definition, children)
20
+ @definition, @children =
21
+ definition, children
22
+ end
23
+
24
+ # @return [TransactionSetVal]
25
+ def copy(changes = {})
26
+ TransactionSetVal.new \
27
+ changes.fetch(:definition, @definition),
28
+ changes.fetch(:children, @children)
29
+ end
30
+
31
+ # (see AbstractSet#transaction_set?)
32
+ # @return true
33
+ def transaction_set?
34
+ true
35
+ end
36
+
37
+ # @return [void]
38
+ def pretty_print(q)
39
+ id = @definition.try do |d|
40
+ ansi.bold("[#{d.functional_group}#{d.id}]")
41
+ end
42
+
43
+ q.text(ansi.envelope("TransactionSetVal#{id}"))
44
+ q.group(2, "(", ")") do
45
+ q.breakable ""
46
+ @children.each do |e|
47
+ unless q.current_group.first?
48
+ q.text ","
49
+ q.breakable
50
+ end
51
+ q.pp e
52
+ end
53
+ end
54
+ end
55
+
56
+ # @return [String]
57
+ def inspect
58
+ ansi.envelope("Transaction") + "(#{@children.map(&:inspect).join(", ")})"
59
+ end
60
+
61
+ # @return [Boolean]
62
+ def ==(other)
63
+ eql?(other) or
64
+ (other.definition == @definition and
65
+ other.children == @children)
66
+ end
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ using Refinements
4
+
5
+ module Values
6
+ class TransmissionVal < AbstractVal
7
+ # @return [Array<InterchangeVal>]
8
+ attr_reader :children
9
+
10
+ def initialize(children = [])
11
+ @children = children
12
+ end
13
+
14
+ def copy(changes = {})
15
+ TransmissionVal.new(changes.fetch(:children, @children))
16
+ end
17
+
18
+ def descriptor
19
+ "root"
20
+ end
21
+
22
+ def leaf?
23
+ false
24
+ end
25
+
26
+ def transmission?
27
+ true
28
+ end
29
+
30
+ # @return [Boolean]
31
+ def ==(other)
32
+ eql?(other) or other.children == @children
33
+ end
34
+
35
+ # @return [void]
36
+ def pretty_print(q)
37
+ q.text(ansi.envelope("TransmissionVal"))
38
+ q.group(2, "(", ")") do
39
+ q.breakable ""
40
+ @children.each do |e|
41
+ unless q.current_group.first?
42
+ q.text ","
43
+ q.breakable
44
+ end
45
+ q.pp e
46
+ end
47
+ end
48
+ end
49
+
50
+ # @return [String]
51
+ def inspect
52
+ ansi.envelope("TransmissionVal") + "(#{@children.map(&:inspect).join(", ")})"
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ module Values
4
+ autoload :AbstractVal, "stupidedi/values/abstract_val"
5
+ autoload :TransmissionVal, "stupidedi/values/transmission_val"
6
+ autoload :InterchangeVal, "stupidedi/values/interchange_val"
7
+ autoload :FunctionalGroupVal, "stupidedi/values/functional_group_val"
8
+ autoload :TransactionSetVal, "stupidedi/values/transaction_set_val"
9
+
10
+ autoload :TableVal, "stupidedi/values/table_val"
11
+ autoload :LoopVal, "stupidedi/values/loop_val"
12
+ autoload :SegmentVal, "stupidedi/values/segment_val"
13
+ autoload :InvalidSegmentVal, "stupidedi/values/invalid_segment_val"
14
+ autoload :InvalidEnvelopeVal, "stupidedi/values/invalid_envelope_val"
15
+ autoload :SegmentValGroup, "stupidedi/values/segment_val_group"
16
+
17
+ autoload :AbstractElementVal, "stupidedi/values/abstract_element_val"
18
+ autoload :CompositeElementVal, "stupidedi/values/composite_element_val"
19
+ autoload :RepeatedElementVal, "stupidedi/values/repeated_element_val"
20
+ autoload :SimpleElementVal, "stupidedi/values/simple_element_val"
21
+ end
22
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ VERSION = "2.0.0"
4
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+ module Stupidedi
3
+ module Versions
4
+ module Common
5
+ module ElementReqs
6
+ Mandatory = Schema::ElementReq.new(true, false, "M")
7
+ Optional = Schema::ElementReq.new(false, false, "O")
8
+ Relational = Schema::ElementReq.new(false, false, "X")
9
+ # Flexible = Schema::ElementReq.new(false, false, "F")
10
+ end
11
+ end
12
+ end
13
+ end