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.
Files changed (309) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +103 -37
  3. data/.solargraph.yml +4 -0
  4. data/.vscode/settings.json +17 -0
  5. data/.yardopts +2 -2
  6. data/CHANGELOG.md +50 -0
  7. data/Gemfile.lock +21 -7
  8. data/README.md +32 -3
  9. data/Rakefile +1 -10
  10. data/data/004010/code-lists/100.tsv +164 -0
  11. data/data/004010/code-lists/156.tsv +52 -0
  12. data/data/004010/code-lists/26.tsv +499 -0
  13. data/data/004010/code-lists/etc/100-fancy-definitions.tsv +164 -0
  14. data/data/004010/code-lists/etc/100-with-funds-codes.tsv +180 -0
  15. data/data/004010/code-lists/etc/26-alpha2.tsv +250 -0
  16. data/data/004010/code-lists/etc/26-alpha3.tsv +250 -0
  17. data/data/004010/elements-short.tsv +1405 -0
  18. data/data/004010/elements.tsv +3 -3
  19. data/data/004010/segments.tsv +1009 -1003
  20. data/data/004010/segments/ack.segment.yml +15 -0
  21. data/data/004010/segments/bak.segment.yml +9 -0
  22. data/data/004010/segments/beg.segment.yml +17 -0
  23. data/data/004010/segments/big.segment.yml +10 -0
  24. data/data/004010/segments/bsn.segment.yml +10 -0
  25. data/data/004010/segments/cad.segment.yml +14 -0
  26. data/data/004010/segments/ctp.segment.yml +19 -0
  27. data/data/004010/segments/ctt.segment.yml +13 -0
  28. data/data/004010/segments/dtm.segment.yml +7 -0
  29. data/data/004010/segments/envelope/ge.segment.yml +7 -0
  30. data/data/004010/segments/envelope/gs.segment.yml +13 -0
  31. data/data/004010/segments/envelope/iea.segment.yml +8 -0
  32. data/data/004010/segments/envelope/isa.segment.yml +22 -0
  33. data/data/004010/segments/envelope/se.segment.yml +7 -0
  34. data/data/004010/segments/envelope/st.segment.yml +12 -0
  35. data/data/004010/segments/hl.segment.yml +9 -0
  36. data/data/004010/segments/it1.segment.yml +20 -0
  37. data/data/004010/segments/lin.segment.yml +10 -0
  38. data/data/004010/segments/loop/hl.segment.yml +8 -0
  39. data/data/004010/segments/man.segment.yml +7 -0
  40. data/data/004010/segments/n1.segment.yml +9 -0
  41. data/data/004010/segments/n2.segment.yml +7 -0
  42. data/data/004010/segments/n3.segment.yml +6 -0
  43. data/data/004010/segments/n4.segment.yml +9 -0
  44. data/data/004010/segments/pid.segment.yml +10 -0
  45. data/data/004010/segments/po1.segment.yml +14 -0
  46. data/data/004010/segments/prf.segment.yml +9 -0
  47. data/data/004010/segments/ref.segment.yml +7 -0
  48. data/data/004010/segments/sac.segment.yml +20 -0
  49. data/data/004010/segments/sln.segment.yml +12 -0
  50. data/data/004010/segments/sn1.segment.yml +11 -0
  51. data/data/004010/segments/td1.segment.yml +13 -0
  52. data/data/004010/segments/td5.segment.yml +11 -0
  53. data/data/004010/segments/tds.segment.yml +10 -0
  54. data/data/schema/element_summary.json +60 -0
  55. data/data/schema/loop_summary.json +49 -0
  56. data/data/schema/segment_summary.json +66 -0
  57. data/data/schema/src/element_summary.schema.yml +73 -0
  58. data/data/schema/src/loop_summary.schema.yml +50 -0
  59. data/data/schema/src/segment_summary.schema.yml +59 -0
  60. data/data/schema/src/transaction_set_summary.schema.yml +27 -0
  61. data/data/schema/transaction_set_summary.json +33 -0
  62. data/data/sources.md +114 -145
  63. data/eddy.gemspec +6 -3
  64. data/exe/eddy +14 -0
  65. data/lib/definitions/elements/generated/1005.hierarchical_structure_code.rb +98 -0
  66. data/lib/definitions/elements/generated/1019.invoice_type_code.rb +40 -0
  67. data/lib/definitions/elements/generated/103.packaging_code.rb +29 -0
  68. data/lib/definitions/elements/generated/1166.contract_type_code.rb +87 -0
  69. data/lib/definitions/elements/generated/1232.purchase_category.rb +53 -0
  70. data/lib/definitions/elements/generated/127.reference_identification.rb +29 -0
  71. data/lib/definitions/elements/generated/128.reference_identification_qualifier.rb +1540 -0
  72. data/lib/definitions/elements/generated/1300.service_promotion_allowance_or_charge_code.rb +1090 -0
  73. data/lib/definitions/elements/generated/1301.agency_service_promotion_allowance_or_charge_code.rb +29 -0
  74. data/lib/definitions/elements/generated/133.routing_sequence_code.rb +60 -0
  75. data/lib/definitions/elements/generated/166.address_information.rb +29 -0
  76. data/lib/definitions/elements/generated/183.volume.rb +29 -0
  77. data/lib/definitions/elements/generated/187.weight_qualifier.rb +88 -0
  78. data/lib/definitions/elements/generated/19.city_name.rb +29 -0
  79. data/lib/definitions/elements/generated/206.equipment_initial.rb +29 -0
  80. data/lib/definitions/elements/generated/207.equipment_number.rb +29 -0
  81. data/lib/definitions/elements/generated/212.unit_price.rb +29 -0
  82. data/lib/definitions/elements/generated/22.commodity_code.rb +29 -0
  83. data/lib/definitions/elements/generated/23.commodity_code_qualifier.rb +60 -0
  84. data/lib/definitions/elements/generated/234.product_service_id.rb +29 -0
  85. data/lib/definitions/elements/generated/235.product_service_id_qualifier.rb +514 -0
  86. data/lib/definitions/elements/generated/236.price_identifier_code.rb +201 -0
  87. data/lib/definitions/elements/generated/248.allowance_or_charge_indicator.rb +44 -0
  88. data/lib/definitions/elements/generated/26.country_code.rb +535 -0
  89. data/lib/definitions/elements/generated/284.service_level_code.rb +103 -0
  90. data/lib/definitions/elements/generated/324.purchase_order_number.rb +29 -0
  91. data/lib/definitions/elements/generated/326.request_reference_number.rb +29 -0
  92. data/lib/definitions/elements/generated/327.change_order_sequence_number.rb +29 -0
  93. data/lib/definitions/elements/generated/328.release_number.rb +29 -0
  94. data/lib/definitions/elements/generated/330.quantity_ordered.rb +29 -0
  95. data/lib/definitions/elements/generated/347.hash_total.rb +29 -0
  96. data/lib/definitions/elements/generated/349.item_description_type.rb +40 -0
  97. data/lib/definitions/elements/generated/352.description.rb +29 -0
  98. data/lib/definitions/elements/generated/353.transaction_set_purpose_code.rb +102 -0
  99. data/lib/definitions/elements/generated/354.number_of_line_items.rb +30 -0
  100. data/lib/definitions/elements/generated/355.unit_or_basis_for_measurement_code.rb +831 -0
  101. data/lib/definitions/elements/generated/358.quantity_invoiced.rb +29 -0
  102. data/lib/definitions/elements/generated/367.contract_number.rb +29 -0
  103. data/lib/definitions/elements/generated/368.shipment_order_status_code.rb +139 -0
  104. data/lib/definitions/elements/generated/374.date_time_qualifier.rb +1149 -0
  105. data/lib/definitions/elements/generated/380.quantity.rb +29 -0
  106. data/lib/definitions/elements/generated/382.number_of_units_shipped.rb +29 -0
  107. data/lib/definitions/elements/generated/387.routing.rb +29 -0
  108. data/lib/definitions/elements/generated/396.shipment_identification.rb +29 -0
  109. data/lib/definitions/elements/generated/559.agency_qualifier_code.rb +213 -0
  110. data/lib/definitions/elements/generated/587.acknowledgment_type.rb +52 -0
  111. data/lib/definitions/elements/generated/610.amount.rb +30 -0
  112. data/lib/definitions/elements/generated/639.basis_of_unit_price_code.rb +128 -0
  113. data/lib/definitions/elements/generated/640.transaction_type_code.rb +483 -0
  114. data/lib/definitions/elements/generated/646.quantity_shipped_to_date.rb +29 -0
  115. data/lib/definitions/elements/generated/648.price_multiplier_qualifier.rb +43 -0
  116. data/lib/definitions/elements/generated/649.multiplier.rb +29 -0
  117. data/lib/definitions/elements/generated/66.identification_code_qualifier.rb +252 -0
  118. data/lib/definitions/elements/generated/662.relationship_code.rb +42 -0
  119. data/lib/definitions/elements/generated/668.line_item_status_code.rb +63 -0
  120. data/lib/definitions/elements/generated/67.identification_code.rb +29 -0
  121. data/lib/definitions/elements/generated/687.class_of_trade_code.rb +89 -0
  122. data/lib/definitions/elements/generated/750.product_process_characteristic_code.rb +254 -0
  123. data/lib/definitions/elements/generated/751.product_description_code.rb +29 -0
  124. data/lib/definitions/elements/generated/76.invoice_number.rb +29 -0
  125. data/lib/definitions/elements/generated/782.monetary_amount.rb +29 -0
  126. data/lib/definitions/elements/generated/786.security_level_code.rb +54 -0
  127. data/lib/definitions/elements/generated/79.lading_description.rb +29 -0
  128. data/lib/definitions/elements/generated/80.lading_quantity.rb +30 -0
  129. data/lib/definitions/elements/generated/87.marks_and_numbers.rb +29 -0
  130. data/lib/definitions/elements/generated/88.marks_and_numbers_qualifier.rb +57 -0
  131. data/lib/definitions/elements/generated/91.transportation_method_type_code.rb +108 -0
  132. data/lib/definitions/elements/generated/92.purchase_order_type_code.rb +106 -0
  133. data/lib/definitions/elements/generated/98.entity_identifier_code.rb +1349 -0
  134. data/lib/definitions/elements/manual/116.postal_code.rb +44 -0
  135. data/lib/definitions/elements/manual/124.application_receivers_code.rb +29 -0
  136. data/lib/definitions/elements/manual/140.standard_carrier_alpha_code.rb +211 -0
  137. data/lib/definitions/elements/manual/142.application_senders_code.rb +29 -0
  138. data/lib/definitions/elements/manual/143.transaction_set_identifier_code.rb +335 -0
  139. data/lib/definitions/elements/manual/156.state_or_province_code.rb +92 -0
  140. data/lib/definitions/elements/manual/28.group_control_number.rb +34 -0
  141. data/lib/definitions/elements/manual/329.transactional_set_control_number.rb +35 -0
  142. data/lib/definitions/elements/manual/337.time.rb +30 -0
  143. data/lib/definitions/elements/manual/350.assigned_identification.rb +33 -0
  144. data/lib/definitions/elements/manual/373.date.rb +30 -0
  145. data/lib/definitions/elements/manual/455.responsible_agency_code.rb +43 -0
  146. data/lib/definitions/elements/manual/479.functional_identifier_code.rb +271 -0
  147. data/lib/definitions/elements/manual/480.version_release_industry_identifier_code.rb +145 -0
  148. data/lib/definitions/elements/manual/784.length_of_binary_data.rb +30 -0
  149. data/lib/definitions/elements/manual/785.binary_data.rb +30 -0
  150. data/lib/definitions/elements/manual/96.number_of_included_segments.rb +30 -0
  151. data/lib/definitions/elements/manual/97.number_of_transaction_sets_included.rb +30 -0
  152. data/lib/definitions/elements/manual/hl/628.hierarchical_id_number.rb +29 -0
  153. data/lib/definitions/elements/manual/hl/734.hierarchical_parent_id_number.rb +29 -0
  154. data/lib/definitions/elements/manual/hl/735.hierarchical_level_code.rb +207 -0
  155. data/lib/definitions/elements/manual/hl/736.hierarchical_child_code.rb +39 -0
  156. data/lib/definitions/elements/manual/i/I01.authorization_information_qualifier.rb +48 -0
  157. data/lib/definitions/elements/manual/i/I02.authorization_information.rb +33 -0
  158. data/lib/definitions/elements/manual/i/I03.security_information_qualifier.rb +43 -0
  159. data/lib/definitions/elements/manual/i/I04.security_information.rb +33 -0
  160. data/lib/definitions/elements/manual/i/I05.interchange_id_qualifier.rb +75 -0
  161. data/lib/definitions/elements/manual/i/I06.interchange_sender_id.rb +29 -0
  162. data/lib/definitions/elements/manual/i/I07.interchange_receiver_id.rb +29 -0
  163. data/lib/definitions/elements/manual/i/I08.interchange_date.rb +35 -0
  164. data/lib/definitions/elements/manual/i/I09.interchange_time.rb +36 -0
  165. data/lib/definitions/elements/manual/i/I10.interchange_control_standards_identifier.rb +42 -0
  166. data/lib/definitions/elements/manual/i/I11.interchange_control_version_number.rb +55 -0
  167. data/lib/definitions/elements/manual/i/I12.interchange_control_number.rb +34 -0
  168. data/lib/definitions/elements/manual/i/I13.acknowledgment_requested.rb +43 -0
  169. data/lib/definitions/elements/manual/i/I14.usage_indicator.rb +40 -0
  170. data/lib/definitions/elements/manual/i/I15.component_element_separator.rb +36 -0
  171. data/lib/definitions/elements/manual/i/I16.number_of_included_functional_groups.rb +30 -0
  172. data/lib/definitions/elements/manual/misc/81.weight.rb +29 -0
  173. data/lib/definitions/elements/manual/misc/93.name.rb +29 -0
  174. data/lib/definitions/segments/generated/ack.rb +192 -0
  175. data/lib/definitions/segments/generated/bak.rb +90 -0
  176. data/lib/definitions/segments/generated/beg.rb +226 -0
  177. data/lib/definitions/segments/generated/big.rb +107 -0
  178. data/lib/definitions/segments/generated/bsn.rb +107 -0
  179. data/lib/definitions/segments/generated/cad.rb +175 -0
  180. data/lib/definitions/segments/generated/ctp.rb +158 -0
  181. data/lib/definitions/segments/generated/ctt.rb +141 -0
  182. data/lib/definitions/segments/generated/dtm.rb +56 -0
  183. data/lib/definitions/segments/generated/it1.rb +277 -0
  184. data/lib/definitions/segments/generated/lin.rb +107 -0
  185. data/lib/definitions/segments/generated/man.rb +56 -0
  186. data/lib/definitions/segments/generated/n1.rb +90 -0
  187. data/lib/definitions/segments/generated/n3.rb +39 -0
  188. data/lib/definitions/segments/generated/n4.rb +90 -0
  189. data/lib/definitions/segments/generated/pid.rb +107 -0
  190. data/lib/definitions/segments/generated/po1.rb +175 -0
  191. data/lib/definitions/segments/generated/prf.rb +90 -0
  192. data/lib/definitions/segments/generated/ref.rb +56 -0
  193. data/lib/definitions/segments/generated/sac.rb +107 -0
  194. data/lib/definitions/segments/generated/sln.rb +141 -0
  195. data/lib/definitions/segments/generated/sn1.rb +124 -0
  196. data/lib/definitions/segments/generated/td1.rb +158 -0
  197. data/lib/definitions/segments/generated/td5.rb +107 -0
  198. data/lib/definitions/segments/generated/tds.rb +39 -0
  199. data/lib/definitions/segments/manual/envelopes/ge.rb +53 -0
  200. data/lib/definitions/segments/manual/envelopes/gs.rb +163 -0
  201. data/lib/definitions/segments/manual/envelopes/iea.rb +53 -0
  202. data/lib/definitions/segments/manual/envelopes/isa.rb +295 -0
  203. data/lib/definitions/segments/manual/envelopes/se.rb +52 -0
  204. data/lib/definitions/segments/manual/envelopes/st.rb +52 -0
  205. data/lib/definitions/segments/manual/hl.rb +96 -0
  206. data/lib/definitions/segments/manual/n2.rb +52 -0
  207. data/lib/definitions/transaction_sets/manual/810/810.rb +143 -0
  208. data/lib/definitions/transaction_sets/manual/810/loops.rb +109 -0
  209. data/lib/definitions/transaction_sets/manual/850/850.rb +92 -0
  210. data/lib/definitions/transaction_sets/manual/850/loops.rb +58 -0
  211. data/lib/definitions/transaction_sets/manual/855/855.rb +83 -0
  212. data/lib/definitions/transaction_sets/manual/855/loops.rb +104 -0
  213. data/lib/definitions/transaction_sets/manual/856/856.rb +83 -0
  214. data/lib/definitions/transaction_sets/manual/856/loops.rb +155 -0
  215. data/lib/eddy.rb +29 -7
  216. data/lib/eddy/build/build.rb +47 -0
  217. data/lib/eddy/build/elements/element.rb +67 -0
  218. data/lib/eddy/build/elements/elements.rb +46 -0
  219. data/lib/eddy/build/elements/id.rb +55 -0
  220. data/lib/eddy/build/elements/n.rb +48 -0
  221. data/lib/eddy/build/loop_builder.rb +93 -0
  222. data/lib/eddy/build/segment_builder.rb +169 -0
  223. data/lib/eddy/build/transaction_set_builder.rb +218 -0
  224. data/lib/eddy/cli/cli.rb +39 -0
  225. data/lib/eddy/config.rb +51 -0
  226. data/lib/eddy/data.rb +50 -0
  227. data/lib/eddy/data/persistence/active_record.rb +10 -0
  228. data/lib/eddy/data/persistence/base.rb +47 -0
  229. data/lib/eddy/data/persistence/file.rb +50 -0
  230. data/lib/eddy/data/persistence/memory.rb +65 -0
  231. data/lib/eddy/data/store.rb +108 -0
  232. data/lib/eddy/errors.rb +112 -0
  233. data/lib/eddy/models/element.rb +14 -0
  234. data/lib/eddy/models/element/an.rb +55 -0
  235. data/lib/eddy/models/element/b.rb +53 -0
  236. data/lib/eddy/models/element/base.rb +116 -0
  237. data/lib/eddy/models/element/composite.rb +6 -0
  238. data/lib/eddy/models/element/dt.rb +100 -0
  239. data/lib/eddy/models/element/id.rb +58 -0
  240. data/lib/eddy/models/element/n.rb +94 -0
  241. data/lib/eddy/models/element/r.rb +84 -0
  242. data/lib/eddy/models/element/tm.rb +113 -0
  243. data/lib/eddy/models/loop.rb +74 -0
  244. data/lib/eddy/models/segment.rb +35 -0
  245. data/lib/eddy/models/transaction_set.rb +101 -0
  246. data/lib/eddy/parse.rb +58 -0
  247. data/lib/eddy/schema/element_summary.rb +123 -0
  248. data/lib/eddy/schema/loop_summary.rb +101 -0
  249. data/lib/eddy/schema/segment_summary.rb +116 -0
  250. data/lib/eddy/schema/transaction_set_summary.rb +96 -0
  251. data/lib/eddy/schema/validate.rb +41 -0
  252. data/lib/eddy/util.rb +16 -0
  253. data/lib/eddy/util/clean_folder.rb +14 -0
  254. data/lib/eddy/util/edi_data.rb +153 -0
  255. data/lib/eddy/util/new_number.rb +24 -0
  256. data/lib/eddy/util/normalize.rb +51 -0
  257. data/lib/eddy/util/paths.rb +19 -0
  258. data/lib/eddy/util/read.rb +38 -0
  259. data/lib/eddy/util/time.rb +56 -0
  260. data/lib/eddy/util/timestamp.rb +12 -0
  261. data/lib/eddy/util/trim.rb +29 -0
  262. data/lib/eddy/version.rb +1 -1
  263. data/lib/eddy/write/functional_group.rb +33 -0
  264. data/lib/eddy/write/interchange.rb +28 -0
  265. data/lib/eddy/write/simple_interchange.rb +57 -0
  266. data/lib/generators/eddy/initializer/initializer_generator.rb +17 -0
  267. data/lib/generators/eddy/initializer/templates/eddy.rb.erb +6 -0
  268. data/lib/generators/eddy/migration/migration_generator.rb +53 -0
  269. data/lib/generators/eddy/migration/templates/migration.rb.erb +35 -0
  270. data/tasks/build.rake +15 -0
  271. data/tasks/misc/gemspec.rake +12 -0
  272. data/tasks/misc/missing_lists.rake +240 -0
  273. data/tasks/misc/yaml2json.rake +20 -0
  274. data/todo.txt +16 -0
  275. metadata +297 -42
  276. data/data/004010/segments/ISA.tsv +0 -17
  277. data/data/schema.jsonc +0 -67
  278. data/lib/eddy/build/build_an.rb +0 -31
  279. data/lib/eddy/build/build_dt.rb +0 -46
  280. data/lib/eddy/build/build_elements.rb +0 -181
  281. data/lib/eddy/build/build_id.rb +0 -56
  282. data/lib/eddy/build/build_r_and_n.rb +0 -69
  283. data/lib/eddy/build/build_tm.rb +0 -52
  284. data/lib/eddy/build/segments.rb +0 -25
  285. data/lib/eddy/definitions/manual/elements/109.dt.pickup_date.rb +0 -20
  286. data/lib/eddy/definitions/manual/elements/111.tm.pickup_time.rb +0 -20
  287. data/lib/eddy/definitions/manual/elements/112.an.pier_name.rb +0 -19
  288. data/lib/eddy/definitions/manual/elements/785.b.binary_data.rb +0 -19
  289. data/lib/eddy/definitions/manual/elements/81.r.weight.rb +0 -19
  290. data/lib/eddy/definitions/manual/elements/86.n0.total_equipment.rb +0 -20
  291. data/lib/eddy/definitions/manual/elements/I02.authorization_information.rb +0 -20
  292. data/lib/eddy/definitions/manual/elements/I04.security_information.rb +0 -20
  293. data/lib/eddy/definitions/manual/elements/I08.interchange_date.rb +0 -20
  294. data/lib/eddy/definitions/manual/elements/I09.interchange_time.rb +0 -20
  295. data/lib/eddy/definitions/manual/elements/I15.component_element_separator.rb +0 -32
  296. data/lib/eddy/definitions/manual/segments/n1.rb +0 -14
  297. data/lib/eddy/element.rb +0 -14
  298. data/lib/eddy/element/an.rb +0 -36
  299. data/lib/eddy/element/b.rb +0 -9
  300. data/lib/eddy/element/base.rb +0 -37
  301. data/lib/eddy/element/dt.rb +0 -89
  302. data/lib/eddy/element/id.rb +0 -40
  303. data/lib/eddy/element/n.rb +0 -43
  304. data/lib/eddy/element/r.rb +0 -47
  305. data/lib/eddy/element/tm.rb +0 -108
  306. data/lib/eddy/error.rb +0 -14
  307. data/lib/eddy/helpers.rb +0 -31
  308. data/lib/eddy/segment.rb +0 -12
  309. 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
@@ -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