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,322 @@
1
+ module Stupidedi
2
+ module Versions
3
+ module FunctionalGroups
4
+ module FiftyTen
5
+ module ElementTypes
6
+
7
+ class Nn < SimpleElementDef
8
+
9
+ # @return [Integer]
10
+ attr_reader :precision
11
+
12
+ def initialize(id, name, min_length, max_length, precision, description = nil, parent = nil)
13
+ super(id, name, min_length, max_length, description, parent)
14
+
15
+ if precision > max_length
16
+ raise ArgumentError,
17
+ "precision cannot be greater than max_length"
18
+ end
19
+
20
+ @precision = precision
21
+ end
22
+
23
+ # @return [Nn]
24
+ def copy(changes = {})
25
+ Nn.new \
26
+ changes.fetch(:id, @id),
27
+ changes.fetch(:name, @name),
28
+ changes.fetch(:min_length, @min_length),
29
+ changes.fetch(:max_length, @max_length),
30
+ changes.fetch(:precision, @precision),
31
+ changes.fetch(:description, @description),
32
+ changes.fetch(:parent, @parent)
33
+ end
34
+
35
+ # @return [void]
36
+ def pretty_print(q)
37
+ q.text "N#{@precision}[#{@id}]"
38
+ end
39
+
40
+ def companion
41
+ FixnumVal
42
+ end
43
+ end
44
+
45
+
46
+ #
47
+ # @see X222.pdf B.1.1.3.1.1 Numeric
48
+ #
49
+ class FixnumVal < Values::SimpleElementVal
50
+
51
+ def numeric?
52
+ true
53
+ end
54
+
55
+ def too_long?
56
+ false
57
+ end
58
+
59
+ def too_short?
60
+ false
61
+ end
62
+
63
+ class Invalid < FixnumVal
64
+
65
+ # @return [Object]
66
+ attr_reader :value
67
+
68
+ def initialize(value, usage, position)
69
+ @value = value
70
+ super(usage, position)
71
+ end
72
+
73
+ def valid?
74
+ false
75
+ end
76
+
77
+ def empty?
78
+ false
79
+ end
80
+
81
+ # @return [FixnumVal]
82
+ def map
83
+ FixnumVal.value(yield(nil), usage, position)
84
+ end
85
+
86
+ # @return [String]
87
+ def inspect
88
+ id = definition.bind do |d|
89
+ "[#{'% 5s' % d.id}: #{d.name}]".bind do |s|
90
+ if usage.forbidden?
91
+ ansi.forbidden(s)
92
+ elsif usage.required?
93
+ ansi.required(s)
94
+ else
95
+ ansi.optional(s)
96
+ end
97
+ end
98
+ end
99
+
100
+ ansi.element("Nn.invalid#{id}") << "(#{ansi.invalid(@value.inspect)})"
101
+ end
102
+
103
+ # @return [String]
104
+ def to_s
105
+ ""
106
+ end
107
+
108
+ # @return [String]
109
+ def to_x12(truncate = true)
110
+ ""
111
+ end
112
+
113
+ # @return [Boolean]
114
+ def ==(other)
115
+ eql?(other)
116
+ end
117
+ end
118
+
119
+ #
120
+ # Empty numeric value. Shouldn't be directly instantiated -- instead
121
+ # use the {FixnumVal.value} and {FixnumVal.empty} constructors.
122
+ #
123
+ class Empty < FixnumVal
124
+
125
+ def valid?
126
+ true
127
+ end
128
+
129
+ def empty?
130
+ true
131
+ end
132
+
133
+ # @return [FixnumVal]
134
+ def map
135
+ FixnumVal.value(yield(nil), usage, position)
136
+ end
137
+
138
+ # @return [String]
139
+ def inspect
140
+ id = definition.bind do |d|
141
+ "[#{'% 5s' % d.id}: #{d.name}]".bind do |s|
142
+ if usage.forbidden?
143
+ ansi.forbidden(s)
144
+ elsif usage.required?
145
+ ansi.required(s)
146
+ else
147
+ ansi.optional(s)
148
+ end
149
+ end
150
+ end
151
+
152
+ ansi.element("Nn.empty#{id}")
153
+ end
154
+
155
+ # @return [String]
156
+ def to_s
157
+ ""
158
+ end
159
+
160
+ # @return [String]
161
+ def to_x12(truncate = true)
162
+ ""
163
+ end
164
+
165
+ # @return [Boolean]
166
+ def ==(other)
167
+ other.is_a?(Empty) or other.nil?
168
+ end
169
+ end
170
+
171
+ #
172
+ # Non-empty numeric value. Shouldn't be directly instantiated --
173
+ # instead, use the {FixnumVal.value} constructors.
174
+ #
175
+ class NonEmpty < FixnumVal
176
+ include Comparable
177
+
178
+ # @group Mathematical Operators
179
+ #################################################################
180
+
181
+ extend Operators::Binary
182
+ binary_operators :+, :-, :*, :/, :%, :coerce => :to_d
183
+
184
+ extend Operators::Relational
185
+ relational_operators :==, :<=>, :coerce => :to_d
186
+
187
+ extend Operators::Unary
188
+ unary_operators :abs, :-@, :+@
189
+
190
+ # @endgroup
191
+ #################################################################
192
+
193
+ # @return [BigDecimal]
194
+ attr_reader :value
195
+
196
+ delegate :to_i, :to_d, :to_f, :to_r, :to_c, :to => :@value
197
+
198
+ def initialize(value, usage, position)
199
+ @value = value
200
+ super(usage, position)
201
+ end
202
+
203
+ # @return [NonEmpty]
204
+ def copy(changes = {})
205
+ NonEmpty.new \
206
+ changes.fetch(:value, @value),
207
+ changes.fetch(:usage, usage),
208
+ changes.fetch(:position, position)
209
+ end
210
+
211
+ def coerce(other)
212
+ # self', other' = other.coerce(self)
213
+ # self' * other'
214
+ if other.respond_to?(:to_d)
215
+ return copy(:value => other.to_d), self
216
+ else
217
+ raise TypeError,
218
+ "cannot coerce FixnumVal to #{other.class}"
219
+ end
220
+ end
221
+
222
+ def valid?
223
+ true
224
+ end
225
+
226
+ def empty?
227
+ false
228
+ end
229
+
230
+ # @return [String]
231
+ def inspect
232
+ id = definition.bind do |d|
233
+ "[#{'% 5s' % d.id}: #{d.name}]".bind do |s|
234
+ if usage.forbidden?
235
+ ansi.forbidden(s)
236
+ elsif usage.required?
237
+ ansi.required(s)
238
+ else
239
+ ansi.optional(s)
240
+ end
241
+ end
242
+ end
243
+
244
+ ansi.element("Nn.value#{id}") << "(#{to_s})"
245
+ end
246
+
247
+ # @return [String]
248
+ def to_s
249
+ # The number of fractional digits is implied by usage.precision
250
+ (@value * (10 ** definition.precision)).to_i.to_s
251
+ end
252
+
253
+ # @return [String]
254
+ def to_x12(truncate = true)
255
+ nn = (@value * (10 ** definition.precision)).to_i
256
+ sign = (nn < 0) ? "-" : ""
257
+
258
+ # Leading zeros must be suppressed unless necessary to satisfy a
259
+ # minimum length requirement
260
+ if truncate
261
+ sign << nn.abs.to_s.take(definition.max_length).
262
+ rjust(definition.min_length, "0")
263
+ else
264
+ sign << nn.abs.to_s.rjust(definition.min_length, "0")
265
+ end
266
+ end
267
+
268
+ def too_long?
269
+ nn = (@value * (10 ** definition.precision)).to_i
270
+
271
+ # The length of a numeric type does not include an optional sign
272
+ definition.max_length < nn.abs.to_s.length
273
+ end
274
+
275
+ # @return [FixnumVal]
276
+ def map
277
+ FixnumVal.value(yield(@value), usage, position)
278
+ end
279
+ end
280
+
281
+ end
282
+
283
+ class << FixnumVal
284
+ # @group Constructors
285
+ ###################################################################
286
+
287
+ # @return [FixnumVal]
288
+ def empty(usage, position)
289
+ self::Empty.new(usage, position)
290
+ end
291
+
292
+ # @return [FixnumVal]
293
+ def value(object, usage, position)
294
+ if object.blank?
295
+ self::Empty.new(usage, position)
296
+ elsif object.respond_to?(:to_d)
297
+ # The number of fractional digits is implied by usage.precision
298
+ factor = 10 ** usage.definition.precision
299
+
300
+ self::NonEmpty.new(object.to_d / factor, usage, position)
301
+ else
302
+ self::Invalid.new(object, usage, position)
303
+ end
304
+ rescue ArgumentError
305
+ self::Invalid.new(object, usage, position)
306
+ end
307
+
308
+ # @endgroup
309
+ ###################################################################
310
+ end
311
+
312
+ # Prevent direct instantiation of abstract class FixnumVal
313
+ FixnumVal.eigenclass.send(:protected, :new)
314
+ FixnumVal::Empty.eigenclass.send(:public, :new)
315
+ FixnumVal::Invalid.eigenclass.send(:public, :new)
316
+ FixnumVal::NonEmpty.eigenclass.send(:public, :new)
317
+ end
318
+
319
+ end
320
+ end
321
+ end
322
+ end
@@ -0,0 +1,354 @@
1
+ module Stupidedi
2
+ module Versions
3
+ module FunctionalGroups
4
+ module FiftyTen
5
+ module ElementTypes
6
+
7
+ #
8
+ class R < SimpleElementDef
9
+
10
+ # @return [Integer]
11
+ attr_reader :max_precision
12
+
13
+ def initialize(id, name, min_length, max_length, max_precision = nil, description = nil, parent = nil)
14
+ super(id, name, min_length, max_length, description, parent)
15
+
16
+ if max_precision.try(:>, max_length)
17
+ raise ArgumentError,
18
+ "max_precision cannot be greater than max_length"
19
+ end
20
+
21
+ @max_precision = max_precision
22
+ end
23
+
24
+ def companion
25
+ FloatVal
26
+ end
27
+ end
28
+
29
+ #
30
+ # @see X222.pdf B.1.1.3.1.2 Decimal
31
+ #
32
+ class FloatVal < Values::SimpleElementVal
33
+ # PATTERN = /\A[+-]? (?# optional leading sign )
34
+ # (?:
35
+ # (?:\d+\.?\d*) | (?# whole with optional decimal or ..)
36
+ # (?:\d*?\.?\d+) ) (?# optional whole with decimal )
37
+ # (?:E[+-]?\d+)? (?# optional exponent )
38
+ # \Z/ix
39
+
40
+ def numeric?
41
+ true
42
+ end
43
+
44
+ def too_long?
45
+ false
46
+ end
47
+
48
+ def too_short?
49
+ false
50
+ end
51
+
52
+ class Invalid < FloatVal
53
+
54
+ # @return [Object]
55
+ attr_reader :value
56
+
57
+ def initialize(value, usage, position)
58
+ @value = value
59
+ super(usage, position)
60
+ end
61
+
62
+ def valid?
63
+ false
64
+ end
65
+
66
+ def empty?
67
+ false
68
+ end
69
+
70
+ # @return [FloatVal]
71
+ def map
72
+ FloatVal.value(yield(nil), usage, position)
73
+ end
74
+
75
+ # @return [String]
76
+ def inspect
77
+ id = definition.try do |d|
78
+ "[#{'% 5s' % d.id}: #{d.name}]".bind do |s|
79
+ if usage.forbidden?
80
+ ansi.forbidden(s)
81
+ elsif usage.required?
82
+ ansi.required(s)
83
+ else
84
+ ansi.optional(s)
85
+ end
86
+ end
87
+ end
88
+
89
+ ansi.element(" R.invalid#{id}") << "(#{ansi.invalid(@value.inspect)})"
90
+ end
91
+
92
+ # @return [String]
93
+ def to_s
94
+ ""
95
+ end
96
+
97
+ # @return [String]
98
+ def to_x12(truncate = true)
99
+ ""
100
+ end
101
+
102
+ # @return [Boolean]
103
+ def ==(other)
104
+ eql?(other)
105
+ end
106
+ end
107
+
108
+ #
109
+ # Empty numeric value. Shouldn't be directly instantiated -- instead
110
+ # use the {FloatVal.value} and {FloatVal.empty} constructors.
111
+ #
112
+ class Empty < FloatVal
113
+
114
+ def valid?
115
+ true
116
+ end
117
+
118
+ def empty?
119
+ true
120
+ end
121
+
122
+ # @return [FloatVal]
123
+ def map
124
+ FloatVal.value(yield(nil), usage, position)
125
+ end
126
+
127
+ # @return [String]
128
+ def inspect
129
+ id = definition.try do |d|
130
+ "[#{'% 5s' % d.id}: #{d.name}]".bind do |s|
131
+ if usage.forbidden?
132
+ ansi.forbidden(s)
133
+ elsif usage.required?
134
+ ansi.required(s)
135
+ else
136
+ ansi.optional(s)
137
+ end
138
+ end
139
+ end
140
+
141
+ ansi.element(" R.empty#{id}")
142
+ end
143
+
144
+ # @return [String]
145
+ def to_s
146
+ ""
147
+ end
148
+
149
+ # @return [String]
150
+ def to_x12(truncate = true)
151
+ ""
152
+ end
153
+
154
+ # @return [Boolean]
155
+ def ==(other)
156
+ other.is_a?(Empty) or other.nil?
157
+ end
158
+ end
159
+
160
+ #
161
+ # Non-empty numeric value. Shouldn't be directly instantiated --
162
+ # instead, use the {FloatVal.value} constructors.
163
+ #
164
+ class NonEmpty < FloatVal
165
+ include Comparable
166
+
167
+ # @group Mathematical Operators
168
+ #################################################################
169
+
170
+ extend Operators::Binary
171
+ binary_operators(:+, :-, :*, :/, :%, :coerce => :to_d)
172
+
173
+ extend Operators::Relational
174
+ relational_operators(:==, :<=>, :coerce => :to_d)
175
+
176
+ extend Operators::Unary
177
+ unary_operators(:abs, :-@, :+@)
178
+
179
+ # @endgroup
180
+ #################################################################
181
+
182
+ # @return [BigDecimal]
183
+ attr_reader :value
184
+
185
+ delegate :to_i, :to_d, :to_f, :to_r, :to_c, :to => :@value
186
+
187
+ def initialize(value, usage, position)
188
+ @value = value
189
+ super(usage, position)
190
+ end
191
+
192
+ # @return [NonEmpty]
193
+ def copy(changes = {})
194
+ NonEmpty.new \
195
+ changes.fetch(:value, @value),
196
+ changes.fetch(:usage, usage),
197
+ changes.fetch(:position, position)
198
+ end
199
+
200
+ def coerce(other)
201
+ # self', other' = other.coerce(self)
202
+ # self' * other'
203
+ if other.respond_to?(:to_d)
204
+ return copy(:value => other.to_d), self
205
+ else
206
+ raise TypeError,
207
+ "cannot coerce FloatVal to #{other.class}"
208
+ end
209
+ end
210
+
211
+ def valid?
212
+ # False for NaN and +/- Infinity
213
+ @value.finite?
214
+ end
215
+
216
+ def empty?
217
+ false
218
+ end
219
+
220
+ # @return [String]
221
+ def inspect
222
+ id = definition.try do |d|
223
+ "[#{'% 5s' % d.id}: #{d.name}]".bind do |s|
224
+ if usage.forbidden?
225
+ ansi.forbidden(s)
226
+ elsif usage.required?
227
+ ansi.required(s)
228
+ else
229
+ ansi.optional(s)
230
+ end
231
+ end
232
+ end
233
+
234
+ ansi.element(" R.value#{id}") << "(#{to_s})"
235
+ end
236
+
237
+ # @return [String]
238
+ def to_s
239
+ if definition.max_precision.present?
240
+ @value.round(definition.max_precision).to_s("F")
241
+ else
242
+ @value.to_s("F")
243
+ end
244
+ end
245
+
246
+ # While the ASC X12 standard supports the usage of exponential
247
+ # notation, the HIPAA guides prohibit it. In the interest of
248
+ # simplicity, this method will not output exponential notation,
249
+ # as there is currently no configuration attribute to indicate
250
+ # if this is allowed or not -- if this is required in the future,
251
+ # the best place for it to fit would be in SimpleElementUse
252
+ #
253
+ # @return [String]
254
+ def to_x12(truncate = true)
255
+ remaining =
256
+ if @value.to_i.zero?
257
+ definition.max_length
258
+ else
259
+ definition.max_length - @value.to_i.abs.to_s.length
260
+ end
261
+
262
+ if remaining <= 0
263
+ if truncate
264
+ int = @value.to_i.to_s
265
+ sign = (int < 0) ? "-" : ""
266
+ return sign << int.abs.to_s.take(definition.max_length)
267
+ else
268
+ return @value.to_i.abs
269
+ end
270
+ end
271
+
272
+ # Don't exceed the definition's max_precision
273
+ precision =
274
+ if definition.max_precision.present?
275
+ (definition.max_precision < remaining) ?
276
+ definition.max_precision : remaining
277
+ else
278
+ remaining
279
+ end
280
+
281
+ rounded = @value.round(precision)
282
+ sign = (rounded < 0) ? "-" : ""
283
+
284
+ # Leading zeros preceeding the decimal point and trailing zeros
285
+ # following the decimal point must be supressed unless necessary
286
+ # to satisfy a minimum length requirement or to indicate
287
+ # precision, respectively.
288
+ if rounded.zero?
289
+ "0" * definition.min_length
290
+ else
291
+ sign << rounded.abs.to_s("F").
292
+ gsub(/^0+/, ""). # leading zeros
293
+ gsub(/0+$/, ""). # trailing zeros
294
+ gsub(/\.$/, ""). # trailing decimal point
295
+ rjust(definition.min_length, "0")
296
+ end
297
+ end
298
+
299
+ def too_long?
300
+ # We can truncate the fractional portion as much as needed, so
301
+ # the only concern we have about length is regarding the digits
302
+ # to the left of the decimal place.
303
+
304
+ # The length of a decimal type does not include an optional sign
305
+ definition.max_length < @value.to_i.abs.to_s.length
306
+ end
307
+
308
+ # @return [FloatVal]
309
+ def map
310
+ FloatVal.value(yield(@value), usage, position)
311
+ end
312
+ end
313
+
314
+ end
315
+
316
+ class << FloatVal
317
+ # @group Constructors
318
+ ###################################################################
319
+
320
+ # @return [FloatVal]
321
+ def empty(usage, position)
322
+ self::Empty.new(usage, position)
323
+ end
324
+
325
+ # @return [FloatVal]
326
+ def value(object, usage, position)
327
+ if object.blank?
328
+ self::Empty.new(usage, position)
329
+ elsif object.respond_to?(:to_d)
330
+ begin
331
+ self::NonEmpty.new(object.to_d, usage, position)
332
+ rescue ArgumentError
333
+ self::Invalid.new(object, usage, position)
334
+ end
335
+ else
336
+ self::Invalid.new(object, usage, position)
337
+ end
338
+ end
339
+
340
+ # @endgroup
341
+ ###################################################################
342
+ end
343
+
344
+ # Prevent direct instantiation of abstract class FloatVal
345
+ FloatVal.eigenclass.send(:protected, :new)
346
+ FloatVal::Empty.eigenclass.send(:public, :new)
347
+ FloatVal::Invalid.eigenclass.send(:public, :new)
348
+ FloatVal::NonEmpty.eigenclass.send(:public, :new)
349
+
350
+ end
351
+ end
352
+ end
353
+ end
354
+ end