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,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
@@ -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