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
@@ -2,10 +2,32 @@
2
2
  module Eddy; end
3
3
 
4
4
  require "eddy/version"
5
- require "eddy/error"
6
- require "eddy/helpers"
7
- require "eddy/element"
8
- require "eddy/segment"
9
- require "eddy/transaction_set"
10
- require "eddy/build/build_elements"
11
- Dir.glob(File.join(__dir__, "eddy", "definitions", "manual", "**/*.rb")).each { |file| require file }
5
+ require "eddy/errors"
6
+ require "eddy/util"
7
+ require "eddy/config"
8
+ require "eddy/data"
9
+
10
+ Dir.glob(File.join(__dir__, "eddy", "schema", "*.rb")).sort.each { |file| require file }
11
+
12
+ require "eddy/models/element"
13
+ require "eddy/models/segment"
14
+ require "eddy/models/loop"
15
+ require "eddy/models/transaction_set"
16
+
17
+ require "eddy/write/interchange"
18
+ require "eddy/write/simple_interchange"
19
+ require "eddy/write/functional_group"
20
+
21
+ require "eddy/parse"
22
+
23
+ require "eddy/build/build"
24
+
25
+ # Dir.glob(File.join(__dir__, "definitions", "elements", "manual", "**", "*.rb")).sort.each { |file| require file }
26
+ # Dir.glob(File.join(__dir__, "definitions", "segments", "manual", "**", "*.rb")).sort.each { |file| require file }
27
+ # Dir.glob(File.join(__dir__, "definitions", "transaction_sets", "manual", "**", "*.rb")).sort.each { |file| require file }
28
+
29
+ Dir.glob(File.join(__dir__, "definitions", "elements", "**", "*.rb")).sort.each { |file| require file }
30
+ Dir.glob(File.join(__dir__, "definitions", "segments", "**", "*.rb")).sort.each { |file| require file }
31
+ Dir.glob(File.join(__dir__, "definitions", "transaction_sets", "**", "*.rb")).sort.each { |file| require file }
32
+
33
+ require "eddy/cli/cli"
@@ -0,0 +1,47 @@
1
+ require "fileutils"
2
+
3
+ require "eddy/build/elements/elements"
4
+ require "eddy/build/segment_builder"
5
+ require "eddy/build/loop_builder"
6
+ require "eddy/build/transaction_set_builder"
7
+
8
+ module Eddy
9
+ # Generate Ruby classes for modeling Semgents & Data Element logic, notes, and validation.
10
+ module Build
11
+
12
+ # @return [void]
13
+ def self.make_folders()
14
+ folders = [
15
+ File.join(Eddy.config.build_dir, "segments"),
16
+ File.join(Eddy.config.build_dir, "elements"),
17
+ File.join(Eddy.config.build_dir, "transaction_sets"),
18
+ ]
19
+ folders.each { |f| FileUtils.mkdir_p(f) }
20
+ end
21
+
22
+ # @return [void]
23
+ def self.clean_folders()
24
+ folders = [
25
+ File.join(Eddy.config.build_dir, "segments"),
26
+ File.join(Eddy.config.build_dir, "elements"),
27
+ File.join(Eddy.config.build_dir, "transaction_sets"),
28
+ ]
29
+ folders.each { |f| Eddy::Util.clean_folder(f) }
30
+ end
31
+
32
+ # @return [void]
33
+ def self.build_all_segments()
34
+ files = Eddy::Util.list_segment_definitions()
35
+ files.each do |f|
36
+ builder = Eddy::Build::SegmentBuilder.from_file(f)
37
+ builder.build(build_elements: true)
38
+ end
39
+ end
40
+
41
+ # @return [void]
42
+ def self.build_all_elements()
43
+ Eddy::Build::Elements.generate_elements()
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,67 @@
1
+ require "ginny"
2
+
3
+ module Eddy
4
+ module Build
5
+ module Elements
6
+
7
+ # @param el [Eddy::Schema::ElementSummary]
8
+ # @return [Array<Hash>]
9
+ def self.element_params(el)
10
+ return [
11
+ { name: "val", type: el.yard_type, optional: true, keyword: true },
12
+ { name: "req", type: "String", optional: true, keyword: true },
13
+ { name: "ref", type: "String", optional: true, keyword: true },
14
+ ]
15
+ end
16
+
17
+ # @param el [Eddy::Schema::ElementSummary]
18
+ # @return [String]
19
+ def self.default_constructor(el)
20
+ return Ginny::Func.create({
21
+ name: "initialize",
22
+ params: self.element_params(el),
23
+ body: <<~RB,
24
+ @id = "#{el.id}"
25
+ @name = "#{el.name}"
26
+ @description = "#{el.description}"
27
+ super(
28
+ min: #{el.min},
29
+ max: #{el.max},
30
+ req: req,
31
+ ref: ref,
32
+ val: val,
33
+ )
34
+ RB
35
+ }).render()
36
+ end
37
+
38
+ # @param el [Eddy::Schema::ElementSummary]
39
+ # @param body [String]
40
+ # @return [Ginny::Class]
41
+ def self.ginny_class(el, body)
42
+ return Ginny::Class.create({
43
+ classify_name: false,
44
+ name: Eddy::Util.normalize_id(el.id),
45
+ description: el.doc_comment,
46
+ parent: "Eddy::Element::#{el.edi_type}",
47
+ modules: ["Eddy", "Elements"],
48
+ body: body,
49
+ })
50
+ end
51
+
52
+ # @param el [Eddy::Schema::ElementSummary]
53
+ # @param test [Boolean] (false) When true, returns output as a string instead of writing to a file.
54
+ # @return [void]
55
+ def self.element(el, test: false)
56
+ c = self.ginny_class(el, self.default_constructor(el))
57
+ return c.render if test
58
+ c.generate(
59
+ File.join(Eddy::Util.root_dir, "build", "elements"),
60
+ file: "#{el.id}.#{Eddy::Util.snake_case(el.name)}.rb",
61
+ )
62
+ return nil
63
+ end
64
+
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,46 @@
1
+ require "eddy/build/elements/element"
2
+ require "eddy/build/elements/n"
3
+ require "eddy/build/elements/id"
4
+
5
+ module Eddy
6
+ # Generate Ruby classes for modeling Data Element logic, notes, and validation.
7
+ module Build
8
+ module Elements
9
+
10
+ # Generate `Eddy::Element` classes for all data elements defined in `data/004010/elements.tsv`
11
+ #
12
+ # @param elements [Array<Eddy::Schema::ElementSummary>]
13
+ # @return [void]
14
+ def self.generate_elements(elements = self.generate_element_data())
15
+ existing = (Eddy::Util.list_element_classes() + Eddy::Util.list_built_elements()).uniq()
16
+ elements.each do |el|
17
+ next if existing.include?(el.id)
18
+ existing.append(el.id)
19
+ case el.edi_type()
20
+ when "B" then next
21
+ when "ID" then self.id(el)
22
+ when "N" then self.n(el)
23
+ when "AN" then self.element(el)
24
+ when "DT" then self.element(el)
25
+ when "R" then self.element(el)
26
+ when "TM" then self.element(el)
27
+ end
28
+ end
29
+ return nil
30
+ end
31
+
32
+ # Generate usable data from `data/004010/elements.tsv`.
33
+ #
34
+ # @return [Array<Eddy::Schema::ElementSummary>]
35
+ def self.generate_element_data()
36
+ data = Eddy::Util.raw_element_data()
37
+ elements = data.map do |el|
38
+ next if el[:type].nil? || el[:description].nil?
39
+ Eddy::Schema::ElementSummary.create(el)
40
+ end
41
+ return elements.compact
42
+ end
43
+
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,55 @@
1
+ require "ginny"
2
+
3
+ module Eddy
4
+ module Build
5
+ module Elements
6
+
7
+ # @param el [Eddy::Schema::ElementSummary]
8
+ # @param test [Boolean] (false) When true, returns output as a string instead of writing to a file.
9
+ # @return [void]
10
+ def self.id(el, test: false)
11
+ code_list = self.build_code_list(el.id)
12
+ return nil if code_list.nil?
13
+ c = self.ginny_class(
14
+ el,
15
+ ("\n" + self.default_constructor(el) + "\n\n" + code_list + "\n"),
16
+ # "\n#{self.default_constructor(el)}\n\n#{code_list}\n",
17
+ )
18
+ return c.render if test
19
+ c.generate(
20
+ File.join(Eddy::Util.root_dir, "build", "elements"),
21
+ file: "#{el.id}.#{Eddy::Util.snake_case(el.name)}.rb",
22
+ )
23
+ return nil
24
+ end
25
+
26
+ # @param id [String]
27
+ # @return [String]
28
+ def self.build_code_list(id)
29
+ file = File.join(Eddy::Util.data_dir, "004010", "code-lists", "#{id}.tsv")
30
+ begin
31
+ data = Eddy::Util.parse_tsv(file)
32
+ rescue Errno::ENOENT
33
+ puts("Missing code-list for element #{id}")
34
+ return nil
35
+ rescue CSV::MalformedCSVError => e
36
+ puts("Error reading csv file '#{file}':#{e}")
37
+ return nil
38
+ end
39
+ # body = "return [\n" + data.map { |c| %("#{c[:id]}").indent(2) }.join(",\n") + "\n]\n"
40
+ body = ""
41
+ body << "return [\n"
42
+ data.each do |c|
43
+ body << %("#{c[:id]}", # #{c[:definition]}\n).indent(2)
44
+ end
45
+ body << "]\n"
46
+ return Ginny::Func.create({
47
+ name: "code_list",
48
+ return_type: "Array<String>",
49
+ body: body,
50
+ }).render()
51
+ end
52
+
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,48 @@
1
+ require "ginny"
2
+
3
+ module Eddy
4
+ module Build
5
+ module Elements
6
+
7
+ # @param el [Eddy::Schema::ElementSummary]
8
+ # @param test [Boolean] (false) When true, returns output as a string instead of writing to a file.
9
+ # @return [void]
10
+ def self.n(el, test: false)
11
+ decimal_points = self.determine_decimals(el.type)
12
+ constructor = Ginny::Func.create({
13
+ name: "initialize",
14
+ params: self.element_params(el),
15
+ body: <<~RB,
16
+ @id = "#{el.id}"
17
+ @name = "#{el.name}"
18
+ @description = "#{el.description}"
19
+ super(
20
+ min: #{el.min},
21
+ max: #{el.max},
22
+ req: req,
23
+ ref: ref,
24
+ val: val,
25
+ decimals: #{decimal_points},
26
+ )
27
+ RB
28
+ }).render()
29
+ c = self.ginny_class(el, constructor)
30
+ return c.render if test
31
+ c.generate(
32
+ File.join(Eddy::Util.root_dir, "build", "elements"),
33
+ file: "#{el.id}.#{Eddy::Util.snake_case(el.name)}.rb",
34
+ )
35
+ return nil
36
+ end
37
+
38
+ # @param type [String]
39
+ # @return [Integer]
40
+ def self.determine_decimals(type)
41
+ match = type.match(/(?<=N)(?<decimal>\d)/)
42
+ return 0 if match.nil?
43
+ return match[:decimal].to_i
44
+ end
45
+
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,93 @@
1
+ require "ginny"
2
+
3
+ module Eddy
4
+ module Build
5
+ # Generate Ruby code from JSON/YAML EDI definitions.
6
+ class LoopBuilder
7
+
8
+ # @return [Eddy::Schema::LoopSummary]
9
+ attr_accessor :summary
10
+ # @return [String] (nil)
11
+ attr_accessor :folder
12
+ # Namespace the Loop is within.
13
+ # @return [String]
14
+ attr_accessor :t_set_id
15
+
16
+ # @param folder [String] (nil)
17
+ # @param t_set_id [Boolean] ("")
18
+ # @return [void]
19
+ def initialize(folder: nil, t_set_id: "")
20
+ self.folder = folder
21
+ self.t_set_id = t_set_id
22
+ end
23
+
24
+ # @param summary [Eddy::Schema::LoopSummary]
25
+ # @param (see #initialize)
26
+ # @return [Eddy::Build::LoopBuilder]
27
+ def self.from_summary(summary, **kwargs)
28
+ lb = Eddy::Build::LoopBuilder.new(**kwargs)
29
+ lb.summary = summary
30
+ return lb
31
+ end
32
+
33
+ # @return [Ginny::Class]
34
+ def ginny_class()
35
+ return Ginny::Class.create({
36
+ classify_name: false,
37
+ parent: "Eddy::Loop::Base",
38
+ name: self.summary.loop_id,
39
+ description: summary.doc_comment(header: true),
40
+ body: <<~STR.strip,
41
+ # @param store [Eddy::Data::Store]
42
+ # @return [void]
43
+ def initialize(store)
44
+ super(store)
45
+ @repeat = #{self.summary.repeat}
46
+ @components = [
47
+ #{self.components(self.t_set_id)}
48
+ ]
49
+ end
50
+
51
+ #{self.class.add_ideration(self.summary, self.t_set_id)}
52
+ STR
53
+ })
54
+ end
55
+
56
+ # @param t_set_id [Integer]
57
+ # @return [String]
58
+ def components(t_set_id)
59
+ comps = []
60
+ self.summary.components.each do |comp|
61
+ case comp
62
+ when Eddy::Schema::SegmentSummary
63
+ comps << " Eddy::Segments::#{comp.id.upcase},"
64
+ when Eddy::Schema::LoopSummary
65
+ comps << " Eddy::TransactionSets::#{t_set_id}::Loops::#{comp.loop_id.upcase},"
66
+ end
67
+ end
68
+ return comps.join("\n ")
69
+ end
70
+
71
+ # @param summary [Eddy::Schema::LoopSummary]
72
+ # @param t_set_id [String]
73
+ # @return [String]
74
+ def self.add_ideration(summary, t_set_id)
75
+ yield_params = []
76
+ summary.components.each do |comp|
77
+ case comp
78
+ when Eddy::Schema::SegmentSummary
79
+ yield_params << "# @yieldparam [Eddy::Segments::#{comp.id.upcase}] #{comp.id.downcase}"
80
+ when Eddy::Schema::LoopSummary
81
+ yield_params << "# @yieldparam [Eddy::TransactionSets::#{t_set_id}::Loops::#{comp.loop_id.upcase}] l_#{comp.loop_id.downcase}"
82
+ end
83
+ end
84
+ return <<~YARD.strip
85
+ # @!method add_iteration(&block)
86
+ #{yield_params.join("\n")}
87
+ # @return [void]
88
+ YARD
89
+ end
90
+
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,169 @@
1
+ require "set"
2
+ require "ginny"
3
+
4
+ module Eddy
5
+ module Build
6
+ # Generate Ruby code from JSON/YAML EDI definitions.
7
+ class SegmentBuilder
8
+
9
+ # @return [Eddy::Schema::SegmentSummary]
10
+ attr_accessor :summary
11
+ # @return [String] (nil)
12
+ attr_accessor :folder
13
+ # A hash of element names that appear more than once in the segment.
14
+ # @return [Hash{String => Integer}]
15
+ attr_accessor :duplicate_elements
16
+
17
+ # @param folder [String] (nil)
18
+ # @return [void]
19
+ def initialize(folder: nil)
20
+ self.folder = folder
21
+ end
22
+
23
+ # @param path [String] Path to a JSON or YAML file containing a valid Segment definition.
24
+ # @param (see #initialize)
25
+ # @return [Eddy::Build::SegmentBuilder]
26
+ def self.from_file(path, **kwargs)
27
+ raise Eddy::Errors::Error, "Invalid segment definition" unless Eddy::Schema.valid_segment_data?(path)
28
+ data = Eddy::Util.read_json_or_yaml(path)
29
+ sb = Eddy::Build::SegmentBuilder.new(**kwargs)
30
+ sb.summary = Eddy::Schema::SegmentSummary.create(data)
31
+ return sb
32
+ end
33
+
34
+ # @param summary [Eddy::Schema::SegmentSummary]
35
+ # @param (see #initialize)
36
+ # @return [Eddy::Build::SegmentBuilder]
37
+ def self.from_summary(summary, **kwargs)
38
+ sb = Eddy::Build::SegmentBuilder.new(**kwargs)
39
+ sb.summary = summary
40
+ return sb
41
+ end
42
+
43
+ # Generated the Segment and return the name of the file where it was written.
44
+ #
45
+ # @param build_elements [Boolean] (false)
46
+ # @return [String]
47
+ def build(build_elements: false)
48
+ Eddy::Build.make_folders()
49
+ if build_elements
50
+ Eddy::Build::Elements.generate_elements(self.summary.elements)
51
+ end
52
+ path = self.folder || File.join(Eddy.config.build_dir, "segments")
53
+ result = self.ginny_class.generate(path)
54
+ return result
55
+ end
56
+
57
+ # @return [Ginny::Class]
58
+ def ginny_class()
59
+ return Ginny::Class.create({
60
+ classify_name: false,
61
+ modules: ["Eddy", "Segments"],
62
+ parent: "Eddy::Segment",
63
+ name: summary.id,
64
+ description: summary.doc_comment(header: true),
65
+ body: <<~STR,
66
+
67
+ #{self.constructor()}
68
+
69
+ #{self.accessors()}
70
+ STR
71
+ })
72
+ end
73
+
74
+ # @return [String]
75
+ def constructor()
76
+ return Ginny::Func.create({
77
+ name: "initialize",
78
+ params: [{ name: "store", type: "Eddy::Data::Store" }],
79
+ body: <<~RB,
80
+ @id = "#{summary.id}"
81
+ @name = "#{summary.name}"
82
+ #{self.declarations()}
83
+
84
+
85
+
86
+ #{self.super_call()}
87
+ RB
88
+ }).render()
89
+ end
90
+
91
+ # @return [String]
92
+ def declarations()
93
+ decs = ""
94
+ self.summary.elements.each do |el|
95
+ req = el.req.nil? ? "nil" : '"' + el.req + '"'
96
+ decs << %(@#{el.ref.to_s.downcase} = Eddy::Elements::#{Eddy::Util.normalize_id(el.id)}.new(ref: "#{el.ref.to_s.upcase}", req: #{req})\n)
97
+ end
98
+ return decs
99
+ end
100
+
101
+ # @return [String]
102
+ def super_call()
103
+ super_call = "super(\n"
104
+ super_call << " store,\n"
105
+ self.summary.elements.each { |el| super_call << " @#{el.ref.to_s.downcase},\n" }
106
+ super_call << ")"
107
+ return super_call
108
+ end
109
+
110
+ # @return [String]
111
+ def accessors()
112
+ self.find_duplicate_elements()
113
+ defs = self.summary.elements.map do |el|
114
+ Eddy::Build::SegmentBuilder.element_accessor_v2(el, self.duplicate_elements)
115
+ end
116
+ return defs.join("\n\n")
117
+ end
118
+
119
+ # @param el [Eddy::Schema::ElementSummary]
120
+ # @param header [Symbol] (see Eddy::Schema::ElementSummary#doc_comment)
121
+ # @return [String]
122
+ def self.element_accessor_v1(el, header: :summary)
123
+ return <<~RB.strip
124
+ #{el.doc_comment(header: header).gsub(/^/, '# ').gsub(/([[:blank:]]+)$/, '')}
125
+ #
126
+ # @param arg [#{el.yard_type}]
127
+ # @return [void]
128
+ def #{el.ref.upcase}=(arg)
129
+ @#{el.ref.downcase}.value = arg
130
+ end
131
+ RB
132
+ end
133
+
134
+ # @param el [Eddy::Schema::ElementSummary]
135
+ # @param dupes [Hash]
136
+ # @param header [Boolean] (false)
137
+ # @return [String]
138
+ def self.element_accessor_v2(el, dupes, header: :ref)
139
+ if dupes.key?(el.name)
140
+ normal_name = el.normalized_name + dupes[el.name].to_s
141
+ dupes[el.name] += 1
142
+ else
143
+ normal_name = el.normalized_name
144
+ end
145
+ return <<~RB.strip
146
+ #{el.doc_comment(header: header).gsub(/^/, '# ').gsub(/([[:blank:]]+)$/, '')}
147
+ #
148
+ # @param arg [#{el.yard_type}]
149
+ # @return [void]
150
+ def #{el.ref.upcase}=(arg)
151
+ @#{el.ref.downcase}.value = arg
152
+ end
153
+ alias #{normal_name}= #{el.ref.upcase}=
154
+ RB
155
+ end
156
+
157
+ # @return [void]
158
+ def find_duplicate_elements()
159
+ names = self.summary.elements.map(&:name)
160
+ s = Set.new()
161
+ dupes = names.reject { |e| s.add?(e) }.uniq
162
+ self.duplicate_elements = {}
163
+ dupes.each { |d| self.duplicate_elements[d] = 1 }
164
+ return nil
165
+ end
166
+
167
+ end
168
+ end
169
+ end