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,6 @@
1
+ module Eddy
2
+ module Element
3
+ # - [References to Component Data Elements - X12 RFI](http://www.x12.org/rfis/References%20to%20Component%20Data%20Elements.pdf)
4
+ class Composite; end
5
+ end
6
+ end
@@ -0,0 +1,100 @@
1
+ require "time"
2
+
3
+ module Eddy
4
+ module Element
5
+ # Date in `YYMMDD` or `CCYYMMDD` format based on EDI version being used (DLMS Baseline is 004010)
6
+ #
7
+ # Values for this type are generated from a *UTC* formatted [Time][time] object.
8
+ #
9
+ # [time]: https://ruby-doc.org/stdlib-2.6.5/libdoc/time/rdoc/Time.html
10
+ class DT < Base
11
+
12
+ # Format for the date. Valid values: `:yymmdd` or `:ccyymmdd`
13
+ # @return [Symbol<:yymmdd, :ccyymmdd>]
14
+ attr_reader :fmt
15
+
16
+ # @param min [Integer] (nil)
17
+ # @param max [Integer] (nil)
18
+ # @param req [String] (nil)
19
+ # @param ref [String] (nil)
20
+ # @param val [Time] (nil) A *UTC* formatted Time object.
21
+ # @param fmt [Symbol] (nil) Format for the date. Valid values: `:yymmdd` or `:ccyymmdd`.
22
+ # @return [void]
23
+ def initialize(
24
+ min: nil,
25
+ max: nil,
26
+ req: nil,
27
+ ref: nil,
28
+ val: nil,
29
+ fmt: nil
30
+ )
31
+ @type = "DT"
32
+ @min = min
33
+ @max = max
34
+ self.req = req
35
+ self.ref = ref
36
+ if fmt.nil?
37
+ raise ArgumentError, "DT elements require either a `fmt` value, or `min` and `max` values." if min.nil? || max.nil?
38
+ @fmt = determine_format()
39
+ else
40
+ self.fmt = fmt
41
+ end
42
+ self.value = val
43
+ end
44
+
45
+ # @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
46
+ # @return [String]
47
+ def value()
48
+ if @val.nil?
49
+ case self.req
50
+ when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
51
+ when "O", "C" then return ""
52
+ else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
53
+ end
54
+ end
55
+ case self.fmt
56
+ when :yymmdd then return Eddy::Util::Time.yymmdd(@val)
57
+ when :ccyymmdd then return Eddy::Util::Time.ccyymmdd(@val)
58
+ else raise Eddy::Errors::Error "invalid fmt value for DT object"
59
+ end
60
+ end
61
+
62
+ # @raise [ElementValidationError] Unless passed a *UTC* formatted `Time` object.
63
+ # @param arg [Time] A *UTC* formatted [Time](https://ruby-doc.org/stdlib-2.6.5/libdoc/time/rdoc/Time.html) object.
64
+ # @return [void]
65
+ def value=(arg)
66
+ if arg.nil?
67
+ @val = arg
68
+ return
69
+ end
70
+ raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(Time)
71
+ raise Eddy::Errors::ElementValidationError.new("Argument passed is not in UTC format", element: self) unless arg.utc?()
72
+ @val = arg
73
+ end
74
+
75
+ # @param fmt [Symbol]
76
+ # @return [void]
77
+ def fmt=(fmt)
78
+ return if fmt.nil?
79
+ fmt = fmt.to_sym.downcase
80
+ raise ArgumentError, "Invalid fmt for DT value: #{fmt}" unless accepted_formats.include?(fmt)
81
+ @fmt = fmt
82
+ end
83
+
84
+ # @return [Array<Symbol>]
85
+ def accepted_formats()
86
+ return [:yymmdd, :ccyymmdd]
87
+ end
88
+
89
+ # @return [Symbol]
90
+ def determine_format()
91
+ case self.max
92
+ when 6 then return :yymmdd
93
+ when 8 then return :ccyymmdd
94
+ else raise Eddy::Errors::Error, "unable to determine format for dt element"
95
+ end
96
+ end
97
+
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,58 @@
1
+ module Eddy
2
+ module Element
3
+ # Identifier (works with a code list specified by the dictionary).
4
+ class ID < 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 = "ID"
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
38
+ end
39
+
40
+ # @param arg [String]
41
+ # return [void]
42
+ def value=(arg)
43
+ if arg.nil?
44
+ @val = arg
45
+ return
46
+ end
47
+ raise Eddy::Errors::ElementValidationError.new("Value not present in code list: #{arg}", element: self) unless self.code_list().include?(arg)
48
+ @val = arg
49
+ end
50
+
51
+ # @return [Array<String>]
52
+ def code_list()
53
+ raise NotImplementedError, "Each ID element must define its own code_list"
54
+ end
55
+
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,94 @@
1
+ module Eddy
2
+ module Element
3
+ # Numeric (implies the number of decimal points, e.g., N2 would be two decimal positions)
4
+ class N < Base
5
+
6
+ # *Implied* number of decimal points.
7
+ # @return [Integer]
8
+ attr_accessor :decimals
9
+
10
+ # @param min [Integer]
11
+ # @param max [Integer]
12
+ # @param req [String] (nil)
13
+ # @param ref [String] (nil)
14
+ # @param val [Numeric] (nil)
15
+ # @param decimals [Integer] (0)
16
+ # @return [void]
17
+ def initialize(
18
+ min:,
19
+ max:,
20
+ req: nil,
21
+ ref: nil,
22
+ val: nil,
23
+ decimals: 0
24
+ )
25
+ @min = min
26
+ @max = max
27
+ self.req = req
28
+ self.ref = ref
29
+ self.decimals = decimals
30
+ self.value = val
31
+ end
32
+
33
+ # @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
34
+ # @return [String]
35
+ def value()
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
+ return self.process_value()
44
+ end
45
+
46
+ # @raise [Eddy::Errors::ElementValidationError]
47
+ # @param arg [Numeric]
48
+ # @return [void]
49
+ def value=(arg)
50
+ if arg.nil?
51
+ @val = nil
52
+ return
53
+ end
54
+ raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(Numeric)
55
+ @val = arg
56
+ end
57
+
58
+ # @return [String]
59
+ def process_value()
60
+ return self.class.process_value(
61
+ @val,
62
+ self.decimals,
63
+ min: self.min,
64
+ max: self.max,
65
+ )
66
+ end
67
+
68
+ # Convert a Float or Integer value to a valid EDI string representation.
69
+ # [Stas Spiridonov is a wizard](https://github.com/spiridonov/baldr/blob/master/lib/baldr/types.rb#L43).
70
+ #
71
+ # @param val [Numeric] Original value.
72
+ # @param decimals [Integer] *Implied* number of decimal points.
73
+ # @param min [Integer] (1) Minimum length for a valid value.
74
+ # @param max [Integer] (nil) Maximum length for a valid value.
75
+ # @return [String]
76
+ def self.process_value(val, decimals, min: 1, max: nil)
77
+ case val
78
+ when Integer
79
+ if (val - val.floor) == 0
80
+ return sprintf("%0#{min}d", val.truncate)
81
+ else
82
+ return sprintf("%0#{min}d", val.round(2))
83
+ end
84
+ # return sprintf("%0#{min}d", val)
85
+ when Float
86
+ return (val * (10.0**decimals)).round.to_s
87
+ else
88
+ raise ArgumentError, "'val' must be a Float or an Integer."
89
+ end
90
+ end
91
+
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,84 @@
1
+ require "bigdecimal"
2
+
3
+ module Eddy
4
+ module Element
5
+ # Decimal Numeric (decimal points must be transmitted if used).
6
+ class R < Base
7
+
8
+ # @param min [Integer]
9
+ # @param max [Integer]
10
+ # @param req [String] (nil)
11
+ # @param ref [String] (nil)
12
+ # @param val [Numeric] (nil)
13
+ # @return [void]
14
+ def initialize(
15
+ min:,
16
+ max:,
17
+ req: nil,
18
+ ref: nil,
19
+ val: nil
20
+ )
21
+ @type = "R"
22
+ @min = min
23
+ @max = max
24
+ self.req = req
25
+ self.ref = ref
26
+ self.value = val
27
+ end
28
+
29
+ # @return [String]
30
+ def value()
31
+ if @val.nil?
32
+ case self.req
33
+ when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
34
+ when "O", "C" then return ""
35
+ else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
36
+ end
37
+ end
38
+ return process(@val)
39
+ end
40
+
41
+ # @param arg [Numeric]
42
+ # @raise [ArgumentError] Unless passed a Numeric value.
43
+ # @return [void]
44
+ def value=(arg)
45
+ if arg.nil?
46
+ @val = arg
47
+ return
48
+ end
49
+ raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(Numeric)
50
+ @val = arg
51
+ end
52
+
53
+ # Stringify a float value and trim to the element's `max` attribute.
54
+ #
55
+ # TODO: Use `sprintf` here?
56
+ #
57
+ # See:
58
+ #
59
+ # - [Ruby class types and case statements (Stack Overflow)](https://stackoverflow.com/questions/3908380/ruby-class-types-and-case-statements)
60
+ # - [Numbers and Class Hierarchy in Ruby (Medium)](https://medium.com/rubyinside/numbers-and-class-hierarchy-in-ruby-8c93c4749316)
61
+ #
62
+ # @param val [Numeric]
63
+ # @return [String]
64
+ def process(val)
65
+ case val
66
+ when Integer
67
+ return val.to_s.slice(0..self.max)
68
+ when Float
69
+ return val.to_s.slice(0..(self.max + 1))
70
+ when Complex
71
+ # TODO: Handle case
72
+ raise NotImplementedError
73
+ when Rational
74
+ # TODO: Handle case
75
+ raise NotImplementedError
76
+ when BigDecimal
77
+ # TODO: Handle case
78
+ raise NotImplementedError
79
+ end
80
+ end
81
+
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,113 @@
1
+ require "time"
2
+
3
+ module Eddy
4
+ module Element
5
+ # Time in `HHMMSSDD` format.
6
+ # Time expressed in 24-hour clock time as follows:
7
+ # `HHMM`, or `HHMMSS`, or `HHMMSSD`, or `HHMMSSDD`
8
+ # where H = hours (00-23), M = minutes (00-59), S = integer seconds (00-59) and DD = decimal seconds;
9
+ # decimal seconds are expressed as follows:
10
+ # D = tenths (0-9) and DD = hundredths (00-99)
11
+ #
12
+ # Values for this type are generated from a *UTC* formatted [Time][time] object.
13
+ #
14
+ # [time]: https://ruby-doc.org/stdlib-2.6.5/libdoc/time/rdoc/Time.html
15
+ class TM < Base
16
+
17
+ # Format for the date. Valid values: `:hhmm`, `:hhmmss`, `:hhmmssd`, and `:hhmmssdd`
18
+ # TODO: Decide if this should be an attr_accessor
19
+ # @return [Symbol<:hhmm, :hhmmss, :hhmmssd, :hhmmssdd>]
20
+ attr_reader :fmt
21
+
22
+ # TM elements require either a `fmt` value, or `min` and `max` values.
23
+ #
24
+ # @raise [ArgumentError] If an invalid format argument is passed.
25
+ # @param min [Integer] (nil)
26
+ # @param max [Integer] (nil)
27
+ # @param req [String] (nil)
28
+ # @param ref [String] (nil)
29
+ # @param val [Time] (nil)
30
+ # @param fmt [Symbol] (nil) Format for the date. Valid values: `:hhmm`, `:hhmmss`, `:hhmmssd`, and `:hhmmssdd`
31
+ # @return [void]
32
+ def initialize(
33
+ min: nil,
34
+ max: nil,
35
+ req: nil,
36
+ ref: nil,
37
+ val: nil,
38
+ fmt: nil
39
+ )
40
+ @type = "TM"
41
+ @min = min
42
+ @max = max
43
+ self.req = req
44
+ self.ref = ref
45
+ if fmt.nil?
46
+ raise ArgumentError, "TM elements require either a `fmt` value, or `min` and `max` values." if min.nil? || max.nil?
47
+ @fmt = determine_format()
48
+ else
49
+ self.fmt = fmt
50
+ end
51
+ self.value = val
52
+ end
53
+
54
+ # @raise [Eddy::Errors::ElementNilValueError] If the element is required and no value has been set.
55
+ # @return [String]
56
+ def value()
57
+ if @val.nil?
58
+ case self.req
59
+ when "M" then raise Eddy::Errors::ElementNilValueError.new(element: self)
60
+ when "O", "C" then return ""
61
+ else raise Eddy::Errors::Error, "Invalid req value: #{self.req}"
62
+ end
63
+ end
64
+ case self.fmt
65
+ when :hhmm then return Eddy::Util::Time.hhmm(@val)
66
+ when :hhmmss then return Eddy::Util::Time.hhmmss(@val)
67
+ when :hhmmssd then return Eddy::Util::Time.hhmmssd(@val)
68
+ when :hhmmssdd then return Eddy::Util::Time.hhmmssdd(@val)
69
+ else raise Eddy::Errors::Error, "invalid fmt value for TM object"
70
+ end
71
+ end
72
+
73
+ # @raise [ElementValidationError] Unless passed a *UTC* formatted Time object.
74
+ # @param arg [Time] A *UTC* formatted `Time` object.
75
+ # @return [void]
76
+ def value=(arg)
77
+ if arg.nil?
78
+ @val = arg
79
+ return
80
+ end
81
+ raise Eddy::Errors::TypeValidationError.new(element: self, arg: arg) unless arg.is_a?(Time)
82
+ raise Eddy::Errors::ElementValidationError.new("Argument is not in UTC format", element: self) unless arg.utc?()
83
+ @val = arg
84
+ end
85
+
86
+ # @param fmt [Symbol]
87
+ # @return [void]
88
+ def fmt=(fmt)
89
+ return if fmt.nil?
90
+ fmt = fmt.to_sym.downcase
91
+ raise ArgumentError unless accepted_formats.include?(fmt)
92
+ @fmt = fmt
93
+ end
94
+
95
+ # @return [Array<Symbol>]
96
+ def accepted_formats()
97
+ return [:hhmm, :hhmmss, :hhmmssd, :hhmmssdd]
98
+ end
99
+
100
+ # @return [Symbol]
101
+ def determine_format()
102
+ case self.max
103
+ when 4 then return :hhmm
104
+ when 6 then return :hhmmss
105
+ when 7 then return :hhmmssd
106
+ when 8 then return :hhmmssdd
107
+ else raise Eddy::Errors::Error, "unable to determine format for TM element"
108
+ end
109
+ end
110
+
111
+ end
112
+ end
113
+ end