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,116 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Schema
|
|
3
|
+
# A collection of Data Elements. Used in Companion Guides to define a Transaction Set.
|
|
4
|
+
class SegmentSummary
|
|
5
|
+
|
|
6
|
+
# Indicates the order in which Segments should appear in their Level of the Transaction Set.
|
|
7
|
+
# @return [String]
|
|
8
|
+
attr_accessor :pos
|
|
9
|
+
# Short string identifying the Segment.
|
|
10
|
+
# @return [String]
|
|
11
|
+
attr_accessor :id
|
|
12
|
+
# Full name of the Segment.
|
|
13
|
+
# @return [String]
|
|
14
|
+
attr_accessor :name
|
|
15
|
+
# Documents the purpose of a Segment.
|
|
16
|
+
# @return [String]
|
|
17
|
+
attr_accessor :purpose
|
|
18
|
+
# Number of times a particular Segment may be repeated at its location in the Transaction Set.
|
|
19
|
+
# @return [Integer]
|
|
20
|
+
attr_accessor :max_use
|
|
21
|
+
# *Syntax*, *Semantic*, or *Comment* notes on a Segment.
|
|
22
|
+
# @return [String]
|
|
23
|
+
attr_accessor :notes
|
|
24
|
+
# Indicates whether or not the Segment must be used; Somewhat redundant due to `Req`.
|
|
25
|
+
# @return [String]
|
|
26
|
+
attr_accessor :usage
|
|
27
|
+
# Number of Data Elements included in the Segment.
|
|
28
|
+
# @return [Integer]
|
|
29
|
+
attr_accessor :element_count
|
|
30
|
+
# Defines if/how the Segment is required.
|
|
31
|
+
# @return [String]
|
|
32
|
+
attr_accessor :req
|
|
33
|
+
# Indicates where the Segment is located in the Transaction Set.
|
|
34
|
+
# @return [String]
|
|
35
|
+
attr_accessor :level
|
|
36
|
+
# Number of Data Elements included in the Segment.
|
|
37
|
+
# @return [Array<Eddy::Schema::ElementSummary>]
|
|
38
|
+
attr_accessor :elements
|
|
39
|
+
|
|
40
|
+
# @return [void]
|
|
41
|
+
def initialize()
|
|
42
|
+
self.elements = []
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# @param params [Hash]
|
|
46
|
+
# @return [self]
|
|
47
|
+
def self.create(params = {})
|
|
48
|
+
s = new()
|
|
49
|
+
s.pos = params[:pos]
|
|
50
|
+
s.id = params[:id]
|
|
51
|
+
s.name = params[:name]
|
|
52
|
+
s.purpose = params[:purpose]
|
|
53
|
+
s.max_use = params[:max_use]
|
|
54
|
+
s.notes = params[:notes]
|
|
55
|
+
s.usage = params[:usage]
|
|
56
|
+
s.element_count = params[:element_count]
|
|
57
|
+
s.req = params[:req]
|
|
58
|
+
s.level = params[:level]
|
|
59
|
+
s.process_elements(params[:elements])
|
|
60
|
+
return s
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# @param path [String] Path to a JSON or YAML file containing a valid Segment definition.
|
|
64
|
+
# @return [self]
|
|
65
|
+
def self.from_file(path)
|
|
66
|
+
raise Eddy::Errors::Error, "Invalid segment definition" unless Eddy::Schema.valid_segment_data?(path)
|
|
67
|
+
data = Eddy::Util.read_json_or_yaml(path)
|
|
68
|
+
return Eddy::Schema::SegmentSummary.create(data)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# @param id [String]
|
|
72
|
+
# @return [self]
|
|
73
|
+
def self.default_for_id(id)
|
|
74
|
+
id.downcase!
|
|
75
|
+
if ["ge", "gs", "iea", "isa", "se", "st"].include?(id)
|
|
76
|
+
path = File.join(Eddy::Util.data_dir, "004010", "segments", "envelope", "#{id}.segment.yml")
|
|
77
|
+
return self.from_file(path)
|
|
78
|
+
end
|
|
79
|
+
path = File.join(Eddy::Util.data_dir, "004010", "segments", "#{id}.segment.yml")
|
|
80
|
+
raise Eddy::Errors::Error, "No segment found with id #{id}" unless File.file?(path)
|
|
81
|
+
return self.from_file(path)
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
# TODO: Only use defaults if not enough info is provided.
|
|
85
|
+
# TODO: Define *enough info*.
|
|
86
|
+
#
|
|
87
|
+
# @param elements [Array<Hash>]
|
|
88
|
+
# @return [void]
|
|
89
|
+
def process_elements(elements)
|
|
90
|
+
return if elements.nil?
|
|
91
|
+
elements.each do |el|
|
|
92
|
+
default_el = Eddy::Schema::ElementSummary.default_for_id(el[:id])
|
|
93
|
+
default_el.ref = el[:ref]
|
|
94
|
+
default_el.req = el[:req] || nil
|
|
95
|
+
self.elements << default_el
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Generate a description to use as a doc comment for a segment.
|
|
100
|
+
#
|
|
101
|
+
# @param header [Boolean] (true)
|
|
102
|
+
# @return [String]
|
|
103
|
+
def doc_comment(header: true)
|
|
104
|
+
parts = []
|
|
105
|
+
parts << "### Segment Summary:\n" if header
|
|
106
|
+
parts << <<~YARD.strip
|
|
107
|
+
- Id: #{self.id}
|
|
108
|
+
- Name: #{self.name}
|
|
109
|
+
- Purpose: #{self.purpose}
|
|
110
|
+
YARD
|
|
111
|
+
return parts.compact.join("\n")
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Schema
|
|
3
|
+
# An outline of all required components for an EDI transaction set implementation.
|
|
4
|
+
class TransactionSetSummary
|
|
5
|
+
# A short code identifying the Transaction Set.
|
|
6
|
+
# @return [Integer]
|
|
7
|
+
attr_accessor :id
|
|
8
|
+
# A descriptive name for the Transaction Set.
|
|
9
|
+
# @return [String]
|
|
10
|
+
attr_accessor :name
|
|
11
|
+
# A short string used to group related Transaction Sets.
|
|
12
|
+
# @return [String]
|
|
13
|
+
attr_accessor :functional_group
|
|
14
|
+
# The components that make up the Transaction Set.
|
|
15
|
+
# @return [Array<Eddy::Schema::SegmentSummary, Eddy::Schema::LoopSummary>]
|
|
16
|
+
attr_accessor :components
|
|
17
|
+
|
|
18
|
+
# @return [void]
|
|
19
|
+
def initialize()
|
|
20
|
+
self.components = []
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
# @param params [Hash]
|
|
24
|
+
# @return [self]
|
|
25
|
+
def self.create(params = {})
|
|
26
|
+
summary = TransactionSetSummary.new()
|
|
27
|
+
summary.id = params[:id]
|
|
28
|
+
summary.name = params[:name]
|
|
29
|
+
summary.functional_group = params[:functional_group]
|
|
30
|
+
summary.process_components(params[:components])
|
|
31
|
+
return summary
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# @param path [String] Path to a JSON or YAML file containing a valid Segment definition.
|
|
35
|
+
# @return [self]
|
|
36
|
+
def self.from_file(path)
|
|
37
|
+
raise Eddy::Errors::Error, "Invalid transaction set definition" unless Eddy::Schema.valid_transaction_set_data?(path)
|
|
38
|
+
data = Eddy::Util.read_json_or_yaml(path)
|
|
39
|
+
return Eddy::Schema::TransactionSetSummary.create(data)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# @param components [Array<Hash>]
|
|
43
|
+
# @return [void]
|
|
44
|
+
def process_components(components)
|
|
45
|
+
components.each do |comp|
|
|
46
|
+
if comp.key?(:loop_id)
|
|
47
|
+
self.components << Eddy::Schema::LoopSummary.create(comp)
|
|
48
|
+
else
|
|
49
|
+
self.components << Eddy::Schema::SegmentSummary.create(comp)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# @return [String]
|
|
55
|
+
def normalized_name
|
|
56
|
+
return "TS#{self.id}"
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Generate a description to use as a doc comment for a transaction set.
|
|
60
|
+
#
|
|
61
|
+
# @param header [Boolean] (true)
|
|
62
|
+
# @return [String]
|
|
63
|
+
def doc_comment(header: true)
|
|
64
|
+
parts = []
|
|
65
|
+
parts << "### Transaction Set Summary:\n" if header
|
|
66
|
+
parts << <<~YARD.strip
|
|
67
|
+
- Id: #{self.id}
|
|
68
|
+
- Name: #{self.name}
|
|
69
|
+
- Functional Group: #{self.functional_group}
|
|
70
|
+
YARD
|
|
71
|
+
return parts.compact.join("\n")
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
# Return all components in a single, flattened array.
|
|
75
|
+
#
|
|
76
|
+
# @return [Array<Eddy::Schema::SegmentSummary, Eddy::Schema::LoopSummary>]
|
|
77
|
+
def all_components()
|
|
78
|
+
return self.components.map do |comp|
|
|
79
|
+
case comp
|
|
80
|
+
when Eddy::Schema::LoopSummary then [comp, comp.all_components()]
|
|
81
|
+
when Eddy::Schema::SegmentSummary then comp
|
|
82
|
+
else raise Eddy::Errors::Error
|
|
83
|
+
end
|
|
84
|
+
end.flatten
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Return one of each kind of loop in the Transaction Set.
|
|
88
|
+
#
|
|
89
|
+
# @return [Array<Eddy::Schema::SegmentSummary, Eddy::Schema::LoopSummary>]
|
|
90
|
+
def unique_loops()
|
|
91
|
+
return self.all_components.select { |c| c.is_a?(Eddy::Schema::LoopSummary) }.uniq(&:loop_id)
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
require "pathname"
|
|
2
|
+
require "json_schemer"
|
|
3
|
+
|
|
4
|
+
module Eddy
|
|
5
|
+
module Schema
|
|
6
|
+
|
|
7
|
+
# Check a Segment definition file against Eddy's JSON schema.
|
|
8
|
+
#
|
|
9
|
+
# @param path [String] Path to the file.
|
|
10
|
+
# @return [Boolean]
|
|
11
|
+
def self.valid_segment_data?(path)
|
|
12
|
+
schema = Pathname.new(File.join(Eddy::Util.data_dir, "schema", "segment_summary.json"))
|
|
13
|
+
schemer = JSONSchemer.schema(schema, ref_resolver: "net/http")
|
|
14
|
+
data = Eddy::Util.read_json_or_yaml(path, symbolize: false)
|
|
15
|
+
schemer.valid?(data)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Check a Loop definition file against Eddy's JSON schema.
|
|
19
|
+
#
|
|
20
|
+
# @param path [String] Path to the file.
|
|
21
|
+
# @return [Boolean]
|
|
22
|
+
def self.valid_loop_data?(path)
|
|
23
|
+
schema = Pathname.new(File.join(Eddy::Util.data_dir, "schema", "loop_summary.json"))
|
|
24
|
+
schemer = JSONSchemer.schema(schema, ref_resolver: "net/http")
|
|
25
|
+
data = Eddy::Util.read_json_or_yaml(path, symbolize: false)
|
|
26
|
+
schemer.valid?(data)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Check a Transaction Set definition file against Eddy's JSON schema.
|
|
30
|
+
#
|
|
31
|
+
# @param path [String] Path to the file.
|
|
32
|
+
# @return [Boolean]
|
|
33
|
+
def self.valid_transaction_set_data?(path)
|
|
34
|
+
schema = Pathname.new(File.join(Eddy::Util.data_dir, "schema", "transaction_set_summary.json"))
|
|
35
|
+
schemer = JSONSchemer.schema(schema, ref_resolver: "net/http")
|
|
36
|
+
data = Eddy::Util.read_json_or_yaml(path, symbolize: false)
|
|
37
|
+
schemer.valid?(data)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
end
|
|
41
|
+
end
|
data/lib/eddy/util.rb
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
# Assorted helper functions.
|
|
3
|
+
module Util; end
|
|
4
|
+
end
|
|
5
|
+
|
|
6
|
+
require "eddy/util/new_number"
|
|
7
|
+
require "eddy/util/normalize"
|
|
8
|
+
require "eddy/util/trim"
|
|
9
|
+
require "eddy/util/read"
|
|
10
|
+
require "eddy/util/clean_folder"
|
|
11
|
+
require "eddy/util/timestamp"
|
|
12
|
+
require "eddy/util/time"
|
|
13
|
+
|
|
14
|
+
require "eddy/util/paths"
|
|
15
|
+
|
|
16
|
+
require "eddy/util/edi_data"
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Util
|
|
3
|
+
# Delete all files from a folder; returns number of deleted files.
|
|
4
|
+
#
|
|
5
|
+
# @param path [String] Path to the folder.
|
|
6
|
+
# @return [Integer]
|
|
7
|
+
def self.clean_folder(path)
|
|
8
|
+
dir = File.expand_path(path)
|
|
9
|
+
children = Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) }
|
|
10
|
+
deleted = File.unlink(*children)
|
|
11
|
+
return deleted
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Util
|
|
3
|
+
# @!group EDI Data
|
|
4
|
+
|
|
5
|
+
# Return raw data from `data/004010/elements.tsv`.
|
|
6
|
+
#
|
|
7
|
+
#
|
|
8
|
+
# @example Example return value
|
|
9
|
+
# [
|
|
10
|
+
# {:id=>"1", :name=>"Route Code", :type=>"AN", :min=>"1", :max=>"13", :description=>"Mutually defined route code"},
|
|
11
|
+
# {:id=>"2", :name=>"Number of Accepted Transaction Sets", :type=>"N0", :min=>"1", :max=>"6", :description=>"Number of accepted Transaction Sets in a Functional Group"},
|
|
12
|
+
# {:id=>"3", :name=>"Free Form Message", :type=>"AN", :min=>"1", :max=>"60", :description=>"Free-form text"},
|
|
13
|
+
# ...,
|
|
14
|
+
# ]
|
|
15
|
+
#
|
|
16
|
+
# @return [Array<Hash>]
|
|
17
|
+
def self.raw_element_data()
|
|
18
|
+
return Eddy::Util.parse_tsv(File.join(Eddy::Util.data_dir, "004010", "elements.tsv"))
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Returns a hash where the keys are Element ids and the values are unprocessed Element names.
|
|
22
|
+
#
|
|
23
|
+
# @example Example return value
|
|
24
|
+
# {
|
|
25
|
+
# "1" => "Route Code",
|
|
26
|
+
# "2" => "Number of Accepted Transaction Sets",
|
|
27
|
+
# "3" => "Free Form Message",
|
|
28
|
+
# "4" => "Air Carrier Code",
|
|
29
|
+
# "5" => "Airport Code",
|
|
30
|
+
# "7" => "Bank Account Number",
|
|
31
|
+
# "8" => "Bank Client Code",
|
|
32
|
+
# "9" => "Late Reason Code",
|
|
33
|
+
# "11" => "Billing Code",
|
|
34
|
+
# ...,
|
|
35
|
+
# }
|
|
36
|
+
#
|
|
37
|
+
# @return [Hash<String, String>]
|
|
38
|
+
def self.element_ids()
|
|
39
|
+
file = File.join(Eddy::Util.data_dir, "004010", "elements-short.tsv")
|
|
40
|
+
data = {}
|
|
41
|
+
CSV.foreach(file, { col_sep: "\t", quote_char: "\x00", headers: false }) do |row|
|
|
42
|
+
next if row == ["id", "name"]
|
|
43
|
+
data[row[0]] = row[1]
|
|
44
|
+
end
|
|
45
|
+
return data
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Returns a hash where the keys are Segment ids and the values are unprocessed Segment names.
|
|
49
|
+
#
|
|
50
|
+
# @example Example return value
|
|
51
|
+
# {
|
|
52
|
+
# "AAA" => "Request Validation",
|
|
53
|
+
# "ACD" => "Account Description",
|
|
54
|
+
# "ACK" => "Line Item Acknowledgment",
|
|
55
|
+
# "ACS" => "Ancillary Charges",
|
|
56
|
+
# "ACT" => "Account Identification",
|
|
57
|
+
# "AD1" => "Adjustment Amount",
|
|
58
|
+
# "ADI" => "Animal Disposition",
|
|
59
|
+
# ...,
|
|
60
|
+
# }
|
|
61
|
+
#
|
|
62
|
+
# @return [Hash<String, String>]
|
|
63
|
+
def self.segment_ids()
|
|
64
|
+
file = File.join(Eddy::Util.data_dir, "004010", "segments.tsv")
|
|
65
|
+
data = {}
|
|
66
|
+
CSV.foreach(file, { col_sep: "\t", quote_char: "\x00" }) do |row|
|
|
67
|
+
next if row == ["id", "name"]
|
|
68
|
+
data[row[0]] = row[1]
|
|
69
|
+
end
|
|
70
|
+
return data
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# Return the full name of an Element with the given id.
|
|
74
|
+
#
|
|
75
|
+
# @example
|
|
76
|
+
# Eddy::Util.element_name_by_id("93") #=> "Name"
|
|
77
|
+
#
|
|
78
|
+
# @param id [String] ID of the Element to look up.
|
|
79
|
+
# @return [Hash]
|
|
80
|
+
def self.element_name_by_id(id)
|
|
81
|
+
data = Eddy::Util.element_ids()
|
|
82
|
+
return data[id] if data.key?(id)
|
|
83
|
+
raise Eddy::Errors::Error, "No element found with id #{id}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Return the full name of a Segment with the given id.
|
|
87
|
+
#
|
|
88
|
+
# @example
|
|
89
|
+
# Eddy::Util.segment_name_by_id("N2") #=> "Additional Name Information"
|
|
90
|
+
#
|
|
91
|
+
# @param id [String] ID of the Segment to look up.
|
|
92
|
+
# @return [Hash]
|
|
93
|
+
def self.segment_name_by_id(id)
|
|
94
|
+
data = Eddy::Util.segment_ids()
|
|
95
|
+
return data[id] if data.key?(id)
|
|
96
|
+
raise Eddy::Errors::Error, "No segment found with id #{id}"
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# List the names of Elements for which Ruby classes have already been built.
|
|
100
|
+
#
|
|
101
|
+
# @example
|
|
102
|
+
# Eddy::Util.list_element_classes() #=> ["166", "326", "349", "234", ...]
|
|
103
|
+
#
|
|
104
|
+
# @return [Array<String>]
|
|
105
|
+
def self.list_element_classes()
|
|
106
|
+
dir = File.join(Eddy::Util.root_dir, "lib", "definitions", "elements", "**", "*.rb")
|
|
107
|
+
files = Dir.glob(dir)
|
|
108
|
+
return files.map { |f| File.basename(f).sub(/\..*/, "").upcase }
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# List the names of Segments for which Ruby classes have already been built.
|
|
112
|
+
#
|
|
113
|
+
# @example
|
|
114
|
+
# Eddy::Util.list_segment_classes() #=> ["TD5", "N4", "TD1", "BIG", ...]
|
|
115
|
+
#
|
|
116
|
+
# @return [Array<String>]
|
|
117
|
+
def self.list_segment_classes()
|
|
118
|
+
dir = File.join(Eddy::Util.root_dir, "lib", "definitions", "segments", "**", "*.rb")
|
|
119
|
+
files = Dir.glob(dir)
|
|
120
|
+
return files.map { |f| File.basename(f).sub(/\..*/, "").upcase }
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
# List Segment definition files in `data/004010/segments`.
|
|
124
|
+
#
|
|
125
|
+
# @example Example return value
|
|
126
|
+
# [
|
|
127
|
+
# "~/.rbenv/versions/2.6.5/lib/gems/eddy-0.0.0/data/004010/segments/ack.segment.yml",
|
|
128
|
+
# "~/.rbenv/versions/2.6.5/lib/gems/eddy-0.0.0/data/004010/segments/bak.segment.yml",
|
|
129
|
+
# ...,
|
|
130
|
+
# ]
|
|
131
|
+
#
|
|
132
|
+
# @return [Array<String>]
|
|
133
|
+
def self.list_segment_definitions()
|
|
134
|
+
dir = File.join(Eddy::Util.data_dir, "004010", "segments")
|
|
135
|
+
files = Dir.entries(dir).select { |f| File.file?(File.join(dir, f)) }
|
|
136
|
+
return files.map { |f| File.join(dir, f) }.sort
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# List names of Elements with Ruby files currently in `Eddy.config.build_dir/elements`.
|
|
140
|
+
#
|
|
141
|
+
# @example
|
|
142
|
+
# Eddy::Util.list_built_elements() #=> []
|
|
143
|
+
#
|
|
144
|
+
# @return [Array<String>]
|
|
145
|
+
def self.list_built_elements()
|
|
146
|
+
dir = File.join(Eddy.config.build_dir, "elements", "**", "*.rb")
|
|
147
|
+
files = Dir.glob(dir)
|
|
148
|
+
return files.map { |f| File.basename(f).sub(/\..*/, "").upcase }
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
# @!endgroup EDI Data
|
|
152
|
+
end
|
|
153
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Eddy
|
|
2
|
+
module Util
|
|
3
|
+
|
|
4
|
+
# Given an array of numbers, returns the lowest number not included in the array.
|
|
5
|
+
#
|
|
6
|
+
# @param existing [Array<Integer>]
|
|
7
|
+
# @return [Integer]
|
|
8
|
+
def self.new_number(existing)
|
|
9
|
+
n = nil
|
|
10
|
+
i = 1
|
|
11
|
+
loop do
|
|
12
|
+
if existing.include?(i)
|
|
13
|
+
i += 1
|
|
14
|
+
next
|
|
15
|
+
else
|
|
16
|
+
n = i
|
|
17
|
+
break
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
return n
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|