eddy 0.1.0 → 0.3.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.
- checksums.yaml +4 -4
- data/.rubocop.yml +103 -37
- data/.solargraph.yml +4 -0
- data/.vscode/settings.json +17 -0
- data/.yardopts +2 -2
- data/CHANGELOG.md +50 -0
- data/Gemfile.lock +21 -7
- data/README.md +32 -3
- data/Rakefile +1 -10
- data/data/004010/code-lists/100.tsv +164 -0
- data/data/004010/code-lists/156.tsv +52 -0
- data/data/004010/code-lists/26.tsv +499 -0
- data/data/004010/code-lists/etc/100-fancy-definitions.tsv +164 -0
- data/data/004010/code-lists/etc/100-with-funds-codes.tsv +180 -0
- data/data/004010/code-lists/etc/26-alpha2.tsv +250 -0
- data/data/004010/code-lists/etc/26-alpha3.tsv +250 -0
- data/data/004010/elements-short.tsv +1405 -0
- data/data/004010/elements.tsv +3 -3
- data/data/004010/segments.tsv +1009 -1003
- data/data/004010/segments/ack.segment.yml +15 -0
- data/data/004010/segments/bak.segment.yml +9 -0
- data/data/004010/segments/beg.segment.yml +17 -0
- data/data/004010/segments/big.segment.yml +10 -0
- data/data/004010/segments/bsn.segment.yml +10 -0
- data/data/004010/segments/cad.segment.yml +14 -0
- data/data/004010/segments/ctp.segment.yml +19 -0
- data/data/004010/segments/ctt.segment.yml +13 -0
- data/data/004010/segments/dtm.segment.yml +7 -0
- data/data/004010/segments/envelope/ge.segment.yml +7 -0
- data/data/004010/segments/envelope/gs.segment.yml +13 -0
- data/data/004010/segments/envelope/iea.segment.yml +8 -0
- data/data/004010/segments/envelope/isa.segment.yml +22 -0
- data/data/004010/segments/envelope/se.segment.yml +7 -0
- data/data/004010/segments/envelope/st.segment.yml +12 -0
- data/data/004010/segments/hl.segment.yml +9 -0
- data/data/004010/segments/it1.segment.yml +20 -0
- data/data/004010/segments/lin.segment.yml +10 -0
- data/data/004010/segments/loop/hl.segment.yml +8 -0
- data/data/004010/segments/man.segment.yml +7 -0
- data/data/004010/segments/n1.segment.yml +9 -0
- data/data/004010/segments/n2.segment.yml +7 -0
- data/data/004010/segments/n3.segment.yml +6 -0
- data/data/004010/segments/n4.segment.yml +9 -0
- data/data/004010/segments/pid.segment.yml +10 -0
- data/data/004010/segments/po1.segment.yml +14 -0
- data/data/004010/segments/prf.segment.yml +9 -0
- data/data/004010/segments/ref.segment.yml +7 -0
- data/data/004010/segments/sac.segment.yml +20 -0
- data/data/004010/segments/sln.segment.yml +12 -0
- data/data/004010/segments/sn1.segment.yml +11 -0
- data/data/004010/segments/td1.segment.yml +13 -0
- data/data/004010/segments/td5.segment.yml +11 -0
- data/data/004010/segments/tds.segment.yml +10 -0
- data/data/schema/element_summary.json +60 -0
- data/data/schema/loop_summary.json +49 -0
- data/data/schema/segment_summary.json +66 -0
- data/data/schema/src/element_summary.schema.yml +73 -0
- data/data/schema/src/loop_summary.schema.yml +50 -0
- data/data/schema/src/segment_summary.schema.yml +59 -0
- data/data/schema/src/transaction_set_summary.schema.yml +27 -0
- data/data/schema/transaction_set_summary.json +33 -0
- data/data/sources.md +114 -145
- data/eddy.gemspec +6 -3
- data/exe/eddy +14 -0
- data/lib/definitions/elements/generated/1005.hierarchical_structure_code.rb +98 -0
- data/lib/definitions/elements/generated/1019.invoice_type_code.rb +40 -0
- data/lib/definitions/elements/generated/103.packaging_code.rb +29 -0
- data/lib/definitions/elements/generated/1166.contract_type_code.rb +87 -0
- data/lib/definitions/elements/generated/1232.purchase_category.rb +53 -0
- data/lib/definitions/elements/generated/127.reference_identification.rb +29 -0
- data/lib/definitions/elements/generated/128.reference_identification_qualifier.rb +1540 -0
- data/lib/definitions/elements/generated/1300.service_promotion_allowance_or_charge_code.rb +1090 -0
- data/lib/definitions/elements/generated/1301.agency_service_promotion_allowance_or_charge_code.rb +29 -0
- data/lib/definitions/elements/generated/133.routing_sequence_code.rb +60 -0
- data/lib/definitions/elements/generated/166.address_information.rb +29 -0
- data/lib/definitions/elements/generated/183.volume.rb +29 -0
- data/lib/definitions/elements/generated/187.weight_qualifier.rb +88 -0
- data/lib/definitions/elements/generated/19.city_name.rb +29 -0
- data/lib/definitions/elements/generated/206.equipment_initial.rb +29 -0
- data/lib/definitions/elements/generated/207.equipment_number.rb +29 -0
- data/lib/definitions/elements/generated/212.unit_price.rb +29 -0
- data/lib/definitions/elements/generated/22.commodity_code.rb +29 -0
- data/lib/definitions/elements/generated/23.commodity_code_qualifier.rb +60 -0
- data/lib/definitions/elements/generated/234.product_service_id.rb +29 -0
- data/lib/definitions/elements/generated/235.product_service_id_qualifier.rb +514 -0
- data/lib/definitions/elements/generated/236.price_identifier_code.rb +201 -0
- data/lib/definitions/elements/generated/248.allowance_or_charge_indicator.rb +44 -0
- data/lib/definitions/elements/generated/26.country_code.rb +535 -0
- data/lib/definitions/elements/generated/284.service_level_code.rb +103 -0
- data/lib/definitions/elements/generated/324.purchase_order_number.rb +29 -0
- data/lib/definitions/elements/generated/326.request_reference_number.rb +29 -0
- data/lib/definitions/elements/generated/327.change_order_sequence_number.rb +29 -0
- data/lib/definitions/elements/generated/328.release_number.rb +29 -0
- data/lib/definitions/elements/generated/330.quantity_ordered.rb +29 -0
- data/lib/definitions/elements/generated/347.hash_total.rb +29 -0
- data/lib/definitions/elements/generated/349.item_description_type.rb +40 -0
- data/lib/definitions/elements/generated/352.description.rb +29 -0
- data/lib/definitions/elements/generated/353.transaction_set_purpose_code.rb +102 -0
- data/lib/definitions/elements/generated/354.number_of_line_items.rb +30 -0
- data/lib/definitions/elements/generated/355.unit_or_basis_for_measurement_code.rb +831 -0
- data/lib/definitions/elements/generated/358.quantity_invoiced.rb +29 -0
- data/lib/definitions/elements/generated/367.contract_number.rb +29 -0
- data/lib/definitions/elements/generated/368.shipment_order_status_code.rb +139 -0
- data/lib/definitions/elements/generated/374.date_time_qualifier.rb +1149 -0
- data/lib/definitions/elements/generated/380.quantity.rb +29 -0
- data/lib/definitions/elements/generated/382.number_of_units_shipped.rb +29 -0
- data/lib/definitions/elements/generated/387.routing.rb +29 -0
- data/lib/definitions/elements/generated/396.shipment_identification.rb +29 -0
- data/lib/definitions/elements/generated/559.agency_qualifier_code.rb +213 -0
- data/lib/definitions/elements/generated/587.acknowledgment_type.rb +52 -0
- data/lib/definitions/elements/generated/610.amount.rb +30 -0
- data/lib/definitions/elements/generated/639.basis_of_unit_price_code.rb +128 -0
- data/lib/definitions/elements/generated/640.transaction_type_code.rb +483 -0
- data/lib/definitions/elements/generated/646.quantity_shipped_to_date.rb +29 -0
- data/lib/definitions/elements/generated/648.price_multiplier_qualifier.rb +43 -0
- data/lib/definitions/elements/generated/649.multiplier.rb +29 -0
- data/lib/definitions/elements/generated/66.identification_code_qualifier.rb +252 -0
- data/lib/definitions/elements/generated/662.relationship_code.rb +42 -0
- data/lib/definitions/elements/generated/668.line_item_status_code.rb +63 -0
- data/lib/definitions/elements/generated/67.identification_code.rb +29 -0
- data/lib/definitions/elements/generated/687.class_of_trade_code.rb +89 -0
- data/lib/definitions/elements/generated/750.product_process_characteristic_code.rb +254 -0
- data/lib/definitions/elements/generated/751.product_description_code.rb +29 -0
- data/lib/definitions/elements/generated/76.invoice_number.rb +29 -0
- data/lib/definitions/elements/generated/782.monetary_amount.rb +29 -0
- data/lib/definitions/elements/generated/786.security_level_code.rb +54 -0
- data/lib/definitions/elements/generated/79.lading_description.rb +29 -0
- data/lib/definitions/elements/generated/80.lading_quantity.rb +30 -0
- data/lib/definitions/elements/generated/87.marks_and_numbers.rb +29 -0
- data/lib/definitions/elements/generated/88.marks_and_numbers_qualifier.rb +57 -0
- data/lib/definitions/elements/generated/91.transportation_method_type_code.rb +108 -0
- data/lib/definitions/elements/generated/92.purchase_order_type_code.rb +106 -0
- data/lib/definitions/elements/generated/98.entity_identifier_code.rb +1349 -0
- data/lib/definitions/elements/manual/116.postal_code.rb +44 -0
- data/lib/definitions/elements/manual/124.application_receivers_code.rb +29 -0
- data/lib/definitions/elements/manual/140.standard_carrier_alpha_code.rb +211 -0
- data/lib/definitions/elements/manual/142.application_senders_code.rb +29 -0
- data/lib/definitions/elements/manual/143.transaction_set_identifier_code.rb +335 -0
- data/lib/definitions/elements/manual/156.state_or_province_code.rb +92 -0
- data/lib/definitions/elements/manual/28.group_control_number.rb +34 -0
- data/lib/definitions/elements/manual/329.transactional_set_control_number.rb +35 -0
- data/lib/definitions/elements/manual/337.time.rb +30 -0
- data/lib/definitions/elements/manual/350.assigned_identification.rb +33 -0
- data/lib/definitions/elements/manual/373.date.rb +30 -0
- data/lib/definitions/elements/manual/455.responsible_agency_code.rb +43 -0
- data/lib/definitions/elements/manual/479.functional_identifier_code.rb +271 -0
- data/lib/definitions/elements/manual/480.version_release_industry_identifier_code.rb +145 -0
- data/lib/definitions/elements/manual/784.length_of_binary_data.rb +30 -0
- data/lib/definitions/elements/manual/785.binary_data.rb +30 -0
- data/lib/definitions/elements/manual/96.number_of_included_segments.rb +30 -0
- data/lib/definitions/elements/manual/97.number_of_transaction_sets_included.rb +30 -0
- data/lib/definitions/elements/manual/hl/628.hierarchical_id_number.rb +29 -0
- data/lib/definitions/elements/manual/hl/734.hierarchical_parent_id_number.rb +29 -0
- data/lib/definitions/elements/manual/hl/735.hierarchical_level_code.rb +207 -0
- data/lib/definitions/elements/manual/hl/736.hierarchical_child_code.rb +39 -0
- data/lib/definitions/elements/manual/i/I01.authorization_information_qualifier.rb +48 -0
- data/lib/definitions/elements/manual/i/I02.authorization_information.rb +33 -0
- data/lib/definitions/elements/manual/i/I03.security_information_qualifier.rb +43 -0
- data/lib/definitions/elements/manual/i/I04.security_information.rb +33 -0
- data/lib/definitions/elements/manual/i/I05.interchange_id_qualifier.rb +75 -0
- data/lib/definitions/elements/manual/i/I06.interchange_sender_id.rb +29 -0
- data/lib/definitions/elements/manual/i/I07.interchange_receiver_id.rb +29 -0
- data/lib/definitions/elements/manual/i/I08.interchange_date.rb +35 -0
- data/lib/definitions/elements/manual/i/I09.interchange_time.rb +36 -0
- data/lib/definitions/elements/manual/i/I10.interchange_control_standards_identifier.rb +42 -0
- data/lib/definitions/elements/manual/i/I11.interchange_control_version_number.rb +55 -0
- data/lib/definitions/elements/manual/i/I12.interchange_control_number.rb +34 -0
- data/lib/definitions/elements/manual/i/I13.acknowledgment_requested.rb +43 -0
- data/lib/definitions/elements/manual/i/I14.usage_indicator.rb +40 -0
- data/lib/definitions/elements/manual/i/I15.component_element_separator.rb +36 -0
- data/lib/definitions/elements/manual/i/I16.number_of_included_functional_groups.rb +30 -0
- data/lib/definitions/elements/manual/misc/81.weight.rb +29 -0
- data/lib/definitions/elements/manual/misc/93.name.rb +29 -0
- data/lib/definitions/segments/generated/ack.rb +192 -0
- data/lib/definitions/segments/generated/bak.rb +90 -0
- data/lib/definitions/segments/generated/beg.rb +226 -0
- data/lib/definitions/segments/generated/big.rb +107 -0
- data/lib/definitions/segments/generated/bsn.rb +107 -0
- data/lib/definitions/segments/generated/cad.rb +175 -0
- data/lib/definitions/segments/generated/ctp.rb +158 -0
- data/lib/definitions/segments/generated/ctt.rb +141 -0
- data/lib/definitions/segments/generated/dtm.rb +56 -0
- data/lib/definitions/segments/generated/it1.rb +277 -0
- data/lib/definitions/segments/generated/lin.rb +107 -0
- data/lib/definitions/segments/generated/man.rb +56 -0
- data/lib/definitions/segments/generated/n1.rb +90 -0
- data/lib/definitions/segments/generated/n3.rb +39 -0
- data/lib/definitions/segments/generated/n4.rb +90 -0
- data/lib/definitions/segments/generated/pid.rb +107 -0
- data/lib/definitions/segments/generated/po1.rb +175 -0
- data/lib/definitions/segments/generated/prf.rb +90 -0
- data/lib/definitions/segments/generated/ref.rb +56 -0
- data/lib/definitions/segments/generated/sac.rb +107 -0
- data/lib/definitions/segments/generated/sln.rb +141 -0
- data/lib/definitions/segments/generated/sn1.rb +124 -0
- data/lib/definitions/segments/generated/td1.rb +158 -0
- data/lib/definitions/segments/generated/td5.rb +107 -0
- data/lib/definitions/segments/generated/tds.rb +39 -0
- data/lib/definitions/segments/manual/envelopes/ge.rb +53 -0
- data/lib/definitions/segments/manual/envelopes/gs.rb +163 -0
- data/lib/definitions/segments/manual/envelopes/iea.rb +53 -0
- data/lib/definitions/segments/manual/envelopes/isa.rb +295 -0
- data/lib/definitions/segments/manual/envelopes/se.rb +52 -0
- data/lib/definitions/segments/manual/envelopes/st.rb +52 -0
- data/lib/definitions/segments/manual/hl.rb +96 -0
- data/lib/definitions/segments/manual/n2.rb +52 -0
- data/lib/definitions/transaction_sets/manual/810/810.rb +143 -0
- data/lib/definitions/transaction_sets/manual/810/loops.rb +109 -0
- data/lib/definitions/transaction_sets/manual/850/850.rb +92 -0
- data/lib/definitions/transaction_sets/manual/850/loops.rb +58 -0
- data/lib/definitions/transaction_sets/manual/855/855.rb +83 -0
- data/lib/definitions/transaction_sets/manual/855/loops.rb +104 -0
- data/lib/definitions/transaction_sets/manual/856/856.rb +83 -0
- data/lib/definitions/transaction_sets/manual/856/loops.rb +155 -0
- data/lib/eddy.rb +29 -7
- data/lib/eddy/build/build.rb +47 -0
- data/lib/eddy/build/elements/element.rb +67 -0
- data/lib/eddy/build/elements/elements.rb +46 -0
- data/lib/eddy/build/elements/id.rb +55 -0
- data/lib/eddy/build/elements/n.rb +48 -0
- data/lib/eddy/build/loop_builder.rb +93 -0
- data/lib/eddy/build/segment_builder.rb +169 -0
- data/lib/eddy/build/transaction_set_builder.rb +218 -0
- data/lib/eddy/cli/cli.rb +39 -0
- data/lib/eddy/config.rb +51 -0
- data/lib/eddy/data.rb +50 -0
- data/lib/eddy/data/persistence/active_record.rb +10 -0
- data/lib/eddy/data/persistence/base.rb +47 -0
- data/lib/eddy/data/persistence/file.rb +50 -0
- data/lib/eddy/data/persistence/memory.rb +65 -0
- data/lib/eddy/data/store.rb +108 -0
- data/lib/eddy/errors.rb +112 -0
- data/lib/eddy/models/element.rb +14 -0
- data/lib/eddy/models/element/an.rb +55 -0
- data/lib/eddy/models/element/b.rb +53 -0
- data/lib/eddy/models/element/base.rb +116 -0
- data/lib/eddy/models/element/composite.rb +6 -0
- data/lib/eddy/models/element/dt.rb +100 -0
- data/lib/eddy/models/element/id.rb +58 -0
- data/lib/eddy/models/element/n.rb +94 -0
- data/lib/eddy/models/element/r.rb +84 -0
- data/lib/eddy/models/element/tm.rb +113 -0
- data/lib/eddy/models/loop.rb +74 -0
- data/lib/eddy/models/segment.rb +35 -0
- data/lib/eddy/models/transaction_set.rb +101 -0
- data/lib/eddy/parse.rb +58 -0
- data/lib/eddy/schema/element_summary.rb +123 -0
- data/lib/eddy/schema/loop_summary.rb +101 -0
- data/lib/eddy/schema/segment_summary.rb +116 -0
- data/lib/eddy/schema/transaction_set_summary.rb +96 -0
- data/lib/eddy/schema/validate.rb +41 -0
- data/lib/eddy/util.rb +16 -0
- data/lib/eddy/util/clean_folder.rb +14 -0
- data/lib/eddy/util/edi_data.rb +153 -0
- data/lib/eddy/util/new_number.rb +24 -0
- data/lib/eddy/util/normalize.rb +51 -0
- data/lib/eddy/util/paths.rb +19 -0
- data/lib/eddy/util/read.rb +38 -0
- data/lib/eddy/util/time.rb +56 -0
- data/lib/eddy/util/timestamp.rb +12 -0
- data/lib/eddy/util/trim.rb +29 -0
- data/lib/eddy/version.rb +1 -1
- data/lib/eddy/write/functional_group.rb +33 -0
- data/lib/eddy/write/interchange.rb +28 -0
- data/lib/eddy/write/simple_interchange.rb +57 -0
- data/lib/generators/eddy/initializer/initializer_generator.rb +17 -0
- data/lib/generators/eddy/initializer/templates/eddy.rb.erb +6 -0
- data/lib/generators/eddy/migration/migration_generator.rb +53 -0
- data/lib/generators/eddy/migration/templates/migration.rb.erb +35 -0
- data/tasks/build.rake +15 -0
- data/tasks/misc/gemspec.rake +12 -0
- data/tasks/misc/missing_lists.rake +240 -0
- data/tasks/misc/yaml2json.rake +20 -0
- data/todo.txt +16 -0
- metadata +297 -42
- data/data/004010/segments/ISA.tsv +0 -17
- data/data/schema.jsonc +0 -67
- data/lib/eddy/build/build_an.rb +0 -31
- data/lib/eddy/build/build_dt.rb +0 -46
- data/lib/eddy/build/build_elements.rb +0 -181
- data/lib/eddy/build/build_id.rb +0 -56
- data/lib/eddy/build/build_r_and_n.rb +0 -69
- data/lib/eddy/build/build_tm.rb +0 -52
- data/lib/eddy/build/segments.rb +0 -25
- data/lib/eddy/definitions/manual/elements/109.dt.pickup_date.rb +0 -20
- data/lib/eddy/definitions/manual/elements/111.tm.pickup_time.rb +0 -20
- data/lib/eddy/definitions/manual/elements/112.an.pier_name.rb +0 -19
- data/lib/eddy/definitions/manual/elements/785.b.binary_data.rb +0 -19
- data/lib/eddy/definitions/manual/elements/81.r.weight.rb +0 -19
- data/lib/eddy/definitions/manual/elements/86.n0.total_equipment.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I02.authorization_information.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I04.security_information.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I08.interchange_date.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I09.interchange_time.rb +0 -20
- data/lib/eddy/definitions/manual/elements/I15.component_element_separator.rb +0 -32
- data/lib/eddy/definitions/manual/segments/n1.rb +0 -14
- data/lib/eddy/element.rb +0 -14
- data/lib/eddy/element/an.rb +0 -36
- data/lib/eddy/element/b.rb +0 -9
- data/lib/eddy/element/base.rb +0 -37
- data/lib/eddy/element/dt.rb +0 -89
- data/lib/eddy/element/id.rb +0 -40
- data/lib/eddy/element/n.rb +0 -43
- data/lib/eddy/element/r.rb +0 -47
- data/lib/eddy/element/tm.rb +0 -108
- data/lib/eddy/error.rb +0 -14
- data/lib/eddy/helpers.rb +0 -31
- data/lib/eddy/segment.rb +0 -12
- data/lib/eddy/transaction_set.rb +0 -35
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Data
|
|
3
|
+
module Persistence
|
|
4
|
+
# Persist data as an object in memory.
|
|
5
|
+
class Memory < Base
|
|
6
|
+
|
|
7
|
+
# @return [void]
|
|
8
|
+
def initialize()
|
|
9
|
+
@data = {
|
|
10
|
+
interchange_control_numbers: [],
|
|
11
|
+
functional_group_control_numbers: {},
|
|
12
|
+
transaction_set_control_numbers: {},
|
|
13
|
+
}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# @return [Array<Integer>]
|
|
17
|
+
def interchange_control_numbers()
|
|
18
|
+
return @data[:interchange_control_numbers]
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# @param functional_group [String]
|
|
22
|
+
# @return [Array<Integer>]
|
|
23
|
+
def functional_group_control_numbers(functional_group)
|
|
24
|
+
unless @data[:functional_group_control_numbers].key?(functional_group)
|
|
25
|
+
@data[:functional_group_control_numbers][functional_group] = []
|
|
26
|
+
end
|
|
27
|
+
return @data[:functional_group_control_numbers][functional_group]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# @param transaction_set_id [String]
|
|
31
|
+
# @return [Array<Integer>]
|
|
32
|
+
def transaction_set_control_numbers(transaction_set_id)
|
|
33
|
+
unless @data[:transaction_set_control_numbers].key?(transaction_set_id)
|
|
34
|
+
@data[:transaction_set_control_numbers][transaction_set_id] = []
|
|
35
|
+
end
|
|
36
|
+
return @data[:transaction_set_control_numbers][transaction_set_id]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# @param new_ctrl_num [Integer]
|
|
40
|
+
# @return [void]
|
|
41
|
+
def add_interchange_control_number(new_ctrl_num)
|
|
42
|
+
self.interchange_control_numbers.append(new_ctrl_num)
|
|
43
|
+
return nil
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# @param functional_group [String]
|
|
47
|
+
# @param new_ctrl_num [Integer]
|
|
48
|
+
# @return [void]
|
|
49
|
+
def add_functional_group_control_number(functional_group, new_ctrl_num)
|
|
50
|
+
self.functional_group_control_numbers(functional_group).append(new_ctrl_num)
|
|
51
|
+
return nil
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @param transaction_set_id [String]
|
|
55
|
+
# @param new_ctrl_num [Integer]
|
|
56
|
+
# @return [void]
|
|
57
|
+
def add_transaction_set_control_number(transaction_set_id, new_ctrl_num)
|
|
58
|
+
self.transaction_set_control_numbers(transaction_set_id).append(new_ctrl_num)
|
|
59
|
+
return nil
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
require "time"
|
|
2
|
+
|
|
3
|
+
module Eddy
|
|
4
|
+
module Data
|
|
5
|
+
# Container used to distribute state throughout an Interchange.
|
|
6
|
+
class Store
|
|
7
|
+
|
|
8
|
+
# Time value for use by DT/TM Elements.
|
|
9
|
+
# @return [Time]
|
|
10
|
+
attr_accessor :time
|
|
11
|
+
|
|
12
|
+
# Component Element Separator
|
|
13
|
+
#
|
|
14
|
+
# Used by:
|
|
15
|
+
#
|
|
16
|
+
# - Eddy::Elements::I15
|
|
17
|
+
#
|
|
18
|
+
# @return [String] (">")
|
|
19
|
+
attr_accessor :component_separator
|
|
20
|
+
# @return [String] ("~")
|
|
21
|
+
attr_accessor :segment_separator
|
|
22
|
+
# Data Element Separator
|
|
23
|
+
# @return [String] ("*")
|
|
24
|
+
attr_accessor :element_separator
|
|
25
|
+
# QUESTION: is this the same as `component_separator`?
|
|
26
|
+
#
|
|
27
|
+
# See:
|
|
28
|
+
#
|
|
29
|
+
# - [Repeating Data Elements - X12 RFI](http://www.x12.org/rfis/Repeating%20Data%20Elements.pdf)
|
|
30
|
+
# @return [String]
|
|
31
|
+
attr_accessor :repitition_separator
|
|
32
|
+
|
|
33
|
+
# Used by:
|
|
34
|
+
#
|
|
35
|
+
# - Eddy::Elements::I11
|
|
36
|
+
#
|
|
37
|
+
# @return [String] ("00401")
|
|
38
|
+
attr_accessor :edi_version
|
|
39
|
+
|
|
40
|
+
# Version / Release / Industry Identifier Code
|
|
41
|
+
#
|
|
42
|
+
# Used by:
|
|
43
|
+
#
|
|
44
|
+
# - Eddy::Elements::E480
|
|
45
|
+
#
|
|
46
|
+
# @return [String]
|
|
47
|
+
attr_accessor :version_release_industry_id_code
|
|
48
|
+
|
|
49
|
+
# Total number of transaction sets included in the functional group or interchange (transmission) group.
|
|
50
|
+
# @return [Integer]
|
|
51
|
+
attr_accessor :number_of_transaction_sets_included
|
|
52
|
+
# A count of the number of functional groups included in an interchange.
|
|
53
|
+
# @return [Integer]
|
|
54
|
+
attr_accessor :number_of_included_functional_groups
|
|
55
|
+
|
|
56
|
+
# Application Sender's Code
|
|
57
|
+
# Code identifying party sending transmission; codes agreed to by trading partners
|
|
58
|
+
# @return [String]
|
|
59
|
+
attr_accessor :application_senders_code
|
|
60
|
+
# Application Receiver's Code
|
|
61
|
+
# Code identifying party receiving transmission. Codes agreed to by trading partners
|
|
62
|
+
# @return [String]
|
|
63
|
+
attr_accessor :application_receivers_code
|
|
64
|
+
|
|
65
|
+
# @param time [Time]
|
|
66
|
+
# @return [void]
|
|
67
|
+
def initialize(time: Time.now().utc())
|
|
68
|
+
self.time = time
|
|
69
|
+
self.component_separator = ">"
|
|
70
|
+
self.segment_separator = "~"
|
|
71
|
+
self.element_separator = "*"
|
|
72
|
+
self.edi_version = "00401"
|
|
73
|
+
self.number_of_included_functional_groups = 0
|
|
74
|
+
self.number_of_transaction_sets_included = 0
|
|
75
|
+
self.application_senders_code = "sender_id"
|
|
76
|
+
self.application_receivers_code = "receiver_id"
|
|
77
|
+
self.version_release_industry_id_code = "004010"
|
|
78
|
+
@group_control_number = 1
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# FIXME: not implemented
|
|
82
|
+
#
|
|
83
|
+
# @return [Integer]
|
|
84
|
+
def interchange_control_number()
|
|
85
|
+
# raise NotImplementedError
|
|
86
|
+
return 1
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# FIXME: not implemented
|
|
90
|
+
#
|
|
91
|
+
# @return [Integer]
|
|
92
|
+
def transaction_set_control_number()
|
|
93
|
+
# raise NotImplementedError
|
|
94
|
+
return 1
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
# Returns an incremended value every time it's called.
|
|
98
|
+
#
|
|
99
|
+
# @return [Integer]
|
|
100
|
+
def group_control_number()
|
|
101
|
+
old_count = @group_control_number.dup
|
|
102
|
+
@group_control_number += 1
|
|
103
|
+
return old_count
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
end
|
data/lib/eddy/errors.rb
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Errors
|
|
3
|
+
# Exceptions raised by Eddy inherit from Error.
|
|
4
|
+
class Error < StandardError; end
|
|
5
|
+
|
|
6
|
+
# @!group Element Validation Errors
|
|
7
|
+
|
|
8
|
+
# Exception raised by descendents of {Eddy::Element::Base}.
|
|
9
|
+
class ElementValidationError < Error
|
|
10
|
+
# @return [Eddy::Element::Base] Element instance that raised the exception.
|
|
11
|
+
attr_accessor :element
|
|
12
|
+
# Argument that caused the exception when passed to `value=`. (if applicable)
|
|
13
|
+
# @return [Object]
|
|
14
|
+
attr_accessor :arg
|
|
15
|
+
|
|
16
|
+
# @param msg [String] ("")
|
|
17
|
+
# @param element [Eddy::Element::Base] (nil) Element instance that raised the exception.
|
|
18
|
+
# @return [void]
|
|
19
|
+
def initialize(msg = "", element: nil)
|
|
20
|
+
self.element = element unless element.nil?
|
|
21
|
+
msg = "Invalid value assigned to element #{element_description()}. " << msg
|
|
22
|
+
super(msg)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# @return [String]
|
|
26
|
+
def element_description()
|
|
27
|
+
el = self.element
|
|
28
|
+
return "" if el.nil?
|
|
29
|
+
description = ""
|
|
30
|
+
if !el.ref.nil? && el.ref.length > 0
|
|
31
|
+
description << el.ref
|
|
32
|
+
else
|
|
33
|
+
description << el.class.name.split("::").last
|
|
34
|
+
end
|
|
35
|
+
description << " (#{el.name})"
|
|
36
|
+
return description
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# Exception raised when `value` has been called before `value=` and no default value is set.
|
|
41
|
+
class ElementNilValueError < ElementValidationError
|
|
42
|
+
# @param element [Eddy::Element::Base] Element instance that raised the exception.
|
|
43
|
+
# @param msg [String] (nil)
|
|
44
|
+
# @return [void]
|
|
45
|
+
def initialize(msg = "", element:)
|
|
46
|
+
self.element = element
|
|
47
|
+
if msg.length == 0
|
|
48
|
+
msg << "This element requires a value but none was set."
|
|
49
|
+
end
|
|
50
|
+
super(msg)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Exception raised when an invalid argument is passed to the `value=` method of an {Eddy::Element::Base} class.
|
|
55
|
+
class TypeValidationError < ElementValidationError
|
|
56
|
+
# @param element [Eddy::Element::Base] Element instance that raised the exception.
|
|
57
|
+
# @param arg [Object] Passed argument that caused the exception.
|
|
58
|
+
# @param msg [String] ("")
|
|
59
|
+
# @return [void]
|
|
60
|
+
def initialize(msg = "", element:, arg:)
|
|
61
|
+
self.element = element
|
|
62
|
+
self.arg = arg
|
|
63
|
+
if msg.length == 0
|
|
64
|
+
msg << "Value must to be a #{wanted_type(element)}; recieved #{self.arg} (#{self.arg.class.name})"
|
|
65
|
+
end
|
|
66
|
+
super(msg)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# @param el [Eddy::Element::Base] Element instance that raised the exception.
|
|
70
|
+
# @return [String]
|
|
71
|
+
def wanted_type(el)
|
|
72
|
+
return case el
|
|
73
|
+
when Eddy::Element::AN then "String"
|
|
74
|
+
when Eddy::Element::B then "String"
|
|
75
|
+
when Eddy::Element::DT then "Time"
|
|
76
|
+
when Eddy::Element::TM then "Time"
|
|
77
|
+
when Eddy::Element::N then "Float or Integer"
|
|
78
|
+
when Eddy::Element::R then "Float or Integer"
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Exception raised when an invalid argument is passed to the `value=` method of an {Eddy::Element::Base} class.
|
|
84
|
+
class LengthValidationError < ElementValidationError
|
|
85
|
+
|
|
86
|
+
# @param element [Eddy::Element::Base] Element instance that raised the exception.
|
|
87
|
+
# @param arg [Object] Passed argument that caused the exception.
|
|
88
|
+
# @param msg [String] ("")
|
|
89
|
+
# @return [void]
|
|
90
|
+
def initialize(msg = "", element:, arg:)
|
|
91
|
+
self.element = element
|
|
92
|
+
self.arg = arg
|
|
93
|
+
if msg.length == 0
|
|
94
|
+
msg << "Value can't be longer than #{self.element.max}. "
|
|
95
|
+
msg << "Length of recieved value: #{self.arg.to_s.length}"
|
|
96
|
+
end
|
|
97
|
+
super(msg)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# @!endgroup Element Validation Errors
|
|
102
|
+
|
|
103
|
+
# Exception raised when an issue occurs while generating code.
|
|
104
|
+
class BuildError < Error; end
|
|
105
|
+
|
|
106
|
+
# Exception raised from a `render` method.
|
|
107
|
+
class RenderError < Error; end
|
|
108
|
+
|
|
109
|
+
# Exception raised when a definition file can't be found.
|
|
110
|
+
class MissingDefinitionError < Error; end
|
|
111
|
+
end
|
|
112
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
# Base types for EDI Data Elements.
|
|
3
|
+
module Element; end
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
require "eddy/models/element/base"
|
|
7
|
+
|
|
8
|
+
require "eddy/models/element/an"
|
|
9
|
+
require "eddy/models/element/b"
|
|
10
|
+
require "eddy/models/element/dt"
|
|
11
|
+
require "eddy/models/element/id"
|
|
12
|
+
require "eddy/models/element/n"
|
|
13
|
+
require "eddy/models/element/r"
|
|
14
|
+
require "eddy/models/element/tm"
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Element
|
|
3
|
+
# Alphanumeric string including special characters
|
|
4
|
+
class AN < Base
|
|
5
|
+
|
|
6
|
+
# @param min [Integer]
|
|
7
|
+
# @param max [Integer]
|
|
8
|
+
# @param req [String] (nil)
|
|
9
|
+
# @param ref [String] (nil)
|
|
10
|
+
# @param val [String] (nil)
|
|
11
|
+
# @return [void]
|
|
12
|
+
def initialize(
|
|
13
|
+
min:,
|
|
14
|
+
max:,
|
|
15
|
+
req: nil,
|
|
16
|
+
ref: nil,
|
|
17
|
+
val: nil
|
|
18
|
+
)
|
|
19
|
+
@type = "AN"
|
|
20
|
+
@min = min
|
|
21
|
+
@max = max
|
|
22
|
+
self.req = req
|
|
23
|
+
self.ref = ref
|
|
24
|
+
self.value = val
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
|
|
28
|
+
# @return [String]
|
|
29
|
+
def value()
|
|
30
|
+
if @val.nil?
|
|
31
|
+
case self.req
|
|
32
|
+
when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
|
|
33
|
+
when "O", "C" then return ""
|
|
34
|
+
else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
return @val.ljust(self.min)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
# @raise [Eddy::Errors::ElementValidationError]
|
|
41
|
+
# @param arg [String]
|
|
42
|
+
# @return [void]
|
|
43
|
+
def value=(arg)
|
|
44
|
+
if arg.nil?
|
|
45
|
+
@val = arg
|
|
46
|
+
return
|
|
47
|
+
end
|
|
48
|
+
raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(String)
|
|
49
|
+
raise Eddy::Errors::LengthValidationError.new(element: self, arg: arg) if arg.length > self.max
|
|
50
|
+
@val = arg
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Element
|
|
3
|
+
# Binary Data.
|
|
4
|
+
# This type only occurs in the BIN segment.
|
|
5
|
+
#
|
|
6
|
+
# See:
|
|
7
|
+
#
|
|
8
|
+
# - [Maximum Length of Binary Data Element - X12 RFI](http://www.x12.org/rfis/Maximum%20Length%20of%20Binary%20Data%20Element.pdf)
|
|
9
|
+
class B < Base
|
|
10
|
+
|
|
11
|
+
# @param min [Integer]
|
|
12
|
+
# @param max [Integer]
|
|
13
|
+
# @param req [String] (nil)
|
|
14
|
+
# @param ref [String] (nil)
|
|
15
|
+
# @param val [String] (nil)
|
|
16
|
+
# @return [void]
|
|
17
|
+
def initialize(
|
|
18
|
+
min:,
|
|
19
|
+
max:,
|
|
20
|
+
req: nil,
|
|
21
|
+
ref: nil,
|
|
22
|
+
val: nil
|
|
23
|
+
)
|
|
24
|
+
@type = "B"
|
|
25
|
+
@min = min
|
|
26
|
+
@max = max
|
|
27
|
+
self.req = req
|
|
28
|
+
self.ref = ref
|
|
29
|
+
self.value = val
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
|
|
33
|
+
# @return [String<Binary>]
|
|
34
|
+
def value()
|
|
35
|
+
super()
|
|
36
|
+
if @val.nil?
|
|
37
|
+
case self.req
|
|
38
|
+
when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
|
|
39
|
+
when "O", "C" then return ""
|
|
40
|
+
else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @param _arg [Object] Whatever is to be assigned to `value`
|
|
46
|
+
# @return [void]
|
|
47
|
+
def value=(_arg)
|
|
48
|
+
super()
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Element
|
|
3
|
+
# Base class for EDI Data Element types.
|
|
4
|
+
class Base
|
|
5
|
+
|
|
6
|
+
# Positive number under 1688, or I01-I64
|
|
7
|
+
# @return [String]
|
|
8
|
+
attr_reader :id
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_reader :name
|
|
11
|
+
# @return [String]
|
|
12
|
+
attr_reader :description
|
|
13
|
+
# One of: AN, B, DT, ID, N, R, or TM
|
|
14
|
+
# @return [String]
|
|
15
|
+
attr_reader :type
|
|
16
|
+
# Minimum length for a valid value
|
|
17
|
+
# @return [Integer]
|
|
18
|
+
attr_reader :min
|
|
19
|
+
# Maximum length for a valid value
|
|
20
|
+
# @return [Integer]
|
|
21
|
+
attr_reader :max
|
|
22
|
+
# String used to identify a data element within a Segment.
|
|
23
|
+
# @return [String]
|
|
24
|
+
attr_accessor :ref
|
|
25
|
+
|
|
26
|
+
# # @return [void]
|
|
27
|
+
# def initialize(**kwargs)
|
|
28
|
+
|
|
29
|
+
# end
|
|
30
|
+
|
|
31
|
+
# @note Classes inheriting from `Eddy::Element::Base` must define the method `value`.
|
|
32
|
+
# @return [void]
|
|
33
|
+
def value(*)
|
|
34
|
+
raise NotImplementedError, "Classes inheriting from `Eddy::Element::Base` must define a `value` method."
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
# @note Classes inheriting from `Eddy::Element::Base` must define the method `value=`.
|
|
38
|
+
# @return [void]
|
|
39
|
+
def value=(*)
|
|
40
|
+
raise NotImplementedError, "Classes inheriting from `Eddy::Element::Base` must define a `value=` method."
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Indicates whether the value must be present in its segment.
|
|
44
|
+
#
|
|
45
|
+
# | code | description | official |
|
|
46
|
+
# | ----- | ----------- | ---------- |
|
|
47
|
+
# | **M** | Mandatory | yes |
|
|
48
|
+
# | **O** | Optional | yes |
|
|
49
|
+
# | **C** | Conditional | yes |
|
|
50
|
+
# | F | Floating | deprecated |
|
|
51
|
+
# | R | Required | no |
|
|
52
|
+
# | S | Situational | no |
|
|
53
|
+
# | A | Advised | no |
|
|
54
|
+
# | N | Not Advised | no |
|
|
55
|
+
# | N | Not Used | no |
|
|
56
|
+
# | X | Not Used | no |
|
|
57
|
+
# | X | Conditional | no |
|
|
58
|
+
#
|
|
59
|
+
# See:
|
|
60
|
+
#
|
|
61
|
+
# - [The Data Segment - EDIdEv](https://secure.edidev.net/edidev-ca/help/Using/Using_EDI/Using_AscX12/DataStructures/DataSegment/DataSegment.htm)
|
|
62
|
+
# - [Required vs Mandatory in Code Descriptions - X12 RFI](http://www.x12.org/rfis/Required%20vs%20Mandatory%20in%20Code%20Descriptions.pdf)
|
|
63
|
+
#
|
|
64
|
+
# @return [String]
|
|
65
|
+
def req
|
|
66
|
+
return @req
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# (see #req)
|
|
70
|
+
#
|
|
71
|
+
# @param req [String, nil]
|
|
72
|
+
# @return [void]
|
|
73
|
+
def req=(req)
|
|
74
|
+
if req.nil?
|
|
75
|
+
@req = "O"
|
|
76
|
+
return
|
|
77
|
+
end
|
|
78
|
+
raise ArgumentError, req.to_s unless req.is_a?(String)
|
|
79
|
+
case req.upcase
|
|
80
|
+
when "M", "R" then @req = "M"
|
|
81
|
+
when "O" then @req = "O"
|
|
82
|
+
when "C", "X" then @req = "C"
|
|
83
|
+
when "F" then raise Eddy::Errors::Error, "Req value 'F' not supported"
|
|
84
|
+
else raise Eddy::Errors::Error, "Invalid argument for `req=`: #{req}"
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Generate a description to use as a doc comment for an element.
|
|
89
|
+
#
|
|
90
|
+
# @param header [Boolean] (true)
|
|
91
|
+
# @return [Hash]
|
|
92
|
+
def doc_comment(header: true)
|
|
93
|
+
if header
|
|
94
|
+
return <<~END.strip
|
|
95
|
+
### Element Summary:
|
|
96
|
+
|
|
97
|
+
- Id: #{self.id}
|
|
98
|
+
- Name: #{self.name}
|
|
99
|
+
- Type: #{self.type}
|
|
100
|
+
- Min/Max: #{self.min}/#{self.max}
|
|
101
|
+
- Description: #{self.description}
|
|
102
|
+
END
|
|
103
|
+
else
|
|
104
|
+
return <<~END.strip
|
|
105
|
+
- Id: #{self.id}
|
|
106
|
+
- Name: #{self.name}
|
|
107
|
+
- Type: #{self.type}
|
|
108
|
+
- Min/Max: #{self.min}/#{self.max}
|
|
109
|
+
- Description: #{self.description}
|
|
110
|
+
END
|
|
111
|
+
end
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|