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
data/lib/stupidedi.rb ADDED
@@ -0,0 +1,66 @@
1
+ require "bigdecimal"
2
+ require "time"
3
+ require "date"
4
+
5
+ begin
6
+ require "term/ansicolor" if $stdout.tty?
7
+ rescue LoadError
8
+ warn "terminal color disabled. gem install term-ansicolor to enable"
9
+ end
10
+
11
+ $:.unshift(File.expand_path("..", __FILE__))
12
+
13
+ # Monkey patches
14
+
15
+ #equire "ruby/exception"
16
+ require "ruby/symbol"
17
+ require "ruby/object"
18
+ require "ruby/module"
19
+ require "ruby/array"
20
+ require "ruby/hash"
21
+ require "ruby/enumerable"
22
+ require "ruby/string"
23
+ require "ruby/blank"
24
+ require "ruby/to_d"
25
+ require "ruby/to_date"
26
+ require "ruby/to_time"
27
+ require "ruby/try"
28
+ require "ruby/instance_exec"
29
+
30
+ module Stupidedi
31
+ autoload :Builder, "stupidedi/builder"
32
+ autoload :Config, "stupidedi/config"
33
+ autoload :Color, "stupidedi/color"
34
+ autoload :Versions, "stupidedi/versions"
35
+ autoload :Editor, "stupidedi/editor"
36
+ autoload :Exceptions, "stupidedi/exceptions"
37
+ autoload :Guides, "stupidedi/guides"
38
+ autoload :Reader, "stupidedi/reader"
39
+ autoload :Schema, "stupidedi/schema"
40
+ autoload :Values, "stupidedi/values"
41
+ autoload :Writer, "stupidedi/writer"
42
+ autoload :Zipper, "stupidedi/zipper"
43
+
44
+ autoload :Sets, "stupidedi/sets"
45
+ autoload :Either, "stupidedi/either"
46
+ autoload :Inspect, "stupidedi/inspect"
47
+ autoload :TailCall, "stupidedi/tail_call"
48
+ autoload :BlankSlate, "stupidedi/blank_slate"
49
+ autoload :ThreadLocalVar, "stupidedi/thread_local"
50
+ autoload :ThreadLocalHash, "stupidedi/thread_local"
51
+
52
+ # We can use a much faster implementation provided by the "called_from"
53
+ # gem, but this only compiles against Ruby 1.8. Use this implementation
54
+ # when its available, but fall back to the slow Kernel.caller method if
55
+ # we have to
56
+ if RUBY_VERSION < "1.9"
57
+ require "called_from"
58
+ def self.caller(depth = 2)
59
+ ::Kernel.called_from(depth)
60
+ end
61
+ else
62
+ def self.caller(depth = 2)
63
+ ::Kernel.caller.at(depth - 1).try(:split, ":")
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,551 @@
1
+ require "spec_helper"
2
+
3
+ describe "Generating" do
4
+ include NavigationMatchers
5
+
6
+ let(:config) { Stupidedi::Config.default }
7
+ let(:strict) { Stupidedi::Builder::BuilderDsl.build(config, true) }
8
+ let(:relaxed) { Stupidedi::Builder::BuilderDsl.build(config, false) }
9
+
10
+ context "unrecognized methods" do
11
+ it "raises an exception" do
12
+ lambda { relaxed.xyz }.should \
13
+ raise_error(NoMethodError)
14
+ end
15
+ end
16
+
17
+ context "unrecognized interchange version" do
18
+ def isa(dsl, version)
19
+ dsl.ISA("00", "",
20
+ "00", "",
21
+ "ZZ", "",
22
+ "ZZ", "",
23
+ Time.now.utc,
24
+ Time.now.utc,
25
+ "", version, 123456789, "1", "T", "")
26
+ end
27
+
28
+ context "when non-strict" do
29
+ it "quietly proceeds" do
30
+ # 0050x isn't configured
31
+ isa(relaxed, "0050x")
32
+
33
+ # An invalid ISA segment was added
34
+ relaxed.zipper.select{|z| z.node.invalid? }.should be_defined
35
+
36
+ # It's parent is an InvalidEnvelopeVal
37
+ relaxed.zipper.select{|z| z.parent.node.invalid? }.should be_defined
38
+ end
39
+ end
40
+
41
+ context "when strict" do
42
+ it "loudly complains" do
43
+ lambda do
44
+ isa(strict, "0050x")
45
+ end.should raise_error('unknown interchange version "0050x"')
46
+
47
+ # The ISA segment wasn't added
48
+ relaxed.should be_empty
49
+ end
50
+ end
51
+ end
52
+
53
+ context "interchange 00501" do
54
+ context "tracks separators" do
55
+ def isa(dsl, component = ":", repetition = "^")
56
+ dsl.ISA("00", "",
57
+ "00", "",
58
+ "ZZ", "431777999",
59
+ "ZZ", "133052274",
60
+ Time.now.utc,
61
+ Time.now.utc,
62
+ repetition, "00501", 123456789, "1", "T",
63
+ component)
64
+ end
65
+
66
+ it "on the first interchange" do
67
+ isa(relaxed, ":", "^")
68
+
69
+ relaxed.machine.separators.component.should == ":"
70
+ relaxed.machine.separators.repetition.should == "^"
71
+ end
72
+
73
+ it "on subsequent interchanges" do
74
+ isa(relaxed, "$", "%")
75
+ isa(relaxed, "@", "#")
76
+
77
+ relaxed.machine.separators.component.should == "@"
78
+ relaxed.machine.separators.repetition.should == "#"
79
+
80
+ relaxed.machine.prev.tap do |machine|
81
+ machine.separators.component.should == "$"
82
+ machine.separators.repetition.should == "%"
83
+ end.should be_defined
84
+ end
85
+ end
86
+
87
+ context "with missing IEA" do
88
+ def isa(dsl)
89
+ dsl.ISA("00", "",
90
+ "00", "",
91
+ "ZZ", "431777999",
92
+ "ZZ", "133052274",
93
+ Time.now.utc,
94
+ Time.now.utc,
95
+ "", "00501", 123456789, "1", "T", "")
96
+ end
97
+
98
+ context "when strict" do
99
+ it "loudly complains" do
100
+ lambda { isa(strict) }.should_not \
101
+ raise_error("required segment IEA is missing from interchange 00501")
102
+
103
+ lambda { isa(strict) }.should \
104
+ raise_error("required segment IEA is missing from interchange 00501")
105
+
106
+ strict.should be_first
107
+ end
108
+ end
109
+
110
+ context "when non-strict" do
111
+ it "quietly proceeds" do
112
+ lambda { isa(relaxed) }.should_not \
113
+ raise_error("required segment IEA is missing from interchange 00501")
114
+
115
+ lambda { isa(relaxed) }.should_not \
116
+ raise_error("required segment IEA is missing from interchange 00501")
117
+
118
+ relaxed.should_not be_first
119
+ end
120
+ end
121
+ end
122
+
123
+ context "with mising required elements" do
124
+ def isa(dsl)
125
+ dsl.ISA("00", "",
126
+ "00", "",
127
+ "ZZ", "",
128
+ "ZZ", "133052274",
129
+ Time.now.utc,
130
+ Time.now.utc,
131
+ "", "00501", 123456789, "1", "T", "")
132
+ end
133
+
134
+ context "when strict" do
135
+ it "loudly complains" do
136
+ lambda { isa(strict) }.should \
137
+ raise_error("required element ISA06 is blank")
138
+
139
+ strict.should be_empty
140
+ end
141
+ end
142
+
143
+ context "when non-strict" do
144
+ it "quietly proceeds" do
145
+ lambda { isa(relaxed) }.should_not \
146
+ raise_error("required element ISA06 is blank")
147
+
148
+ relaxed.element(6).select{|e| e.node == "" }.should be_defined
149
+ relaxed.element(6).select{|e| e.node.empty? }.should be_defined
150
+ end
151
+ end
152
+ end
153
+
154
+ context "invalid values" do
155
+
156
+ context "with disallowed ID values" do
157
+ def isa(dsl)
158
+ dsl.ISA("XX", "",
159
+ "00", "",
160
+ "ZZ", "431777999",
161
+ "ZZ", "133052274",
162
+ Time.now.utc,
163
+ Time.now.utc,
164
+ "", "00501", 123456789, "1", "T", "")
165
+ end
166
+
167
+ context "when strict" do
168
+ it "loudly complains" do
169
+ lambda { isa(strict) }.should \
170
+ raise_error("value XX not allowed in element ISA01")
171
+
172
+ strict.should be_empty
173
+ end
174
+ end
175
+
176
+ context "when non-strict" do
177
+ it "quietly proceeds" do
178
+ lambda { isa(relaxed) }.should_not \
179
+ raise_error("value XX not allowed in element ISA01")
180
+
181
+ relaxed.element(1).select{|e| e.node == "XX" }.should be_defined
182
+ relaxed.element(1).select{|e| e.node.invalid? }.should_not be_defined
183
+ end
184
+ end
185
+ end
186
+
187
+ context "with invalid DT values" do
188
+ def isa(dsl)
189
+ dsl.ISA("00", "",
190
+ "00", "",
191
+ "ZZ", "431777999",
192
+ "ZZ", "133052274",
193
+ "DATE",
194
+ Time.now.utc,
195
+ "", "00501", 123456789, "1", "T", "")
196
+ end
197
+
198
+ context "when strict" do
199
+ it "loudly complains" do
200
+ lambda { isa(strict) }.should \
201
+ raise_error("invalid element ISA09")
202
+
203
+ strict.should be_empty
204
+ end
205
+ end
206
+
207
+ context "when non-strict" do
208
+ it "quietly proceeds" do
209
+ lambda { isa(relaxed) }.should_not \
210
+ raise_error("invalid element ISA09")
211
+
212
+ relaxed.element(9).select{|e| e.node.invalid? }.should be_defined
213
+ relaxed.element(9).select{|e| e.node == "DATE" }.should_not be_defined
214
+ end
215
+ end
216
+ end
217
+
218
+ context "with invalid TM values" do
219
+ def isa(dsl)
220
+ dsl.ISA("00", "",
221
+ "00", "",
222
+ "ZZ", "431777999",
223
+ "ZZ", "133052274",
224
+ Time.now.utc,
225
+ "TIME",
226
+ "", "00501", 123456789, "1", "T", "")
227
+ end
228
+
229
+ context "when strict" do
230
+ it "loudly complains" do
231
+ lambda { isa(strict) }.should \
232
+ raise_error("invalid element ISA10")
233
+
234
+ strict.should be_empty
235
+ end
236
+ end
237
+
238
+ context "when non-strict" do
239
+ it "quietly proceeds" do
240
+ lambda { isa(relaxed) }.should_not \
241
+ raise_error("invalid element ISA10")
242
+
243
+ relaxed.element(10).select{|e| e.node.invalid? }.should be_defined
244
+ relaxed.element(10).select{|e| e.node == "TIME" }.should_not be_defined
245
+ end
246
+ end
247
+ end
248
+
249
+ context "with invalid Nn values", :ruby => "1.8" do
250
+ def isa(dsl)
251
+ dsl.ISA("00", "",
252
+ "00", "",
253
+ "ZZ", "431777999",
254
+ "ZZ", "133052274",
255
+ Time.now.utc,
256
+ Time.now.utc,
257
+ "", "00501", "1234ABC", "1", "T", "")
258
+ end
259
+
260
+ context "when strict" do
261
+ it "loudly complains" do
262
+ lambda { isa(strict) }.should \
263
+ raise_error("invalid element ISA13")
264
+
265
+ strict.should be_empty
266
+ end
267
+ end
268
+
269
+ context "when non-strict" do
270
+ it "quietly proceeds" do
271
+ lambda { isa(relaxed) }.should_not \
272
+ raise_error("invalid element ISA13")
273
+
274
+ relaxed.element(13).select{|e| e.node.invalid? }.should be_defined
275
+ end
276
+ end
277
+ end
278
+
279
+ end
280
+
281
+ context "incorrect element lengths" do
282
+
283
+ context "with Nn elements that are too long" do
284
+ def setup(dsl)
285
+ dsl.ISA("00", "",
286
+ "00", "",
287
+ "ZZ", "431777999",
288
+ "ZZ", "133052274",
289
+ Time.now.utc,
290
+ Time.now.utc,
291
+ "^", "00501", 1234567890, "1", "T", ":")
292
+ end
293
+
294
+ context "when strict" do
295
+ it "loudly complains" do
296
+ lambda { setup(strict) }.should \
297
+ raise_error("value is too long in element ISA13")
298
+ end
299
+ end
300
+
301
+ context "when non-strict" do
302
+ it "quietly proceeds" do
303
+ lambda { setup(relaxed) }.should_not \
304
+ raise_error
305
+
306
+ relaxed.element(13).select{|e| e.node == 1234567890 }.should be_defined
307
+ relaxed.element(13).select{|e| e.node.too_long? }.should be_defined
308
+ end
309
+ end
310
+ end
311
+
312
+ context "with Nn element that are too short" do
313
+ # I don't know of any Nn elements that have a min_length
314
+ # that isn't just 1. So the #too_short? method in FixnumVal
315
+ # don't bother testing and returns false in every case, for
316
+ # simplicity.
317
+ end
318
+
319
+ context "with R elements that are too long" do
320
+ end
321
+
322
+ context "with R elements that are too short" do
323
+ # I don't know of any R elements that have a min_length
324
+ # that isn't just 1. So the #too_short? method in FloatVal
325
+ # don't bother testing and returns false in every case, for
326
+ # simplicity.
327
+ end
328
+
329
+ context "with AN elements that are too long" do
330
+ def setup(dsl)
331
+ dsl.ISA("00", "",
332
+ "00", "",
333
+ "ZZ", "431777999xxxxxxxxxxx",
334
+ "ZZ", "133052274",
335
+ Time.now.utc,
336
+ Time.now.utc,
337
+ "^", "00501", 123456789, "1", "T", ":")
338
+ end
339
+
340
+ context "when strict" do
341
+ it "loudly complains" do
342
+ lambda { setup(strict) }.should \
343
+ raise_error("value is too long in element ISA06")
344
+ end
345
+ end
346
+
347
+ context "when non-strict" do
348
+ it "quietly proceeds" do
349
+ lambda { setup(relaxed) }.should_not \
350
+ raise_error("value is too long in element ISA06")
351
+
352
+ relaxed.element(6).select{|e| e.node == "431777999xxxxxxxxxxx" }.should be_defined
353
+ relaxed.element(6).select{|e| e.node.too_long? }.should be_defined
354
+ end
355
+ end
356
+ end
357
+
358
+ context "with AN elements that are too short" do
359
+ # I don't know of any AN elements that have a min_length
360
+ # that isn't just 1. But the #too_short? method in StringVal
361
+ # is correctly implemented
362
+ end
363
+
364
+ context "with TM elements that are too long" do
365
+ # Because TM definitions ensure max_length is 2, 4, or greater
366
+ # than 6 and because of the values are parsed into TimeVals, we
367
+ # can always safely truncate output to max_length. So there
368
+ # isn't a case where a TM element value is too long
369
+ end
370
+
371
+ context "with TM elements that are too short" do
372
+ def setup(dsl, time = Time.now.utc)
373
+ dsl.ISA("00", "",
374
+ "00", "",
375
+ "ZZ", "431777999",
376
+ "ZZ", "133052274",
377
+ Time.now.utc,
378
+ time.hour.to_s,
379
+ "^", "00501", 123456789, "1", "T", ":")
380
+ end
381
+
382
+ context "when strict" do
383
+ it "complains loudly" do
384
+ lambda { setup(strict) }.should \
385
+ raise_error("value is too short in element ISA10")
386
+ end
387
+ end
388
+
389
+ context "when non-strict" do
390
+ it "proceeds quietly" do
391
+ time = Time.now.utc
392
+
393
+ lambda { setup(relaxed, time) }.should_not \
394
+ raise_error("value is too short in element ISA10")
395
+
396
+ relaxed.element(10).select{|e| e.node.hour == time.hour }.should be_defined
397
+ relaxed.element(10).select{|e| e.node.too_short? }.should be_defined
398
+ end
399
+ end
400
+ end
401
+
402
+ context "with DT elements that are too long" do
403
+ def setup(dsl)
404
+ dsl.ISA("00", "",
405
+ "00", "",
406
+ "ZZ", "431777999",
407
+ "ZZ", "133052274",
408
+ Time.now.utc,
409
+ Time.now.utc,
410
+ "^", "00501", 123456789, "1", "T", ":")
411
+
412
+ dsl.GS("HC",
413
+ "SENDER ID",
414
+ "RECEIVER ID",
415
+ "222221105",
416
+ Time.now.utc, "1", "X", "005010X222")
417
+ end
418
+
419
+ context "when strict" do
420
+ it "complains loudly" do
421
+ lambda { setup(strict) }.should \
422
+ raise_error("value is too long in element GS04")
423
+ end
424
+ end
425
+
426
+ context "when non-strict" do
427
+ it "quietly proceeds" do
428
+ lambda { setup(relaxed) }.should_not \
429
+ raise_error("value is too long in element GS04")
430
+
431
+ relaxed.element(4).select{|e| e.node.year.should == 22222 }.should be_defined
432
+ end
433
+ end
434
+ end
435
+
436
+ context "with DT elements that are too short" do
437
+ def setup(dsl)
438
+ dsl.ISA("00", "",
439
+ "00", "",
440
+ "ZZ", "431777999",
441
+ "ZZ", "133052274",
442
+ Time.now.utc,
443
+ Time.now.utc,
444
+ "^", "00501", 123456789, "1", "T", ":")
445
+
446
+ dsl.GS("HC",
447
+ "SENDER ID",
448
+ "RECEIVER ID",
449
+ "110605",
450
+ Time.now.utc, "1", "X", "005010X222")
451
+ end
452
+
453
+ context "when strict" do
454
+ it "complains loudly" do
455
+ lambda { setup(strict) }.should \
456
+ raise_error("value is too short in element GS04")
457
+ end
458
+ end
459
+
460
+ context "when non-strict" do
461
+ it "quietly proceeds" do
462
+ lambda { setup(relaxed) }.should_not \
463
+ raise_error("value is too short in element GS04")
464
+
465
+ relaxed.element(4).select{|e| e.node.year.should == 11 }.should be_defined
466
+ end
467
+ end
468
+ end
469
+
470
+ end
471
+
472
+ context "placeholder elements" do
473
+ def setup(dsl, ts)
474
+ dsl.ISA("00", "",
475
+ "00", "",
476
+ "ZZ", "431777999",
477
+ "ZZ", "133052274",
478
+ Time.now.utc,
479
+ Time.now.utc,
480
+ "^", "00501", 123456789, "1", "T", ":")
481
+
482
+ dsl.GS("HC",
483
+ "SENDER ID",
484
+ "RECEIVER ID",
485
+ Time.now.utc,
486
+ Time.now.utc, "1", "X", ts)
487
+ end
488
+
489
+ context "with default element placeholder" do
490
+ context "when value cannot be inferred" do
491
+ it "raises an error" do
492
+ setup(relaxed, "005010X222")
493
+
494
+ lambda { relaxed.ST("837", relaxed.default, "005010X222") }.should \
495
+ raise_error("ST02 cannot be inferred")
496
+ end
497
+ end
498
+
499
+ context "when blank value can be inferred" do
500
+ it "generates an empty element" do
501
+ setup(relaxed, "005010X221")
502
+
503
+ lambda { relaxed.ST("835", "CONTROLNUM", relaxed.default) }.should_not \
504
+ raise_error("ST02 cannot be inferred")
505
+
506
+ relaxed.element(3).select{|e| e.node == "" }.should be_defined
507
+ relaxed.element(3).select{|e| e.node.blank? }.should be_defined
508
+ end
509
+ end
510
+
511
+ context "when non-empty value can be inferred" do
512
+ it "generates a non-empty element value" do
513
+ setup(relaxed, "005010X222")
514
+
515
+ lambda { relaxed.ST("837", "CONTROLNUM", relaxed.default) }.should_not \
516
+ raise_error("ST02 cannot be inferred")
517
+
518
+ relaxed.element(3).select{|e| e.node == "005010X222" }.should be_defined
519
+ end
520
+ end
521
+ end
522
+
523
+ context "with not_used element placeholder" do
524
+ context "when element is declared forbidden" do
525
+ it "generates an empty element" do
526
+ setup(relaxed, "005010X221")
527
+
528
+ lambda { relaxed.ST("835", "CONTROLNUM", relaxed.not_used) }.should_not \
529
+ raise_error("ST03 is not forbidden")
530
+
531
+ relaxed.element(3).select{|e| e.node == "" }.should be_defined
532
+ relaxed.element(3).select{|e| e.node.blank? }.should be_defined
533
+ end
534
+ end
535
+
536
+ context "when element is not declared forbidden" do
537
+ it "generates a non-empty element value" do
538
+ setup(relaxed, "005010X222")
539
+
540
+ lambda { relaxed.ST("837", "CONTROLNUM", relaxed.not_used) }.should \
541
+ raise_error("ST03 is not forbidden")
542
+ end
543
+ end
544
+ end
545
+
546
+ end
547
+ end
548
+
549
+ context "interchange 00401" do
550
+ end
551
+ end