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
@@ -75,7 +75,7 @@ module LedgerSync
75
75
 
76
76
  attr_reader :operation
77
77
 
78
- def initialize(operation: nil, error:)
78
+ def initialize(error:, operation: nil)
79
79
  @operation = operation
80
80
  super(error: error)
81
81
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../primary_phone/deserializer'
4
+ require_relative '../primary_email_addr/deserializer'
5
+
3
6
  module LedgerSync
4
7
  module Ledgers
5
8
  module QuickBooksOnline
@@ -7,17 +10,16 @@ module LedgerSync
7
10
  class Deserializer < QuickBooksOnline::Deserializer
8
11
  id
9
12
 
10
- attribute :display_name,
11
- hash_attribute: 'DisplayName'
12
-
13
- attribute :first_name,
14
- hash_attribute: 'GivenName'
15
-
16
- attribute :last_name,
17
- hash_attribute: 'FamilyName'
13
+ attribute :DisplayName
14
+ attribute :GivenName
15
+ attribute :MiddleName
16
+ attribute :FamilyName
17
+ attribute :CompanyName
18
18
 
19
- attribute :email,
20
- hash_attribute: 'PrimaryEmailAddr.Address'
19
+ references_one :PrimaryPhone,
20
+ deserializer: PrimaryPhone::Deserializer
21
+ references_one :PrimaryEmailAddr,
22
+ deserializer: PrimaryEmailAddr::Deserializer
21
23
  end
22
24
  end
23
25
  end
@@ -10,13 +10,13 @@ module LedgerSync
10
10
  params do
11
11
  required(:external_id).maybe(:string)
12
12
  required(:ledger_id).value(:nil)
13
- optional(:display_name).maybe(:string)
14
- optional(:first_name).maybe(:string)
15
- optional(:last_name).maybe(:string)
16
- optional(:email).maybe(:string)
17
- optional(:company_name).maybe(:string)
18
- optional(:phone_number).maybe(:string)
19
- optional(:subsidiary).maybe(:hash, Types::Reference)
13
+ optional(:CompanyName).maybe(:string)
14
+ optional(:DisplayName).maybe(:string)
15
+ optional(:FamilyName).maybe(:string)
16
+ optional(:GivenName).maybe(:string)
17
+ optional(:MiddleName).maybe(:string)
18
+ required(:PrimaryPhone).maybe(:hash, Types::Reference)
19
+ required(:PrimaryEmailAddr).maybe(:hash, Types::Reference)
20
20
  end
21
21
  end
22
22
  end
@@ -10,13 +10,13 @@ module LedgerSync
10
10
  params do
11
11
  required(:external_id).maybe(:string)
12
12
  required(:ledger_id).filled(:string)
13
- required(:display_name).maybe(:string)
14
- required(:first_name).maybe(:string)
15
- required(:last_name).maybe(:string)
16
- required(:email).maybe(:string)
17
- optional(:company_name).maybe(:string)
18
- optional(:phone_number).maybe(:string)
19
- optional(:subsidiary).maybe(:hash, Types::Reference)
13
+ optional(:CompanyName).maybe(:string)
14
+ optional(:DisplayName).maybe(:string)
15
+ optional(:FamilyName).maybe(:string)
16
+ optional(:GivenName).maybe(:string)
17
+ optional(:MiddleName).maybe(:string)
18
+ optional(:PrimaryPhone).maybe(:hash, Types::Reference)
19
+ optional(:PrimaryEmailAddr).maybe(:hash, Types::Reference)
20
20
  end
21
21
  end
22
22
  end
@@ -10,13 +10,13 @@ module LedgerSync
10
10
  params do
11
11
  required(:external_id).maybe(:string)
12
12
  required(:ledger_id).filled(:string)
13
- optional(:display_name).maybe(:string)
14
- optional(:first_name).maybe(:string)
15
- optional(:last_name).maybe(:string)
16
- optional(:email).maybe(:string)
17
- optional(:company_name).maybe(:string)
18
- optional(:phone_number).maybe(:string)
19
- optional(:subsidiary).maybe(:hash, Types::Reference)
13
+ optional(:CompanyName).maybe(:string)
14
+ optional(:DisplayName).maybe(:string)
15
+ optional(:FamilyName).maybe(:string)
16
+ optional(:GivenName).maybe(:string)
17
+ optional(:MiddleName).maybe(:string)
18
+ required(:PrimaryPhone).maybe(:hash, Types::Reference)
19
+ required(:PrimaryEmailAddr).maybe(:hash, Types::Reference)
20
20
  end
21
21
  end
22
22
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../primary_phone/serializer'
4
+ require_relative '../primary_email_addr/serializer'
5
+
3
6
  module LedgerSync
4
7
  module Ledgers
5
8
  module QuickBooksOnline
@@ -7,17 +10,16 @@ module LedgerSync
7
10
  class Serializer < QuickBooksOnline::Serializer
8
11
  id
9
12
 
10
- attribute 'DisplayName',
11
- resource_attribute: :display_name
12
-
13
- attribute 'GivenName',
14
- resource_attribute: :first_name
15
-
16
- attribute 'FamilyName',
17
- resource_attribute: :last_name
13
+ attribute :DisplayName
14
+ attribute :GivenName
15
+ attribute :MiddleName
16
+ attribute :FamilyName
17
+ attribute :CompanyName
18
18
 
19
- attribute 'PrimaryEmailAddr.Address',
20
- resource_attribute: :email
19
+ references_one :PrimaryPhone,
20
+ serializer: PrimaryPhone::Serializer
21
+ references_one :PrimaryEmailAddr,
22
+ serializer: PrimaryEmailAddr::Serializer
21
23
  end
22
24
  end
23
25
  end
@@ -15,7 +15,7 @@ module LedgerSync
15
15
  @original_payload = payload
16
16
  @payload = payload.is_a?(String) ? JSON.parse(payload) : payload
17
17
 
18
- event_notifications_payload = @payload.dig('eventNotifications')
18
+ event_notifications_payload = @payload['eventNotifications']
19
19
  raise 'Invalid payload: Could not find eventNotifications' unless event_notifications_payload.is_a?(Array)
20
20
 
21
21
  @notifications = []
@@ -19,20 +19,20 @@ module LedgerSync
19
19
  @original_payload = payload
20
20
  @payload = payload.is_a?(String) ? JSON.parse(payload) : payload
21
21
 
22
- @deleted_id = @payload.dig('deletedId')
22
+ @deleted_id = @payload['deletedId']
23
23
 
24
- @event_operation = @payload.dig('operation')
24
+ @event_operation = @payload['operation']
25
25
  raise 'Invalid payload: Could not find operation' if @event_operation.blank?
26
26
 
27
- @last_updated_at = @payload.dig('lastUpdated')
27
+ @last_updated_at = @payload['lastUpdated']
28
28
  raise 'Invalid payload: Could not find lastUpdated' if @last_updated_at.blank?
29
29
 
30
30
  @last_updated_at = Time.parse(@last_updated_at)
31
31
 
32
- @ledger_id = @payload.dig('id')
32
+ @ledger_id = @payload['id']
33
33
  raise 'Invalid payload: Could not find id' if @ledger_id.blank?
34
34
 
35
- @quickbooks_online_resource_type = @payload.dig('name')
35
+ @quickbooks_online_resource_type = @payload['name']
36
36
  raise 'Invalid payload: Could not find name' if @quickbooks_online_resource_type.blank?
37
37
 
38
38
  @webhook_notification = webhook_notification
@@ -51,7 +51,7 @@ module LedgerSync
51
51
  end
52
52
 
53
53
  def find_operation_class(client:)
54
- client.class.base_operation_module_for(resource_class: resource_class)::Find
54
+ client.class.base_operations_module_for(resource_class: resource_class)::Find
55
55
  end
56
56
 
57
57
  def local_resource_type
@@ -18,7 +18,7 @@ module LedgerSync
18
18
  @webhook = args.fetch(:webhook, nil)
19
19
  @payload = original_payload.is_a?(String) ? JSON.parse(original_payload) : original_payload
20
20
 
21
- @realm_id = @payload.dig('realmId')
21
+ @realm_id = @payload['realmId']
22
22
  raise 'Invalid payload: Could not find realmId' if @realm_id.blank?
23
23
 
24
24
  events_payload = @payload.dig('dataChangeEvent', 'entities')
@@ -9,7 +9,7 @@ module LedgerSync
9
9
  :request,
10
10
  :status
11
11
 
12
- def initialize(body: nil, headers: {}, raw: nil, request:, status:)
12
+ def initialize(request:, status:, body: nil, headers: {}, raw: nil)
13
13
  @body = parse_json(body)
14
14
  @headers = headers
15
15
  @raw = raw
@@ -5,13 +5,17 @@ require 'oauth2'
5
5
  module LedgerSync
6
6
  module Ledgers
7
7
  module Stripe
8
- class Client < Ledgers::Client
8
+ class Client
9
+ include Ledgers::Client::Mixin
10
+
9
11
  attr_reader :api_key
10
12
 
11
13
  def initialize(
12
14
  api_key:
13
15
  )
14
16
  @api_key = api_key
17
+
18
+ super()
15
19
  end
16
20
 
17
21
  def url_for(resource:)
@@ -13,7 +13,7 @@ module LedgerSync
13
13
  include ResourceAttribute::Reference::One::Mixin
14
14
  include ResourceAttribute::Reference::Many::Mixin
15
15
  include Util::Mixins::DupableMixin
16
- include Ledgers::Mixins::InferClientMixin
16
+ include Ledgers::Mixins::InferConfigMixin
17
17
 
18
18
  PRIMITIVES = [
19
19
  ActiveModel::Type,
@@ -68,9 +68,11 @@ module LedgerSync
68
68
 
69
69
  LedgerSync.register_resource(resource: subclass)
70
70
 
71
- return if subclass.inferred_client_class.nil?
71
+ return if subclass.inferred_config.nil?
72
72
 
73
- subclass.inferred_client_class.register_resource(resource: subclass)
73
+ subclass.inferred_config.client_class.register_resource(resource: subclass)
74
+
75
+ super
74
76
  end
75
77
 
76
78
  def self.operations
@@ -47,6 +47,8 @@ module LedgerSync
47
47
 
48
48
  def self.inherited(base)
49
49
  base.include(Mixin)
50
+
51
+ super
50
52
  end
51
53
  end
52
54
  end
@@ -15,8 +15,8 @@ module LedgerSync
15
15
  module ClassMethods
16
16
  def references_one(name, to: nil)
17
17
  to ||= begin
18
- require "ledger_sync/ledgers/#{inferred_client_class.root_key}/resources/#{name}"
19
- inferred_client_class.resources[name]
18
+ require "#{inferred_config.root_path}/resources/#{name}"
19
+ inferred_config.client_class.resources[name]
20
20
  end
21
21
 
22
22
  resource_attribute = ResourceAttribute::Reference::One.new(
@@ -27,15 +27,16 @@ module LedgerSync
27
27
  name = attribute.name
28
28
  raise "Attribute #{name} already exists on #{resource.name}." if attributes.key?(name)
29
29
 
30
- if attribute.is_a?(ResourceAttribute::Reference::One)
30
+ case attribute
31
+ when ResourceAttribute::Reference::One
31
32
  @attributes[attribute.name] = attribute
32
33
  @references << attribute
33
34
  @references_one << attribute
34
- elsif attribute.is_a?(ResourceAttribute::Reference::Many)
35
+ when ResourceAttribute::Reference::Many
35
36
  @attributes[attribute.name] = attribute
36
37
  @references << attribute
37
38
  @references_many << attribute
38
- elsif attribute.is_a?(ResourceAttribute)
39
+ when ResourceAttribute
39
40
  @attributes[attribute.name] = attribute
40
41
  else
41
42
  raise 'Unknown attribute class'
@@ -8,6 +8,8 @@ module LedgerSync
8
8
 
9
9
  def initialize(args = {})
10
10
  @deserializer = args.fetch(:deserializer)
11
+
12
+ super()
11
13
  end
12
14
 
13
15
  def cast_value(args = {})
@@ -8,6 +8,8 @@ module LedgerSync
8
8
 
9
9
  def initialize(args = {})
10
10
  @format = args.fetch(:format)
11
+
12
+ super()
11
13
  end
12
14
 
13
15
  def cast_value(args = {})
@@ -8,6 +8,8 @@ module LedgerSync
8
8
 
9
9
  def initialize(args = {})
10
10
  @hash = args.fetch(:hash)
11
+
12
+ super()
11
13
  end
12
14
 
13
15
  def cast_value(args = {})
@@ -8,6 +8,8 @@ module LedgerSync
8
8
 
9
9
  def initialize(args = {})
10
10
  @format = args.fetch(:format)
11
+
12
+ super()
11
13
  end
12
14
 
13
15
  def cast_value(args = {})
@@ -8,6 +8,8 @@ module LedgerSync
8
8
 
9
9
  def initialize(args = {})
10
10
  @serializer = args.fetch(:serializer)
11
+
12
+ super()
11
13
  end
12
14
 
13
15
  def cast_value(args = {})
@@ -89,8 +89,8 @@ module LedgerSync
89
89
  args.fetch(:serializer)
90
90
  else
91
91
  resource_key = inferred_resource_class.resource_attributes[hash_attribute].type.resource_class.resource_type
92
- require "ledger_sync/ledgers/#{inferred_client_class.root_key}/#{resource_key}/serializer"
93
- inferred_client_class.resources[resource_key]::Serializer
92
+ require File.join(inferred_config.root_path, resource_key.to_s, 'serializer')
93
+ inferred_config.client_class.resources[resource_key]::Serializer
94
94
  end
95
95
  end
96
96
  end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ def support(*paths)
4
+ paths.each do |path|
5
+ require File.join(LedgerSync.root, 'spec/support/', path.to_s)
6
+ end
7
+ end
8
+
9
+ def core_support(*paths)
10
+ paths.each do |path|
11
+ require File.join(LedgerSync.root, 'lib/ledger_sync/test/support/', path.to_s)
12
+ end
13
+ end
14
+
15
+ def qa_support(*paths)
16
+ paths.each do |path|
17
+ require File.join(LedgerSync.root, 'spec/qa/support/', path.to_s)
18
+ end
19
+ end
20
+
21
+ module LedgerSync
22
+ module Test
23
+ module Support
24
+ def self.setup(*paths_to_require)
25
+ require 'webmock/rspec'
26
+ require 'simplecov'
27
+ require 'coveralls'
28
+ Coveralls.wear!
29
+
30
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new(
31
+ [
32
+ Coveralls::SimpleCov::Formatter,
33
+ SimpleCov::Formatter::HTMLFormatter
34
+ ]
35
+ )
36
+
37
+ SimpleCov.start do
38
+ add_filter 'lib/ledger_sync/util/debug.rb'
39
+ end
40
+
41
+ # Set an environment variable to determine when we are testing. This
42
+ # prevents things like the QuickBooks Online client overwriting
43
+ # environment variables with dummy values.
44
+ ENV['TEST_ENV'] = 'true'
45
+
46
+ require 'bundler/setup'
47
+ require 'ap'
48
+ require 'byebug'
49
+
50
+ paths_to_require.each { |e| require e.to_s }
51
+
52
+ # Include test adaptor
53
+ require File.join(LedgerSync.root, 'spec/support/test_ledger/config')
54
+
55
+ core_support :factory_bot
56
+
57
+ RSpec.configure do |config|
58
+ # Enable flags like --only-failures and --next-failure
59
+ config.example_status_persistence_file_path = 'tmp/rspec_history.txt'
60
+
61
+ # Disable RSpec exposing methods globally on `Module` and `main`
62
+ config.disable_monkey_patching!
63
+
64
+ config.expect_with :rspec do |c|
65
+ c.syntax = :expect
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,157 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'factory_bot'
4
+
5
+ #
6
+ # Override factory registration to work with Resource and its relationships
7
+ # and attribute types.
8
+ #
9
+ def register_factory(args = {}) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
10
+ prefix = args.fetch(:prefix)
11
+ resource_class = args.fetch(:resource_class)
12
+ key = "#{prefix}_#{resource_class.resource_type}"
13
+
14
+ FactoryBot.define do
15
+ factory key, class: resource_class do
16
+ resource_class.resource_attributes.each do |attribute, resource_attribute|
17
+ case resource_attribute.type
18
+ when LedgerSync::Type::StringFromSet
19
+ add_attribute(attribute) { resource_attribute.type.values.first }
20
+ when LedgerSync::Type::String, LedgerSync::Type::ID
21
+ case attribute.to_sym
22
+ when :ledger_id
23
+ sequence(attribute) { nil }
24
+ else # when :external_id or something else
25
+ sequence(attribute) { |n| "#{attribute}-#{rand_id(n)}" }
26
+ end
27
+ when LedgerSync::Type::Float
28
+ add_attribute(attribute) { 1.23 }
29
+ when LedgerSync::Type::Boolean
30
+ add_attribute(attribute) { false }
31
+ when LedgerSync::Type::Date
32
+ add_attribute(attribute) { Date.today }
33
+ when LedgerSync::Type::Hash
34
+ add_attribute(attribute) { {} }
35
+ when LedgerSync::Type::Integer
36
+ add_attribute(attribute) { 123 }
37
+ when LedgerSync::Type::ReferenceOne
38
+ key_ending = if resource_attribute.type.resource_class.is_a?(Array)
39
+ resource_attribute.type.resource_class.first.resource_type
40
+ else
41
+ resource_attribute.type.resource_class.resource_type
42
+ end
43
+ resource_attribute_key = "#{prefix}_#{key_ending}"
44
+ next if resource_attribute_key == key
45
+
46
+ references_one attribute, factory: resource_attribute_key
47
+ when LedgerSync::Type::ReferenceMany
48
+ key_ending = if resource_attribute.type.resource_class.is_a?(Array)
49
+ resource_attribute.type.resource_class.first.resource_type
50
+ else
51
+ resource_attribute.type.resource_class.resource_type
52
+ end
53
+ resource_attribute_key = "#{prefix}_#{key_ending}"
54
+ next if resource_attribute_key == key
55
+
56
+ references_many attribute, factory: resource_attribute_key
57
+ else
58
+ raise "Do not know how to default type: #{resource_attribute.type.class.name}"
59
+ end
60
+ end
61
+ end
62
+ end
63
+ end
64
+
65
+ def generate_resource_factories
66
+ LedgerSync.ledgers.each do |ledger_key, ledger|
67
+ ledger.client_class.resources.each do |resource_key, resource_class|
68
+ factory_key = "#{ledger_key}_#{resource_key}".to_sym
69
+ next if FactoryBot.factories.registered?(factory_key)
70
+
71
+ register_factory(prefix: ledger_key, resource_class: resource_class)
72
+ end
73
+ end
74
+ end
75
+
76
+ RSpec.configure do |config|
77
+ config.include FactoryBot::Syntax::Methods
78
+ config.before(:suite) do
79
+ FactoryBot.find_definitions
80
+ generate_resource_factories
81
+ end
82
+ config.after { FactoryBot.rewind_sequences }
83
+ end
84
+
85
+ FactoryBot.define do
86
+ skip_create
87
+ initialize_with { new(attributes) } # Allows initializing read-only attrs
88
+ end
89
+
90
+ module FactoryBot
91
+ def self.rand_id(*appends, include_test_run_id: true)
92
+ ret = ''
93
+ ret += test_run_id if include_test_run_id
94
+ ret += (0...8).map { rand(65..90).chr }.join
95
+ appends.each do |append|
96
+ ret += "-#{append}"
97
+ end
98
+ ret
99
+ end
100
+
101
+ def self.test_run_id(*appends, **keywords)
102
+ @test_run_id ||= rand_id(
103
+ *appends,
104
+ **keywords.merge(include_test_run_id: false)
105
+ )
106
+ end
107
+
108
+ class DefinitionProxy
109
+ #
110
+ # Helper method of our references_one on resources
111
+ #
112
+ # @param [String] name
113
+ # @param [String] factory Defaults to name
114
+ #
115
+ # @return [FactoryBot::Declaration]
116
+ #
117
+ def references_one(name, factory: nil)
118
+ add_attribute(name) do
119
+ factory ||= name
120
+ FactoryBot.build(factory, **attributes_for(factory))
121
+ end
122
+ end
123
+
124
+ #
125
+ # Helper method of our references_many on resources
126
+ #
127
+ # @param [String] name
128
+ # @param [String] factory Defaults to name
129
+ #
130
+ # @return [FactoryBot::Declaration]
131
+ #
132
+ def references_many(name, count: 0, factory: nil)
133
+ add_attribute(name) do
134
+ factory ||= name
135
+ FactoryBot.build_list(factory, count)
136
+ end
137
+ end
138
+ end
139
+ end
140
+
141
+ #
142
+ # Used for uniqueness in QuickBooks Online given the unique name requirement
143
+ #
144
+ # @return [String]
145
+ #
146
+ def rand_id(*args)
147
+ FactoryBot.rand_id(*args)
148
+ end
149
+
150
+ #
151
+ # Used for uniqueness in QuickBooks Online given the unique name requirement
152
+ #
153
+ # @return [String]
154
+ #
155
+ def test_run_id(*args)
156
+ @test_run_id ||= FactoryBot.test_run_id(*args)
157
+ end