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