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,251 @@
1
+ module Stupidedi
2
+ module Schema
3
+
4
+ class AbstractElementUse < AbstractUse
5
+ include Inspect
6
+
7
+ delegate :forbidden?, :required?, :optional?, :to => :requirement
8
+
9
+ delegate :code_lists, :to => :definition
10
+
11
+ # @return [ElementReq]
12
+ abstract :requirement
13
+
14
+ # @return [SimpleElementDef, CompositeElementDef]
15
+ abstract :definition
16
+
17
+ abstract :simple?
18
+
19
+ abstract :component?
20
+
21
+ # @return [SimpleElementVal, CompositeElementVal]
22
+ def empty(position)
23
+ definition.empty(self, position)
24
+ end
25
+
26
+ # @return [SimpleElementVal, CompositeElementVal]
27
+ def value(object, position)
28
+ definition.value(object, self, position)
29
+ end
30
+
31
+ def composite?
32
+ not simple?
33
+ end
34
+ end
35
+
36
+ class SimpleElementUse < AbstractElementUse
37
+ # @return [SimpleElementDef]
38
+ attr_reader :definition
39
+
40
+ # @return [ElementReq]
41
+ attr_reader :requirement
42
+
43
+ # @return [RepeatCount]
44
+ attr_reader :repeat_count
45
+
46
+ # @return [AbstractSet]
47
+ attr_reader :allowed_values
48
+
49
+ # @return [SegmentDef]
50
+ attr_reader :parent
51
+
52
+ def initialize(definition, requirement, repeat_count, allowed_values, parent)
53
+ @definition, @requirement, @repeat_count, @allowed_values, @parent =
54
+ definition, requirement, repeat_count, allowed_values, parent
55
+
56
+ # Delay re-parenting until the entire definition tree has a root
57
+ # to prevent unnecessarily copying objects
58
+ unless parent.nil?
59
+ @definition = @definition.copy(:parent => self)
60
+ end
61
+ end
62
+
63
+ # @return [SimpleElementUse]
64
+ def copy(changes = {})
65
+ SimpleElementUse.new \
66
+ changes.fetch(:definition, @definition),
67
+ changes.fetch(:requirement, @requirement),
68
+ changes.fetch(:repeat_count, @repeat_count),
69
+ changes.fetch(:allowed_values, @allowed_values),
70
+ changes.fetch(:parent, @parent)
71
+ end
72
+
73
+ # @return [SimpleElementVal]
74
+ def parse(string)
75
+ definition.parse(string, self)
76
+ end
77
+
78
+ def repeatable?
79
+ @repeat_count.try{|r| r.include?(2) }
80
+ end
81
+
82
+ # @return true
83
+ def simple?
84
+ true
85
+ end
86
+
87
+ # @return false
88
+ def component?
89
+ false
90
+ end
91
+
92
+ # @return [AbstractSet<CodeList>]
93
+ def code_lists
94
+ if forbidden?
95
+ Sets.empty
96
+ else
97
+ @definition.code_lists(@allowed_values)
98
+ end
99
+ end
100
+
101
+ # @return [void]
102
+ def pretty_print(q)
103
+ q.text("SimpleElementUse")
104
+ q.group(2, "(", ")") do
105
+ q.breakable ""
106
+ q.pp @definition
107
+ q.text ","
108
+
109
+ q.breakable
110
+ q.pp @requirement
111
+ q.text ","
112
+
113
+ q.breakable
114
+ q.pp @repeat_count
115
+ end
116
+ end
117
+ end
118
+
119
+ class ComponentElementUse < AbstractElementUse
120
+ # @return [SimpleElementDef]
121
+ attr_reader :definition
122
+
123
+ # @return [ElementReq]
124
+ attr_reader :requirement
125
+
126
+ # @return [CompositeElementDef]
127
+ attr_reader :parent
128
+
129
+ # @return [AbstractSet]
130
+ attr_reader :allowed_values
131
+
132
+ def initialize(definition, requirement, allowed_values, parent)
133
+ @definition, @requirement, @allowed_values, @parent =
134
+ definition, requirement, allowed_values, parent
135
+
136
+ # Delay re-parenting until the entire definition tree has a root
137
+ # to prevent unnecessarily copying objects
138
+ unless parent.nil?
139
+ @definition = @definition.copy(:parent => self)
140
+ end
141
+ end
142
+
143
+ # @return [ComponentElementUse]
144
+ def copy(changes = {})
145
+ ComponentElementUse.new \
146
+ changes.fetch(:definition, @definition),
147
+ changes.fetch(:requirement, @requirement),
148
+ changes.fetch(:allowed_values, @allowed_values),
149
+ changes.fetch(:parent, @parent)
150
+ end
151
+
152
+ # @return [SimpleElementVal]
153
+ def parse(string)
154
+ definition.parse(string, self)
155
+ end
156
+
157
+ # @return false
158
+ def repeatable?
159
+ false
160
+ end
161
+
162
+ # @return true
163
+ def simple?
164
+ true
165
+ end
166
+
167
+ # @return true
168
+ def component?
169
+ true
170
+ end
171
+
172
+ # @return [void]
173
+ def pretty_print(q)
174
+ q.text("ComponentElementUse")
175
+ q.group(2, "(", ")") do
176
+ q.breakable ""
177
+ q.pp @definition
178
+ q.text ","
179
+ q.breakable
180
+ q.pp @requirement
181
+ end
182
+ end
183
+ end
184
+
185
+ class CompositeElementUse < AbstractElementUse
186
+ # @return [CompositeElementDef]
187
+ attr_reader :definition
188
+
189
+ # @return [ElementReq]
190
+ attr_reader :requirement
191
+
192
+ # @return [RepeatCount]
193
+ attr_reader :repeat_count
194
+
195
+ # @return [SegmentDef]
196
+ attr_reader :parent
197
+
198
+ def initialize(definition, requirement, repeat_count, parent)
199
+ @definition, @requirement, @repeat_count, @parent =
200
+ definition, requirement, repeat_count, parent
201
+
202
+ # Delay re-parenting until the entire definition tree has a root
203
+ # to prevent unnecessarily copying objects
204
+ unless parent.nil?
205
+ @definition = @definition.copy(:parent => self)
206
+ end
207
+ end
208
+
209
+ # @return [CompositeElementUse]
210
+ def copy(changes = {})
211
+ CompositeElementUse.new \
212
+ changes.fetch(:definition, @definition),
213
+ changes.fetch(:requirement, @requirement),
214
+ changes.fetch(:repeat_count, @repeat_count),
215
+ changes.fetch(:parent, @parent)
216
+ end
217
+
218
+ def repeatable?
219
+ @repeat_count.try{|r| r.include?(2) }
220
+ end
221
+
222
+ # @return false
223
+ def simple?
224
+ false
225
+ end
226
+
227
+ # @return false
228
+ def component?
229
+ false
230
+ end
231
+
232
+ # @return [void]
233
+ def pretty_print(q)
234
+ q.text("CompositeElementUse")
235
+ q.group(2, "(", ")") do
236
+ q.breakable ""
237
+ q.pp @definition
238
+ q.text ","
239
+
240
+ q.breakable
241
+ q.pp @requirement
242
+ q.text ","
243
+
244
+ q.breakable
245
+ q.pp @repeat_count
246
+ end
247
+ end
248
+ end
249
+
250
+ end
251
+ end
@@ -0,0 +1,114 @@
1
+ module Stupidedi
2
+ module Schema
3
+
4
+ #
5
+ # X12 standards are released three times yearly. The version codes sent in
6
+ # the `GS08` and `ST03` elements encode the version (eg 004, 005), the
7
+ # release (eg 0040, 0050), the subrelease (00501, 00602) and the level
8
+ # (eg 005010)
9
+ #
10
+ # The release schedules look like this:
11
+ #
12
+ # Approved by Available Ballot Results Available for
13
+ # Version Subcommitees for Ballot Approved Distribution
14
+ # ---------------------------------------------------------------------
15
+ # 005010 Feb 03 Jun 03 Oct 03 Jan 04
16
+ # 005011 Jun 03 Oct 04 Feb 04 Mar 04
17
+ # 005012 Oct 03 Feb 04 Jun 04 Jul 04
18
+ #
19
+ # 005020 Feb 04 Jun 04 Oct 04 Jan 05
20
+ # 005021 Jun 04 Oct 04 Feb 05 Mar 05
21
+ # 005022 Oct 04 Feb 05 Jun 05 Jul 05
22
+ #
23
+ # @see http://www.disa.org/x12org/subcommittees/dev/pdf/X12RELEASESCHED.pdf
24
+ #
25
+ # @see X222.pdf B.1.1.3.13 Functional Group
26
+ # @see X222.pdf B.1.1.4.2 Functional Groups
27
+ #
28
+ class FunctionalGroupDef < AbstractDef
29
+ include Inspect
30
+
31
+ # @return [String]
32
+ attr_reader :id
33
+
34
+ # @return [Array<SegmentUses>]
35
+ attr_reader :header_segment_uses
36
+
37
+ # @return [Array<SegmentUses>]
38
+ attr_reader :trailer_segment_uses
39
+
40
+ # @return [Hash, Module]
41
+ abstract :segment_dict
42
+
43
+ def initialize(id, header_segment_uses, trailer_segment_uses)
44
+ @id, @header_segment_uses, @trailer_segment_uses =
45
+ id, header_segment_uses, trailer_segment_uses
46
+
47
+ @header_segment_uses = header_segment_uses.map{|x| x.copy(:parent => self) }
48
+ @trailer_segment_uses = trailer_segment_uses.map{|x| x.copy(:parent => self) }
49
+ end
50
+
51
+ # @return [FunctionalGroupDef]
52
+ def copy(changes = {})
53
+ FunctionalGroupDef.new \
54
+ changes.fetch(:id, @id),
55
+ changes.fetch(:header_segment_uses, @header_segment_uses),
56
+ changes.fetch(:trailer_segment_uses, @trailer_segment_uses)
57
+ end
58
+
59
+ # @return [SegmentUse]
60
+ def entry_segment_use
61
+ @header_segment_uses.head
62
+ end
63
+
64
+ # @return [Array<SegmentUse>]
65
+ def children
66
+ @header_segment_uses + @trailer_segment_uses
67
+ end
68
+
69
+ # @return [Values::FunctionalGroupVal]
70
+ def empty
71
+ Values::FunctionalGroupVal.new(self, [], [])
72
+ end
73
+
74
+ def functional_group?
75
+ true
76
+ end
77
+
78
+ # @return [AbstractSet<CodeList>
79
+ def code_lists
80
+ children.map(&:code_lists).inject(&:|)
81
+ end
82
+
83
+ # @return [void]
84
+ def pretty_print(q)
85
+ q.text("FunctionalGroupDef")
86
+ q.group(2, "(", ")") do
87
+ q.breakable ""
88
+ @header_segment_uses.each do |e|
89
+ unless q.current_group.first?
90
+ q.text ","
91
+ q.breakable
92
+ end
93
+ q.pp e
94
+ end
95
+
96
+ unless q.current_group.first?
97
+ q.text ","
98
+ q.breakable
99
+ end
100
+ q.text "... (TRANSACTION SETS) ..."
101
+
102
+ @trailer_segment_uses.each do |e|
103
+ unless q.current_group.first?
104
+ q.text ","
105
+ q.breakable
106
+ end
107
+ q.pp e
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+ end
114
+ end
@@ -0,0 +1,93 @@
1
+ module Stupidedi
2
+ module Schema
3
+
4
+ #
5
+ # @see X12-5.pdf 3.2.1 Basic Interchange Service Request
6
+ # @see X222.pdf B.1.1.4.1 Interchange Control Structures
7
+ #
8
+ class InterchangeDef < AbstractDef
9
+ include Inspect
10
+
11
+ # @return [String]
12
+ attr_reader :id
13
+
14
+ # @return [Array<SegmentUse>]
15
+ attr_reader :header_segment_uses
16
+
17
+ # @return [Array<SegmentUse>]
18
+ attr_reader :trailer_segment_uses
19
+
20
+ # @return [Values::InterchangeVal]
21
+ abstract :empty, :args => %w(separators)
22
+
23
+ # @return [Reader::Separators]
24
+ abstract :separators, :args => %w(isa_segment_val)
25
+
26
+ def initialize(id, header_segment_uses, trailer_segment_uses)
27
+ @id, @header_segment_uses, @trailer_segment_uses =
28
+ id, header_segment_uses, trailer_segment_uses
29
+
30
+ @header_segment_uses = header_segment_uses.map{|x| x.copy(:parent => self) }
31
+ @trailer_segment_uses = trailer_segment_uses.map{|x| x.copy(:parent => self) }
32
+ end
33
+
34
+ # @return [InterchangeDef]
35
+ def copy(changes = {})
36
+ InterchangeDef.new \
37
+ changes.fetch(:id, @id),
38
+ changes.fetch(:header_segment_uses, @header_segment_uses),
39
+ changes.fetch(:trailer_segment_uses, @trailer_segment_uses)
40
+ end
41
+
42
+ # @return [SegmentUse]
43
+ def entry_segment_use
44
+ @header_segment_uses.head
45
+ end
46
+
47
+ # @return [Array<SegmentUse>]
48
+ def children
49
+ @header_segment_uses + @trailer_segment_uses
50
+ end
51
+
52
+ # (see AbstractDef)
53
+ def interchange?
54
+ true
55
+ end
56
+
57
+ # @return [AbstractSet<CodeList>]
58
+ def code_lists
59
+ children.map(&:code_lists).inject(&:|)
60
+ end
61
+
62
+ # @return [void]
63
+ def pretty_print(q)
64
+ q.text("InterchangeDef[#{id}]")
65
+ q.group(2, "(", ")") do
66
+ q.breakable ""
67
+ @header_segment_uses.each do |e|
68
+ unless q.current_group.first?
69
+ q.text ","
70
+ q.breakable
71
+ end
72
+ q.pp e
73
+ end
74
+
75
+ unless q.current_group.first?
76
+ q.text ","
77
+ q.breakable
78
+ end
79
+ q.text "... (FUNCTIONAL GROUPS) ..."
80
+
81
+ @trailer_segment_uses.each do |e|
82
+ unless q.current_group.first?
83
+ q.text ","
84
+ q.breakable
85
+ end
86
+ q.pp e
87
+ end
88
+ end
89
+ end
90
+ end
91
+
92
+ end
93
+ end
@@ -0,0 +1,152 @@
1
+ module Stupidedi
2
+ module Schema
3
+
4
+ #
5
+ # @see X222.pdf 2.2.2 Loops
6
+ # @see X222.pdf B.1.3.12.4 Loops of Data Segments
7
+ #
8
+ class LoopDef < AbstractDef
9
+ include Inspect
10
+
11
+ # @return [String]
12
+ attr_reader :id
13
+
14
+ # @return [RepeatCount]
15
+ attr_reader :repeat_count
16
+
17
+ # @return [Array<SegmentUse>]
18
+ attr_reader :header_segment_uses
19
+
20
+ # @return [Array<SegmentUse>]
21
+ attr_reader :trailer_segment_uses
22
+
23
+ # @return [Array<LoopDef>]
24
+ attr_reader :loop_defs
25
+
26
+ # @return [LoopDef, TableDef]
27
+ attr_reader :parent
28
+
29
+ delegate :requirement, :to => :entry_segment_use
30
+
31
+ delegate :required?, :to => :requirement
32
+
33
+ def initialize(id, repeat_count, header_segment_uses, loop_defs, trailer_segment_uses, parent)
34
+ @id, @repeat_count, @header_segment_uses, @loop_defs, @trailer_segment_uses, @parent =
35
+ id, repeat_count, header_segment_uses, loop_defs, trailer_segment_uses, parent
36
+
37
+ # Delay re-parenting until the entire definition tree has a root
38
+ # to prevent unnecessarily copying objects
39
+ unless parent.nil?
40
+ @header_segment_uses = @header_segment_uses.map{|x| x.copy(:parent => self) }
41
+ @loop_defs = @loop_defs.map{|x| x.copy(:parent => self) }
42
+ @trailer_segment_uses = @trailer_segment_uses.map{|x| x.copy(:parent => self) }
43
+ end
44
+ end
45
+
46
+ # @return [LoopDef]
47
+ def copy(changes = {})
48
+ LoopDef.new \
49
+ changes.fetch(:id, @id),
50
+ changes.fetch(:repeat_count, @repeat_count),
51
+ changes.fetch(:header_segment_uses, @header_segment_uses),
52
+ changes.fetch(:loop_defs, @loop_defs),
53
+ changes.fetch(:trailer_segment_uses, @trailer_segment_uses),
54
+ changes.fetch(:parent, @parent)
55
+ end
56
+
57
+ def repeatable?
58
+ @repeat_count.try{|r| r.include?(2) }
59
+ end
60
+
61
+ # @see X222 B.1.1.3.11.1 Loop Control Segments
62
+ # @see X222 B.1.1.3.12.4 Loops of Data Segments Bounded Loops
63
+ def bounded?
64
+ @header_segment_uses.head.definition.id == :LS and
65
+ @trailer_segment_uses.last.definition.id == :LE
66
+ end
67
+
68
+ # @see X12.59 5.6 HL-initiated Loop
69
+ def hierarchical?
70
+ @header_segment_uses.head.definition.id == :HL
71
+ end
72
+
73
+ # @return [SegmentUse]
74
+ def entry_segment_use
75
+ @header_segment_uses.head
76
+ end
77
+
78
+ # @return [Array<SegmentUse, LoopDef>]
79
+ def children
80
+ @header_segment_uses + @loop_defs + @trailer_segment_uses
81
+ end
82
+
83
+ # @return [LoopVal]
84
+ def empty
85
+ Values::LoopVal.new(self, [])
86
+ end
87
+
88
+ def loop?
89
+ true
90
+ end
91
+
92
+ # @return [AbstractSet<CodeList>]
93
+ def code_lists
94
+ children.map(&:code_lists).inject(&:|)
95
+ end
96
+
97
+ # @return [void]
98
+ def pretty_print(q)
99
+ q.text("LoopDef[#{@id}]")
100
+ q.group(2, "(", ")") do
101
+ q.breakable ""
102
+ @header_segment_uses.each do |e|
103
+ unless q.current_group.first?
104
+ q.text ","
105
+ q.breakable
106
+ end
107
+ q.pp e
108
+ end
109
+ @loop_defs.each do |e|
110
+ unless q.current_group.first?
111
+ q.text ","
112
+ q.breakable
113
+ end
114
+ q.pp e
115
+ end
116
+ @trailer_segment_uses.each do |e|
117
+ unless q.current_group.first?
118
+ q.text ","
119
+ q.breakable
120
+ end
121
+ q.pp e
122
+ end
123
+ end
124
+ end
125
+ end
126
+
127
+ class << LoopDef
128
+ # @group Constructors
129
+ #########################################################################
130
+
131
+ # @return [LoopDef]
132
+ def build(id, repeat_count, *children)
133
+ header, children = children.split_when{|x| x.is_a?(LoopDef) }
134
+ loop_defs, trailer = children.split_when{|x| x.is_a?(SegmentUse) }
135
+
136
+ # @todo: Ensure there is at least one SegmentUse in header
137
+ if header.empty?
138
+ raise Exceptions::InvalidSchemaError,
139
+ "first child must be a SegmentUse"
140
+ elsif header.head.repeat_count.include?(2)
141
+ "first child must have RepeatCount.bounded(1)"
142
+ end
143
+
144
+ new(id, repeat_count, header, loop_defs, trailer, nil)
145
+ end
146
+
147
+ # @endgroup
148
+ #########################################################################
149
+ end
150
+
151
+ end
152
+ end
@@ -0,0 +1,85 @@
1
+ module Stupidedi
2
+ module Schema
3
+
4
+ class RepeatCount
5
+ class Bounded < RepeatCount
6
+ include Comparable
7
+
8
+ delegate :<=>, :to => :@max
9
+
10
+ # @return [Integer]
11
+ attr_reader :max
12
+
13
+ def initialize(max)
14
+ @max = max
15
+ end
16
+
17
+ def include?(n)
18
+ n <= @max
19
+ end
20
+
21
+ def exclude?(n)
22
+ n > @max
23
+ end
24
+
25
+ def inspect
26
+ @max.to_s
27
+ end
28
+ end
29
+
30
+ # @private
31
+ Once = Class.new(Bounded) do
32
+ def initialize
33
+ @max = 1
34
+ end
35
+ end.new
36
+
37
+ # @private
38
+ Unbounded = Class.new(RepeatCount) do
39
+ include Comparable
40
+
41
+ Infinity = 1.0/0.0
42
+
43
+ def include?(n)
44
+ true
45
+ end
46
+
47
+ def exclude?(n)
48
+ false
49
+ end
50
+
51
+ def <=>(n)
52
+ Infinity <=> n
53
+ end
54
+
55
+ def inspect
56
+ ">1"
57
+ end
58
+ end.new
59
+ end
60
+
61
+ class << RepeatCount
62
+ # @group Constructors
63
+ #########################################################################
64
+
65
+ def bounded(n)
66
+ if n < 1
67
+ raise Exception::InvalidSchemaError,
68
+ "n must be positive"
69
+ elsif n == 1
70
+ RepeatCount::Once
71
+ else
72
+ RepeatCount::Bounded.new(n)
73
+ end
74
+ end
75
+
76
+ def unbounded
77
+ RepeatCount::Unbounded
78
+ end
79
+
80
+ # @endgroup
81
+ #########################################################################
82
+ end
83
+
84
+ end
85
+ end