xero-ruby 0.2.4 → 2.0.0

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