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,218 @@
1
+ require "ginny"
2
+
3
+ module Eddy
4
+ module Build
5
+ # Generate Ruby code from JSON/YAML EDI definitions.
6
+ #
7
+ # - Validate definition file
8
+ # - Create Summary
9
+ # - For Segments, check that we have a default definition for each.
10
+ # - Generate segments?
11
+ # - For Elements, check that we have a default definition for each.
12
+ # - Apply any input over default element attributes.
13
+ class TransactionSetBuilder
14
+
15
+ # @return [Eddy::Schema::TransactionSetSummary]
16
+ attr_accessor :summary
17
+ # @return [String] (nil)
18
+ attr_accessor :folder
19
+ # @return [Boolean] (false)
20
+ attr_accessor :headers
21
+
22
+ # @param folder [String] (nil)
23
+ # @param headers [Boolean] (false)
24
+ # @return [void]
25
+ def initialize(folder: nil, headers: false)
26
+ self.folder = folder
27
+ self.headers = headers
28
+ end
29
+
30
+ # @param path [String] Path to a JSON or YAML file containing a valid Transaction Set definition.
31
+ # @param (see #initialize)
32
+ # @return [Eddy::Build::TransactionSetBuilder]
33
+ def self.from_file(path, **kwargs)
34
+ raise Eddy::Errors::Error, "Invalid transaction set definition" unless Eddy::Schema.valid_transaction_set_data?(path)
35
+ data = Eddy::Util.read_json_or_yaml(path)
36
+ builder = Eddy::Build::TransactionSetBuilder.new(**kwargs)
37
+ builder.summary = Eddy::Schema::TransactionSetSummary.create(data)
38
+ return builder
39
+ end
40
+
41
+ # @param summary [Eddy::Schema::TransactionSetSummary]
42
+ # @param (see #initialize)
43
+ # @return [Eddy::Build::TransactionSetBuilder]
44
+ def self.from_summary(summary, **kwargs)
45
+ builder = Eddy::Build::TransactionSetBuilder.new(**kwargs)
46
+ builder.summary = summary
47
+ return builder
48
+ end
49
+
50
+ # @return [String]
51
+ def build()
52
+ root_path = self.folder || File.join(Eddy::Util.root_dir, "build", "transaction_sets")
53
+ path = File.join(root_path, self.summary.id.to_s)
54
+ FileUtils.mkdir_p(path)
55
+ File.open(File.join(path, "loops.rb"), "a") { |f| f.write(self.render_loops) }
56
+ return self.ginny_class.generate(path)
57
+ end
58
+
59
+ # @return [String]
60
+ def render_loops()
61
+ loops = self.summary.unique_loops.map do |l|
62
+ Eddy::Build::LoopBuilder.from_summary(l, t_set_id: self.summary.normalized_name).ginny_class.render()
63
+ end.join("\n\n")
64
+ return Ginny.mod(("\n" + loops + "\n"), "Eddy", "TransactionSets", self.summary.normalized_name, "Loops")
65
+ end
66
+
67
+ # @return [Ginny::Class]
68
+ def ginny_class()
69
+ return Ginny::Class.create({
70
+ classify_name: false,
71
+ modules: ["Eddy", "TransactionSets", self.summary.normalized_name],
72
+ parent: "Eddy::TransactionSet",
73
+ name: self.summary.normalized_name,
74
+ description: self.summary.doc_comment(header: true),
75
+ body: <<~STR,
76
+
77
+ ID = "#{self.summary.id}".freeze
78
+ NAME = "#{self.summary.name}".freeze
79
+ FUNCTIONAL_GROUP = "#{self.summary.functional_group}".freeze
80
+
81
+ #{self.constructor()}
82
+
83
+ #{self.accessors()}
84
+ STR
85
+ })
86
+ end
87
+
88
+ # @!group Initialize
89
+
90
+ # @return [String]
91
+ def constructor()
92
+ return Ginny::Func.create({
93
+ name: "initialize",
94
+ params: [{ name: "store", type: "Eddy::Data::Store" }],
95
+ body: <<~RB,
96
+ #{self.declarations()}
97
+
98
+
99
+ #{self.super_call()}
100
+ RB
101
+ }).render()
102
+ end
103
+
104
+ # @return [String]
105
+ def declarations()
106
+ decs = ""
107
+ self.summary.components.each do |comp|
108
+ case comp
109
+ when Eddy::Schema::SegmentSummary
110
+ decs << "@#{comp.id.downcase} = Eddy::Segments::#{comp.id.upcase}.new(store)\n"
111
+ when Eddy::Schema::LoopSummary
112
+ if comp.repeat == 1
113
+ decs << "@#{comp.loop_id.downcase} = Eddy::Segments::#{comp.loop_id.upcase}.new(store)\n"
114
+ else
115
+ decs << "@l_#{comp.loop_id.downcase} = Eddy::TransactionSets::#{self.summary.normalized_name}::Loops::#{comp.loop_id.upcase}.new(store)\n"
116
+ end
117
+ end
118
+ end
119
+ return decs
120
+ end
121
+
122
+ # @return [String]
123
+ def super_call()
124
+ super_call = "super(\n"
125
+ super_call << " store,\n"
126
+ self.summary.components.each do |comp|
127
+ case comp
128
+ when Eddy::Schema::SegmentSummary
129
+ super_call << " @#{comp.id.downcase},\n"
130
+ when Eddy::Schema::LoopSummary
131
+ if comp.repeat == 1
132
+ super_call << " @#{comp.loop_id.downcase},\n"
133
+ else
134
+ super_call << " @l_#{comp.loop_id.downcase},\n"
135
+ end
136
+ end
137
+ end
138
+ super_call << ")"
139
+ return super_call
140
+ end
141
+
142
+ # @!endgroup Initialize
143
+
144
+ # @return [String]
145
+ def accessors()
146
+ defs = self.summary.components.map do |comp|
147
+ case comp
148
+ when Eddy::Schema::SegmentSummary
149
+ Eddy::Build::TransactionSetBuilder.segment_accessor(comp.id)
150
+ when Eddy::Schema::LoopSummary
151
+ if comp.repeat == 1
152
+ Eddy::Build::TransactionSetBuilder.segment_accessor(comp.loop_id)
153
+ else
154
+ Eddy::Build::TransactionSetBuilder.loop_accessor(comp, self.summary.normalized_name)
155
+ end
156
+ end
157
+ end
158
+ return defs.join("\n\n")
159
+ end
160
+
161
+ # @param segment_id [String]
162
+ # @return [String]
163
+ def self.segment_accessor(segment_id)
164
+ upper = segment_id.upcase
165
+ lower = segment_id.downcase
166
+ return <<~RB.strip
167
+ # (see Eddy::Segments::#{upper})
168
+ #
169
+ # @yieldparam [Eddy::Segments::#{upper}] #{lower}
170
+ # @return [Eddy::Segments::#{upper}]
171
+ def #{upper}()
172
+ yield(@#{lower}) if block_given?
173
+ return @#{lower}
174
+ end
175
+ RB
176
+ end
177
+
178
+ # @param summary [Eddy::Schema::LoopSummary]
179
+ # @param t_set_name [String]
180
+ # @return [String]
181
+ def self.loop_accessor(summary, t_set_name)
182
+ upper = summary.loop_id.upcase
183
+ lower = summary.loop_id.downcase
184
+ return <<~RB.strip
185
+ # (see Eddy::TransactionSets::#{t_set_name}::Loops::#{upper})
186
+ #
187
+ #{self.loop_components(summary, t_set_name)}
188
+ # @return [void]
189
+ def L_#{upper}(&block)
190
+ if block_given?
191
+ @l_#{lower}.add_iteration(&block)
192
+ else
193
+ raise Eddy::Errors::Error, \"No block given in loop iteration\"
194
+ end
195
+ return nil
196
+ end
197
+ RB
198
+ end
199
+
200
+ # @param summary [Eddy::Schema::LoopSummary]
201
+ # @param t_set_name [String]
202
+ # @return [String]
203
+ def self.loop_components(summary, t_set_name)
204
+ comps = []
205
+ summary.components.each do |comp|
206
+ case comp
207
+ when Eddy::Schema::SegmentSummary
208
+ comps << "# @yieldparam [Eddy::Segments::#{comp.id.upcase}] #{comp.id.downcase}"
209
+ when Eddy::Schema::LoopSummary
210
+ comps << "# @yieldparam [Eddy::TransactionSets::#{t_set_name}::Loops::#{comp.loop_id.upcase}] l_#{comp.loop_id.downcase}"
211
+ end
212
+ end
213
+ return comps.join("\n")
214
+ end
215
+
216
+ end
217
+ end
218
+ end
@@ -0,0 +1,39 @@
1
+ require "thor"
2
+
3
+ module Eddy
4
+ # Command Line Interface for Eddy
5
+ class CLI < Thor
6
+ desc "version", "Display version"
7
+ map ["-v", "--version"] => :version
8
+
9
+ # @return [void]
10
+ def version()
11
+ puts("Eddy version #{Eddy::VERSION}")
12
+ exit(0)
13
+ end
14
+
15
+ desc("segment PATH", "Build a Segment from a JSON or YAML definition")
16
+ method_option("build-elements", type: :boolean, default: false)
17
+ # @param path [String]
18
+ # @return [void]
19
+ def segment(path)
20
+ path = File.expand_path(path)
21
+ builder = Eddy::Build::SegmentBuilder.from_file(path)
22
+ result = builder.build(build_elements: options["build-elements"])
23
+ puts("Segment class generated: #{result}")
24
+ exit(0)
25
+ end
26
+
27
+ desc("set PATH", "Build a Transaction Set from a JSON or YAML definition")
28
+ # @param path [String]
29
+ # @return [void]
30
+ def set(path)
31
+ path = File.expand_path(path)
32
+ builder = Eddy::Build::TransactionSetBuilder.from_file(path)
33
+ result = builder.build()
34
+ puts("Transaction Set class generated: #{result}")
35
+ exit(0)
36
+ end
37
+
38
+ end
39
+ end
@@ -0,0 +1,51 @@
1
+ module Eddy
2
+ # Configuration for Eddy
3
+ class Config
4
+
5
+ # @return [String<"test", "development", "production">] ("development")
6
+ attr_accessor :env
7
+ # Method used by Eddy to persist data about EDI control numbers.
8
+ # @return [Symbol<:memory, :file>] (:memory)
9
+ attr_accessor :persistence_method
10
+ # @return [String]
11
+ attr_accessor :tmp_dir
12
+ # @return [String]
13
+ attr_accessor :build_dir
14
+ # @return [Boolean] (true)
15
+ attr_accessor :colorize_errors
16
+ # @return [Boolean] (true)
17
+ attr_accessor :validate
18
+
19
+ # @return [void]
20
+ def initialize()
21
+ self.env = "development"
22
+ self.persistence_method = :memory
23
+ self.tmp_dir = File.join(Eddy::Util.root_dir, "tmp")
24
+ self.build_dir = File.join(Eddy::Util.root_dir, "build")
25
+ self.colorize_errors = true
26
+ self.validate = true
27
+ end
28
+
29
+ end
30
+
31
+ # Configuration for Eddy
32
+ #
33
+ # @return [Eddy::Config]
34
+ def self.config()
35
+ @config ||= Config.new
36
+ end
37
+
38
+ # Modify Eddy's current config
39
+ #
40
+ # @example
41
+ # Eddy.configure do |config|
42
+ # config.persistence_method = :file
43
+ # end
44
+ #
45
+ # @yieldparam [Eddy::Config] config current Eddy config
46
+ # @return [void]
47
+ def self.configure()
48
+ yield self.config
49
+ end
50
+
51
+ end
@@ -0,0 +1,50 @@
1
+ require "eddy/data/store"
2
+ require "eddy/data/persistence/base"
3
+ require "eddy/data/persistence/memory"
4
+
5
+ module Eddy
6
+
7
+ # Persistent data used by Eddy.
8
+ # @return [Eddy::Data::Persistence::Base]
9
+ def self.data
10
+ return @data if defined? @data
11
+ case Eddy.config.persistence_method
12
+ when :memory then @data = Eddy::Data::Persistence::Memory.new()
13
+ when :file then raise NotImplementedError
14
+ when :db then raise NotImplementedError
15
+ else raise Eddy::Errors::Error, "Unsupported persistence method: #{Eddy.config.persistence_method}"
16
+ end
17
+ return @data
18
+ end
19
+
20
+ module Data
21
+
22
+ # @return [Integer]
23
+ def self.new_interchange_control_number
24
+ existing = Eddy.data.interchange_control_numbers()
25
+ new_ctrl_num = Eddy::Util.new_number(existing)
26
+ Eddy.data.add_interchange_control_number(new_ctrl_num)
27
+ return new_ctrl_num
28
+ end
29
+
30
+ # @param functional_group [String]
31
+ # @return [Integer]
32
+ def self.new_functional_group_control_number(functional_group)
33
+ existing = Eddy.data.functional_group_control_numbers(functional_group)
34
+ new_ctrl_num = Eddy::Util.new_number(existing)
35
+ Eddy.data.add_functional_group_control_number(functional_group, new_ctrl_num)
36
+ return new_ctrl_num
37
+ end
38
+
39
+ # @param transaction_set_id [String]
40
+ # @return [Integer]
41
+ def self.new_transaction_set_control_number(transaction_set_id)
42
+ existing = Eddy.data.transaction_set_control_numbers(transaction_set_id)
43
+ new_ctrl_num = Eddy::Util.new_number(existing)
44
+ Eddy.data.transaction_set_control_numbers(transaction_set_id, new_ctrl_num)
45
+ return new_ctrl_num
46
+ end
47
+
48
+ end
49
+
50
+ end
@@ -0,0 +1,10 @@
1
+ module Eddy
2
+ module Data
3
+ module Persistence
4
+ # Persist data to a database using Active Record.
5
+ class ActiveRecord
6
+
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,47 @@
1
+ module Eddy
2
+ module Data
3
+ module Persistence
4
+ # Base class for data persistence wrappers.
5
+ class Base
6
+
7
+ # @return [Array<Integer>]
8
+ def interchange_control_numbers()
9
+ raise NotImplementedError
10
+ end
11
+
12
+ # @param _functional_group [String]
13
+ # @return [Array<Integer>]
14
+ def functional_group_control_numbers(_functional_group)
15
+ raise NotImplementedError
16
+ end
17
+
18
+ # @param _transaction_set_id [String]
19
+ # @return [Array<Integer>]
20
+ def transaction_set_control_numbers(_transaction_set_id)
21
+ raise NotImplementedError
22
+ end
23
+
24
+ # @param _new_ctrl_num [Integer]
25
+ # @return [Array<Integer>]
26
+ def add_interchange_control_number(_new_ctrl_num)
27
+ raise NotImplementedError
28
+ end
29
+
30
+ # @param _functional_group [String]
31
+ # @param _new_ctrl_num [Integer]
32
+ # @return [Array<Integer>]
33
+ def add_functional_group_control_number(_functional_group, _new_ctrl_num)
34
+ raise NotImplementedError
35
+ end
36
+
37
+ # @param _transaction_set_id [String]
38
+ # @param _new_ctrl_num [Integer]
39
+ # @return [Array<Integer>]
40
+ def add_transaction_set_control_number(_transaction_set_id, _new_ctrl_num)
41
+ raise NotImplementedError
42
+ end
43
+
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,50 @@
1
+ require "fileutils"
2
+ require "json"
3
+ require "pathname"
4
+
5
+ module Eddy
6
+ module Data
7
+ module Persistence
8
+ # Persist data to a local JSON file.
9
+ class File < Memory
10
+
11
+ # @return [void]
12
+ def initialize()
13
+ if path.file?
14
+ self.read()
15
+ else
16
+ super()
17
+ end
18
+ end
19
+
20
+ # Renturn a [Pathname](https://ruby-doc.org/stdlib-2.5.0/libdoc/pathname/rdoc/Pathname.html) to the JSON file used for storage.
21
+ #
22
+ # See:
23
+ #
24
+ # - [FileTest](https://ruby-doc.org/core-2.5.0/FileTest.html#method-i-file-3F)
25
+ #
26
+ # @return [Pathname]
27
+ def path()
28
+ file = File.join(Eddy.config.tmp_dir, "eddy_persistent_data.json")
29
+ # FileUtils.mkdir_p(File.dirname(file))
30
+ return Pathname.new(file)
31
+ end
32
+
33
+ # Read the JSON file into `@data`.
34
+ #
35
+ # @return [void]
36
+ def read()
37
+ @data = JSON.parse(File.read(self.path()), symbolize_names: symbolize)
38
+ end
39
+
40
+ # Write `@data` out to the JSON file. This will overwrite the file's contents.
41
+ #
42
+ # @return [void]
43
+ def write()
44
+ File.open(self.path(), "w") { |f| f.write(@data.to_json) }
45
+ end
46
+
47
+ end
48
+ end
49
+ end
50
+ end