ledger_sync 1.4.4 → 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
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