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,123 @@
1
+ module Stupidedi
2
+ module Guides
3
+ module FiftyTen
4
+ module X231
5
+
6
+ b = GuideBuilder
7
+ d = Schema
8
+ r = SegmentReqs
9
+ e = ElementReqs
10
+ s = Versions::FunctionalGroups::FiftyTen::SegmentDefs
11
+ t = Versions::FunctionalGroups::FiftyTen::TransactionSetDefs
12
+
13
+ FA999 = b.build(t::FA999,
14
+ d::TableDef.header("Table 1 - Header",
15
+ b::Segment(100, s::ST, "Transaction Set Header",
16
+ r::Required, d::RepeatCount.bounded(1),
17
+ b::Element(e::Required, "Transaction Set Identifier Code", b::Values("999")),
18
+ b::Element(e::Required, "Transaction Set Control Number"),
19
+ b::Element(e::Required, "Implementation Guide Version Name", b::Values("005010X231"))),
20
+ b::Segment(200, s::AK1, "Functional Group Response Header",
21
+ r::Required, d::RepeatCount.bounded(1),
22
+ b::Element(e::Required, "Functional Identifier Code"),
23
+ b::Element(e::Required, "Group Control Number"),
24
+ b::Element(e::Required, "Version, Release, or Industry Identifier Code")),
25
+
26
+ d::LoopDef.build("2000 TRANSACTION SET RESPONSE HEADER",
27
+ d::RepeatCount.unbounded,
28
+ b::Segment(300, s::AK2, "Transaction Set Response Header",
29
+ r::Situational, d::RepeatCount.bounded(1),
30
+ b::Element(e::Required, "Transaction Set Identifier Code"),
31
+ b::Element(e::Required, "Transaction Set Control Number"),
32
+ b::Element(e::Situational, "Implementation Convention Reference")),
33
+
34
+ d::LoopDef.build("2100 ERROR IDENTIFICATION",
35
+ d::RepeatCount.unbounded,
36
+ b::Segment(400, s::IK3, "Error Identification",
37
+ r::Situational, d::RepeatCount.bounded(1),
38
+ b::Element(e::Required, "Segment ID Code"),
39
+ b::Element(e::Required, "Segment Position in Transaction Set"),
40
+ b::Element(e::Situational, "Loop Identifier Code"),
41
+ b::Element(e::Required, "Implementation Segment Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "I4", "I6", "I7", "I8", "I9"))),
42
+ b::Segment(500, s::CTX, "Segment Context",
43
+ r::Situational, d::RepeatCount.bounded(9),
44
+ b::Element(e::Required, "CONTEXT IDENTIFICATION",
45
+ b::Element(e::Required, "Context Name", b::Values("SITUATIONAL TRIGGER")),
46
+ b::Element(e::NotUsed, "Context Reference")),
47
+ b::Element(e::Required, "Segment ID Code"),
48
+ b::Element(e::Required, "Segment Position in Transaction Set"),
49
+ b::Element(e::Situational, "Loop Identifier Code"),
50
+ b::Element(e::Situational, "POSITION IN SEGMENT",
51
+ b::Element(e::Required, "Element Position in Segment"),
52
+ b::Element(e::Situational, "Component Data Element Position in Composite"),
53
+ b::Element(e::Situational, "Repeating Data Element Position")),
54
+ b::Element(e::Situational, "REFERENCE IN SEGMENT",
55
+ b::Element(e::Required, "Data Element Reference Number"),
56
+ b::Element(e::Situational, "Component Data Element Reference Number"))),
57
+ b::Segment(500, s::CTX, "Business Unit Identifier",
58
+ r::Situational, d::RepeatCount.bounded(1),
59
+ b::Element(e::Required, "CONTEXT IDENTIFICATION",
60
+ b::Element(e::Required, "Context Name", b::Values("TRN02", "NM109", "PATIENT NAME NM109", "SUBSCRIBER NAME NM109", "ENT01", "SUBSCRIBER NUMBER REF02", "CLM01")),
61
+ b::Element(e::Required, "Context Reference")),
62
+ b::Element(e::NotUsed, "Segment ID Code"),
63
+ b::Element(e::NotUsed, "Segment Position in Transaction Set"),
64
+ b::Element(e::NotUsed, "Loop Identifier Code"),
65
+ b::Element(e::NotUsed, "POSITION IN SEGMENT"),
66
+ b::Element(e::NotUsed, "REFERENCE IN SEGMENT")),
67
+
68
+ d::LoopDef.build("2110 IMPLEMENTATION DATA ELEMENT NOTE",
69
+ d::RepeatCount.unbounded,
70
+ b::Segment(600, s::IK4, "Implementation Data Element Note",
71
+ r::Situational, d::RepeatCount.bounded(1),
72
+ b::Element(e::Required, "POSITION IN SEGMENT",
73
+ b::Element(e::Required, "Element Position in Segment"),
74
+ b::Element(e::Situational, "Component Data Element Position in Composite"),
75
+ b::Element(e::Situational, "Repeating Data Element Position")),
76
+ b::Element(e::Situational, "Data Element Reference Number"),
77
+ b::Element(e::Required, "Implementation Data Element Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "12", "13", "I10", "I11", "I12", "I13", "I6", "I9")),
78
+ b::Element(e::Situational, "Copy of Bad Data Element")),
79
+ b::Segment(700, s::CTX, "Element Context",
80
+ r::Situational, d::RepeatCount.bounded(10),
81
+ b::Element(e::Required, "CONTEXT IDENTIFICATION",
82
+ b::Element(e::Required, "Context Name", b::Values("SITUATIONAL TRIGGER")),
83
+ b::Element(e::NotUsed, "Context Reference")),
84
+ b::Element(e::Required, "Segment ID Code"),
85
+ b::Element(e::Required, "Segment Position in Transaction Set"),
86
+ b::Element(e::Situational, "Loop Identifier Code"),
87
+ b::Element(e::Situational, "POSITION IN SEGMENT",
88
+ b::Element(e::Required, "Element Position in Segment"),
89
+ b::Element(e::Situational, "Component Data Element Position in Composite"),
90
+ b::Element(e::Situational, "Repeating Data Element Position")),
91
+ b::Element(e::Situational, "REFERENCE IN SEGMENT",
92
+ b::Element(e::Required, "Data Element Reference Number"),
93
+ b::Element(e::Situational, "Component Data Element Reference Number"))))),
94
+
95
+ b::Segment(800, s::IK5, "Implementation Transaction Set Response Trailer",
96
+ r::Required, d::RepeatCount.bounded(1),
97
+ b::Element(e::Required, "Transaction Set Acknowledgement Code", b::Values("A", "E", "M", "R", "W", "X")),
98
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I6")),
99
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I6")),
100
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I6")),
101
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I6")),
102
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I6")))),
103
+
104
+ b::Segment( 900, s::AK9, "Functional Group Response Trailer",
105
+ r::Required, d::RepeatCount.bounded(1),
106
+ b::Element(e::Required, "Functional Group Acknowledgement Code", b::Values("A", "E", "M", "P", "R", "W", "X")),
107
+ b::Element(e::Required, "Number of Transaction Sets Included"),
108
+ b::Element(e::Required, "Number of Received Transaction Sets"),
109
+ b::Element(e::Required, "Number of Accepted Transaction Sets"),
110
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26")),
111
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26")),
112
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26")),
113
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26")),
114
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26"))),
115
+ b::Segment(200, s::SE, "Transaction Set Trailer",
116
+ r::Required, d::RepeatCount.bounded(1),
117
+ b::Element(e::Required, "Transaction Segment Count"),
118
+ b::Element(e::Required, "Transaction Set Control Number"))))
119
+
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,119 @@
1
+ module Stupidedi
2
+ module Guides
3
+ module FiftyTen
4
+ module X231A1
5
+
6
+ b = GuideBuilder
7
+ d = Schema
8
+ r = SegmentReqs
9
+ e = ElementReqs
10
+ s = Versions::FunctionalGroups::FiftyTen::SegmentDefs
11
+ t = Versions::FunctionalGroups::FiftyTen::TransactionSetDefs
12
+
13
+ FA999 = b.build(t::FA999,
14
+ d::TableDef.header("Table 1 - Header",
15
+ b::Segment(100, s::ST, "Transaction Set Header",
16
+ r::Required, d::RepeatCount.bounded(1),
17
+ b::Element(e::Required, "Transaction Set Identifier Code", b::Values("999")),
18
+ b::Element(e::Required, "Transaction Set Control Number"),
19
+ b::Element(e::Required, "Implementation Guide Version Name", b::Values("005010X231A1"))),
20
+ b::Segment(200, s::AK1, "Functional Group Response Header",
21
+ r::Required, d::RepeatCount.bounded(1),
22
+ b::Element(e::Required, "Functional Identifier Code"),
23
+ b::Element(e::Required, "Group Control Number"),
24
+ b::Element(e::Required, "Version, Release, or Industry Identifier Code")),
25
+
26
+ d::LoopDef.build("2000 TRANSACTION SET RESPONSE HEADER",
27
+ d::RepeatCount.unbounded,
28
+ b::Segment(300, s::AK2, "Transaction Set Response Header",
29
+ r::Situational, d::RepeatCount.bounded(1),
30
+ b::Element(e::Required, "Transaction Set Identifier Code"),
31
+ b::Element(e::Required, "Transaction Set Control Number"),
32
+ b::Element(e::Situational, "Implementation Convention Reference")),
33
+
34
+ d::LoopDef.build("2100 ERROR IDENTIFICATION",
35
+ d::RepeatCount.unbounded,
36
+ b::Segment(400, s::IK3, "Error Identification",
37
+ r::Situational, d::RepeatCount.bounded(1),
38
+ b::Element(e::Required, "Segment ID Code"),
39
+ b::Element(e::Required, "Segment Position in Transaction Set"),
40
+ b::Element(e::Situational, "Loop Identifier Code"),
41
+ b::Element(e::Required, "Implementation Segment Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "I4", "I6", "I7", "I8", "I9"))),
42
+ b::Segment(500, s::CTX, "Segment Context",
43
+ r::Situational, d::RepeatCount.bounded(9),
44
+ b::Element(e::Required, "CONTEXT IDENTIFICATION",
45
+ b::Element(e::Required, "Context Name", b::Values("SITUATIONAL TRIGGER")),
46
+ b::Element(e::NotUsed, "Context Reference")),
47
+ b::Element(e::Required, "Segment ID Code"),
48
+ b::Element(e::Required, "Segment Position in Transaction Set"),
49
+ b::Element(e::Situational, "Loop Identifier Code"),
50
+ b::Element(e::Situational, "POSITION IN SEGMENT",
51
+ b::Element(e::Required, "Element Position in Segment"),
52
+ b::Element(e::Situational, "Component Data Element Position in Composite"),
53
+ b::Element(e::Situational, "Repeating Data Element Position")),
54
+ b::Element(e::NotUsed, "REFERENCE IN SEGMENT")),
55
+ b::Segment(500, s::CTX, "Business Unit Identifier",
56
+ r::Situational, d::RepeatCount.bounded(1),
57
+ b::Element(e::Required, "CONTEXT IDENTIFICATION",
58
+ b::Element(e::Required, "Context Name", b::Values("TRN02", "NM109", "PATIENT NAME NM109", "SUBSCRIBER NAME NM109", "ENT01", "SUBSCRIBER NUMBER REF02", "CLM01")),
59
+ b::Element(e::Required, "Context Reference")),
60
+ b::Element(e::NotUsed, "Segment ID Code"),
61
+ b::Element(e::NotUsed, "Segment Position in Transaction Set"),
62
+ b::Element(e::NotUsed, "Loop Identifier Code"),
63
+ b::Element(e::NotUsed, "POSITION IN SEGMENT"),
64
+ b::Element(e::NotUsed, "REFERENCE IN SEGMENT")),
65
+
66
+ d::LoopDef.build("2110 IMPLEMENTATION DATA ELEMENT NOTE",
67
+ d::RepeatCount.unbounded,
68
+ b::Segment(600, s::IK4, "Implementation Data Element Note",
69
+ r::Situational, d::RepeatCount.bounded(1),
70
+ b::Element(e::Required, "POSITION IN SEGMENT",
71
+ b::Element(e::Required, "Element Position in Segment"),
72
+ b::Element(e::Situational, "Component Data Element Position in Composite"),
73
+ b::Element(e::Situational, "Repeating Data Element Position")),
74
+ b::Element(e::Situational, "Data Element Reference Number"),
75
+ b::Element(e::Required, "Implementation Data Element Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "12", "13", "I10", "I11", "I12", "I13", "I6", "I9")),
76
+ b::Element(e::Situational, "Copy of Bad Data Element")),
77
+ b::Segment(700, s::CTX, "Element Context",
78
+ r::Situational, d::RepeatCount.bounded(10),
79
+ b::Element(e::Required, "CONTEXT IDENTIFICATION",
80
+ b::Element(e::Required, "Context Name", b::Values("SITUATIONAL TRIGGER")),
81
+ b::Element(e::NotUsed, "Context Reference")),
82
+ b::Element(e::Required, "Segment ID Code"),
83
+ b::Element(e::Required, "Segment Position in Transaction Set"),
84
+ b::Element(e::Situational, "Loop Identifier Code"),
85
+ b::Element(e::Situational, "POSITION IN SEGMENT",
86
+ b::Element(e::Required, "Element Position in Segment"),
87
+ b::Element(e::Situational, "Component Data Element Position in Composite"),
88
+ b::Element(e::Situational, "Repeating Data Element Position")),
89
+ b::Element(e::NotUsed, "REFERENCE IN SEGMENT")))),
90
+
91
+ b::Segment(800, s::IK5, "Implementation Transaction Set Response Trailer",
92
+ r::Required, d::RepeatCount.bounded(1),
93
+ b::Element(e::Required, "Transaction Set Acknowledgement Code", b::Values("A", "E", "M", "R", "W", "X")),
94
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I5", "I6")),
95
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I5", "I6")),
96
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I5", "I6")),
97
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I5", "I6")),
98
+ b::Element(e::Situational, "Implementation Transaction Set Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "15", "16", "17", "18", "19", "23", "24", "25", "26", "27", "I5", "I6")))),
99
+
100
+ b::Segment( 900, s::AK9, "Functional Group Response Trailer",
101
+ r::Required, d::RepeatCount.bounded(1),
102
+ b::Element(e::Required, "Functional Group Acknowledgement Code", b::Values("A", "E", "M", "P", "R", "W", "X")),
103
+ b::Element(e::Required, "Number of Transaction Sets Included"),
104
+ b::Element(e::Required, "Number of Received Transaction Sets"),
105
+ b::Element(e::Required, "Number of Accepted Transaction Sets"),
106
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26")),
107
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26")),
108
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26")),
109
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26")),
110
+ b::Element(e::Situational, "Functional Group Syntax Error Code", b::Values("1", "2", "3", "4", "5", "6", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "23", "24", "25", "26"))),
111
+ b::Segment(200, s::SE, "Transaction Set Trailer",
112
+ r::Required, d::RepeatCount.bounded(1),
113
+ b::Element(e::Required, "Transaction Segment Count"),
114
+ b::Element(e::Required, "Transaction Set Control Number"))))
115
+
116
+ end
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,38 @@
1
+ module Stupidedi
2
+ module Guides
3
+ module FiftyTen
4
+
5
+ #
6
+ # @see X222.pdf 2.2 Implementation Usage
7
+ #
8
+ module ElementReqs
9
+
10
+ # Declares that this element must always be sent. Required elements
11
+ # within Situational segments when the segment occurs.
12
+ #
13
+ # Similarly, required component elements within situational composite
14
+ # elements only occur when the composite element occurs.
15
+ Required = Schema::ElementReq.new(true, false, "R")
16
+
17
+ # Use of this element varies, depending on data content and business
18
+ # context as described in the defining rule. The defining rule is
19
+ # documented in a Situational Rule attached to the element.
20
+ #
21
+ # There are two forms of Situational Rules. The first is "Required when
22
+ # <condition>. If not required by <condition>, the element may be
23
+ # provided at the discretion of the sender, but it cannot be required or
24
+ # requested by the receiver.'
25
+ #
26
+ # The other form is "Required when <condition>. If not required by
27
+ # <condition>, do not send". The element described by the rule cannot
28
+ # occur except when the condition holds.
29
+ Situational = Schema::ElementReq.new(false, false, "S")
30
+
31
+ # This element must never be sent.
32
+ NotUsed = Schema::ElementReq.new(false, true, "N")
33
+
34
+ end
35
+
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,180 @@
1
+ module Stupidedi
2
+ module Guides
3
+ module FiftyTen
4
+
5
+ #
6
+ # {GuideBuilder} is a simple DSL for construction an implementation guide.
7
+ #
8
+ module GuideBuilder
9
+ end
10
+
11
+ class << GuideBuilder
12
+
13
+ # @return [Schema::TransactionSetDef]
14
+ def build(transaction_set_def, *table_defs)
15
+ transaction_set_def.copy(:table_defs => table_defs)
16
+ end
17
+
18
+ # @group Element Constraints
19
+ #######################################################################
20
+
21
+ # @param [String, ...] values
22
+ def Values(*values)
23
+ [:Values, values]
24
+ end
25
+
26
+ # @param [Integer] n
27
+ def MaxLength(n)
28
+ [:MaxLength, n]
29
+ end
30
+
31
+ # @param [Integer] n
32
+ def MaxPrecision(n)
33
+ [:MaxPrecision, n]
34
+ end
35
+
36
+ # @endgroup
37
+ #######################################################################
38
+
39
+ # @group Definition Constructors
40
+ #######################################################################
41
+
42
+ # @param [Schema::ElementReq] requirement
43
+ # @param [String] name
44
+ def Element(requirement, name, *constraints)
45
+ [:Element, requirement, name, constraints]
46
+ end
47
+
48
+ # @return [SegmentUse]
49
+ def Segment(position, segment_def, name, requirement, repeat_count, *elements)
50
+ unless elements.length == segment_def.element_uses.length
51
+ raise Exceptions::InvalidSchemaError,
52
+ "segment #{segment_def.id} has #{segment_def.element_uses.length}" <<
53
+ " elements but #{elements.length} arguments were specified"
54
+ end
55
+
56
+ element_index = "00"
57
+ element_uses = elements.zip(segment_def.element_uses).map do |e, u|
58
+ e_tag, e_requirement, e_name, e_arguments = e
59
+ element_index.succ!
60
+
61
+ unless e_tag == :Element
62
+ raise Exceptions::InvalidSchemaError,
63
+ "given argument for #{segment_def.id}#{element_index} must be Element(...)"
64
+ end
65
+
66
+ if u.composite?
67
+ e_repeat_count, e_arguments = e_arguments.partition{|x| x.is_a?(Schema::RepeatCount) }
68
+
69
+ changes = Hash.new
70
+ changes[:requirement] = e_requirement
71
+
72
+ if e_repeat_count.length == 1
73
+ changes[:repeat_count] = e_repeat_count.head
74
+ elsif e_repeat_count.length > 1
75
+ raise Exceptions::InvalidSchemaError,
76
+ "more than one RepeatCount was specified"
77
+ end
78
+
79
+ unless e_requirement.forbidden?
80
+ unless e_arguments.length == u.definition.component_uses.length
81
+ raise Exceptions::InvalidSchemaError,
82
+ "composite element #{u.definition.id} at #{segment_def.id}" <<
83
+ "#{element_index} has #{u.definition.element_uses.length}" <<
84
+ " component elements but #{e_arguments.length} were given"
85
+ end
86
+
87
+ # ComponentElementUses
88
+ component_index = "00"
89
+ component_uses = e_arguments.zip(u.definition.component_uses).map do |e, c|
90
+ c_tag, c_requirement, c_name, c_arguments = e
91
+ component_index.succ!
92
+
93
+ unless c_tag == :Element
94
+ raise Exceptions::InvalidSchemaError,
95
+ "given argument for #{segment_def.id}#{element_index}" <<
96
+ "-#{component_index} must be Element(...)"
97
+ end
98
+
99
+ mod_element(c, c_requirement, c_name, c_arguments)
100
+ end
101
+
102
+ changes[:definition] = u.definition.copy(:name => e_name,
103
+ :component_uses => component_uses)
104
+ else
105
+ changes[:definition] = u.definition.copy(:name => e_name)
106
+ end
107
+
108
+ u.copy(changes)
109
+ else
110
+ mod_element(u, e_requirement, e_name, e_arguments)
111
+ end
112
+ end
113
+
114
+ segment_def.copy(:name => name).
115
+ copy(:element_uses => element_uses).
116
+ use(position, requirement, repeat_count)
117
+ end
118
+
119
+ # @endgroup
120
+ #######################################################################
121
+
122
+ private
123
+
124
+ # @return [Schema::SimpleElementUse]
125
+ def mod_element(element_use, requirement, name, arguments)
126
+ unless requirement.is_a?(Schema::ElementReq)
127
+ raise Exceptions::InvalidSchemaError,
128
+ "first argument to Element must be a Schema::ElementReq but got #{requirement.inspect}"
129
+ end
130
+
131
+ unless name.is_a?(String)
132
+ raise Exceptions::InvalidSchemaError,
133
+ "element name must be a String"
134
+ end
135
+
136
+ changes = Hash.new # changes to SegmentUse
137
+ dhanges = Hash.new # changes to SegmentDef
138
+
139
+ changes[:requirement] = requirement
140
+ changes[:definition] = element_use.definition.copy(:name => name)
141
+
142
+ repeat_count = arguments.select{|x| x.is_a?(Schema::RepeatCount) }
143
+
144
+ if repeat_count.length == 1
145
+ changes[:repeat_count] = repeat_count.head
146
+ elsif repeat_count.length > 1
147
+ raise Exceptions::InvalidSchemaError,
148
+ "more than one RepeatCount specified for this Element"
149
+ end
150
+
151
+ allowed_values = arguments.select{|x| x.is_a?(Array) and x.head == :Values }
152
+
153
+ if allowed_values.length == 1
154
+ changes[:allowed_values] = element_use.allowed_values.replace(allowed_values.head.last)
155
+ elsif allowed_values.length > 1
156
+ raise Exceptions::InvalidSchemaError,
157
+ "more than one Values specified for this Element"
158
+ end
159
+
160
+ max_length = arguments.select{|x| x.is_a?(Array) and x.head == :MaxLength }
161
+
162
+ if max_length.length == 1
163
+ dhanges[:max_length] = max_length.head.last
164
+ elsif max_length.length > 1
165
+ raise Exceptions::InvalidSchemaError,
166
+ "more than one MaxLength specified for this Element"
167
+ end
168
+
169
+ if dhanges.empty?
170
+ element_use.copy(changes)
171
+ else
172
+ element_use.copy(changes.merge(:definition =>
173
+ element_use.definition.copy(dhanges)))
174
+ end
175
+ end
176
+ end
177
+
178
+ end
179
+ end
180
+ end
@@ -0,0 +1,32 @@
1
+ module Stupidedi
2
+ module Guides
3
+ module FiftyTen
4
+
5
+ #
6
+ # @see X222.pdf 2.2 Implementation Usage
7
+ #
8
+ module SegmentReqs
9
+
10
+ # Declares that this segment must always be sent. Required segments
11
+ # within Situational loops only occur when the loop occurs.
12
+ Required = Schema::SegmentReq.new(true, false, "R")
13
+
14
+ # Use of this segment varies, depending on data content and business
15
+ # context as described in the defining rule. The defining rule is
16
+ # documented in a Situational Rule attached to the segment.
17
+ #
18
+ # There are two forms of Situational Rules. The first is "Required when
19
+ # <condition>. If not required by <condition>, the segment may be
20
+ # provided at the discretion of the sender, but it cannot be required or
21
+ # requested by the receiver.'
22
+ #
23
+ # The other form is "Required when <condition>. If not required by
24
+ # <condition>, do not send". The segment described by the rule cannot
25
+ # occur except when the condition holds.
26
+ Situational = Schema::SegmentReq.new(false, false, "S")
27
+
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,64 @@
1
+ module Stupidedi
2
+ module Guides
3
+
4
+ #
5
+ # @see Stupidedi::Versions::FunctionalGroups::FiftyTen
6
+ #
7
+ module FiftyTen
8
+
9
+ autoload :SegmentReqs, "stupidedi/guides/005010/segment_reqs"
10
+ autoload :ElementReqs, "stupidedi/guides/005010/element_reqs"
11
+
12
+ autoload :GuideBuilder, "stupidedi/guides/005010/guide_builder"
13
+
14
+ module X214
15
+ autoload :HN277, "stupidedi/guides/005010/X214-HN277"
16
+ end
17
+
18
+ module X221
19
+ autoload :HP835, "stupidedi/guides/005010/X221-HP835"
20
+ end
21
+
22
+ module X221A1
23
+ autoload :HP835, "stupidedi/guides/005010/X221A1-HP835"
24
+ end
25
+
26
+ module X222
27
+ autoload :HC837P, "stupidedi/guides/005010/X222-HC837P"
28
+ end
29
+
30
+ module X222A1
31
+ autoload :HC837P, "stupidedi/guides/005010/X222A1-HC837P"
32
+ end
33
+
34
+ # module X223
35
+ # autoload :HC837I, "stupidedi/guides/005010/X223-HC837I"
36
+ # end
37
+
38
+ # module X223A1
39
+ # autoload :HC837I, "stupidedi/guides/005010/X223A1-HC837I"
40
+ # end
41
+
42
+ # module X224
43
+ # autoload :HC837D, "stupidedi/guides/005010/X224-HC837D"
44
+ # end
45
+
46
+ # module X224A1
47
+ # autoload :HC837D, "stupidedi/guides/005010/X224A1-HC837D"
48
+ # end
49
+
50
+ # module X224A2
51
+ # autoload :HC837D, "stupidedi/guides/005010/X224A2-HC837D"
52
+ # end
53
+
54
+ module X231
55
+ autoload :FA999, "stupidedi/guides/005010/X231-FA999"
56
+ end
57
+
58
+ module X231A1
59
+ autoload :FA999, "stupidedi/guides/005010/X231A1-FA999"
60
+ end
61
+
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,5 @@
1
+ module Stupidedi
2
+ module Guides
3
+ autoload :FiftyTen, "stupidedi/guides/005010"
4
+ end
5
+ end
@@ -0,0 +1,26 @@
1
+ module Stupidedi
2
+
3
+ #
4
+ # When an exception is raised, in some cases `#inspect` is called on a
5
+ # huge object graph to generate the message `"undefined method '...' for
6
+ # <Stupidedi::Schema::TransactionSetDef:0x...>"`. This can take several
7
+ # seconds, since `Object#inspect` descends recursively into each instance
8
+ # variable.
9
+ #
10
+ # This mixin defines an alternative default implementation for `#inspect`,
11
+ # which should be significantly faster than the default Ruby implementation
12
+ # since it does not descend into the object.
13
+ #
14
+ module Inspect
15
+
16
+ # @return [String]
17
+ def inspect
18
+ if self.class.name.empty?
19
+ "#<\#<Class:0x#{self.class.object_id.abs.to_s(16)}>"
20
+ else
21
+ "#<#{self.class.name}"
22
+ end << ":0x#{object_id.abs.to_s(16)} ...>"
23
+ end
24
+ end
25
+
26
+ end