stupidedi 1.1.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 (500) hide show
  1. data/README.md +215 -0
  2. data/Rakefile +108 -0
  3. data/bin/edi-ed +71 -0
  4. data/bin/edi-pp +81 -0
  5. data/doc/Defining.md +0 -0
  6. data/doc/Generating.md +321 -0
  7. data/doc/LICENSE.md +0 -0
  8. data/doc/Navigating.md +645 -0
  9. data/doc/Parsing.md +0 -0
  10. data/doc/Serializing.md +7 -0
  11. data/doc/Tokenizing.md +0 -0
  12. data/doc/Validating.md +0 -0
  13. data/doc/design/Parser.md +0 -0
  14. data/doc/design/Reader.md +0 -0
  15. data/lib/ruby/array.rb +164 -0
  16. data/lib/ruby/blank.rb +67 -0
  17. data/lib/ruby/enumerable.rb +35 -0
  18. data/lib/ruby/exception.rb +33 -0
  19. data/lib/ruby/hash.rb +4 -0
  20. data/lib/ruby/instance_exec.rb +26 -0
  21. data/lib/ruby/module.rb +79 -0
  22. data/lib/ruby/object.rb +63 -0
  23. data/lib/ruby/string.rb +73 -0
  24. data/lib/ruby/symbol.rb +24 -0
  25. data/lib/ruby/to_d.rb +81 -0
  26. data/lib/ruby/to_date.rb +33 -0
  27. data/lib/ruby/to_time.rb +24 -0
  28. data/lib/ruby/try.rb +43 -0
  29. data/lib/stupidedi/blank_slate.rb +11 -0
  30. data/lib/stupidedi/builder/builder_dsl.rb +281 -0
  31. data/lib/stupidedi/builder/constraint_table.rb +418 -0
  32. data/lib/stupidedi/builder/generation.rb +112 -0
  33. data/lib/stupidedi/builder/instruction.rb +102 -0
  34. data/lib/stupidedi/builder/instruction_table.rb +204 -0
  35. data/lib/stupidedi/builder/navigation.rb +655 -0
  36. data/lib/stupidedi/builder/state_machine.rb +55 -0
  37. data/lib/stupidedi/builder/states/abstract_state.rb +332 -0
  38. data/lib/stupidedi/builder/states/failure_state.rb +69 -0
  39. data/lib/stupidedi/builder/states/functional_group_state.rb +97 -0
  40. data/lib/stupidedi/builder/states/initial_state.rb +63 -0
  41. data/lib/stupidedi/builder/states/interchange_state.rb +94 -0
  42. data/lib/stupidedi/builder/states/loop_state.rb +79 -0
  43. data/lib/stupidedi/builder/states/table_state.rb +96 -0
  44. data/lib/stupidedi/builder/states/transaction_set_state.rb +112 -0
  45. data/lib/stupidedi/builder/states/transmission_state.rb +59 -0
  46. data/lib/stupidedi/builder/tokenization.rb +196 -0
  47. data/lib/stupidedi/builder.rb +23 -0
  48. data/lib/stupidedi/color.rb +93 -0
  49. data/lib/stupidedi/config/code_list_config.rb +42 -0
  50. data/lib/stupidedi/config/editor_config.rb +51 -0
  51. data/lib/stupidedi/config/functional_group_config.rb +62 -0
  52. data/lib/stupidedi/config/interchange_config.rb +79 -0
  53. data/lib/stupidedi/config/transaction_set_config.rb +91 -0
  54. data/lib/stupidedi/config.rb +101 -0
  55. data/lib/stupidedi/editor/00501.rb +341 -0
  56. data/lib/stupidedi/editor/005010/N2.rb +0 -0
  57. data/lib/stupidedi/editor/005010/N3.rb +0 -0
  58. data/lib/stupidedi/editor/005010/N4.rb +63 -0
  59. data/lib/stupidedi/editor/005010/NM1.rb +0 -0
  60. data/lib/stupidedi/editor/005010.rb +469 -0
  61. data/lib/stupidedi/editor/X222-HC837.rb +195 -0
  62. data/lib/stupidedi/editor/abstract_ed.rb +36 -0
  63. data/lib/stupidedi/editor/claim_ack.rb +9 -0
  64. data/lib/stupidedi/editor/implementation_ack.rb +213 -0
  65. data/lib/stupidedi/editor/interchange_ack.rb +9 -0
  66. data/lib/stupidedi/editor/result.rb +100 -0
  67. data/lib/stupidedi/editor/result_set.rb +69 -0
  68. data/lib/stupidedi/editor/transaction_set_ed.rb +275 -0
  69. data/lib/stupidedi/editor/transmission_ed.rb +90 -0
  70. data/lib/stupidedi/editor.rb +37 -0
  71. data/lib/stupidedi/either.rb +287 -0
  72. data/lib/stupidedi/exceptions/invalid_element_error.rb +8 -0
  73. data/lib/stupidedi/exceptions/invalid_schema_error.rb +8 -0
  74. data/lib/stupidedi/exceptions/output_error.rb +8 -0
  75. data/lib/stupidedi/exceptions/parse_error.rb +8 -0
  76. data/lib/stupidedi/exceptions/stupidedi_error.rb +8 -0
  77. data/lib/stupidedi/exceptions/tokenize_error.rb +8 -0
  78. data/lib/stupidedi/exceptions/zipper_error.rb +8 -0
  79. data/lib/stupidedi/exceptions.rb +11 -0
  80. data/lib/stupidedi/guides/005010/X214-HN277.rb +409 -0
  81. data/lib/stupidedi/guides/005010/X221-HP835.rb +613 -0
  82. data/lib/stupidedi/guides/005010/X221A1-HP835.rb +613 -0
  83. data/lib/stupidedi/guides/005010/X222-HC837P.rb +2291 -0
  84. data/lib/stupidedi/guides/005010/X222A1-HC837P.rb +2297 -0
  85. data/lib/stupidedi/guides/005010/X231-FA999.rb +123 -0
  86. data/lib/stupidedi/guides/005010/X231A1-FA999.rb +119 -0
  87. data/lib/stupidedi/guides/005010/element_reqs.rb +38 -0
  88. data/lib/stupidedi/guides/005010/guide_builder.rb +180 -0
  89. data/lib/stupidedi/guides/005010/segment_reqs.rb +32 -0
  90. data/lib/stupidedi/guides/005010.rb +64 -0
  91. data/lib/stupidedi/guides.rb +5 -0
  92. data/lib/stupidedi/inspect.rb +26 -0
  93. data/lib/stupidedi/reader/input/abstract_input.rb +133 -0
  94. data/lib/stupidedi/reader/input/delegated_input.rb +111 -0
  95. data/lib/stupidedi/reader/input/file_input.rb +155 -0
  96. data/lib/stupidedi/reader/input.rb +30 -0
  97. data/lib/stupidedi/reader/position.rb +69 -0
  98. data/lib/stupidedi/reader/result.rb +168 -0
  99. data/lib/stupidedi/reader/segment_dict.rb +175 -0
  100. data/lib/stupidedi/reader/separators.rb +85 -0
  101. data/lib/stupidedi/reader/stream_reader.rb +172 -0
  102. data/lib/stupidedi/reader/token_reader.rb +466 -0
  103. data/lib/stupidedi/reader/tokens/component_element_tok.rb +56 -0
  104. data/lib/stupidedi/reader/tokens/composite_element_tok.rb +64 -0
  105. data/lib/stupidedi/reader/tokens/repeated_element_tok.rb +64 -0
  106. data/lib/stupidedi/reader/tokens/segment_tok.rb +51 -0
  107. data/lib/stupidedi/reader/tokens/simple_element_tok.rb +63 -0
  108. data/lib/stupidedi/reader.rb +121 -0
  109. data/lib/stupidedi/schema/abstract_def.rb +74 -0
  110. data/lib/stupidedi/schema/abstract_use.rb +73 -0
  111. data/lib/stupidedi/schema/code_list.rb +94 -0
  112. data/lib/stupidedi/schema/element_def.rb +173 -0
  113. data/lib/stupidedi/schema/element_req.rb +56 -0
  114. data/lib/stupidedi/schema/element_use.rb +251 -0
  115. data/lib/stupidedi/schema/functional_group_def.rb +114 -0
  116. data/lib/stupidedi/schema/interchange_def.rb +93 -0
  117. data/lib/stupidedi/schema/loop_def.rb +152 -0
  118. data/lib/stupidedi/schema/repeat_count.rb +85 -0
  119. data/lib/stupidedi/schema/segment_def.rb +108 -0
  120. data/lib/stupidedi/schema/segment_req.rb +43 -0
  121. data/lib/stupidedi/schema/segment_use.rb +98 -0
  122. data/lib/stupidedi/schema/syntax_note.rb +63 -0
  123. data/lib/stupidedi/schema/table_def.rb +139 -0
  124. data/lib/stupidedi/schema/transaction_set_def.rb +88 -0
  125. data/lib/stupidedi/schema.rb +28 -0
  126. data/lib/stupidedi/sets/absolute_set.rb +297 -0
  127. data/lib/stupidedi/sets/abstract_set.rb +174 -0
  128. data/lib/stupidedi/sets/null_set.rb +125 -0
  129. data/lib/stupidedi/sets/relative_complement.rb +137 -0
  130. data/lib/stupidedi/sets/relative_set.rb +269 -0
  131. data/lib/stupidedi/sets/universal_set.rb +104 -0
  132. data/lib/stupidedi/sets.rb +57 -0
  133. data/lib/stupidedi/tail_call.rb +109 -0
  134. data/lib/stupidedi/thread_local.rb +174 -0
  135. data/lib/stupidedi/values/abstract_element_val.rb +19 -0
  136. data/lib/stupidedi/values/abstract_val.rb +130 -0
  137. data/lib/stupidedi/values/composite_element_val.rb +95 -0
  138. data/lib/stupidedi/values/functional_group_val.rb +102 -0
  139. data/lib/stupidedi/values/interchange_val.rb +86 -0
  140. data/lib/stupidedi/values/invalid_envelope_val.rb +61 -0
  141. data/lib/stupidedi/values/invalid_segment_val.rb +78 -0
  142. data/lib/stupidedi/values/loop_val.rb +70 -0
  143. data/lib/stupidedi/values/repeated_element_val.rb +105 -0
  144. data/lib/stupidedi/values/segment_val.rb +104 -0
  145. data/lib/stupidedi/values/segment_val_group.rb +20 -0
  146. data/lib/stupidedi/values/simple_element_val.rb +80 -0
  147. data/lib/stupidedi/values/table_val.rb +66 -0
  148. data/lib/stupidedi/values/transaction_set_val.rb +66 -0
  149. data/lib/stupidedi/values/transmission_val.rb +52 -0
  150. data/lib/stupidedi/values.rb +21 -0
  151. data/lib/stupidedi/version.rb +3 -0
  152. data/lib/stupidedi/versions/functional_groups/004010/element_defs.rb +54 -0
  153. data/lib/stupidedi/versions/functional_groups/004010/element_reqs.rb +18 -0
  154. data/lib/stupidedi/versions/functional_groups/004010/element_types/date_val.rb +527 -0
  155. data/lib/stupidedi/versions/functional_groups/004010/element_types/fixnum_val.rb +335 -0
  156. data/lib/stupidedi/versions/functional_groups/004010/element_types/float_val.rb +299 -0
  157. data/lib/stupidedi/versions/functional_groups/004010/element_types/identifier_val.rb +287 -0
  158. data/lib/stupidedi/versions/functional_groups/004010/element_types/string_val.rb +338 -0
  159. data/lib/stupidedi/versions/functional_groups/004010/element_types/time_val.rb +309 -0
  160. data/lib/stupidedi/versions/functional_groups/004010/element_types.rb +124 -0
  161. data/lib/stupidedi/versions/functional_groups/004010/functional_group_def.rb +30 -0
  162. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/GE.rb +20 -0
  163. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/GS.rb +27 -0
  164. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/SE.rb +20 -0
  165. data/lib/stupidedi/versions/functional_groups/004010/segment_defs/ST.rb +20 -0
  166. data/lib/stupidedi/versions/functional_groups/004010/segment_defs.rb +23 -0
  167. data/lib/stupidedi/versions/functional_groups/004010/segment_reqs.rb +18 -0
  168. data/lib/stupidedi/versions/functional_groups/004010/syntax_notes.rb +174 -0
  169. data/lib/stupidedi/versions/functional_groups/004010.rb +38 -0
  170. data/lib/stupidedi/versions/functional_groups/005010/element_defs.rb +1405 -0
  171. data/lib/stupidedi/versions/functional_groups/005010/element_reqs.rb +18 -0
  172. data/lib/stupidedi/versions/functional_groups/005010/element_types/date_val.rb +577 -0
  173. data/lib/stupidedi/versions/functional_groups/005010/element_types/fixnum_val.rb +322 -0
  174. data/lib/stupidedi/versions/functional_groups/005010/element_types/float_val.rb +354 -0
  175. data/lib/stupidedi/versions/functional_groups/005010/element_types/identifier_val.rb +368 -0
  176. data/lib/stupidedi/versions/functional_groups/005010/element_types/operators.rb +117 -0
  177. data/lib/stupidedi/versions/functional_groups/005010/element_types/string_val.rb +398 -0
  178. data/lib/stupidedi/versions/functional_groups/005010/element_types/time_val.rb +327 -0
  179. data/lib/stupidedi/versions/functional_groups/005010/element_types.rb +132 -0
  180. data/lib/stupidedi/versions/functional_groups/005010/functional_group_def.rb +30 -0
  181. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK1.rb +21 -0
  182. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK2.rb +21 -0
  183. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AK9.rb +28 -0
  184. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/AMT.rb +21 -0
  185. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/BHT.rb +24 -0
  186. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/BPR.rb +49 -0
  187. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CAS.rb +56 -0
  188. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CL1.rb +22 -0
  189. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CLM.rb +41 -0
  190. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CLP.rb +34 -0
  191. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CN1.rb +24 -0
  192. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR1.rb +32 -0
  193. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR2.rb +35 -0
  194. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CR3.rb +25 -0
  195. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CRC.rb +26 -0
  196. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CTP.rb +36 -0
  197. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CTX.rb +24 -0
  198. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/CUR.rb +57 -0
  199. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DMG.rb +34 -0
  200. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DN1.rb +22 -0
  201. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DN2.rb +24 -0
  202. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DTM.rb +24 -0
  203. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/DTP.rb +21 -0
  204. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/FRM.rb +25 -0
  205. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/GE.rb +20 -0
  206. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/GS.rb +27 -0
  207. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HCP.rb +39 -0
  208. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HI.rb +31 -0
  209. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/HL.rb +22 -0
  210. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK3.rb +22 -0
  211. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK4.rb +22 -0
  212. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/IK5.rb +24 -0
  213. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/K3.rb +21 -0
  214. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LIN.rb +69 -0
  215. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LQ.rb +22 -0
  216. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/LX.rb +19 -0
  217. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MEA.rb +39 -0
  218. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MIA.rb +45 -0
  219. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/MOA.rb +28 -0
  220. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N1.rb +24 -0
  221. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N2.rb +20 -0
  222. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N3.rb +20 -0
  223. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/N4.rb +30 -0
  224. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/NM1.rb +35 -0
  225. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/NTE.rb +20 -0
  226. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/OI.rb +24 -0
  227. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PAT.rb +31 -0
  228. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PER.rb +32 -0
  229. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PLB.rb +40 -0
  230. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PRV.rb +26 -0
  231. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PS1.rb +21 -0
  232. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/PWK.rb +30 -0
  233. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/QTY.rb +25 -0
  234. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/RDM.rb +23 -0
  235. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/REF.rb +23 -0
  236. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SBR.rb +28 -0
  237. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SE.rb +20 -0
  238. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/ST.rb +21 -0
  239. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/STC.rb +30 -0
  240. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV1.rb +44 -0
  241. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV2.rb +29 -0
  242. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV3.rb +30 -0
  243. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SV5.rb +29 -0
  244. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SVC.rb +26 -0
  245. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/SVD.rb +24 -0
  246. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TOO.rb +21 -0
  247. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TRN.rb +22 -0
  248. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TS2.rb +40 -0
  249. data/lib/stupidedi/versions/functional_groups/005010/segment_defs/TS3.rb +45 -0
  250. data/lib/stupidedi/versions/functional_groups/005010/segment_defs.rb +227 -0
  251. data/lib/stupidedi/versions/functional_groups/005010/segment_reqs.rb +18 -0
  252. data/lib/stupidedi/versions/functional_groups/005010/syntax_notes.rb +165 -0
  253. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/FA999.rb +38 -0
  254. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HB271.rb +85 -0
  255. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HC837.rb +163 -0
  256. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HI278.rb +64 -0
  257. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HN277.rb +74 -0
  258. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HP835.rb +68 -0
  259. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HR276.rb +57 -0
  260. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/HS270.rb +53 -0
  261. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs/RA820.rb +240 -0
  262. data/lib/stupidedi/versions/functional_groups/005010/transaction_set_defs.rb +68 -0
  263. data/lib/stupidedi/versions/functional_groups/005010.rb +38 -0
  264. data/lib/stupidedi/versions/functional_groups.rb +8 -0
  265. data/lib/stupidedi/versions/interchanges/00401/element_defs.rb +224 -0
  266. data/lib/stupidedi/versions/interchanges/00401/interchange_def.rb +45 -0
  267. data/lib/stupidedi/versions/interchanges/00401/segment_defs/IEA.rb +20 -0
  268. data/lib/stupidedi/versions/interchanges/00401/segment_defs/ISA.rb +34 -0
  269. data/lib/stupidedi/versions/interchanges/00401/segment_defs/TA1.rb +23 -0
  270. data/lib/stupidedi/versions/interchanges/00401/segment_defs.rb +28 -0
  271. data/lib/stupidedi/versions/interchanges/00401.rb +23 -0
  272. data/lib/stupidedi/versions/interchanges/00501/element_defs.rb +269 -0
  273. data/lib/stupidedi/versions/interchanges/00501/interchange_def.rb +47 -0
  274. data/lib/stupidedi/versions/interchanges/00501/segment_defs/IEA.rb +20 -0
  275. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISA.rb +34 -0
  276. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISB.rb +18 -0
  277. data/lib/stupidedi/versions/interchanges/00501/segment_defs/ISE.rb +18 -0
  278. data/lib/stupidedi/versions/interchanges/00501/segment_defs/TA1.rb +23 -0
  279. data/lib/stupidedi/versions/interchanges/00501/segment_defs/TA3.rb +18 -0
  280. data/lib/stupidedi/versions/interchanges/00501/segment_defs.rb +37 -0
  281. data/lib/stupidedi/versions/interchanges/00501.rb +23 -0
  282. data/lib/stupidedi/versions/interchanges.rb +8 -0
  283. data/lib/stupidedi/versions.rb +6 -0
  284. data/lib/stupidedi/writer/claredi.rb +142 -0
  285. data/lib/stupidedi/writer/default.rb +124 -0
  286. data/lib/stupidedi/writer.rb +6 -0
  287. data/lib/stupidedi/zipper/abstract_cursor.rb +351 -0
  288. data/lib/stupidedi/zipper/dangling_cursor.rb +103 -0
  289. data/lib/stupidedi/zipper/edited_cursor.rb +157 -0
  290. data/lib/stupidedi/zipper/memoized_cursor.rb +131 -0
  291. data/lib/stupidedi/zipper/path.rb +124 -0
  292. data/lib/stupidedi/zipper/root_cursor.rb +120 -0
  293. data/lib/stupidedi/zipper.rb +25 -0
  294. data/lib/stupidedi.rb +66 -0
  295. data/spec/examples/integration/generating.example +551 -0
  296. data/spec/examples/integration/navigating.example +214 -0
  297. data/spec/examples/integration/parsing.example +445 -0
  298. data/spec/examples/ruby/array.example +476 -0
  299. data/spec/examples/ruby/blank.example +62 -0
  300. data/spec/examples/ruby/count.example +68 -0
  301. data/spec/examples/ruby/object.example +99 -0
  302. data/spec/examples/ruby/string.example +111 -0
  303. data/spec/examples/ruby/symbol.example +117 -0
  304. data/spec/examples/ruby/to_d.example +90 -0
  305. data/spec/examples/ruby/try.example +50 -0
  306. data/spec/examples/stupidedi/either.example +375 -0
  307. data/spec/examples/stupidedi/reader/failure.example +68 -0
  308. data/spec/examples/stupidedi/reader/input/delegated_input.example +292 -0
  309. data/spec/examples/stupidedi/reader/separators.example +73 -0
  310. data/spec/examples/stupidedi/reader/stream_reader.example +48 -0
  311. data/spec/examples/stupidedi/reader/success.example +34 -0
  312. data/spec/examples/stupidedi/reader/token_reader.example +775 -0
  313. data/spec/examples/stupidedi/reader.example +168 -0
  314. data/spec/examples/stupidedi/sets/absolute_set.example +1577 -0
  315. data/spec/examples/stupidedi/sets/null_set.example +2 -0
  316. data/spec/examples/stupidedi/sets/relative_set.example +2 -0
  317. data/spec/examples/stupidedi/sets/universal_set.example +1 -0
  318. data/spec/examples/stupidedi/versions/005010/element_types/an.example +201 -0
  319. data/spec/examples/stupidedi/versions/005010/element_types/dt.example +258 -0
  320. data/spec/examples/stupidedi/versions/005010/element_types/id.example +192 -0
  321. data/spec/examples/stupidedi/versions/005010/element_types/nn.example +177 -0
  322. data/spec/examples/stupidedi/versions/005010/element_types/r.example +178 -0
  323. data/spec/examples/stupidedi/versions/005010/element_types/tm.example +2 -0
  324. data/spec/examples/stupidedi/zipper/abstract_cursor.example +417 -0
  325. data/spec/examples/stupidedi/zipper.example +9 -0
  326. data/spec/fixtures/X186-AG824/1-bad.txt +21 -0
  327. data/spec/fixtures/X186-AG824/1-good.txt +17 -0
  328. data/spec/fixtures/X186-AG824/2-bad.txt +26 -0
  329. data/spec/fixtures/X186-AG824/2-good.txt +21 -0
  330. data/spec/fixtures/X186-AG824/3-bad.txt +87 -0
  331. data/spec/fixtures/X186-AG824/3-good.txt +61 -0
  332. data/spec/fixtures/X212-HN277/1-bad.txt +54 -0
  333. data/spec/fixtures/X212-HN277/1-good.txt +46 -0
  334. data/spec/fixtures/X212-HN277/2-bad.txt +37 -0
  335. data/spec/fixtures/X212-HN277/2-good.txt +29 -0
  336. data/spec/fixtures/X212-HN277/3-bad.txt +22 -0
  337. data/spec/fixtures/X212-HN277/3-good.txt +17 -0
  338. data/spec/fixtures/X212-HN277/4-bad.txt +30 -0
  339. data/spec/fixtures/X212-HN277/4-good.txt +24 -0
  340. data/spec/fixtures/X212-HR276/1-bad.txt +53 -0
  341. data/spec/fixtures/X212-HR276/1-good.txt +46 -0
  342. data/spec/fixtures/X212-HR276/2-bad.txt +45 -0
  343. data/spec/fixtures/X212-HR276/2-good.txt +38 -0
  344. data/spec/fixtures/X212-HR276/3-bad.txt +32 -0
  345. data/spec/fixtures/X212-HR276/3-good.txt +26 -0
  346. data/spec/fixtures/X212-HR276/4-bad.txt +32 -0
  347. data/spec/fixtures/X212-HR276/4-good.txt +26 -0
  348. data/spec/fixtures/X214-HN277/1-bad.txt +58 -0
  349. data/spec/fixtures/X214-HN277/1-good.txt +47 -0
  350. data/spec/fixtures/X214-HN277/2-bad.txt +34 -0
  351. data/spec/fixtures/X214-HN277/2-good.txt +22 -0
  352. data/spec/fixtures/X214-HN277/3-bad.txt +64 -0
  353. data/spec/fixtures/X214-HN277/3-good.txt +54 -0
  354. data/spec/fixtures/X214-HN277/4-bad.txt +77 -0
  355. data/spec/fixtures/X214-HN277/4-good.txt +63 -0
  356. data/spec/fixtures/X216-HI278/1-bad.txt +42 -0
  357. data/spec/fixtures/X216-HI278/1-good.txt +27 -0
  358. data/spec/fixtures/X216-HI278/2-bad.txt +43 -0
  359. data/spec/fixtures/X216-HI278/2-good.txt +29 -0
  360. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-1.txt +24 -0
  361. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-1_Clean.txt +20 -0
  362. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-2.txt +46 -0
  363. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-2_Clean.txt +30 -0
  364. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-3.txt +38 -0
  365. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-3_Clean.txt +24 -0
  366. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4a.txt +39 -0
  367. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4a_Clean.txt +24 -0
  368. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4b.txt +43 -0
  369. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-4b_Clean.txt +25 -0
  370. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-5.txt +63 -0
  371. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-5_Clean.txt +41 -0
  372. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-6.txt +36 -0
  373. data/spec/fixtures/X217-HI278/Sample_278_Request_5010X217-6_Clean.txt +20 -0
  374. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-1r.txt +34 -0
  375. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-1r_Clean.txt +23 -0
  376. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-2r.txt +46 -0
  377. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-2r_Clean.txt +31 -0
  378. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-3r.txt +44 -0
  379. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-3r_Clean.txt +26 -0
  380. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-4ar_Clean.txt +28 -0
  381. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-4br_Clean.txt +35 -0
  382. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-5r.txt +60 -0
  383. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-5r_Clean.txt +42 -0
  384. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-6r.txt +40 -0
  385. data/spec/fixtures/X217-HI278/Sample_278_Response_5010X217-6r_Clean.txt +24 -0
  386. data/spec/fixtures/X218-RA820/1-bad.txt +31 -0
  387. data/spec/fixtures/X218-RA820/1-good.txt +25 -0
  388. data/spec/fixtures/X218-RA820/2-bad.txt +37 -0
  389. data/spec/fixtures/X218-RA820/2-good.txt +29 -0
  390. data/spec/fixtures/X218-RA820/3-bad.txt +29 -0
  391. data/spec/fixtures/X218-RA820/3-good.txt +23 -0
  392. data/spec/fixtures/X218-RA820/4-bad.txt +36 -0
  393. data/spec/fixtures/X218-RA820/4-good.txt +27 -0
  394. data/spec/fixtures/X220-BE834/1-bad.txt +35 -0
  395. data/spec/fixtures/X220-BE834/1-good.txt +29 -0
  396. data/spec/fixtures/X220-BE834/10-bad.txt +26 -0
  397. data/spec/fixtures/X220-BE834/10-good.txt +19 -0
  398. data/spec/fixtures/X220-BE834/2-bad.txt +31 -0
  399. data/spec/fixtures/X220-BE834/2-good.txt +23 -0
  400. data/spec/fixtures/X220-BE834/3-bad.txt +36 -0
  401. data/spec/fixtures/X220-BE834/3-good.txt +26 -0
  402. data/spec/fixtures/X220-BE834/4-bad.txt +27 -0
  403. data/spec/fixtures/X220-BE834/4-good.txt +21 -0
  404. data/spec/fixtures/X220-BE834/5-bad.txt +26 -0
  405. data/spec/fixtures/X220-BE834/5-good.txt +17 -0
  406. data/spec/fixtures/X220-BE834/6-bad.txt +25 -0
  407. data/spec/fixtures/X220-BE834/6-good.txt +20 -0
  408. data/spec/fixtures/X220-BE834/7-bad.txt +25 -0
  409. data/spec/fixtures/X220-BE834/7-good.txt +20 -0
  410. data/spec/fixtures/X220-BE834/8-bad.txt +25 -0
  411. data/spec/fixtures/X220-BE834/8-good.txt +20 -0
  412. data/spec/fixtures/X220-BE834/9-bad.txt +27 -0
  413. data/spec/fixtures/X220-BE834/9-good.txt +21 -0
  414. data/spec/fixtures/X221-HP835/1-bad.txt +58 -0
  415. data/spec/fixtures/X221-HP835/1-good.txt +40 -0
  416. data/spec/fixtures/X221-HP835/2-bad.txt +51 -0
  417. data/spec/fixtures/X221-HP835/2-good.txt +40 -0
  418. data/spec/fixtures/X221-HP835/3a-bad.txt +78 -0
  419. data/spec/fixtures/X221-HP835/3a-good.txt +49 -0
  420. data/spec/fixtures/X221-HP835/3b-bad.txt +60 -0
  421. data/spec/fixtures/X221-HP835/3b-good.txt +32 -0
  422. data/spec/fixtures/X221-HP835/3c-bad.txt +55 -0
  423. data/spec/fixtures/X221-HP835/3c-good.txt +34 -0
  424. data/spec/fixtures/X222-HC837/1-bad.txt +60 -0
  425. data/spec/fixtures/X222-HC837/1-good.txt +53 -0
  426. data/spec/fixtures/X222-HC837/10a-bad.txt +52 -0
  427. data/spec/fixtures/X222-HC837/10a-good.txt +40 -0
  428. data/spec/fixtures/X222-HC837/10b-bad.txt +99 -0
  429. data/spec/fixtures/X222-HC837/10b-good.txt +80 -0
  430. data/spec/fixtures/X222-HC837/10c-bad.txt +105 -0
  431. data/spec/fixtures/X222-HC837/10c-good.txt +80 -0
  432. data/spec/fixtures/X222-HC837/11-bad.txt +69 -0
  433. data/spec/fixtures/X222-HC837/11-good.txt +45 -0
  434. data/spec/fixtures/X222-HC837/12-bad.txt +73 -0
  435. data/spec/fixtures/X222-HC837/12-good.txt +51 -0
  436. data/spec/fixtures/X222-HC837/13-bad.txt +64 -0
  437. data/spec/fixtures/X222-HC837/13-good.txt +46 -0
  438. data/spec/fixtures/X222-HC837/3a-bad.txt +83 -0
  439. data/spec/fixtures/X222-HC837/3a-good.txt +59 -0
  440. data/spec/fixtures/X222-HC837/3b-bad.txt +97 -0
  441. data/spec/fixtures/X222-HC837/3b-good.txt +70 -0
  442. data/spec/fixtures/X222-HC837/3c-bad.txt +95 -0
  443. data/spec/fixtures/X222-HC837/3c-good.txt +74 -0
  444. data/spec/fixtures/X222-HC837/4-bad.txt +67 -0
  445. data/spec/fixtures/X222-HC837/4-good.txt +48 -0
  446. data/spec/fixtures/X222-HC837/5-bad.txt +73 -0
  447. data/spec/fixtures/X222-HC837/5-good.txt +60 -0
  448. data/spec/fixtures/X222-HC837/6-bad.txt +50 -0
  449. data/spec/fixtures/X222-HC837/6-good.txt +39 -0
  450. data/spec/fixtures/X222-HC837/7-bad.txt +93 -0
  451. data/spec/fixtures/X222-HC837/7-good.txt +78 -0
  452. data/spec/fixtures/X222-HC837/8-bad.txt +64 -0
  453. data/spec/fixtures/X222-HC837/8-good.txt +52 -0
  454. data/spec/fixtures/X222-HC837/9-bad.txt +56 -0
  455. data/spec/fixtures/X222-HC837/9-good.txt +38 -0
  456. data/spec/fixtures/X223-HC837/1-bad.txt +66 -0
  457. data/spec/fixtures/X223-HC837/1-good.txt +53 -0
  458. data/spec/fixtures/X223-HC837/2-bad.txt +69 -0
  459. data/spec/fixtures/X223-HC837/2-good.txt +60 -0
  460. data/spec/fixtures/X223-HC837/3-bad.txt +89 -0
  461. data/spec/fixtures/X223-HC837/3-good.txt +61 -0
  462. data/spec/fixtures/X223-HC837/4-bad.txt +60 -0
  463. data/spec/fixtures/X223-HC837/4-good.txt +40 -0
  464. data/spec/fixtures/X223-HC837/5-bad.txt +75 -0
  465. data/spec/fixtures/X223-HC837/5-good.txt +58 -0
  466. data/spec/fixtures/X224-HC837/1-bad.txt +54 -0
  467. data/spec/fixtures/X224-HC837/1-good.txt +44 -0
  468. data/spec/fixtures/X224-HC837/2a-bad.txt +52 -0
  469. data/spec/fixtures/X224-HC837/2a-good.txt +42 -0
  470. data/spec/fixtures/X224-HC837/2b-bad.txt +67 -0
  471. data/spec/fixtures/X224-HC837/2b-good.txt +52 -0
  472. data/spec/fixtures/X224-HC837/3-bad.txt +67 -0
  473. data/spec/fixtures/X224-HC837/3-good.txt +51 -0
  474. data/spec/fixtures/X224-HC837/4-bad.txt +49 -0
  475. data/spec/fixtures/X224-HC837/4-good.txt +40 -0
  476. data/spec/fixtures/X230-FA997/1-bad.txt +19 -0
  477. data/spec/fixtures/X230-FA997/1-good.txt +16 -0
  478. data/spec/fixtures/X231-FA999/1-bad.txt +20 -0
  479. data/spec/fixtures/X231-FA999/1-good.txt +20 -0
  480. data/spec/fixtures/X279-HB271/1-bad.txt +36 -0
  481. data/spec/fixtures/X279-HB271/1-good.txt +30 -0
  482. data/spec/fixtures/X279-HB271/2-bad.txt +22 -0
  483. data/spec/fixtures/X279-HB271/2-good.txt +16 -0
  484. data/spec/fixtures/X279-HB271/3-bad.txt +44 -0
  485. data/spec/fixtures/X279-HB271/3-good.txt +36 -0
  486. data/spec/fixtures/X279-HS270/1-bad.txt +29 -0
  487. data/spec/fixtures/X279-HS270/1-good.txt +23 -0
  488. data/spec/fixtures/X279-HS270/2-bad.txt +32 -0
  489. data/spec/fixtures/X279-HS270/2-good.txt +25 -0
  490. data/spec/spec_helper.rb +34 -0
  491. data/spec/support/fixtures.rb +26 -0
  492. data/spec/support/matchers/either_matchers.rb +26 -0
  493. data/spec/support/matchers/navigation_matchers.rb +247 -0
  494. data/spec/support/node.rb +41 -0
  495. data/spec/support/quickcheck/characters.rb +28 -0
  496. data/spec/support/quickcheck/property.rb +105 -0
  497. data/spec/support/quickcheck/serialized_edi.rb +399 -0
  498. data/spec/support/quickcheck.rb +302 -0
  499. data/spec/support/rcov.rb +34 -0
  500. metadata +577 -0
@@ -0,0 +1,213 @@
1
+ module Stupidedi
2
+ module Editor
3
+
4
+ # Generates an FA 999 acknowledgement
5
+ class ImplementationAck
6
+
7
+ def initialize(zipper, builder)
8
+ @builder = builder
9
+ @zipper = zipper
10
+ end
11
+
12
+ def generate
13
+ @builder.ST("999", @builder.blank, "005010X231")
14
+
15
+ # GS01, GS06, and GS08 must all be present and valid. It is not clear
16
+ # how to respond when these elements are not valid (eg not an allowed
17
+ # value, not a number, too longo too short, etc) because copying the
18
+ # value to AK1 generates an invalid AK1 segment.
19
+ @builder.AK1(gs.element(1), # GS01: Functional Identifier
20
+ gs.element(6), # GS06: Group Control Number
21
+ gs.element(8)) # GS08: Industry Identifier
22
+
23
+ # ST01, ST02, and ST03 must all be present and valid. Like the AK1/GS
24
+ # paradox, there isn't a way to generate a valid response when the
25
+ # elements being acknowledged are not valid.
26
+ @builder.AK2(st.element(1), # ST01: Transaction Set Identifier Code
27
+ st.element(2), # ST02: Transaction Set Control Number
28
+ st.element(3)) # ST03: Implementation Guide Version
29
+
30
+ # M ID(2/3), M N0(1/10), O AN(1/4), O ID(1/3)
31
+ @builder.IK3(segment_id, segment_pos, loop_id, error_code)
32
+ # 1: Unrecoginzed segment ID
33
+ # 2: Unexpected segment
34
+ # 3: Required segment missing
35
+ # 4: Loop occurs over maximum times
36
+ # 5: Segment exceeds maximum use
37
+ # 6: Segment not defined in transaction set
38
+ # 7: Segment not in proper sequence
39
+ # 8: Segment has data element errors
40
+ # I4: Implementation "not used" segment present
41
+ # I6: Implementation situationally required segment missing
42
+ # I7: Implementation loop occurs under minimum times
43
+ # I8: Implementation segment below minimum use
44
+ # I9: Implementation situationally "not used" segment present
45
+
46
+ ### Required when IK304 = "I..."
47
+ ##@builder.CTX(
48
+ ## @builder.composite("SITUATIONAL TRIGGER"),
49
+ ## segment_id,
50
+ ## segment_pos,
51
+ ## loop_id,
52
+ ## # Following two composites are required if the failed requirement
53
+ ## # relates to an individual element, otherwise do not send
54
+ ## @builder.composite(element_pos, component_pos, repeated_pos),
55
+ ## @builder.composite(element_ref, component_ref))
56
+
57
+ ##@builder.CTX(
58
+ ### @builder.composite("TRN02", trn.element(2))
59
+ ### @builder.composite("NM109", nm1.element(9))
60
+ ### @builder.composite("ENT01", ent.element(1))
61
+ ### @builder.composite("REF02", ref.element(2))
62
+ ### @builder.composite("CLM01", clm.element(1)))
63
+
64
+ # M C030, O N0(1/4), M ID(1/3), O AN(1/99)
65
+ @builder.IK4(
66
+ @builder.composite(element_pos, component_pos, repeated_pos),
67
+ element_ref,
68
+ error_code,
69
+ element_data)
70
+ # Required when IK304 = "8"
71
+ # 1: Required data element missing
72
+ # 2: Conditional required data element missing
73
+ # 3: Too many data elements
74
+ # 4: Data element too short
75
+ # 5: Data element too long
76
+ # 6: Invalid character in data element
77
+ # 7: Invalid code value
78
+ # 8: Invalid date
79
+ # 9: Invalid time
80
+ # 10: Exclusion condition violated
81
+ # 12: Too many repetitions
82
+ # 13: Too many components
83
+ # I10: Implementation "not used" data element present
84
+ # I11: Implementation too few repetitions
85
+ # I12: Implementation pattern match failure
86
+ # I13: Implementation situationally "not used" data element present
87
+ # I6: Code value not used in implementation
88
+ # I9: Implementation situationally required data element missing
89
+
90
+ ### Required when IK404 = "I..."
91
+ ##@builder.CTX(
92
+ ## @builder.composite("SITUATIONAL TRIGGER"),
93
+ ## segment_id,
94
+ ## segment_pos,
95
+ ## loop_id,
96
+ ## @builder.composite(element_pos, component_pos, repeated_pos),
97
+ ## @builder.composite(element_ref, component_ref))
98
+
99
+
100
+ @builder.IK5(
101
+ acknowledgement_code,
102
+ error_code,
103
+ error_code,
104
+ error_code,
105
+ error_code,
106
+ error_code)
107
+ # A: Accepted
108
+ # E: Accepted but errors were noted
109
+ # R: Rejected
110
+ #
111
+ # 1: Transaction set not supported
112
+ # 2: Transaction set trailer missing
113
+ # 3: Transaction set control number in header and trailer do not match
114
+ # 4: Number of included segments does not match actual count
115
+ # 5: One or more segments in error
116
+ # 6: Missing or invalid transaction set identifier
117
+ # 7: Missing or invalid transaction set control number
118
+ # 17: Security not supported
119
+ # 18: Transaction set not in functional group
120
+ # 19: Invalid transaction set implementation convention reference
121
+ # 23: Transaction set control number not unique within the functional group
122
+ # I5: Implementation one or more segments in error
123
+ # I6: Implementation convention not supported
124
+
125
+ @builder.AK9(
126
+ acknowledgement_code,
127
+ included_count,
128
+ received_count,
129
+ accepted_count,
130
+ error_code,
131
+ error_code,
132
+ error_code,
133
+ error_code,
134
+ error_code)
135
+ # A: Accepted
136
+ # E: Accepted, but errors were found
137
+ # P: Partially accepted, at least one transaction set was rejected
138
+ # R: Rejecetd
139
+ #
140
+ # 1: Funcitonal group not supported
141
+ # 2: Functional group version not supported
142
+ # 3: Funcitonal group trailer missing
143
+ # 4: Group control number in the functional group header and trailer do not agree
144
+ # 5: Number of included transaction sets does not match actual count
145
+ # 6: Group control number violates syntax
146
+ # 16: Security not supported
147
+ # 19: Functional group control number not unique within interchange
148
+
149
+ @builder.ST(count, @builder.blank)
150
+ end
151
+
152
+ private
153
+
154
+ def validate(node)
155
+ if node.element?
156
+ if node.simple?
157
+ unless node.valid?
158
+ # 6: Invalid character in data element
159
+ # 8: Invalid date
160
+ # 9: Invalid time
161
+ end
162
+ # 3: Too many data elements
163
+ # I10: Implementation "not used" data element present
164
+ # I11: Implementation too few repetitions
165
+ # I12: Implementation pattern match failure
166
+ # I6: Code value not used in implementation
167
+
168
+ if node.empty?
169
+ # 1: Required data element missing
170
+ # 2: Conditional required data element missing
171
+ # I9: Implementation situationally required data element missing
172
+ else
173
+ # 10: Exclusion condition violated
174
+ # I13: Implementation situationally "not used" data element present
175
+
176
+ if node.too_long?
177
+ # 5: Data element too long
178
+ elsif node.too_short?
179
+ # 4: Data element too short
180
+ end
181
+
182
+ # 7: Invalid code value
183
+ unless node.allowed?
184
+ end
185
+ end
186
+ elsif node.repeated?
187
+ # 12: Too many repetitions
188
+ elsif node.composite?
189
+ # 13: Too many components
190
+ end
191
+ elsif node.segment?
192
+ if node.valid?
193
+ else
194
+ # 1: Unrecoginzed segment ID
195
+ # 2: Unexpected segment
196
+ # 6: Segment not defined in transaction set
197
+ # 7: Segment not in proper sequence
198
+ # I4: Implementation "not used" segment present
199
+ end
200
+ # 3: Required segment missing
201
+ # 4: Loop occurs over maximum times
202
+ # 5: Segment exceeds maximum use
203
+ # 8: Segment has data element errors
204
+ # I6: Implementation situationally required segment missing
205
+ # I7: Implementation loop occurs under minimum times
206
+ # I8: Implementation segment below minimum use
207
+ # I9: Implementation situationally "not used" segment present
208
+ end
209
+ end
210
+ end
211
+
212
+ end
213
+ end
@@ -0,0 +1,9 @@
1
+ module Stupidedi
2
+ module Editor
3
+
4
+ # Generates a TA1 acknowledgment
5
+ class InterchangeAck
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,100 @@
1
+ module Stupidedi
2
+ module Editor
3
+
4
+ class Result
5
+
6
+ # @return [Zipper::AbstractCursor]
7
+ abstract :zipper
8
+
9
+ # @return [String]
10
+ abstract :reason
11
+
12
+ def error?
13
+ false
14
+ end
15
+
16
+ def warning?
17
+ false
18
+ end
19
+ end
20
+
21
+ class Warning < Result
22
+
23
+ # @return [Zipper::AbstractCursor]
24
+ attr_reader :zipper
25
+
26
+ # @return [String]
27
+ attr_reader :reason
28
+
29
+ def initialize(zipper, reason)
30
+ @zipper, @reason =
31
+ zipper, reason
32
+ end
33
+
34
+ # @return [String]
35
+ def inspect
36
+ "Warning(#{@reason}, #{@zipper.node.inspect})"
37
+ end
38
+
39
+ def warning?
40
+ true
41
+ end
42
+ end
43
+
44
+ class Error < Result
45
+
46
+ # @return [Zipper::AbstractCursor]
47
+ attr_reader :zipper
48
+
49
+ # @return [String]
50
+ attr_reader :reason
51
+
52
+ # @return [String]
53
+ attr_reader :action
54
+
55
+ # @return [String]
56
+ attr_reader :code
57
+
58
+ def initialize(zipper, action, code, reason)
59
+ @zipper, @action, @code, @reason =
60
+ zipper, action, code, reason
61
+ end
62
+
63
+ # @return [String]
64
+ def inspect
65
+ name = self.class.name.split('::').last
66
+ "#{name}(#{zipper.node.position.inspect}, #{@reason}, #{@zipper.node.inspect})"
67
+ end
68
+
69
+ def error?
70
+ true
71
+ end
72
+ end
73
+
74
+ # TA1 Interchange Acknowledgement
75
+ class TA105 < Error
76
+ end
77
+
78
+ # 999 Implementation Acknowledgement
79
+ class AK905 < Error
80
+ end
81
+
82
+ # 999 Implementation Acknowledgement
83
+ class IK304 < Error
84
+ end
85
+
86
+ # 999 Implementation Acknowledgement
87
+ class IK403 < Error
88
+ end
89
+
90
+ # 999 Implementation Acknowledgement
91
+ class IK502 < Error
92
+ end
93
+
94
+ # 277 Claim Acknowledgment
95
+ class ClaimStatus < Error
96
+ end
97
+
98
+ end
99
+ end
100
+
@@ -0,0 +1,69 @@
1
+ module Stupidedi
2
+ module Editor
3
+
4
+ class ResultSet
5
+ include Inspect
6
+
7
+ # @return [Array<Result>]
8
+ attr_reader :results
9
+
10
+ def initialize
11
+ @results = []
12
+
13
+ default = lambda{|h,z| h[z] = [] }
14
+ @ta105s = [] # Hash.new(&default)
15
+ @ak905s = [] # Hash.new(&default)
16
+ @ik304s = [] # Hash.new(&default)
17
+ @ik403s = [] # Hash.new(&default)
18
+ @ik502s = [] # Hash.new(&default)
19
+ @cscs = [] # Hash.new(&default)
20
+ @csccs = [] # Hash.new(&default)
21
+ @eics = [] # Hash.new(&default)
22
+ @warns = []
23
+ end
24
+
25
+ def ta105(*args)
26
+ result = TA105.new(*args)
27
+ @results << result
28
+ @ta105s << result
29
+ end
30
+
31
+ def ak905(*args)
32
+ result = AK905.new(*args)
33
+ @results << result
34
+ @ak905s << result
35
+ end
36
+
37
+ def ik304(*args)
38
+ result = IK304.new(*args)
39
+ @results << result
40
+ @ik304s << result
41
+ end
42
+
43
+ def ik403(*args)
44
+ result = IK403.new(*args)
45
+ @results << result
46
+ @ik403s << result
47
+ end
48
+
49
+ def ik502(*args)
50
+ result = IK502.new(*args)
51
+ @results << result
52
+ @ik502s << result
53
+ end
54
+
55
+ def stc01(*args)
56
+ # result = ClaimStatus.new(*args)
57
+ # @results << result
58
+ # @cscs << result
59
+ end
60
+
61
+ def warn(zipper, message)
62
+ result = Warning.new(zipper, message)
63
+ @results << result
64
+ @warns << result
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,275 @@
1
+ module Stupidedi
2
+ module Editor
3
+
4
+ class TransactionSetEd < AbstractEd
5
+
6
+ # @return [Config]
7
+ attr_reader :config
8
+
9
+ # @return [Time]
10
+ attr_reader :received
11
+
12
+ def initialize(config, received)
13
+ @config, @received =
14
+ config, received
15
+ end
16
+
17
+ def critique(st, acc)
18
+ st.parent.tap do |gs|
19
+ gs.parent.tap do |isa|
20
+ critique_isa(isa, acc)
21
+ end
22
+
23
+ critique_gs(gs, acc)
24
+ end
25
+
26
+ acc.tap { critique_st(st, acc) }
27
+ end
28
+
29
+ private
30
+
31
+ # Performs validations using the definition of the given ISA segment
32
+ def critique_isa(isa, acc)
33
+ isa.segment.tap do |x|
34
+ envelope_def = x.node.definition.parent.parent
35
+
36
+ # ...
37
+ end
38
+ end
39
+
40
+ # Performs validations using the definition of the given GS segment
41
+ def critique_gs(gs, acc)
42
+ gs.segment.tap do |x|
43
+ envelope_def = x.node.definition.parent.parent
44
+
45
+ # ...
46
+ end
47
+ end
48
+
49
+ # Performs validations using the definition of the given ST segment
50
+ def critique_st(st, acc)
51
+ st.segment.tap do |x|
52
+ envelope_def = x.node.definition.parent.parent.parent
53
+
54
+ # Transaction Set Identifier Code
55
+ st.element(1).tap do |e|
56
+ if e.node.present? and e.node.valid?
57
+ unless e.node == envelope_def.id
58
+ acc.ik502(e, "R", "6", "is not an allowed value")
59
+ end
60
+ end
61
+ end
62
+
63
+ st.parent.tap do |gs|
64
+ # Functional Identifier Code
65
+ gs.element(1).tap do |e|
66
+ if e.node.present? and e.node.valid?
67
+ unless e.node == envelope_def.functional_group
68
+ acc.ak905(e, "R", "1", "is not an allowed value")
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ if config.editor.defined_at?(envelope_def)
75
+ editor = config.editor.at(envelope_def)
76
+ editor.new(config, received).critique(st, acc)
77
+ end
78
+ end
79
+
80
+ st.zipper.tap do |zipper|
81
+ until zipper.node.transaction_set?
82
+ zipper = zipper.up
83
+ end
84
+
85
+ recurse(zipper, acc)
86
+ end
87
+ end
88
+
89
+ # IK304 "3" Segment must be present
90
+ # IK304 "I6" Segment must be present
91
+ # IK304 "5" Segment occurs too many times
92
+ # IK304 "4" Loop occurs too many times
93
+ # IK304 "I7" Loop must be present
94
+ #
95
+ # IK403 "1" Element must be present
96
+ # IK403 "I10" Element must not be present
97
+ # IK403 "2" Element must be present if other element(s) is (not) present
98
+ # IK403 "6" Element must contain at least one character
99
+ # IK403 "4" Element value is too short
100
+ # IK403 "5" Element value is too long
101
+ # IK403 "6" Element has invalid characters
102
+ # IK403 "7" Invalid code value
103
+ # IK403 "8" Invalid date
104
+ # IK403 "9" Invalid time
105
+
106
+ def recurse(zipper, acc)
107
+ if zipper.node.simple? or zipper.node.component?
108
+ if zipper.node.invalid?
109
+ if zipper.node.date?
110
+ acc.ik403(zipper, "R", "8", "is not a valid date")
111
+ elsif zipper.node.time?
112
+ acc.ik403(zipper, "R", "8", "is not a valid time")
113
+ elsif zipper.node.numeric?
114
+ acc.ik403(zipper, "R", "6", "is not a valid number")
115
+ else
116
+ acc.ik403(zipper, "R", "6", "is not a valid string")
117
+ end
118
+ elsif zipper.node.blank?
119
+ if zipper.node.usage.required?
120
+ acc.ik403(zipper, "R", "1", "must be present")
121
+ end
122
+ elsif zipper.node.usage.forbidden?
123
+ acc.ik403(zipper, "R", "I10", "must not be present")
124
+ elsif not zipper.node.allowed?
125
+ acc.ik403(zipper, "R", "7", "is not an allowed value")
126
+ elsif zipper.node.too_long?
127
+ acc.ik403(zipper, "R", "5", "is too long")
128
+ elsif zipper.node.too_short?
129
+ acc.ik403(zipper, "R", "4", "is too short")
130
+ end
131
+
132
+ elsif zipper.node.composite?
133
+ if zipper.node.blank?
134
+ if zipper.node.usage.required?
135
+ acc.ik403(zipper, "R", "1", "must be present")
136
+ end
137
+ elsif zipper.node.usage.forbidden?
138
+ acc.ik403(zipper, "R", "I10", "must not be present")
139
+ else
140
+ if zipper.node.present?
141
+ zipper.children.each{|z| recurse(z, acc) }
142
+
143
+ d = zipper.node.definition
144
+ d.syntax_notes.each do |s|
145
+ zs = s.errors(zipper)
146
+ ex = s.reason(zipper) if zs.present?
147
+ zs.each{|c| acc.ik403(c, "R", "2", ex) }
148
+ end
149
+ end
150
+ end
151
+
152
+ elsif zipper.node.repeated?
153
+ zipper.children.each{|z| recurse(z, acc) }
154
+
155
+ elsif zipper.node.segment?
156
+ if zipper.node.valid?
157
+ zipper.children.each do |element|
158
+ recurse(element, acc)
159
+ end
160
+
161
+ zipper.node.definition.tap do |d|
162
+ d.syntax_notes.each do |s|
163
+ es = s.errors(zipper)
164
+ ex = s.reason(zipper) if es.present?
165
+ es.each{|c| acc.ik403(c, "R", "2", ex) }
166
+ end
167
+ end
168
+ else
169
+ acc.ik304(child, "R", "2", "unexpected segment")
170
+ end
171
+
172
+ elsif zipper.node.loop?
173
+ group = Hash.new{|h,k| h[k] = [] }
174
+
175
+ zipper.children.each do |child|
176
+ # Child is either a segment or loop
177
+ recurse(child, acc)
178
+
179
+ if child.node.loop?
180
+ group[child.node.definition] << child
181
+ elsif child.node.valid?
182
+ group[child.node.usage] << child
183
+ end
184
+ end
185
+
186
+ # Though we're iterating the definition tree, we need to track
187
+ # the last location before a required child was missing.
188
+ last = zipper
189
+
190
+ zipper.node.definition.children.each do |child|
191
+ repeat = child.repeat_count
192
+ matches = group.at(child)
193
+
194
+ if matches.blank? and child.required?
195
+ if child.loop?
196
+ acc.ik304(last, "R", "I7", "missing #{child.id} loop")
197
+ else
198
+ acc.ik304(last, "R", "3", "missing #{child.id} segment")
199
+ end
200
+ elsif repeat < matches.length
201
+ matches.drop(repeat.max).each do |c|
202
+ if child.loop?
203
+ acc.ik304(c, "R", "4", "loop occurs too many times")
204
+ else
205
+ acc.ik304(c, "R", "5", "segment occurs too many times")
206
+ end
207
+ end
208
+ end
209
+
210
+ last = matches.last unless matches.blank?
211
+ end
212
+
213
+ elsif zipper.node.table?
214
+ group = Hash.new{|h,k| h[k] = [] }
215
+
216
+ zipper.children.each do |child|
217
+ # Child is either a segment or loop
218
+ recurse(child, acc)
219
+
220
+ if child.node.loop?
221
+ group[child.node.definition] << child
222
+ elsif child.node.valid?
223
+ group[child.node.usage] << child
224
+ end
225
+ end
226
+
227
+ # Though we're iterating the definition tree, we need to track
228
+ # the last location before a required child was missing.
229
+ last = zipper
230
+
231
+ zipper.node.definition.children.each do |child|
232
+ matches = group.at(child)
233
+ repeat = child.repeat_count
234
+
235
+ if matches.blank? and child.required?
236
+ if child.loop?
237
+ acc.ik304(last, "R", "I7", "missing #{child.id} loop")
238
+ else
239
+ acc.ik304(last, "R", "3", "missing #{child.id} segment")
240
+ end
241
+ elsif repeat < matches.length
242
+ matches.drop(repeat.max).each do |c|
243
+ if child.loop?
244
+ acc.ik304(c, "R", "4", "loop occurs too many times")
245
+ else
246
+ acc.ik304(c, "R", "5", "segment occurs too many times")
247
+ end
248
+ end
249
+ end
250
+
251
+ last = matches.last unless matches.blank?
252
+ end
253
+
254
+ elsif zipper.node.transaction_set?
255
+ group = Hash.new{|h,k| h[k] = [] }
256
+
257
+ zipper.children.each do |table|
258
+ recurse(table, acc)
259
+ group[table.node.definition] << table
260
+ end
261
+
262
+ zipper.node.definition.tap do |d|
263
+ d.table_defs.each do |table|
264
+ # @todo: How do we know which tables are required? It isn't
265
+ # obvious because some tables have more than one entry segment,
266
+ # and perhaps each has a different requirement designator.
267
+ end
268
+ end
269
+ end
270
+ end
271
+ end
272
+
273
+ end
274
+ end
275
+