xero-ruby 0.2.4 → 2.0.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 (463) hide show
  1. checksums.yaml +4 -4
  2. data/CODE_OF_CONDUCT.md +76 -0
  3. data/CONTRIBUTING.md +82 -0
  4. data/Gemfile.lock +68 -0
  5. data/LICENSE +21 -0
  6. data/README.md +155 -436
  7. data/build_notes.md +17 -0
  8. data/docs/{Account.md → accounting/Account.md} +3 -3
  9. data/docs/accounting/AccountType.md +16 -0
  10. data/docs/{AccountingApi.md → accounting/AccountingApi.md} +4990 -1787
  11. data/docs/{Accounts.md → accounting/Accounts.md} +3 -3
  12. data/docs/{AccountsPayable.md → accounting/AccountsPayable.md} +3 -3
  13. data/docs/{AccountsReceivable.md → accounting/AccountsReceivable.md} +3 -3
  14. data/docs/{Address.md → accounting/Address.md} +3 -3
  15. data/docs/accounting/Allocation.md +31 -0
  16. data/docs/{Allocations.md → accounting/Allocations.md} +3 -3
  17. data/docs/{Attachment.md → accounting/Attachment.md} +3 -3
  18. data/docs/{Attachments.md → accounting/Attachments.md} +3 -3
  19. data/docs/{Balances.md → accounting/Balances.md} +3 -3
  20. data/docs/{BankTransaction.md → accounting/BankTransaction.md} +3 -3
  21. data/docs/{BankTransactions.md → accounting/BankTransactions.md} +3 -3
  22. data/docs/{BankTransfer.md → accounting/BankTransfer.md} +4 -4
  23. data/docs/{BankTransfers.md → accounting/BankTransfers.md} +3 -3
  24. data/docs/{BatchPayment.md → accounting/BatchPayment.md} +4 -4
  25. data/docs/{BatchPaymentDetails.md → accounting/BatchPaymentDetails.md} +3 -3
  26. data/docs/{BatchPayments.md → accounting/BatchPayments.md} +3 -3
  27. data/docs/{Bill.md → accounting/Bill.md} +3 -3
  28. data/docs/{BrandingTheme.md → accounting/BrandingTheme.md} +3 -3
  29. data/docs/{BrandingThemes.md → accounting/BrandingThemes.md} +3 -3
  30. data/docs/{CISOrgSetting.md → accounting/CISOrgSetting.md} +3 -3
  31. data/docs/{CISSetting.md → accounting/CISSetting.md} +3 -3
  32. data/docs/{CISSettings.md → accounting/CISSettings.md} +3 -3
  33. data/docs/{Contact.md → accounting/Contact.md} +5 -5
  34. data/docs/{ContactGroup.md → accounting/ContactGroup.md} +3 -3
  35. data/docs/{ContactGroups.md → accounting/ContactGroups.md} +3 -3
  36. data/docs/{ContactPerson.md → accounting/ContactPerson.md} +3 -3
  37. data/docs/{Contacts.md → accounting/Contacts.md} +3 -3
  38. data/docs/accounting/CountryCode.md +16 -0
  39. data/docs/{CreditNote.md → accounting/CreditNote.md} +5 -5
  40. data/docs/{CreditNotes.md → accounting/CreditNotes.md} +3 -3
  41. data/docs/{Currencies.md → accounting/Currencies.md} +3 -3
  42. data/docs/{Currency.md → accounting/Currency.md} +3 -3
  43. data/docs/accounting/CurrencyCode.md +16 -0
  44. data/docs/{Element.md → accounting/Element.md} +3 -3
  45. data/docs/{Employee.md → accounting/Employee.md} +3 -3
  46. data/docs/{Employees.md → accounting/Employees.md} +3 -3
  47. data/docs/{Error.md → accounting/Error.md} +3 -3
  48. data/docs/{ExpenseClaim.md → accounting/ExpenseClaim.md} +3 -3
  49. data/docs/{ExpenseClaims.md → accounting/ExpenseClaims.md} +3 -3
  50. data/docs/{ExternalLink.md → accounting/ExternalLink.md} +3 -3
  51. data/docs/{HistoryRecord.md → accounting/HistoryRecord.md} +3 -3
  52. data/docs/{HistoryRecords.md → accounting/HistoryRecords.md} +3 -3
  53. data/docs/{Invoice.md → accounting/Invoice.md} +5 -5
  54. data/docs/{InvoiceReminder.md → accounting/InvoiceReminder.md} +3 -3
  55. data/docs/{InvoiceReminders.md → accounting/InvoiceReminders.md} +3 -3
  56. data/docs/{Invoices.md → accounting/Invoices.md} +3 -3
  57. data/docs/{Item.md → accounting/Item.md} +3 -3
  58. data/docs/{Items.md → accounting/Items.md} +3 -3
  59. data/docs/{Journal.md → accounting/Journal.md} +4 -4
  60. data/docs/{JournalLine.md → accounting/JournalLine.md} +3 -3
  61. data/docs/{Journals.md → accounting/Journals.md} +3 -3
  62. data/docs/accounting/LineAmountTypes.md +16 -0
  63. data/docs/{LineItem.md → accounting/LineItem.md} +3 -3
  64. data/docs/{LineItemTracking.md → accounting/LineItemTracking.md} +3 -3
  65. data/docs/{LinkedTransaction.md → accounting/LinkedTransaction.md} +3 -3
  66. data/docs/{LinkedTransactions.md → accounting/LinkedTransactions.md} +3 -3
  67. data/docs/{ManualJournal.md → accounting/ManualJournal.md} +3 -3
  68. data/docs/{ManualJournalLine.md → accounting/ManualJournalLine.md} +5 -3
  69. data/docs/{ManualJournals.md → accounting/ManualJournals.md} +3 -3
  70. data/docs/{OnlineInvoice.md → accounting/OnlineInvoice.md} +3 -3
  71. data/docs/{OnlineInvoices.md → accounting/OnlineInvoices.md} +3 -3
  72. data/docs/{Organisation.md → accounting/Organisation.md} +6 -4
  73. data/docs/{Organisations.md → accounting/Organisations.md} +3 -3
  74. data/docs/{Overpayment.md → accounting/Overpayment.md} +3 -3
  75. data/docs/{Overpayments.md → accounting/Overpayments.md} +3 -3
  76. data/docs/{Payment.md → accounting/Payment.md} +9 -7
  77. data/docs/{PaymentDelete.md → accounting/PaymentDelete.md} +3 -3
  78. data/docs/{PaymentService.md → accounting/PaymentService.md} +3 -3
  79. data/docs/{PaymentServices.md → accounting/PaymentServices.md} +3 -3
  80. data/docs/{PaymentTerm.md → accounting/PaymentTerm.md} +3 -3
  81. data/docs/{PaymentTermType.md → accounting/PaymentTermType.md} +3 -3
  82. data/docs/{Payments.md → accounting/Payments.md} +3 -3
  83. data/docs/{Phone.md → accounting/Phone.md} +3 -3
  84. data/docs/{Prepayment.md → accounting/Prepayment.md} +3 -3
  85. data/docs/{Prepayments.md → accounting/Prepayments.md} +3 -3
  86. data/docs/{Purchase.md → accounting/Purchase.md} +3 -3
  87. data/docs/{PurchaseOrder.md → accounting/PurchaseOrder.md} +3 -3
  88. data/docs/{PurchaseOrders.md → accounting/PurchaseOrders.md} +3 -3
  89. data/docs/{Quote.md → accounting/Quote.md} +10 -6
  90. data/docs/{QuoteLineAmountTypes.md → accounting/QuoteLineAmountTypes.md} +3 -3
  91. data/docs/{QuoteStatusCodes.md → accounting/QuoteStatusCodes.md} +3 -3
  92. data/docs/{Quotes.md → accounting/Quotes.md} +3 -3
  93. data/docs/{Receipt.md → accounting/Receipt.md} +3 -3
  94. data/docs/{Receipts.md → accounting/Receipts.md} +3 -3
  95. data/docs/{RepeatingInvoice.md → accounting/RepeatingInvoice.md} +3 -3
  96. data/docs/{RepeatingInvoices.md → accounting/RepeatingInvoices.md} +3 -3
  97. data/docs/{Report.md → accounting/Report.md} +4 -4
  98. data/docs/{ReportAttribute.md → accounting/ReportAttribute.md} +3 -3
  99. data/docs/{ReportCell.md → accounting/ReportCell.md} +3 -3
  100. data/docs/{ReportFields.md → accounting/ReportFields.md} +3 -3
  101. data/docs/{ReportRow.md → accounting/ReportRow.md} +3 -3
  102. data/docs/{ReportRows.md → accounting/ReportRows.md} +3 -3
  103. data/docs/{ReportWithRow.md → accounting/ReportWithRow.md} +3 -3
  104. data/docs/{ReportWithRows.md → accounting/ReportWithRows.md} +3 -3
  105. data/docs/{Reports.md → accounting/Reports.md} +3 -3
  106. data/docs/{RequestEmpty.md → accounting/RequestEmpty.md} +3 -3
  107. data/docs/{RowType.md → accounting/RowType.md} +3 -3
  108. data/docs/{SalesTrackingCategory.md → accounting/SalesTrackingCategory.md} +3 -3
  109. data/docs/{Schedule.md → accounting/Schedule.md} +3 -3
  110. data/docs/{TaxComponent.md → accounting/TaxComponent.md} +3 -3
  111. data/docs/{TaxRate.md → accounting/TaxRate.md} +3 -3
  112. data/docs/{TaxRates.md → accounting/TaxRates.md} +3 -3
  113. data/docs/{TaxType.md → accounting/TaxType.md} +3 -3
  114. data/docs/{TenNinteyNineContact.md → accounting/TenNinetyNineContact.md} +3 -3
  115. data/docs/{TimeZone.md → accounting/TimeZone.md} +3 -3
  116. data/docs/{TrackingCategories.md → accounting/TrackingCategories.md} +3 -3
  117. data/docs/{TrackingCategory.md → accounting/TrackingCategory.md} +3 -3
  118. data/docs/{TrackingOption.md → accounting/TrackingOption.md} +3 -3
  119. data/docs/{TrackingOptions.md → accounting/TrackingOptions.md} +3 -3
  120. data/docs/{User.md → accounting/User.md} +3 -3
  121. data/docs/{Users.md → accounting/Users.md} +3 -3
  122. data/docs/{ValidationError.md → accounting/ValidationError.md} +3 -3
  123. data/docs/assets/Asset.md +45 -0
  124. data/docs/assets/AssetApi.md +438 -0
  125. data/docs/{CurrencyCode.md → assets/AssetStatus.md} +3 -3
  126. data/docs/assets/AssetStatusQueryParam.md +16 -0
  127. data/docs/assets/AssetType.md +29 -0
  128. data/docs/assets/Assets.md +19 -0
  129. data/docs/assets/BookDepreciationDetail.md +29 -0
  130. data/docs/assets/BookDepreciationSetting.md +31 -0
  131. data/docs/assets/Error.md +25 -0
  132. data/docs/assets/FieldValidationErrorsElement.md +27 -0
  133. data/docs/assets/Pagination.md +23 -0
  134. data/docs/assets/ResourceValidationErrorsElement.md +25 -0
  135. data/docs/assets/Setting.md +31 -0
  136. data/docs/projects/Amount.md +19 -0
  137. data/docs/{AccountType.md → projects/ChargeType.md} +3 -3
  138. data/docs/{CountryCode.md → projects/CurrencyCode.md} +3 -3
  139. data/docs/projects/Error.md +19 -0
  140. data/docs/projects/Pagination.md +23 -0
  141. data/docs/projects/Project.md +59 -0
  142. data/docs/projects/ProjectApi.md +979 -0
  143. data/docs/projects/ProjectCreateOrUpdate.md +23 -0
  144. data/docs/projects/ProjectPatch.md +17 -0
  145. data/docs/{LineAmountTypes.md → projects/ProjectStatus.md} +3 -3
  146. data/docs/projects/ProjectUser.md +21 -0
  147. data/docs/projects/ProjectUsers.md +19 -0
  148. data/docs/projects/Projects.md +19 -0
  149. data/docs/projects/Task.md +45 -0
  150. data/docs/projects/TaskCreateOrUpdate.md +23 -0
  151. data/docs/projects/Tasks.md +19 -0
  152. data/docs/projects/TimeEntries.md +19 -0
  153. data/docs/projects/TimeEntry.md +33 -0
  154. data/docs/projects/TimeEntryCreateOrUpdate.md +25 -0
  155. data/lib/xero-ruby.rb +148 -122
  156. data/lib/xero-ruby/api/accounting_api.rb +166 -29
  157. data/lib/xero-ruby/api/asset_api.rb +452 -0
  158. data/lib/xero-ruby/api/project_api.rb +1035 -0
  159. data/lib/xero-ruby/api_client.rb +237 -74
  160. data/lib/xero-ruby/api_error.rb +2 -2
  161. data/lib/xero-ruby/configuration.rb +35 -25
  162. data/lib/xero-ruby/models/{account.rb → accounting/account.rb} +65 -24
  163. data/lib/xero-ruby/models/{account_type.rb → accounting/account_type.rb} +3 -3
  164. data/lib/xero-ruby/models/{accounts.rb → accounting/accounts.rb} +12 -7
  165. data/lib/xero-ruby/models/{accounts_payable.rb → accounting/accounts_payable.rb} +15 -9
  166. data/lib/xero-ruby/models/{accounts_receivable.rb → accounting/accounts_receivable.rb} +15 -9
  167. data/lib/xero-ruby/models/{address.rb → accounting/address.rb} +23 -16
  168. data/lib/xero-ruby/models/accounting/allocation.rb +295 -0
  169. data/lib/xero-ruby/models/{allocations.rb → accounting/allocations.rb} +12 -7
  170. data/lib/xero-ruby/models/{attachment.rb → accounting/attachment.rb} +16 -12
  171. data/lib/xero-ruby/models/{attachments.rb → accounting/attachments.rb} +12 -7
  172. data/lib/xero-ruby/models/{balances.rb → accounting/balances.rb} +13 -7
  173. data/lib/xero-ruby/models/{bank_transaction.rb → accounting/bank_transaction.rb} +47 -28
  174. data/lib/xero-ruby/models/{bank_transactions.rb → accounting/bank_transactions.rb} +12 -7
  175. data/lib/xero-ruby/models/{bank_transfer.rb → accounting/bank_transfer.rb} +24 -18
  176. data/lib/xero-ruby/models/{bank_transfers.rb → accounting/bank_transfers.rb} +12 -7
  177. data/lib/xero-ruby/models/{batch_payment.rb → accounting/batch_payment.rb} +33 -23
  178. data/lib/xero-ruby/models/{batch_payment_details.rb → accounting/batch_payment_details.rb} +15 -11
  179. data/lib/xero-ruby/models/{batch_payments.rb → accounting/batch_payments.rb} +12 -7
  180. data/lib/xero-ruby/models/{bill.rb → accounting/bill.rb} +12 -7
  181. data/lib/xero-ruby/models/{branding_theme.rb → accounting/branding_theme.rb} +17 -12
  182. data/lib/xero-ruby/models/{branding_themes.rb → accounting/branding_themes.rb} +12 -7
  183. data/lib/xero-ruby/models/{cis_org_setting.rb → accounting/cis_org_setting.rb} +13 -9
  184. data/lib/xero-ruby/models/{cis_setting.rb → accounting/cis_setting.rb} +12 -8
  185. data/lib/xero-ruby/models/{cis_settings.rb → accounting/cis_settings.rb} +12 -7
  186. data/lib/xero-ruby/models/{contact.rb → accounting/contact.rb} +55 -41
  187. data/lib/xero-ruby/models/{contact_group.rb → accounting/contact_group.rb} +16 -10
  188. data/lib/xero-ruby/models/{contact_groups.rb → accounting/contact_groups.rb} +12 -7
  189. data/lib/xero-ruby/models/{contact_person.rb → accounting/contact_person.rb} +14 -10
  190. data/lib/xero-ruby/models/{contacts.rb → accounting/contacts.rb} +12 -7
  191. data/lib/xero-ruby/models/{country_code.rb → accounting/country_code.rb} +3 -3
  192. data/lib/xero-ruby/models/{credit_note.rb → accounting/credit_note.rb} +51 -34
  193. data/lib/xero-ruby/models/{credit_notes.rb → accounting/credit_notes.rb} +12 -7
  194. data/lib/xero-ruby/models/{currencies.rb → accounting/currencies.rb} +12 -7
  195. data/lib/xero-ruby/models/{currency.rb → accounting/currency.rb} +13 -8
  196. data/lib/xero-ruby/models/{currency_code.rb → accounting/currency_code.rb} +5 -5
  197. data/lib/xero-ruby/models/{element.rb → accounting/element.rb} +18 -8
  198. data/lib/xero-ruby/models/{employee.rb → accounting/employee.rb} +21 -12
  199. data/lib/xero-ruby/models/{employees.rb → accounting/employees.rb} +12 -7
  200. data/lib/xero-ruby/models/{error.rb → accounting/error.rb} +14 -10
  201. data/lib/xero-ruby/models/{expense_claim.rb → accounting/expense_claim.rb} +30 -19
  202. data/lib/xero-ruby/models/{expense_claims.rb → accounting/expense_claims.rb} +12 -7
  203. data/lib/xero-ruby/models/{external_link.rb → accounting/external_link.rb} +18 -8
  204. data/lib/xero-ruby/models/{history_record.rb → accounting/history_record.rb} +14 -10
  205. data/lib/xero-ruby/models/{history_records.rb → accounting/history_records.rb} +12 -7
  206. data/lib/xero-ruby/models/{invoice.rb → accounting/invoice.rb} +73 -50
  207. data/lib/xero-ruby/models/{invoice_reminder.rb → accounting/invoice_reminder.rb} +11 -7
  208. data/lib/xero-ruby/models/{invoice_reminders.rb → accounting/invoice_reminders.rb} +12 -7
  209. data/lib/xero-ruby/models/{invoices.rb → accounting/invoices.rb} +12 -7
  210. data/lib/xero-ruby/models/{item.rb → accounting/item.rb} +28 -22
  211. data/lib/xero-ruby/models/{items.rb → accounting/items.rb} +12 -7
  212. data/lib/xero-ruby/models/{journal.rb → accounting/journal.rb} +44 -15
  213. data/lib/xero-ruby/models/{journal_line.rb → accounting/journal_line.rb} +25 -20
  214. data/lib/xero-ruby/models/{journals.rb → accounting/journals.rb} +12 -7
  215. data/lib/xero-ruby/models/{line_amount_types.rb → accounting/line_amount_types.rb} +3 -3
  216. data/lib/xero-ruby/models/{line_item.rb → accounting/line_item.rb} +29 -25
  217. data/lib/xero-ruby/models/{line_item_tracking.rb → accounting/line_item_tracking.rb} +14 -10
  218. data/lib/xero-ruby/models/{linked_transaction.rb → accounting/linked_transaction.rb} +29 -17
  219. data/lib/xero-ruby/models/{linked_transactions.rb → accounting/linked_transactions.rb} +12 -7
  220. data/lib/xero-ruby/models/{manual_journal.rb → accounting/manual_journal.rb} +29 -19
  221. data/lib/xero-ruby/models/{manual_journal_line.rb → accounting/manual_journal_line.rb} +30 -16
  222. data/lib/xero-ruby/models/{manual_journals.rb → accounting/manual_journals.rb} +12 -7
  223. data/lib/xero-ruby/models/{online_invoice.rb → accounting/online_invoice.rb} +11 -7
  224. data/lib/xero-ruby/models/{online_invoices.rb → accounting/online_invoices.rb} +12 -7
  225. data/lib/xero-ruby/models/{organisation.rb → accounting/organisation.rb} +126 -36
  226. data/lib/xero-ruby/models/{organisations.rb → accounting/organisations.rb} +12 -7
  227. data/lib/xero-ruby/models/{overpayment.rb → accounting/overpayment.rb} +40 -27
  228. data/lib/xero-ruby/models/{overpayments.rb → accounting/overpayments.rb} +12 -7
  229. data/lib/xero-ruby/models/{payment.rb → accounting/payment.rb} +61 -28
  230. data/lib/xero-ruby/models/{payment_delete.rb → accounting/payment_delete.rb} +11 -7
  231. data/lib/xero-ruby/models/{payment_service.rb → accounting/payment_service.rb} +16 -12
  232. data/lib/xero-ruby/models/{payment_services.rb → accounting/payment_services.rb} +12 -7
  233. data/lib/xero-ruby/models/{payment_term.rb → accounting/payment_term.rb} +13 -7
  234. data/lib/xero-ruby/models/{payment_term_type.rb → accounting/payment_term_type.rb} +3 -3
  235. data/lib/xero-ruby/models/{payments.rb → accounting/payments.rb} +12 -7
  236. data/lib/xero-ruby/models/{phone.rb → accounting/phone.rb} +20 -10
  237. data/lib/xero-ruby/models/{prepayment.rb → accounting/prepayment.rb} +41 -27
  238. data/lib/xero-ruby/models/{prepayments.rb → accounting/prepayments.rb} +12 -7
  239. data/lib/xero-ruby/models/{purchase.rb → accounting/purchase.rb} +15 -11
  240. data/lib/xero-ruby/models/{purchase_order.rb → accounting/purchase_order.rb} +49 -37
  241. data/lib/xero-ruby/models/{purchase_orders.rb → accounting/purchase_orders.rb} +12 -7
  242. data/lib/xero-ruby/models/{quote.rb → accounting/quote.rb} +63 -33
  243. data/lib/xero-ruby/models/{quote_line_amount_types.rb → accounting/quote_line_amount_types.rb} +3 -3
  244. data/lib/xero-ruby/models/{quote_status_codes.rb → accounting/quote_status_codes.rb} +4 -3
  245. data/lib/xero-ruby/models/{quotes.rb → accounting/quotes.rb} +12 -7
  246. data/lib/xero-ruby/models/{receipt.rb → accounting/receipt.rb} +36 -23
  247. data/lib/xero-ruby/models/{receipts.rb → accounting/receipts.rb} +12 -7
  248. data/lib/xero-ruby/models/{repeating_invoice.rb → accounting/repeating_invoice.rb} +34 -21
  249. data/lib/xero-ruby/models/{repeating_invoices.rb → accounting/repeating_invoices.rb} +12 -7
  250. data/lib/xero-ruby/models/{report.rb → accounting/report.rb} +19 -13
  251. data/lib/xero-ruby/models/{report_attribute.rb → accounting/report_attribute.rb} +13 -7
  252. data/lib/xero-ruby/models/{report_cell.rb → accounting/report_cell.rb} +13 -7
  253. data/lib/xero-ruby/models/{report_fields.rb → accounting/report_fields.rb} +14 -7
  254. data/lib/xero-ruby/models/{report_row.rb → accounting/report_row.rb} +14 -7
  255. data/lib/xero-ruby/models/{report_rows.rb → accounting/report_rows.rb} +15 -7
  256. data/lib/xero-ruby/models/{report_with_row.rb → accounting/report_with_row.rb} +19 -13
  257. data/lib/xero-ruby/models/{report_with_rows.rb → accounting/report_with_rows.rb} +12 -7
  258. data/lib/xero-ruby/models/{reports.rb → accounting/reports.rb} +12 -7
  259. data/lib/xero-ruby/models/{request_empty.rb → accounting/request_empty.rb} +11 -7
  260. data/lib/xero-ruby/models/{row_type.rb → accounting/row_type.rb} +3 -3
  261. data/lib/xero-ruby/models/{sales_tracking_category.rb → accounting/sales_tracking_category.rb} +12 -8
  262. data/lib/xero-ruby/models/{schedule.rb → accounting/schedule.rb} +27 -15
  263. data/lib/xero-ruby/models/{tax_component.rb → accounting/tax_component.rb} +15 -11
  264. data/lib/xero-ruby/models/{tax_rate.rb → accounting/tax_rate.rb} +104 -22
  265. data/lib/xero-ruby/models/{tax_rates.rb → accounting/tax_rates.rb} +12 -7
  266. data/lib/xero-ruby/models/{tax_type.rb → accounting/tax_type.rb} +7 -3
  267. data/lib/xero-ruby/models/{ten_nintey_nine_contact.rb → accounting/ten_ninety_nine_contact.rb} +46 -42
  268. data/lib/xero-ruby/models/{time_zone.rb → accounting/time_zone.rb} +3 -3
  269. data/lib/xero-ruby/models/{tracking_categories.rb → accounting/tracking_categories.rb} +12 -7
  270. data/lib/xero-ruby/models/{tracking_category.rb → accounting/tracking_category.rb} +19 -12
  271. data/lib/xero-ruby/models/{tracking_option.rb → accounting/tracking_option.rb} +17 -10
  272. data/lib/xero-ruby/models/{tracking_options.rb → accounting/tracking_options.rb} +12 -7
  273. data/lib/xero-ruby/models/{user.rb → accounting/user.rb} +24 -13
  274. data/lib/xero-ruby/models/{users.rb → accounting/users.rb} +12 -7
  275. data/lib/xero-ruby/models/{validation_error.rb → accounting/validation_error.rb} +11 -7
  276. data/lib/xero-ruby/models/assets/asset.rb +353 -0
  277. data/lib/xero-ruby/models/assets/asset_status.rb +38 -0
  278. data/lib/xero-ruby/models/assets/asset_status_query_param.rb +38 -0
  279. data/lib/xero-ruby/models/assets/asset_type.rb +278 -0
  280. data/lib/xero-ruby/models/assets/assets.rb +220 -0
  281. data/lib/xero-ruby/models/assets/book_depreciation_detail.rb +268 -0
  282. data/lib/xero-ruby/models/assets/book_depreciation_setting.rb +347 -0
  283. data/lib/xero-ruby/models/assets/error.rb +252 -0
  284. data/lib/xero-ruby/models/assets/field_validation_errors_element.rb +258 -0
  285. data/lib/xero-ruby/models/assets/pagination.rb +238 -0
  286. data/lib/xero-ruby/models/assets/resource_validation_errors_element.rb +248 -0
  287. data/lib/xero-ruby/models/assets/setting.rb +278 -0
  288. data/lib/xero-ruby/models/projects/amount.rb +218 -0
  289. data/lib/xero-ruby/models/projects/charge_type.rb +38 -0
  290. data/lib/xero-ruby/models/projects/currency_code.rb +199 -0
  291. data/lib/xero-ruby/models/projects/error.rb +218 -0
  292. data/lib/xero-ruby/models/{allocation.rb → projects/pagination.rb} +48 -48
  293. data/lib/xero-ruby/models/projects/project.rb +423 -0
  294. data/lib/xero-ruby/models/projects/project_create_or_update.rb +243 -0
  295. data/lib/xero-ruby/models/projects/project_patch.rb +213 -0
  296. data/lib/xero-ruby/models/projects/project_status.rb +37 -0
  297. data/lib/xero-ruby/models/projects/project_user.rb +228 -0
  298. data/lib/xero-ruby/models/projects/project_users.rb +220 -0
  299. data/lib/xero-ruby/models/projects/projects.rb +220 -0
  300. data/lib/xero-ruby/models/projects/task.rb +385 -0
  301. data/lib/xero-ruby/models/projects/task_create_or_update.rb +253 -0
  302. data/lib/xero-ruby/models/projects/tasks.rb +220 -0
  303. data/lib/xero-ruby/models/projects/time_entries.rb +220 -0
  304. data/lib/xero-ruby/models/projects/time_entry.rb +324 -0
  305. data/lib/xero-ruby/models/projects/time_entry_create_or_update.rb +268 -0
  306. data/lib/xero-ruby/version.rb +3 -3
  307. data/spec/{api → accounting/api}/accounting_api_spec.rb +31 -6
  308. data/spec/{models → accounting/models}/account_spec.rb +5 -5
  309. data/spec/{models → accounting/models}/account_type_spec.rb +5 -5
  310. data/spec/{models → accounting/models}/accounts_payable_spec.rb +5 -5
  311. data/spec/{models → accounting/models}/accounts_receivable_spec.rb +5 -5
  312. data/spec/{models → accounting/models}/accounts_spec.rb +5 -5
  313. data/spec/{models → accounting/models}/address_spec.rb +5 -5
  314. data/spec/{models → accounting/models}/allocation_spec.rb +5 -5
  315. data/spec/{models → accounting/models}/allocations_spec.rb +5 -5
  316. data/spec/{models → accounting/models}/attachment_spec.rb +5 -5
  317. data/spec/{models → accounting/models}/attachments_spec.rb +5 -5
  318. data/spec/{models → accounting/models}/balances_spec.rb +5 -5
  319. data/spec/{models → accounting/models}/bank_transaction_spec.rb +5 -5
  320. data/spec/{models → accounting/models}/bank_transactions_spec.rb +5 -5
  321. data/spec/{models → accounting/models}/bank_transfer_spec.rb +5 -5
  322. data/spec/{models → accounting/models}/bank_transfers_spec.rb +5 -5
  323. data/spec/{models → accounting/models}/batch_payment_details_spec.rb +5 -5
  324. data/spec/{models → accounting/models}/batch_payment_spec.rb +5 -5
  325. data/spec/{models → accounting/models}/batch_payments_spec.rb +5 -5
  326. data/spec/{models → accounting/models}/bill_spec.rb +5 -5
  327. data/spec/{models → accounting/models}/branding_theme_spec.rb +5 -5
  328. data/spec/{models → accounting/models}/branding_themes_spec.rb +5 -5
  329. data/spec/{models → accounting/models}/cis_org_setting_spec.rb +5 -5
  330. data/spec/{models → accounting/models}/cis_setting_spec.rb +5 -5
  331. data/spec/{models → accounting/models}/cis_settings_spec.rb +5 -5
  332. data/spec/{models → accounting/models}/contact_group_spec.rb +5 -5
  333. data/spec/{models → accounting/models}/contact_groups_spec.rb +5 -5
  334. data/spec/{models → accounting/models}/contact_person_spec.rb +5 -5
  335. data/spec/{models → accounting/models}/contact_spec.rb +5 -5
  336. data/spec/{models → accounting/models}/contacts_spec.rb +5 -5
  337. data/spec/{models → accounting/models}/country_code_spec.rb +5 -5
  338. data/spec/{models → accounting/models}/credit_note_spec.rb +5 -5
  339. data/spec/{models → accounting/models}/credit_notes_spec.rb +5 -5
  340. data/spec/{models → accounting/models}/currencies_spec.rb +5 -5
  341. data/spec/{models → accounting/models}/currency_code_spec.rb +5 -5
  342. data/spec/{models → accounting/models}/currency_spec.rb +5 -5
  343. data/spec/{models → accounting/models}/element_spec.rb +5 -5
  344. data/spec/{models → accounting/models}/employee_spec.rb +5 -5
  345. data/spec/{models → accounting/models}/employees_spec.rb +5 -5
  346. data/spec/{models → accounting/models}/error_spec.rb +5 -5
  347. data/spec/{models → accounting/models}/expense_claim_spec.rb +5 -5
  348. data/spec/{models → accounting/models}/expense_claims_spec.rb +5 -5
  349. data/spec/{models → accounting/models}/external_link_spec.rb +5 -5
  350. data/spec/{models → accounting/models}/history_record_spec.rb +5 -5
  351. data/spec/{models → accounting/models}/history_records_spec.rb +5 -5
  352. data/spec/{models → accounting/models}/invoice_reminder_spec.rb +5 -5
  353. data/spec/{models → accounting/models}/invoice_reminders_spec.rb +5 -5
  354. data/spec/{models → accounting/models}/invoice_spec.rb +5 -5
  355. data/spec/{models → accounting/models}/invoices_spec.rb +5 -5
  356. data/spec/{models → accounting/models}/item_spec.rb +5 -5
  357. data/spec/{models → accounting/models}/items_spec.rb +5 -5
  358. data/spec/{models → accounting/models}/journal_line_spec.rb +5 -5
  359. data/spec/{models → accounting/models}/journal_spec.rb +5 -5
  360. data/spec/{models → accounting/models}/journals_spec.rb +5 -5
  361. data/spec/{models → accounting/models}/line_amount_types_spec.rb +5 -5
  362. data/spec/{models → accounting/models}/line_item_spec.rb +5 -5
  363. data/spec/{models → accounting/models}/line_item_tracking_spec.rb +5 -5
  364. data/spec/{models → accounting/models}/linked_transaction_spec.rb +5 -5
  365. data/spec/{models → accounting/models}/linked_transactions_spec.rb +5 -5
  366. data/spec/{models → accounting/models}/manual_journal_line_spec.rb +5 -5
  367. data/spec/{models → accounting/models}/manual_journal_spec.rb +5 -5
  368. data/spec/{models → accounting/models}/manual_journals_spec.rb +5 -5
  369. data/spec/{models → accounting/models}/online_invoice_spec.rb +5 -5
  370. data/spec/{models → accounting/models}/online_invoices_spec.rb +5 -5
  371. data/spec/{models → accounting/models}/organisation_spec.rb +5 -5
  372. data/spec/{models → accounting/models}/organisations_spec.rb +5 -5
  373. data/spec/{models → accounting/models}/overpayment_spec.rb +5 -5
  374. data/spec/{models → accounting/models}/overpayments_spec.rb +5 -5
  375. data/spec/{models → accounting/models}/payment_delete_spec.rb +5 -5
  376. data/spec/{models → accounting/models}/payment_service_spec.rb +5 -5
  377. data/spec/{models → accounting/models}/payment_services_spec.rb +5 -5
  378. data/spec/{models → accounting/models}/payment_spec.rb +11 -5
  379. data/spec/{models → accounting/models}/payment_term_spec.rb +5 -5
  380. data/spec/{models → accounting/models}/payment_term_type_spec.rb +5 -5
  381. data/spec/{models → accounting/models}/payments_spec.rb +5 -5
  382. data/spec/{models → accounting/models}/phone_spec.rb +5 -5
  383. data/spec/{models → accounting/models}/prepayment_spec.rb +5 -5
  384. data/spec/{models → accounting/models}/prepayments_spec.rb +5 -5
  385. data/spec/{models → accounting/models}/purchase_order_spec.rb +5 -5
  386. data/spec/{models → accounting/models}/purchase_orders_spec.rb +5 -5
  387. data/spec/{models → accounting/models}/purchase_spec.rb +5 -5
  388. data/spec/{models → accounting/models}/quote_line_amount_types_spec.rb +5 -5
  389. data/spec/{models → accounting/models}/quote_spec.rb +5 -5
  390. data/spec/{models → accounting/models}/quote_status_codes_spec.rb +5 -5
  391. data/spec/{models → accounting/models}/quotes_spec.rb +5 -5
  392. data/spec/{models → accounting/models}/receipt_spec.rb +5 -5
  393. data/spec/{models → accounting/models}/receipts_spec.rb +5 -5
  394. data/spec/{models → accounting/models}/repeating_invoice_spec.rb +5 -5
  395. data/spec/{models → accounting/models}/repeating_invoices_spec.rb +5 -5
  396. data/spec/{models → accounting/models}/report_attribute_spec.rb +5 -5
  397. data/spec/{models → accounting/models}/report_cell_spec.rb +5 -5
  398. data/spec/{models → accounting/models}/report_fields_spec.rb +5 -5
  399. data/spec/{models → accounting/models}/report_row_spec.rb +5 -5
  400. data/spec/{models → accounting/models}/report_rows_spec.rb +5 -5
  401. data/spec/{models → accounting/models}/report_spec.rb +5 -5
  402. data/spec/{models → accounting/models}/report_with_row_spec.rb +5 -5
  403. data/spec/{models → accounting/models}/report_with_rows_spec.rb +5 -5
  404. data/spec/{models → accounting/models}/reports_spec.rb +5 -5
  405. data/spec/{models → accounting/models}/request_empty_spec.rb +5 -5
  406. data/spec/{models → accounting/models}/row_type_spec.rb +5 -5
  407. data/spec/{models → accounting/models}/sales_tracking_category_spec.rb +5 -5
  408. data/spec/{models → accounting/models}/schedule_spec.rb +5 -5
  409. data/spec/{models → accounting/models}/tax_component_spec.rb +5 -5
  410. data/spec/{models → accounting/models}/tax_rate_spec.rb +6 -6
  411. data/spec/{models → accounting/models}/tax_rates_spec.rb +5 -5
  412. data/spec/{models → accounting/models}/tax_type_spec.rb +5 -5
  413. data/spec/{models → accounting/models}/ten_nintey_nine_contact_spec.rb +8 -8
  414. data/spec/{models → accounting/models}/time_zone_spec.rb +5 -5
  415. data/spec/{models → accounting/models}/tracking_categories_spec.rb +5 -5
  416. data/spec/{models → accounting/models}/tracking_category_spec.rb +5 -5
  417. data/spec/{models → accounting/models}/tracking_option_spec.rb +5 -5
  418. data/spec/{models → accounting/models}/tracking_options_spec.rb +5 -5
  419. data/spec/{models → accounting/models}/user_spec.rb +5 -5
  420. data/spec/{models → accounting/models}/users_spec.rb +5 -5
  421. data/spec/{models → accounting/models}/validation_error_spec.rb +5 -5
  422. data/spec/api_client_spec.rb +12 -52
  423. data/spec/assets/api/asset_api_spec.rb +116 -0
  424. data/spec/assets/models/asset_spec.rb +125 -0
  425. data/spec/assets/models/asset_status_query_param_spec.rb +35 -0
  426. data/spec/assets/models/asset_status_spec.rb +35 -0
  427. data/spec/assets/models/asset_type_spec.rb +77 -0
  428. data/spec/assets/models/assets_spec.rb +47 -0
  429. data/spec/assets/models/book_depreciation_detail_spec.rb +77 -0
  430. data/spec/assets/models/book_depreciation_setting_spec.rb +95 -0
  431. data/spec/assets/models/error_spec.rb +65 -0
  432. data/spec/assets/models/field_validation_errors_element_spec.rb +71 -0
  433. data/spec/assets/models/pagination_spec.rb +59 -0
  434. data/spec/assets/models/resource_validation_errors_element_spec.rb +65 -0
  435. data/spec/assets/models/setting_spec.rb +83 -0
  436. data/spec/configuration_spec.rb +7 -23
  437. data/spec/projects/api/project_api_spec.rb +229 -0
  438. data/spec/projects/models/amount_spec.rb +47 -0
  439. data/spec/projects/models/charge_type_spec.rb +35 -0
  440. data/spec/projects/models/currency_code_spec.rb +35 -0
  441. data/spec/projects/models/error_spec.rb +47 -0
  442. data/spec/projects/models/pagination_spec.rb +59 -0
  443. data/spec/projects/models/project_create_or_update_spec.rb +59 -0
  444. data/spec/projects/models/project_patch_spec.rb +41 -0
  445. data/spec/projects/models/project_spec.rb +167 -0
  446. data/spec/projects/models/project_status_spec.rb +35 -0
  447. data/spec/projects/models/project_user_spec.rb +53 -0
  448. data/spec/projects/models/project_users_spec.rb +47 -0
  449. data/spec/projects/models/projects_spec.rb +47 -0
  450. data/spec/projects/models/task_create_or_update_spec.rb +59 -0
  451. data/spec/projects/models/task_spec.rb +129 -0
  452. data/spec/projects/models/tasks_spec.rb +47 -0
  453. data/spec/projects/models/time_entries_spec.rb +47 -0
  454. data/spec/projects/models/time_entry_create_or_update_spec.rb +65 -0
  455. data/spec/projects/models/time_entry_spec.rb +93 -0
  456. data/spec/spec_helper.rb +2 -2
  457. data/xero-ruby.gemspec +4 -5
  458. metadata +611 -482
  459. data/docs/Allocation.md +0 -21
  460. data/lib/.DS_Store +0 -0
  461. data/pkg/xero-ruby-0.1.3.gem +0 -0
  462. data/pkg/xero-ruby-0.2.2.gem +0 -0
  463. data/pkg/xero-ruby-0.2.3.gem +0 -0
@@ -3,10 +3,10 @@
3
3
 
4
4
  #No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
5
5
 
6
- The version of the OpenAPI document: 2.0.7
6
+ The version of the OpenAPI document: 2.2.11
7
7
  Contact: api@xero.com
8
8
  Generated by: https://openapi-generator.tech
9
- OpenAPI Generator version: 4.2.0
9
+ OpenAPI Generator version: 4.3.1
10
10
 
11
11
  =end
12
12
 
@@ -14,7 +14,8 @@ require 'date'
14
14
  require 'json'
15
15
  require 'logger'
16
16
  require 'tempfile'
17
- require 'typhoeus'
17
+ require 'find'
18
+ require 'faraday'
18
19
 
19
20
  module XeroRuby
20
21
  class ApiClient
@@ -28,7 +29,11 @@ module XeroRuby
28
29
 
29
30
  # Initializes the ApiClient
30
31
  # @option config [Configuration] Configuration for initializing the object, default to Configuration.default
31
- def initialize(config = Configuration.default)
32
+ def initialize(config: Configuration.default, credentials: {})
33
+ @client_id = credentials[:client_id]
34
+ @client_secret = credentials[:client_secret]
35
+ @redirect_uri = credentials[:redirect_uri]
36
+ @scopes = credentials[:scopes]
32
37
  @config = config
33
38
  @user_agent = "xero-ruby-#{VERSION}"
34
39
  @default_headers = {
@@ -37,8 +42,90 @@ module XeroRuby
37
42
  }
38
43
  end
39
44
 
40
- def self.default
41
- @@default ||= ApiClient.new
45
+ def authorization_url
46
+ url = "#{@config.login_url}?response_type=code&client_id=#{@client_id}&redirect_uri=#{@redirect_uri}&scope=#{@scopes}"
47
+ return url
48
+ end
49
+
50
+ def accounting_api
51
+ @config.base_url = @config.accounting_url
52
+ XeroRuby::AccountingApi.new(self)
53
+ end
54
+
55
+ def asset_api
56
+ @config.base_url = @config.asset_url
57
+ XeroRuby::AssetApi.new(self)
58
+ end
59
+
60
+ def project_api
61
+ @config.base_url = @config.project_url
62
+ XeroRuby::ProjectApi.new(self)
63
+ end
64
+
65
+ # Token Helpers
66
+ def token_set
67
+ XeroRuby.configure.token_set
68
+ end
69
+
70
+ def access_token
71
+ XeroRuby.configure.access_token
72
+ end
73
+
74
+ def set_token_set(token_set)
75
+ # helper to set the token_set on a client once the user has y
76
+ # has a valid token set ( access_token & refresh_token )
77
+ XeroRuby.configure.token_set = token_set
78
+ set_access_token(token_set['access_token'])
79
+ end
80
+
81
+ def set_access_token(access_token)
82
+ XeroRuby.configure.access_token = access_token
83
+ end
84
+
85
+ def get_token_set_from_callback(params)
86
+ data = {
87
+ grant_type: 'authorization_code',
88
+ code: params['code'],
89
+ redirect_uri: @redirect_uri
90
+ }
91
+ return token_request(data)
92
+ end
93
+
94
+ def refresh_token_set(token_set)
95
+ data = {
96
+ grant_type: 'refresh_token',
97
+ refresh_token: token_set['refresh_token']
98
+ }
99
+ return token_request(data)
100
+ end
101
+
102
+ def token_request(data)
103
+ response = Faraday.post(@config.token_url) do |req|
104
+ req.headers['Authorization'] = "Basic " + Base64.strict_encode64("#{@client_id}:#{@client_secret}")
105
+ req.headers['Content-Type'] = 'application/x-www-form-urlencoded'
106
+ req.body = URI.encode_www_form(data)
107
+ end
108
+ body = JSON.parse(response.body)
109
+ set_token_set(body)
110
+ return body
111
+ end
112
+
113
+ # Connection heplers
114
+ def connections
115
+ response = Faraday.get('https://api.xero.com/connections') do |req|
116
+ req.headers['Authorization'] = "Bearer #{access_token}"
117
+ req.headers['Content-Type'] = 'application/json'
118
+ end
119
+ body = JSON.parse(response.body)
120
+ return body
121
+ end
122
+
123
+ def disconnect(connection_id)
124
+ Faraday.delete("https://api.xero.com/connections/#{connection_id}") do |req|
125
+ req.headers['Authorization'] = "Bearer #{access_token}"
126
+ req.headers['Content-Type'] = 'application/json'
127
+ end
128
+ return connections
42
129
  end
43
130
 
44
131
  # Call an API with given options.
@@ -46,34 +133,55 @@ module XeroRuby
46
133
  # @return [Array<(Object, Integer, Hash)>] an array of 3 elements:
47
134
  # the data deserialized from response body (could be nil), response status code and response headers.
48
135
  def call_api(http_method, path, opts = {})
49
- request = build_request(http_method, path, opts)
50
- response = request.run
136
+ ssl_options = {
137
+ :ca_file => @config.ssl_ca_file,
138
+ :verify => @config.ssl_verify,
139
+ :verify_mode => @config.ssl_verify_mode,
140
+ :client_cert => @config.ssl_client_cert,
141
+ :client_key => @config.ssl_client_key
142
+ }
51
143
 
52
- if @config.debugging
53
- @config.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n"
144
+ connection = Faraday.new(:url => config.base_url, :ssl => ssl_options) do |conn|
145
+ conn.basic_auth(config.username, config.password)
146
+ if opts[:header_params]["Content-Type"] == "multipart/form-data"
147
+ conn.request :multipart
148
+ conn.request :url_encoded
149
+ end
150
+ conn.adapter(Faraday.default_adapter)
54
151
  end
55
152
 
56
- unless response.success?
57
- if response.timed_out?
58
- fail ApiError.new('Connection timed out')
59
- elsif response.code == 0
60
- # Errors from libcurl will be made visible here
61
- fail ApiError.new(:code => 0,
62
- :message => response.return_message)
63
- else
64
- fail ApiError.new(:code => response.code,
65
- :response_headers => response.headers,
66
- :response_body => response.body),
67
- response.status_message
153
+ begin
154
+ response = connection.public_send(http_method.to_sym.downcase) do |req|
155
+ build_request(http_method, path, req, opts)
156
+ end
157
+
158
+ if @config.debugging
159
+ @config.logger.debug "HTTP response body ~BEGIN~\n#{response.body}\n~END~\n"
160
+ end
161
+
162
+ unless response.success?
163
+ if response.status == 0
164
+ # Errors from libcurl will be made visible here
165
+ fail ApiError.new(:code => 0,
166
+ :message => response.return_message)
167
+ else
168
+ fail ApiError.new(:code => response.status,
169
+ :response_headers => response.headers,
170
+ :response_body => response.body),
171
+ response.reason_phrase
172
+ end
68
173
  end
174
+ rescue Faraday::TimeoutError
175
+ fail ApiError.new('Connection timed out')
69
176
  end
70
177
 
71
178
  if opts[:return_type]
179
+ prepare_file(response) if opts[:return_type] == 'File'
72
180
  data = deserialize(response, opts[:return_type])
73
181
  else
74
182
  data = nil
75
183
  end
76
- return data, response.code, response.headers
184
+ return data, response.status, response.headers
77
185
  end
78
186
 
79
187
  # Builds the HTTP request
@@ -85,7 +193,7 @@ module XeroRuby
85
193
  # @option opts [Hash] :form_params Query parameters
86
194
  # @option opts [Object] :body HTTP body (JSON/XML)
87
195
  # @return [Typhoeus::Request] A Typhoeus Request
88
- def build_request(http_method, path, opts = {})
196
+ def build_request(http_method, path, request, opts = {})
89
197
  url = build_request_url(path)
90
198
  http_method = http_method.to_sym.downcase
91
199
 
@@ -95,25 +203,15 @@ module XeroRuby
95
203
 
96
204
  update_params_for_auth! header_params, query_params, opts[:auth_names]
97
205
 
98
- # set ssl_verifyhosts option based on @config.verify_ssl_host (true/false)
99
- _verify_ssl_host = @config.verify_ssl_host ? 2 : 0
100
-
101
206
  req_opts = {
102
207
  :method => http_method,
103
208
  :headers => header_params,
104
209
  :params => query_params,
105
210
  :params_encoding => @config.params_encoding,
106
211
  :timeout => @config.timeout,
107
- :ssl_verifypeer => @config.verify_ssl,
108
- :ssl_verifyhost => _verify_ssl_host,
109
- :sslcert => @config.cert_file,
110
- :sslkey => @config.key_file,
111
212
  :verbose => @config.debugging
112
213
  }
113
214
 
114
- # set custom cert, if provided
115
- req_opts[:cainfo] = @config.ssl_ca_cert if @config.ssl_ca_cert
116
-
117
215
  if [:post, :patch, :put, :delete].include?(http_method)
118
216
  req_body = build_request_body(header_params, form_params, opts[:body])
119
217
  req_opts.update :body => req_body
@@ -121,9 +219,10 @@ module XeroRuby
121
219
  @config.logger.debug "HTTP request body param ~BEGIN~\n#{req_body}\n~END~\n"
122
220
  end
123
221
  end
124
-
125
- request = Typhoeus::Request.new(url, req_opts)
126
- download_file(request) if opts[:return_type] == 'File'
222
+ request.headers = header_params
223
+ request.body = req_body
224
+ request.url url
225
+ request.params = query_params
127
226
  request
128
227
  end
129
228
 
@@ -135,13 +234,17 @@ module XeroRuby
135
234
  # @return [String] HTTP body data in the form of string
136
235
  def build_request_body(header_params, form_params, body)
137
236
  # http form
138
- if header_params['Content-Type'] == 'application/x-www-form-urlencoded' ||
139
- header_params['Content-Type'] == 'multipart/form-data'
237
+ if header_params['Content-Type'] == 'application/x-www-form-urlencoded'
238
+ data = URI.encode_www_form(form_params)
239
+ elsif header_params['Content-Type'] == 'multipart/form-data'
140
240
  data = {}
141
241
  form_params.each do |key, value|
142
242
  case value
143
- when ::File, ::Array, nil
144
- # let typhoeus handle File, Array and nil parameters
243
+ when ::File, ::Tempfile
244
+ # TODO hardcode to application/octet-stream, need better way to detect content type
245
+ data[key] = Faraday::UploadIO.new(value.path, 'application/octet-stream', value.path)
246
+ when ::Array, nil
247
+ # let Faraday handle Array and nil parameters
145
248
  data[key] = value
146
249
  else
147
250
  data[key] = value.to_s
@@ -196,9 +299,9 @@ module XeroRuby
196
299
  else
197
300
  raise e
198
301
  end
199
- end
302
+ end
200
303
 
201
- convert_to_type data, return_type
304
+ convert_to_type(data, return_type)
202
305
  end
203
306
 
204
307
  # Convert data to the given return type.
@@ -236,11 +339,36 @@ module XeroRuby
236
339
  data.each { |k, v| hash[k] = convert_to_type(v, sub_type) }
237
340
  end
238
341
  else
239
- # models, e.g. Pet
240
- XeroRuby.const_get(return_type).build_from_hash(data)
342
+ api_set = api_set_prefix(return_type)
343
+ case api_set
344
+ when 'accounting'
345
+ XeroRuby::Accounting.const_get(return_type).build_from_hash(data)
346
+ when 'assets'
347
+ XeroRuby::Assets.const_get(return_type).build_from_hash(data)
348
+ when 'projects'
349
+ XeroRuby::Projects.const_get(return_type).build_from_hash(data)
350
+ # when 'newapiset' # add new namespace
351
+ # XeroRuby::<NewAPISet>.const_get(return_type).build_from_hash(data)
352
+ else
353
+ XeroRuby::Accounting.const_get(return_type).build_from_hash(data)
354
+ end
241
355
  end
242
356
  end
243
357
 
358
+ # Traverses the model tree to find the model's namespacing
359
+ # based on the deserializing model/return_type name
360
+ def api_set_prefix(return_type)
361
+ api_set = ''
362
+ Find.find("#{File.dirname(__FILE__)}/models/") do |path|
363
+ model_path = path.split('/')
364
+ matching_name = model_path.last.gsub('.rb','').gsub("_",'')
365
+ if return_type.downcase === matching_name
366
+ api_set = path.split('/')[-2]
367
+ end
368
+ end
369
+ return api_set
370
+ end
371
+
244
372
  # Save response body into a file in (the defined) temporary folder, using the filename
245
373
  # from the "Content-Disposition" header if provided, otherwise a random filename.
246
374
  # The response body is written to the file in chunks in order to handle files which
@@ -248,33 +376,24 @@ module XeroRuby
248
376
  # process can use.
249
377
  #
250
378
  # @see Configuration#temp_folder_path
251
- def download_file(request)
252
- tempfile = nil
253
- encoding = nil
254
- request.on_headers do |response|
255
- content_disposition = response.headers['Content-Disposition']
256
- if content_disposition && content_disposition =~ /filename=/i
257
- filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
258
- prefix = sanitize_filename(filename)
259
- else
260
- prefix = 'download-'
261
- end
262
- prefix = prefix + '-' unless prefix.end_with?('-')
263
- encoding = response.body.encoding
264
- tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
265
- @tempfile = tempfile
266
- end
267
- request.on_body do |chunk|
268
- chunk.force_encoding(encoding)
269
- tempfile.write(chunk)
270
- end
271
- request.on_complete do |response|
272
- tempfile.close if tempfile
273
- @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
274
- "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
275
- "will be deleted automatically with GC. It's also recommended to delete the temp file "\
276
- "explicitly with `tempfile.delete`"
379
+ def prepare_file(response)
380
+ content_disposition = response.headers['Content-Disposition']
381
+ if content_disposition && content_disposition =~ /filename=/i
382
+ filename = content_disposition[/filename=['"]?([^'"\s]+)['"]?/, 1]
383
+ prefix = sanitize_filename(filename)
384
+ else
385
+ prefix = 'download-'
277
386
  end
387
+ prefix = prefix + '-' unless prefix.end_with?('-')
388
+ encoding = response.body.encoding
389
+ tempfile = Tempfile.open(prefix, @config.temp_folder_path, encoding: encoding)
390
+ @tempfile = tempfile
391
+ tempfile.write(response.body)
392
+ tempfile.close if tempfile
393
+ @config.logger.info "Temp file written to #{tempfile.path}, please copy the file to a proper folder "\
394
+ "with e.g. `FileUtils.cp(tempfile.path, '/new/file/path')` otherwise the temp file "\
395
+ "will be deleted automatically with GC. It's also recommended to delete the temp file "\
396
+ "explicitly with `tempfile.delete`"
278
397
  end
279
398
 
280
399
  # Sanitize filename by removing path.
@@ -357,11 +476,55 @@ module XeroRuby
357
476
  # @return [String] JSON string representation of the object
358
477
  def object_to_hash(obj)
359
478
  if obj.respond_to?(:to_hash)
360
- obj.to_hash
479
+ to_camel_keys(obj).to_hash
361
480
  else
362
- obj
481
+ to_camel_keys(obj)
482
+ end
483
+ end
484
+
485
+ # START - Re-serializes snake_cased params to PascalCase required by XeroAPI
486
+ def to_camel_keys(value = self)
487
+ case value
488
+ when Array
489
+ value.map { |v| to_camel_keys(v) }
490
+ when Hash
491
+ Hash[value.map { |k, v| [camelize_key(k), to_camel_keys(v)] }]
492
+ else
493
+ value
494
+ end
495
+ end
496
+
497
+ def camelize_key(key, first_upper = true)
498
+ if key.is_a? Symbol
499
+ camelize(key.to_s, first_upper).to_sym
500
+ elsif key.is_a? String
501
+ camelize(key, first_upper)
502
+ else
503
+ key # Awrence can't camelize anything except strings and symbols
504
+ end
505
+ end
506
+
507
+ def camelize(snake_word, first_upper = true)
508
+ if first_upper
509
+ str = snake_word.to_s
510
+ str = gsubbed(str, /(?:^|_)([^_\s]+)/)
511
+ str = gsubbed(str, %r{/([^/]*)}, "::")
512
+ str
513
+ else
514
+ parts = snake_word.split("_", 2)
515
+ parts[0] << camelize(parts[1]) if parts.size > 1
516
+ parts[0] || ""
517
+ end
518
+ end
519
+
520
+ def gsubbed(str, pattern, extra = "")
521
+ key_map_scronyms = { "id" => "ID" }
522
+ str = str.gsub(pattern) do
523
+ extra + (key_map_scronyms[Regexp.last_match(1)] || Regexp.last_match(1).capitalize)
363
524
  end
525
+ str
364
526
  end
527
+ # END - Re-serializes snake_cased params to PascalCase required by XeroAPI
365
528
 
366
529
  # Build parameter value according to the given collection format.
367
530
  # @param [String] collection_format one of :csv, :ssv, :tsv, :pipes and :multi
@@ -376,7 +539,7 @@ module XeroRuby
376
539
  when :pipes
377
540
  param.join('|')
378
541
  when :multi
379
- # return the array directly as typhoeus will handle it as expected
542
+ # return the array directly as http client will handle it as expected
380
543
  param
381
544
  else
382
545
  fail "unknown collection format: #{collection_format.inspect}"
@@ -3,10 +3,10 @@
3
3
 
4
4
  #No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
5
5
 
6
- The version of the OpenAPI document: 2.0.7
6
+ The version of the OpenAPI document: 2.2.11
7
7
  Contact: api@xero.com
8
8
  Generated by: https://openapi-generator.tech
9
- OpenAPI Generator version: 4.2.0
9
+ OpenAPI Generator version: 4.3.1
10
10
 
11
11
  =end
12
12
 
@@ -3,10 +3,10 @@
3
3
 
4
4
  #No description provided (generated by Openapi Generator https://github.com/openapitools/openapi-generator)
5
5
 
6
- The version of the OpenAPI document: 2.0.7
6
+ The version of the OpenAPI document: 2.2.11
7
7
  Contact: api@xero.com
8
8
  Generated by: https://openapi-generator.tech
9
- OpenAPI Generator version: 4.2.0
9
+ OpenAPI Generator version: 4.3.1
10
10
 
11
11
  =end
12
12
 
@@ -18,8 +18,18 @@ module XeroRuby
18
18
  # Defines url host
19
19
  attr_accessor :host
20
20
 
21
- # Defines url base path
21
+ # Defines url base path & url for overwriting
22
22
  attr_accessor :base_path
23
+ attr_accessor :base_url
24
+
25
+ # Defines url for identity routes
26
+ attr_accessor :login_url
27
+ attr_accessor :token_url
28
+
29
+ # Defines base paths for seperate API's
30
+ attr_accessor :accounting_url
31
+ attr_accessor :asset_url
32
+ attr_accessor :project_url
23
33
 
24
34
  # Defines API keys used with API Key authentications.
25
35
  #
@@ -50,6 +60,9 @@ module XeroRuby
50
60
  # Defines the access token (Bearer) used with OAuth2.
51
61
  attr_accessor :access_token
52
62
 
63
+ # Defines the token set used with OAuth2. May include id/access/refresh token & other meta info.
64
+ attr_accessor :token_set
65
+
53
66
  # Set this to enable/disable debugging. When enabled (set to true), HTTP request/response
54
67
  # details will be logged with `logger.debug` (see the `logger` attribute).
55
68
  # Default to false.
@@ -86,39 +99,31 @@ module XeroRuby
86
99
  # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
87
100
  #
88
101
  # @return [true, false]
89
- attr_accessor :verify_ssl
102
+ attr_accessor :ssl_verify
90
103
 
91
104
  ### TLS/SSL setting
92
- # Set this to false to skip verifying SSL host name
93
- # Default to true.
105
+ # Any `OpenSSL::SSL::` constant (see https://ruby-doc.org/stdlib-2.5.1/libdoc/openssl/rdoc/OpenSSL/SSL.html)
94
106
  #
95
107
  # @note Do NOT set it to false in production code, otherwise you would face multiple types of cryptographic attacks.
96
108
  #
97
- # @return [true, false]
98
- attr_accessor :verify_ssl_host
109
+ attr_accessor :ssl_verify_mode
99
110
 
100
111
  ### TLS/SSL setting
101
112
  # Set this to customize the certificate file to verify the peer.
102
113
  #
103
114
  # @return [String] the path to the certificate file
104
- #
105
- # @see The `cainfo` option of Typhoeus, `--cert` option of libcurl. Related source code:
106
- # https://github.com/typhoeus/typhoeus/blob/master/lib/typhoeus/easy_factory.rb#L145
107
- attr_accessor :ssl_ca_cert
115
+ attr_accessor :ssl_ca_file
108
116
 
109
117
  ### TLS/SSL setting
110
118
  # Client certificate file (for client certificate)
111
- attr_accessor :cert_file
119
+ attr_accessor :ssl_client_cert
112
120
 
113
121
  ### TLS/SSL setting
114
122
  # Client private key file (for client certificate)
115
- attr_accessor :key_file
123
+ attr_accessor :ssl_client_key
116
124
 
117
125
  # Set this to customize parameters encoding of array parameter with multi collectionFormat.
118
126
  # Default to nil.
119
- #
120
- # @see The params_encoding option of Ethon. Related source code:
121
- # https://github.com/typhoeus/ethon/blob/master/lib/ethon/easy/queryable.rb#L96
122
127
  attr_accessor :params_encoding
123
128
 
124
129
  attr_accessor :inject_format
@@ -129,15 +134,20 @@ module XeroRuby
129
134
  @scheme = 'https'
130
135
  @host = 'api.xero.com'
131
136
  @base_path = '/api.xro/2.0'
137
+ @login_url = 'https://login.xero.com/identity/connect/authorize'
138
+ @token_url = 'https://identity.xero.com/connect/token'
139
+ @accounting_url = 'https://api.xero.com/api.xro/2.0'
140
+ @asset_url = 'https://api.xero.com/assets.xro/1.0'
141
+ @project_url = 'https://api.xero.com/projects.xro/2.0/'
132
142
  @api_key = {}
133
143
  @api_key_prefix = {}
134
144
  @timeout = 0
135
145
  @client_side_validation = true
136
- @verify_ssl = true
137
- @verify_ssl_host = true
138
- @params_encoding = nil
139
- @cert_file = nil
140
- @key_file = nil
146
+ @ssl_verify = true
147
+ @ssl_verify_mode = nil
148
+ @ssl_ca_file = nil
149
+ @ssl_client_cert = nil
150
+ @ssl_client_key = nil
141
151
  @debugging = false
142
152
  @inject_format = false
143
153
  @force_ending_format = false
@@ -171,10 +181,10 @@ module XeroRuby
171
181
  @base_path = '' if @base_path == '/'
172
182
  end
173
183
 
174
- def base_url
175
- "#{scheme}://#{[host, base_path].join('/').gsub(/\/+/, '/')}".sub(/\/+\z/, '')
184
+ def base_url=(api_url)
185
+ @base_url = api_url
176
186
  end
177
-
187
+
178
188
  # Gets API key (with prefix if set).
179
189
  # @param [String] param_name the parameter name of API key auth
180
190
  def api_key_with_prefix(param_name)