ledger_sync 1.4.4 → 1.5.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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +64 -1
  3. data/.travis.yml +12 -5
  4. data/Gemfile.lock +67 -65
  5. data/bin/quickbooks_online_oauth_server.rb +1 -1
  6. data/documentation/generators/reference/ledger/generator.rb +2 -0
  7. data/documentation/site/guides/contribute/deployment.md +62 -7
  8. data/documentation/site/guides/contribute/index.md +5 -1
  9. data/ledger_sync.gemspec +13 -11
  10. data/lib/ledger_sync.rb +17 -12
  11. data/lib/ledger_sync/deserializer.rb +2 -2
  12. data/lib/ledger_sync/error.rb +2 -2
  13. data/lib/ledger_sync/error/ledger_errors.rb +1 -2
  14. data/lib/ledger_sync/error/operation_errors.rb +2 -2
  15. data/lib/ledger_sync/error/resource_errors.rb +1 -1
  16. data/lib/ledger_sync/ledger_configuration.rb +16 -12
  17. data/lib/ledger_sync/ledger_configuration_store.rb +16 -7
  18. data/lib/ledger_sync/ledgers/client.rb +123 -108
  19. data/lib/ledger_sync/ledgers/mixins/infer_config_mixin.rb +37 -0
  20. data/lib/ledger_sync/ledgers/mixins/infer_resource_class_mixin.rb +5 -4
  21. data/lib/ledger_sync/ledgers/mixins/infer_serializer_mixin.rb +5 -5
  22. data/lib/ledger_sync/ledgers/mixins/serialization_mixin.rb +2 -2
  23. data/lib/ledger_sync/ledgers/netsuite/check_line_item/deserializer.rb +2 -1
  24. data/lib/ledger_sync/ledgers/netsuite/check_line_item/serializer.rb +2 -1
  25. data/lib/ledger_sync/ledgers/netsuite/client.rb +5 -1
  26. data/lib/ledger_sync/ledgers/netsuite/config.rb +3 -1
  27. data/lib/ledger_sync/ledgers/netsuite/deserializer.rb +1 -1
  28. data/lib/ledger_sync/ledgers/netsuite/type/deserializer_customer_type.rb +2 -0
  29. data/lib/ledger_sync/ledgers/netsuite/type/deserializer_subsidiary_type.rb +2 -0
  30. data/lib/ledger_sync/ledgers/netsuite_soap/client.rb +3 -1
  31. data/lib/ledger_sync/ledgers/netsuite_soap/config.rb +3 -1
  32. data/lib/ledger_sync/ledgers/operation.rb +12 -10
  33. data/lib/ledger_sync/ledgers/quickbooks_online/account/deserializer.rb +10 -22
  34. data/lib/ledger_sync/ledgers/quickbooks_online/account/operations/create.rb +8 -8
  35. data/lib/ledger_sync/ledgers/quickbooks_online/account/operations/find.rb +8 -8
  36. data/lib/ledger_sync/ledgers/quickbooks_online/account/operations/update.rb +8 -8
  37. data/lib/ledger_sync/ledgers/quickbooks_online/account/serializer.rb +11 -17
  38. data/lib/ledger_sync/ledgers/quickbooks_online/account_based_expense_line_detail/deserializer.rb +21 -0
  39. data/lib/ledger_sync/ledgers/quickbooks_online/account_based_expense_line_detail/serializer.rb +21 -0
  40. data/lib/ledger_sync/ledgers/quickbooks_online/bill/deserializer.rb +20 -24
  41. data/lib/ledger_sync/ledgers/quickbooks_online/bill/operations/create.rb +9 -9
  42. data/lib/ledger_sync/ledgers/quickbooks_online/bill/operations/find.rb +9 -9
  43. data/lib/ledger_sync/ledgers/quickbooks_online/bill/operations/update.rb +9 -9
  44. data/lib/ledger_sync/ledgers/quickbooks_online/bill/serializer.rb +20 -23
  45. data/lib/ledger_sync/ledgers/quickbooks_online/bill_line/deserializer.rb +22 -0
  46. data/lib/ledger_sync/ledgers/quickbooks_online/bill_line/serializer.rb +26 -0
  47. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/deserializer.rb +31 -35
  48. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/operations/create.rb +13 -13
  49. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/operations/find.rb +13 -13
  50. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/operations/update.rb +13 -13
  51. data/lib/ledger_sync/ledgers/quickbooks_online/bill_payment/serializer.rb +31 -53
  52. data/lib/ledger_sync/ledgers/quickbooks_online/{bill_payment_line_item → bill_payment_line}/deserializer.rb +3 -5
  53. data/lib/ledger_sync/ledgers/quickbooks_online/{bill_payment_line_item → bill_payment_line}/serializer.rb +3 -5
  54. data/lib/ledger_sync/ledgers/quickbooks_online/check_payment/deserializer.rb +17 -0
  55. data/lib/ledger_sync/ledgers/quickbooks_online/check_payment/serializer.rb +17 -0
  56. data/lib/ledger_sync/ledgers/quickbooks_online/client.rb +10 -6
  57. data/lib/ledger_sync/ledgers/quickbooks_online/config.rb +3 -1
  58. data/lib/ledger_sync/ledgers/quickbooks_online/credit_card_payment/deserializer.rb +17 -0
  59. data/lib/ledger_sync/ledgers/quickbooks_online/credit_card_payment/serializer.rb +17 -0
  60. data/lib/ledger_sync/ledgers/quickbooks_online/currency/deserializer.rb +2 -3
  61. data/lib/ledger_sync/ledgers/quickbooks_online/currency/serializer.rb +3 -2
  62. data/lib/ledger_sync/ledgers/quickbooks_online/customer/deserializer.rb +10 -3
  63. data/lib/ledger_sync/ledgers/quickbooks_online/customer/operations/create.rb +4 -4
  64. data/lib/ledger_sync/ledgers/quickbooks_online/customer/operations/find.rb +5 -5
  65. data/lib/ledger_sync/ledgers/quickbooks_online/customer/operations/update.rb +4 -4
  66. data/lib/ledger_sync/ledgers/quickbooks_online/customer/serializer.rb +10 -3
  67. data/lib/ledger_sync/ledgers/quickbooks_online/department/deserializer.rb +7 -13
  68. data/lib/ledger_sync/ledgers/quickbooks_online/department/operations/create.rb +5 -5
  69. data/lib/ledger_sync/ledgers/quickbooks_online/department/operations/find.rb +5 -5
  70. data/lib/ledger_sync/ledgers/quickbooks_online/department/operations/update.rb +5 -5
  71. data/lib/ledger_sync/ledgers/quickbooks_online/department/serializer.rb +9 -17
  72. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/deserializer.rb +16 -19
  73. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/operations/create.rb +7 -7
  74. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/operations/find.rb +7 -7
  75. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/operations/update.rb +7 -7
  76. data/lib/ledger_sync/ledgers/quickbooks_online/deposit/serializer.rb +16 -19
  77. data/lib/ledger_sync/ledgers/quickbooks_online/deposit_line/deserializer.rb +22 -0
  78. data/lib/ledger_sync/ledgers/quickbooks_online/deposit_line/serializer.rb +26 -0
  79. data/lib/ledger_sync/ledgers/quickbooks_online/deposit_line_detail/deserializer.rb +34 -0
  80. data/lib/ledger_sync/ledgers/quickbooks_online/deposit_line_detail/serializer.rb +35 -0
  81. data/lib/ledger_sync/ledgers/quickbooks_online/deserializer.rb +4 -4
  82. data/lib/ledger_sync/ledgers/quickbooks_online/expense/deserializer.rb +20 -25
  83. data/lib/ledger_sync/ledgers/quickbooks_online/expense/operations/create.rb +10 -10
  84. data/lib/ledger_sync/ledgers/quickbooks_online/expense/operations/find.rb +10 -10
  85. data/lib/ledger_sync/ledgers/quickbooks_online/expense/operations/update.rb +10 -10
  86. data/lib/ledger_sync/ledgers/quickbooks_online/expense/serializer.rb +22 -28
  87. data/lib/ledger_sync/ledgers/quickbooks_online/expense_line/deserializer.rb +22 -0
  88. data/lib/ledger_sync/ledgers/quickbooks_online/expense_line/serializer.rb +26 -0
  89. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/deserializer.rb +15 -15
  90. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/operations/create.rb +7 -7
  91. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/operations/find.rb +7 -7
  92. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/operations/update.rb +7 -7
  93. data/lib/ledger_sync/ledgers/quickbooks_online/invoice/serializer.rb +15 -15
  94. data/lib/ledger_sync/ledgers/quickbooks_online/invoice_line/deserializer.rb +21 -0
  95. data/lib/ledger_sync/ledgers/quickbooks_online/invoice_line/serializer.rb +25 -0
  96. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/deserializer.rb +10 -15
  97. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/operations/create.rb +5 -5
  98. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/operations/find.rb +5 -5
  99. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/operations/update.rb +5 -5
  100. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry/serializer.rb +10 -15
  101. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry_line/deserializer.rb +20 -0
  102. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry_line/serializer.rb +24 -0
  103. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry_line_detail/deserializer.rb +29 -0
  104. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry_line_detail/serializer.rb +29 -0
  105. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/deserializer.rb +9 -13
  106. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/operations/create.rb +5 -5
  107. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/operations/find.rb +5 -5
  108. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/operations/update.rb +5 -5
  109. data/lib/ledger_sync/ledgers/quickbooks_online/ledger_class/serializer.rb +10 -10
  110. data/lib/ledger_sync/ledgers/quickbooks_online/operation.rb +1 -3
  111. data/lib/ledger_sync/ledgers/quickbooks_online/operation/full_update.rb +1 -3
  112. data/lib/ledger_sync/ledgers/quickbooks_online/payment/deserializer.rb +21 -27
  113. data/lib/ledger_sync/ledgers/quickbooks_online/payment/operations/create.rb +10 -10
  114. data/lib/ledger_sync/ledgers/quickbooks_online/payment/operations/find.rb +10 -10
  115. data/lib/ledger_sync/ledgers/quickbooks_online/payment/operations/update.rb +10 -10
  116. data/lib/ledger_sync/ledgers/quickbooks_online/payment/serializer.rb +21 -27
  117. data/lib/ledger_sync/ledgers/quickbooks_online/{payment_line_item → payment_line}/deserializer.rb +3 -4
  118. data/lib/ledger_sync/ledgers/quickbooks_online/{payment_line_item → payment_line}/serializer.rb +3 -4
  119. data/lib/ledger_sync/ledgers/quickbooks_online/preferences/deserializer.rb +10 -29
  120. data/lib/ledger_sync/ledgers/quickbooks_online/preferences/operations/find.rb +10 -10
  121. data/lib/ledger_sync/ledgers/quickbooks_online/preferences/serializer.rb +10 -29
  122. data/lib/ledger_sync/ledgers/quickbooks_online/primary_email_addr/deserializer.rb +13 -0
  123. data/lib/ledger_sync/ledgers/quickbooks_online/primary_email_addr/serializer.rb +13 -0
  124. data/lib/ledger_sync/ledgers/quickbooks_online/primary_phone/deserializer.rb +13 -0
  125. data/lib/ledger_sync/ledgers/quickbooks_online/primary_phone/serializer.rb +13 -0
  126. data/lib/ledger_sync/ledgers/quickbooks_online/reference/deserializer.rb +13 -0
  127. data/lib/ledger_sync/ledgers/quickbooks_online/reference/serializer.rb +13 -0
  128. data/lib/ledger_sync/ledgers/quickbooks_online/resources/account.rb +12 -8
  129. data/lib/ledger_sync/ledgers/quickbooks_online/resources/account_based_expense_line_detail.rb +16 -0
  130. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill.rb +11 -11
  131. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill_line.rb +19 -0
  132. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill_payment.rb +17 -15
  133. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill_payment_line.rb +19 -0
  134. data/lib/ledger_sync/ledgers/quickbooks_online/resources/check_payment.rb +11 -0
  135. data/lib/ledger_sync/ledgers/quickbooks_online/resources/credit_card_payment.rb +11 -0
  136. data/lib/ledger_sync/ledgers/quickbooks_online/resources/currency.rb +7 -3
  137. data/lib/ledger_sync/ledgers/quickbooks_online/resources/customer.rb +4 -3
  138. data/lib/ledger_sync/ledgers/quickbooks_online/resources/department.rb +9 -5
  139. data/lib/ledger_sync/ledgers/quickbooks_online/resources/deposit.rb +9 -9
  140. data/lib/ledger_sync/ledgers/quickbooks_online/resources/deposit_line.rb +19 -0
  141. data/lib/ledger_sync/ledgers/quickbooks_online/resources/deposit_line_detail.rb +22 -0
  142. data/lib/ledger_sync/ledgers/quickbooks_online/resources/expense.rb +12 -12
  143. data/lib/ledger_sync/ledgers/quickbooks_online/resources/expense_line.rb +19 -0
  144. data/lib/ledger_sync/ledgers/quickbooks_online/resources/invoice.rb +8 -8
  145. data/lib/ledger_sync/ledgers/quickbooks_online/resources/invoice_line.rb +19 -0
  146. data/lib/ledger_sync/ledgers/quickbooks_online/resources/item.rb +1 -1
  147. data/lib/ledger_sync/ledgers/quickbooks_online/resources/journal_entry.rb +7 -7
  148. data/lib/ledger_sync/ledgers/quickbooks_online/resources/journal_entry_line.rb +20 -0
  149. data/lib/ledger_sync/ledgers/quickbooks_online/resources/journal_entry_line_detail.rb +27 -0
  150. data/lib/ledger_sync/ledgers/quickbooks_online/resources/ledger_class.rb +9 -5
  151. data/lib/ledger_sync/ledgers/quickbooks_online/resources/payment.rb +11 -11
  152. data/lib/ledger_sync/ledgers/quickbooks_online/resources/{payment_line_item.rb → payment_line.rb} +4 -4
  153. data/lib/ledger_sync/ledgers/quickbooks_online/resources/preferences.rb +10 -10
  154. data/lib/ledger_sync/ledgers/quickbooks_online/resources/sales_item_line_detail.rb +19 -0
  155. data/lib/ledger_sync/ledgers/quickbooks_online/resources/transfer.rb +7 -7
  156. data/lib/ledger_sync/ledgers/quickbooks_online/resources/vendor.rb +11 -9
  157. data/lib/ledger_sync/ledgers/quickbooks_online/sales_item_line_detail/deserializer.rb +21 -0
  158. data/lib/ledger_sync/ledgers/quickbooks_online/sales_item_line_detail/serializer.rb +21 -0
  159. data/lib/ledger_sync/ledgers/quickbooks_online/serialziation/type/mapping_type.rb +2 -0
  160. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/deserializer.rb +13 -16
  161. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/operations/create.rb +6 -6
  162. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/operations/find.rb +6 -6
  163. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/operations/update.rb +6 -6
  164. data/lib/ledger_sync/ledgers/quickbooks_online/transfer/serializer.rb +13 -16
  165. data/lib/ledger_sync/ledgers/quickbooks_online/util/error_matcher.rb +23 -10
  166. data/lib/ledger_sync/ledgers/quickbooks_online/util/operation_error_parser.rb +1 -1
  167. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/deserializer.rb +12 -10
  168. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/operations/create.rb +7 -7
  169. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/operations/find.rb +7 -7
  170. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/operations/update.rb +7 -7
  171. data/lib/ledger_sync/ledgers/quickbooks_online/vendor/serializer.rb +12 -10
  172. data/lib/ledger_sync/ledgers/quickbooks_online/webhook.rb +1 -1
  173. data/lib/ledger_sync/ledgers/quickbooks_online/webhook_event.rb +6 -6
  174. data/lib/ledger_sync/ledgers/quickbooks_online/webhook_notification.rb +1 -1
  175. data/lib/ledger_sync/ledgers/response.rb +1 -1
  176. data/lib/ledger_sync/ledgers/stripe/client.rb +5 -1
  177. data/lib/ledger_sync/resource.rb +5 -3
  178. data/lib/ledger_sync/resource_adaptor.rb +2 -0
  179. data/lib/ledger_sync/resource_attribute/reference/one.rb +2 -2
  180. data/lib/ledger_sync/resource_attribute_set.rb +4 -3
  181. data/lib/ledger_sync/serialization/type/deserializer_type.rb +2 -0
  182. data/lib/ledger_sync/serialization/type/format_date_type.rb +2 -0
  183. data/lib/ledger_sync/serialization/type/mapping_type.rb +2 -0
  184. data/lib/ledger_sync/serialization/type/parse_date_type.rb +2 -0
  185. data/lib/ledger_sync/serialization/type/serializer_type.rb +2 -0
  186. data/lib/ledger_sync/serializer.rb +2 -2
  187. data/lib/ledger_sync/test/support.rb +71 -0
  188. data/lib/ledger_sync/test/support/factory_bot.rb +157 -0
  189. data/lib/ledger_sync/type/date.rb +10 -0
  190. data/lib/ledger_sync/type/value_mixin.rb +3 -1
  191. data/lib/ledger_sync/util/resource_converter/attribute.rb +1 -1
  192. data/lib/ledger_sync/util/resource_converter/type/resource_converter_type.rb +2 -0
  193. data/lib/ledger_sync/util/signer.rb +2 -2
  194. data/lib/ledger_sync/version.rb +9 -1
  195. metadata +89 -65
  196. data/lib/ledger_sync/ledgers/mixins/infer_client_mixin.rb +0 -28
  197. data/lib/ledger_sync/ledgers/quickbooks_online/bill_line_item/deserializer.rb +0 -25
  198. data/lib/ledger_sync/ledgers/quickbooks_online/bill_line_item/serializer.rb +0 -29
  199. data/lib/ledger_sync/ledgers/quickbooks_online/deposit_line_item/deserializer.rb +0 -38
  200. data/lib/ledger_sync/ledgers/quickbooks_online/deposit_line_item/serializer.rb +0 -41
  201. data/lib/ledger_sync/ledgers/quickbooks_online/expense_line_item/deserializer.rb +0 -25
  202. data/lib/ledger_sync/ledgers/quickbooks_online/expense_line_item/serializer.rb +0 -27
  203. data/lib/ledger_sync/ledgers/quickbooks_online/invoice_sales_line_item/deserializer.rb +0 -25
  204. data/lib/ledger_sync/ledgers/quickbooks_online/invoice_sales_line_item/serializer.rb +0 -29
  205. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry_line_item/deserializer.rb +0 -32
  206. data/lib/ledger_sync/ledgers/quickbooks_online/journal_entry_line_item/serializer.rb +0 -36
  207. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill_line_item.rb +0 -21
  208. data/lib/ledger_sync/ledgers/quickbooks_online/resources/bill_payment_line_item.rb +0 -19
  209. data/lib/ledger_sync/ledgers/quickbooks_online/resources/deposit_line_item.rb +0 -25
  210. data/lib/ledger_sync/ledgers/quickbooks_online/resources/expense_line_item.rb +0 -21
  211. data/lib/ledger_sync/ledgers/quickbooks_online/resources/invoice_sales_line_item.rb +0 -21
  212. data/lib/ledger_sync/ledgers/quickbooks_online/resources/journal_entry_line_item.rb +0 -29
  213. data/lib/ledger_sync/ledgers/quickbooks_online/resources/subsidiary.rb +0 -12
  214. data/release.sh +0 -26
@@ -15,4 +15,8 @@ Everyone interacting in the LedgerSync project’s codebases, issue trackers, ch
15
15
 
16
16
  After checking out the repo, run `bin/setup` to install dependencies.
17
17
 
18
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org)
18
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org)
19
+
20
+ ## Development
21
+
22
+ The LedgerSync repo follow [the git flow pattern](https://nvie.com/posts/a-successful-git-branching-model/). You can find [a great cheat sheet here](http://danielkummer.github.io/git-flow-cheatsheet/). Please be sure to follow the naming convention and read our guide to deployment if you are pushing new versions of the gem.
@@ -6,7 +6,9 @@ require 'ledger_sync/version'
6
6
 
7
7
  Gem::Specification.new do |spec|
8
8
  spec.name = 'ledger_sync'
9
- spec.version = LedgerSync::VERSION
9
+ spec.version = LedgerSync.version
10
+
11
+ spec.required_ruby_version = '>= 2.5.8'
10
12
 
11
13
  # spec.required_rubygems_version = Gem::Requirement.new('>= 0') if spec.respond_to? :required_rubygems_version=
12
14
  spec.authors = ['Ryan Jackson']
@@ -29,15 +31,15 @@ Gem::Specification.new do |spec|
29
31
  spec.require_paths = ['lib']
30
32
 
31
33
  spec.add_development_dependency('awesome_print', '>= 0')
32
- spec.add_development_dependency('bump')
33
- spec.add_development_dependency('bundler', '~> 1.16')
34
+ spec.add_development_dependency('bump', '~> 0.9.0')
35
+ spec.add_development_dependency('bundler', '~> 2.1')
34
36
  spec.add_development_dependency('byebug', '>= 0')
35
- spec.add_development_dependency('factory_bot')
37
+ spec.add_development_dependency('factory_bot', '~> 6.1.0')
36
38
  spec.add_development_dependency('jekyll', '~> 3.8.4')
37
39
  spec.add_development_dependency('jekyll-menus', '~> 0.6.0')
38
40
  spec.add_development_dependency('jekyll-paginate', '~> 1.1')
39
41
  spec.add_development_dependency('jekyll-paginate-v2', '~> 1.9')
40
- spec.add_development_dependency('overcommit')
42
+ spec.add_development_dependency('overcommit', '~> 0.57.0')
41
43
  spec.add_development_dependency('rake', '~> 13.0')
42
44
  spec.add_development_dependency('rspec', '~> 3.2')
43
45
  spec.add_development_dependency('rubocop', '>= 0')
@@ -45,19 +47,19 @@ Gem::Specification.new do |spec|
45
47
  spec.add_development_dependency('webmock', '>= 0')
46
48
  spec.add_runtime_dependency('activemodel', '>= 0')
47
49
  spec.add_runtime_dependency('colorize', '>= 0')
48
- spec.add_runtime_dependency('coveralls')
49
- spec.add_runtime_dependency('dotenv')
50
- spec.add_runtime_dependency('dry-schema')
51
- spec.add_runtime_dependency('dry-validation')
50
+ spec.add_runtime_dependency('coveralls', '~> 0.8.23')
51
+ spec.add_runtime_dependency('dotenv', '~> 2.7.6')
52
+ spec.add_runtime_dependency('dry-schema', '~> 1.5.4')
53
+ spec.add_runtime_dependency('dry-validation', '~> 1.5.6')
52
54
  spec.add_runtime_dependency('faraday', '>= 0')
53
55
  spec.add_runtime_dependency('faraday-detailed_logger', '>= 0')
54
56
  spec.add_runtime_dependency('faraday_middleware', '>= 0')
55
57
  spec.add_runtime_dependency('fingerprintable', '>= 1.2.1')
56
- spec.add_runtime_dependency('netsuite')
58
+ spec.add_runtime_dependency('netsuite', '~> 0.8.6')
57
59
  spec.add_runtime_dependency('nokogiri', '>= 0')
58
60
  spec.add_runtime_dependency('oauth2', '>= 0')
59
61
  spec.add_runtime_dependency('pd_ruby', '>= 0')
60
62
  spec.add_runtime_dependency('resonad', '>= 0')
61
63
  spec.add_runtime_dependency('simply_serializable', '>= 1.5.1')
62
- spec.add_runtime_dependency('stripe')
64
+ spec.add_runtime_dependency('stripe', '~> 5.26.0')
63
65
  end
@@ -81,8 +81,14 @@ module LedgerSync
81
81
  LEVEL_ERROR = Logger::ERROR
82
82
  LEVEL_INFO = Logger::INFO
83
83
 
84
- class << self
85
- attr_accessor :ledgers
84
+ module Test
85
+ def require_spec_helper
86
+ require File.join(LedgerSync.root, 'lib/test/support/spec_helper')
87
+ end
88
+ end
89
+
90
+ def self.ledgers
91
+ @ledgers ||= LedgerSync::LedgerConfigurationStore.new
86
92
  end
87
93
 
88
94
  def self.log_level
@@ -105,19 +111,18 @@ module LedgerSync
105
111
  @logger = val
106
112
  end
107
113
 
108
- def self.register_ledger(ledger_key, module_string: nil)
109
- ledger_root_path = "ledger_sync/ledgers/#{ledger_key}"
110
- require "#{ledger_root_path}/client"
111
- self.ledgers ||= LedgerSync::LedgerConfigurationStore.new
112
- ledger_config = LedgerSync::LedgerConfiguration.new(ledger_key, module_string: module_string)
114
+ def self.register_ledger(*args)
115
+ ledger_config = LedgerSync::LedgerConfiguration.new(*args)
116
+
113
117
  yield(ledger_config)
114
- self.ledgers.register_ledger(ledger_config: ledger_config)
115
118
 
116
- client_files = Gem.find_files("#{ledger_root_path}/resource.rb")
117
- client_files |= Gem.find_files("#{ledger_root_path}/resources/**/*.rb")
118
- client_files |= Gem.find_files("#{ledger_root_path}/serialization/**/*.rb")
119
+ ledgers.register_ledger(ledger_config: ledger_config)
120
+
121
+ client_files = Gem.find_files("#{ledger_config.root_path}/resource.rb")
122
+ client_files |= Gem.find_files("#{ledger_config.root_path}/resources/**/*.rb")
123
+ client_files |= Gem.find_files("#{ledger_config.root_path}/serialization/**/*.rb")
119
124
  # Sort the files to include BFS-style as most dependencies are in parent folders
120
- client_files |= Gem.find_files("#{ledger_root_path}/**/*.rb").sort { |a, b| a.count('/') <=> b.count('/') }
125
+ client_files |= Gem.find_files("#{ledger_config.root_path}/**/*.rb").sort { |a, b| a.count('/') <=> b.count('/') }
121
126
 
122
127
  client_files.each do |path|
123
128
  next if path.include?('config.rb')
@@ -100,8 +100,8 @@ module LedgerSync
100
100
  args.fetch(:deserializer)
101
101
  else
102
102
  resource_key = inferred_resource_class.resource_attributes[resource_attribute].type.resource_class.resource_type
103
- require "ledger_sync/ledgers/#{inferred_client_class.root_key}/#{resource_key}/deserializer"
104
- inferred_client_class.resources[resource_key]::Deserializer
103
+ require "#{inferred_config.root_path}/#{resource_key}/deserializer"
104
+ inferred_config.client_class.resources[resource_key]::Deserializer
105
105
  end
106
106
  end
107
107
  end
@@ -5,7 +5,7 @@ module LedgerSync
5
5
  module HelpersMixin
6
6
  module ClassMethods
7
7
  def raise_if_unexpected_class(expected:, given:)
8
- expected = [expected] unless expected.is_a?(Array)
8
+ expected = Array(expected)
9
9
  expected = expected.map { |e| (e.is_a?(Class) ? e : e.class) }
10
10
  given = given.class unless given.is_a?(Class)
11
11
 
@@ -32,7 +32,7 @@ module LedgerSync
32
32
 
33
33
  class UnexpectedClassError < self
34
34
  def initialize(expected:, given:)
35
- expected = [expected] unless expected.is_a?(Array)
35
+ expected = Array(expected)
36
36
 
37
37
  super(
38
38
  message: "Unexpected class. Given #{given.name}. Expected: #{expected.map(&:name).join(', ')}"
@@ -3,8 +3,7 @@
3
3
  module LedgerSync
4
4
  class Error
5
5
  class LedgerError < Error
6
- attr_reader :client
7
- attr_reader :response
6
+ attr_reader :client, :response
8
7
 
9
8
  def initialize(client:, message:, response: nil)
10
9
  @client = client
@@ -5,7 +5,7 @@ module LedgerSync
5
5
  class OperationError < Error
6
6
  attr_reader :operation, :response
7
7
 
8
- def initialize(message: nil, operation:, response: nil)
8
+ def initialize(operation:, message: nil, response: nil)
9
9
  message ||= 'Operation failed.'
10
10
  @operation = operation
11
11
  @response = response
@@ -16,7 +16,7 @@ module LedgerSync
16
16
  class NotFoundError < self; end
17
17
  class LedgerValidationError < self; end
18
18
  class PerformedOperationError < self
19
- def initialize(message: nil, operation:, response: nil)
19
+ def initialize(operation:, message: nil, response: nil)
20
20
  message ||= 'Operation has already been performed. Please check the result.'
21
21
 
22
22
  super(
@@ -15,7 +15,7 @@ module LedgerSync
15
15
 
16
16
  private
17
17
 
18
- def generate_message
18
+ def generate_message # rubocop:disable Metrics/PerceivedComplexity
19
19
  ret = "Attribute #{attribute.name} for #{resource_class.name} should be "
20
20
 
21
21
  ret += case attribute
@@ -5,43 +5,47 @@ module LedgerSync
5
5
  include Fingerprintable::Mixin
6
6
  include SimplySerializable::Mixin
7
7
 
8
- attr_accessor :module_string,
9
- :name,
8
+ attr_accessor :name,
10
9
  :rate_limiting_wait_in_seconds,
11
10
  :test
12
11
 
13
12
  attr_reader :aliases,
14
- :root_key
13
+ :base_module,
14
+ :root_key,
15
+ :root_path
15
16
 
16
17
  simply_serialize only: %i[
17
18
  aliases
18
- module_string
19
+ base_module
19
20
  root_key
20
21
  rate_limiting_wait_in_seconds
21
22
  test
22
23
  ]
23
24
 
24
- def initialize(root_key, module_string: nil)
25
+ def initialize(root_key, args = {})
25
26
  @root_key = root_key
26
27
  @aliases = []
27
- @module_string = module_string || LedgerSync::Util::StringHelpers.camelcase(root_key)
28
+ @root_path = args.fetch(:root_path, "ledger_sync/ledgers/#{root_key}")
29
+
30
+ require client_path
31
+
32
+ @base_module = args.fetch(:base_module, nil)
33
+ @base_module ||= LedgerSync::Ledgers.const_get(LedgerSync::Util::StringHelpers.camelcase(root_key))
28
34
  end
29
35
 
30
36
  def client_class
31
37
  @client_class ||= base_module::Client
32
38
  end
33
39
 
40
+ def client_path
41
+ @client_path ||= File.join(root_path, 'client')
42
+ end
43
+
34
44
  def add_alias(new_alias)
35
45
  @aliases << new_alias
36
46
  LedgerSync.ledgers.add_alias(new_alias, self)
37
47
  end
38
48
 
39
- def base_module
40
- @base_module ||= begin
41
- LedgerSync::Ledgers.const_get(@module_string)
42
- end
43
- end
44
-
45
49
  # Delegate #new to the client class enabling faster client initialization
46
50
  # e.g. LedgerSync.ledgers.test.new(...)
47
51
  def new(*args)
@@ -4,10 +4,11 @@ module LedgerSync
4
4
  class LedgerConfigurationStore
5
5
  include Enumerable
6
6
 
7
- attr_reader :configs, :inflections
7
+ attr_reader :configs, :inflections, :base_module_to_config_mapping
8
8
 
9
9
  def initialize
10
10
  @keys = []
11
+ @base_module_to_config_mapping = {}
11
12
  @configs = {}
12
13
  @inflections = []
13
14
  @class_configs = {}
@@ -15,9 +16,7 @@ module LedgerSync
15
16
 
16
17
  def add_alias(client_key, existing_config)
17
18
  if respond_to?(client_key)
18
- if send(client_key) != existing_config
19
- raise LedgerSync::ConfigurationError, "Alias already taken: #{client_key}"
20
- end
19
+ raise "Alias already taken: #{client_key}" if send(client_key) != existing_config
21
20
 
22
21
  return
23
22
  end
@@ -29,11 +28,21 @@ module LedgerSync
29
28
  @class_configs.fetch(client_class)
30
29
  end
31
30
 
32
- def each
33
- configs.each { |k, v| yield(k, v) }
31
+ def config_from_base_module(base_module:)
32
+ @base_module_to_config_mapping.fetch(base_module, nil)
33
+ end
34
+
35
+ def each(&block)
36
+ configs.each(&block)
37
+ end
38
+
39
+ def find(&block)
40
+ configs.values.find(&block)
34
41
  end
35
42
 
36
43
  def register_ledger(ledger_config:)
44
+ @base_module_to_config_mapping[ledger_config.base_module] = ledger_config
45
+
37
46
  _instance_methods_for(
38
47
  client_key: ledger_config.root_key,
39
48
  ledger_config: ledger_config
@@ -53,7 +62,7 @@ module LedgerSync
53
62
  ledger_config
54
63
  )
55
64
 
56
- @inflections |= [ledger_config.module_string]
65
+ @inflections |= ledger_config.base_module.name.split('::')
57
66
  self.class.class_eval { attr_reader client_key }
58
67
  end
59
68
  end
@@ -2,119 +2,134 @@
2
2
 
3
3
  module LedgerSync
4
4
  module Ledgers
5
- class Client
6
- include Fingerprintable::Mixin
7
- include SimplySerializable::Mixin
8
- include Validatable
9
- include Util::Mixins::ResourceRegisterableMixin
10
-
11
- simply_serialize only: %i[
12
- ledger_configuration
13
- ]
14
-
15
- def initialize(*)
16
- raise NotImplementedError
17
- end
18
-
19
- def ledger_configuration
20
- self.class.config
21
- end
22
-
23
- def base_module
24
- self.class.base_module
25
- end
26
-
27
- def ledger_attributes_to_save
28
- return {} if self.class.ledger_attributes_to_save.nil?
29
-
30
- Hash[self.class.ledger_attributes_to_save.map do |attribute|
31
- [attribute, send(attribute)]
32
- end]
33
- end
34
-
35
- def operation_for(args = {})
36
- method = args.fetch(:method)
37
- resource = args.fetch(:resource)
38
-
39
- self.class.operation_class_for(
40
- method: method,
41
- resource_class: resource.class
42
- ).new(
43
- client: self,
44
- resource: resource
45
- )
46
- end
47
-
48
- def searcher_for(*args)
49
- self.class.searcher_for(*args)
50
- end
51
-
52
- def searcher_class_for(*args)
53
- self.class.searcher_class_for(*args)
54
- end
55
-
56
- def url_for(*_args)
57
- raise NotImplementedError
58
- end
59
-
60
- def parse_operation_error(*)
61
- nil
62
- end
63
-
64
- def self.base_module
65
- config.base_module
66
- end
67
-
68
- def self.base_operation_module_for(resource_class:)
69
- base_module.const_get("#{resource_class.resource_module_str}::Operations")
70
- end
71
-
72
- def self.config
73
- @config ||= LedgerSync.ledgers.config_from_class(client_class: self)
74
- end
75
-
76
- # These are attributes that must always be saved after the client is called.
77
- # For example, the library will handle refreshing tokens that will need
78
- # to be saved back to the application layer for future use.
79
- def self.ledger_attributes_to_save
80
- raise NotImplementedError
81
- end
82
-
83
- def self.ledger_resource_type_for(resource_class:)
84
- ledger_resource_type_overrides[resource_class] || resource_class.resource_type.to_s
85
- end
86
-
87
- def self.ledger_resource_type_overrides
88
- {}
5
+ module Client
6
+ module SharedClassMethods
7
+ def base_operations_module_for(resource_class:)
8
+ resource_class::Operations
9
+ end
10
+ end
11
+
12
+ extend SharedClassMethods
13
+
14
+ module Mixin
15
+ module InstanceMethods
16
+ def ledger_configuration
17
+ self.class.config
18
+ end
19
+
20
+ def base_module
21
+ self.class.base_module
22
+ end
23
+
24
+ def ledger_attributes_to_save
25
+ return {} if self.class.ledger_attributes_to_save.nil?
26
+
27
+ Hash[self.class.ledger_attributes_to_save.map do |attribute|
28
+ [attribute, send(attribute)]
29
+ end]
30
+ end
31
+
32
+ def operation_for(args = {})
33
+ method = args.fetch(:method)
34
+ resource = args.fetch(:resource)
35
+
36
+ self.class.operation_class_for(
37
+ method: method,
38
+ resource_class: resource.class
39
+ ).new(
40
+ client: self,
41
+ resource: resource
42
+ )
43
+ end
44
+
45
+ def searcher_for(*args)
46
+ self.class.searcher_for(*args)
47
+ end
48
+
49
+ def searcher_class_for(*args)
50
+ self.class.searcher_class_for(*args)
51
+ end
52
+
53
+ def url_for(*_args)
54
+ raise NotImplementedError
55
+ end
56
+
57
+ def parse_operation_error(*)
58
+ nil
59
+ end
60
+ end
61
+
62
+ module ClassMethods
63
+ def base_module
64
+ config.base_module
65
+ end
66
+
67
+ def config
68
+ @config ||= LedgerSync.ledgers.config_from_class(client_class: self)
69
+ end
70
+
71
+ # These are attributes that must always be saved after the client is called.
72
+ # For example, the library will handle refreshing tokens that will need
73
+ # to be saved back to the application layer for future use.
74
+ def ledger_attributes_to_save
75
+ raise NotImplementedError
76
+ end
77
+
78
+ def ledger_resource_type_for(resource_class:)
79
+ ledger_resource_type_overrides[resource_class] || resource_class.resource_type.to_s
80
+ end
81
+
82
+ def ledger_resource_type_overrides
83
+ {}
84
+ end
85
+
86
+ def operation_class_for(*args)
87
+ Client.operation_class_for(*args)
88
+ end
89
+
90
+ def resource_from_ledger_type(type:, converter: nil)
91
+ converter ||= proc { |n| n.underscore }
92
+ ledger_resource_type_overrides.invert[converter.call(type).to_sym] || resources[converter.call(type).to_sym]
93
+ end
94
+
95
+ def resources
96
+ @resources ||= {}
97
+ end
98
+
99
+ def root_key
100
+ @root_key ||= config.root_key
101
+ end
102
+
103
+ def searcher_for(resource_type:, query: '')
104
+ searcher_class_for(resource_type: resource_type).new(client: self, query: query)
105
+ end
106
+
107
+ def searcher_class_for(resource_type:)
108
+ base_module.const_get(LedgerSync::Util::StringHelpers.camelcase(resource_type.to_s))::Searcher
109
+ end
110
+
111
+ def url_for(resource: nil); end
112
+ end
113
+
114
+ def self.included(base)
115
+ base.include Fingerprintable::Mixin
116
+ base.include SimplySerializable::Mixin
117
+ base.include Validatable
118
+ base.include Util::Mixins::ResourceRegisterableMixin
119
+ base.extend SharedClassMethods
120
+ base.extend ClassMethods
121
+ base.include InstanceMethods
122
+
123
+ base.simply_serialize only: %i[
124
+ ledger_configuration
125
+ ]
126
+ end
89
127
  end
90
128
 
91
129
  def self.operation_class_for(method:, resource_class:)
92
- base_operation_module_for(resource_class: resource_class)
130
+ base_operations_module_for(resource_class: resource_class)
93
131
  .const_get(LedgerSync::Util::StringHelpers.camelcase(method.to_s))
94
132
  end
95
-
96
- def self.resource_from_ledger_type(type:, converter: nil)
97
- converter ||= proc { |n| n.underscore }
98
- ledger_resource_type_overrides.invert[converter.call(type).to_sym] || resources[converter.call(type).to_sym]
99
- end
100
-
101
- def self.resources
102
- @resources ||= {}
103
- end
104
-
105
- def self.root_key
106
- @root_key ||= config.root_key
107
- end
108
-
109
- def self.searcher_for(resource_type:, query: '')
110
- searcher_class_for(resource_type: resource_type).new(client: self, query: query)
111
- end
112
-
113
- def self.searcher_class_for(resource_type:)
114
- base_module.const_get(LedgerSync::Util::StringHelpers.camelcase(resource_type.to_s))::Searcher
115
- end
116
-
117
- def self.url_for(resource: nil); end
118
133
  end
119
134
  end
120
135
  end