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.
- checksums.yaml +4 -4
- data/CODE_OF_CONDUCT.md +76 -0
- data/CONTRIBUTING.md +82 -0
- data/Gemfile.lock +68 -0
- data/LICENSE +21 -0
- data/README.md +155 -436
- data/build_notes.md +17 -0
- data/docs/{Account.md → accounting/Account.md} +3 -3
- data/docs/accounting/AccountType.md +16 -0
- data/docs/{AccountingApi.md → accounting/AccountingApi.md} +4990 -1787
- data/docs/{Accounts.md → accounting/Accounts.md} +3 -3
- data/docs/{AccountsPayable.md → accounting/AccountsPayable.md} +3 -3
- data/docs/{AccountsReceivable.md → accounting/AccountsReceivable.md} +3 -3
- data/docs/{Address.md → accounting/Address.md} +3 -3
- data/docs/accounting/Allocation.md +31 -0
- data/docs/{Allocations.md → accounting/Allocations.md} +3 -3
- data/docs/{Attachment.md → accounting/Attachment.md} +3 -3
- data/docs/{Attachments.md → accounting/Attachments.md} +3 -3
- data/docs/{Balances.md → accounting/Balances.md} +3 -3
- data/docs/{BankTransaction.md → accounting/BankTransaction.md} +3 -3
- data/docs/{BankTransactions.md → accounting/BankTransactions.md} +3 -3
- data/docs/{BankTransfer.md → accounting/BankTransfer.md} +4 -4
- data/docs/{BankTransfers.md → accounting/BankTransfers.md} +3 -3
- data/docs/{BatchPayment.md → accounting/BatchPayment.md} +4 -4
- data/docs/{BatchPaymentDetails.md → accounting/BatchPaymentDetails.md} +3 -3
- data/docs/{BatchPayments.md → accounting/BatchPayments.md} +3 -3
- data/docs/{Bill.md → accounting/Bill.md} +3 -3
- data/docs/{BrandingTheme.md → accounting/BrandingTheme.md} +3 -3
- data/docs/{BrandingThemes.md → accounting/BrandingThemes.md} +3 -3
- data/docs/{CISOrgSetting.md → accounting/CISOrgSetting.md} +3 -3
- data/docs/{CISSetting.md → accounting/CISSetting.md} +3 -3
- data/docs/{CISSettings.md → accounting/CISSettings.md} +3 -3
- data/docs/{Contact.md → accounting/Contact.md} +5 -5
- data/docs/{ContactGroup.md → accounting/ContactGroup.md} +3 -3
- data/docs/{ContactGroups.md → accounting/ContactGroups.md} +3 -3
- data/docs/{ContactPerson.md → accounting/ContactPerson.md} +3 -3
- data/docs/{Contacts.md → accounting/Contacts.md} +3 -3
- data/docs/accounting/CountryCode.md +16 -0
- data/docs/{CreditNote.md → accounting/CreditNote.md} +5 -5
- data/docs/{CreditNotes.md → accounting/CreditNotes.md} +3 -3
- data/docs/{Currencies.md → accounting/Currencies.md} +3 -3
- data/docs/{Currency.md → accounting/Currency.md} +3 -3
- data/docs/accounting/CurrencyCode.md +16 -0
- data/docs/{Element.md → accounting/Element.md} +3 -3
- data/docs/{Employee.md → accounting/Employee.md} +3 -3
- data/docs/{Employees.md → accounting/Employees.md} +3 -3
- data/docs/{Error.md → accounting/Error.md} +3 -3
- data/docs/{ExpenseClaim.md → accounting/ExpenseClaim.md} +3 -3
- data/docs/{ExpenseClaims.md → accounting/ExpenseClaims.md} +3 -3
- data/docs/{ExternalLink.md → accounting/ExternalLink.md} +3 -3
- data/docs/{HistoryRecord.md → accounting/HistoryRecord.md} +3 -3
- data/docs/{HistoryRecords.md → accounting/HistoryRecords.md} +3 -3
- data/docs/{Invoice.md → accounting/Invoice.md} +5 -5
- data/docs/{InvoiceReminder.md → accounting/InvoiceReminder.md} +3 -3
- data/docs/{InvoiceReminders.md → accounting/InvoiceReminders.md} +3 -3
- data/docs/{Invoices.md → accounting/Invoices.md} +3 -3
- data/docs/{Item.md → accounting/Item.md} +3 -3
- data/docs/{Items.md → accounting/Items.md} +3 -3
- data/docs/{Journal.md → accounting/Journal.md} +4 -4
- data/docs/{JournalLine.md → accounting/JournalLine.md} +3 -3
- data/docs/{Journals.md → accounting/Journals.md} +3 -3
- data/docs/accounting/LineAmountTypes.md +16 -0
- data/docs/{LineItem.md → accounting/LineItem.md} +3 -3
- data/docs/{LineItemTracking.md → accounting/LineItemTracking.md} +3 -3
- data/docs/{LinkedTransaction.md → accounting/LinkedTransaction.md} +3 -3
- data/docs/{LinkedTransactions.md → accounting/LinkedTransactions.md} +3 -3
- data/docs/{ManualJournal.md → accounting/ManualJournal.md} +3 -3
- data/docs/{ManualJournalLine.md → accounting/ManualJournalLine.md} +5 -3
- data/docs/{ManualJournals.md → accounting/ManualJournals.md} +3 -3
- data/docs/{OnlineInvoice.md → accounting/OnlineInvoice.md} +3 -3
- data/docs/{OnlineInvoices.md → accounting/OnlineInvoices.md} +3 -3
- data/docs/{Organisation.md → accounting/Organisation.md} +6 -4
- data/docs/{Organisations.md → accounting/Organisations.md} +3 -3
- data/docs/{Overpayment.md → accounting/Overpayment.md} +3 -3
- data/docs/{Overpayments.md → accounting/Overpayments.md} +3 -3
- data/docs/{Payment.md → accounting/Payment.md} +9 -7
- data/docs/{PaymentDelete.md → accounting/PaymentDelete.md} +3 -3
- data/docs/{PaymentService.md → accounting/PaymentService.md} +3 -3
- data/docs/{PaymentServices.md → accounting/PaymentServices.md} +3 -3
- data/docs/{PaymentTerm.md → accounting/PaymentTerm.md} +3 -3
- data/docs/{PaymentTermType.md → accounting/PaymentTermType.md} +3 -3
- data/docs/{Payments.md → accounting/Payments.md} +3 -3
- data/docs/{Phone.md → accounting/Phone.md} +3 -3
- data/docs/{Prepayment.md → accounting/Prepayment.md} +3 -3
- data/docs/{Prepayments.md → accounting/Prepayments.md} +3 -3
- data/docs/{Purchase.md → accounting/Purchase.md} +3 -3
- data/docs/{PurchaseOrder.md → accounting/PurchaseOrder.md} +3 -3
- data/docs/{PurchaseOrders.md → accounting/PurchaseOrders.md} +3 -3
- data/docs/{Quote.md → accounting/Quote.md} +10 -6
- data/docs/{QuoteLineAmountTypes.md → accounting/QuoteLineAmountTypes.md} +3 -3
- data/docs/{QuoteStatusCodes.md → accounting/QuoteStatusCodes.md} +3 -3
- data/docs/{Quotes.md → accounting/Quotes.md} +3 -3
- data/docs/{Receipt.md → accounting/Receipt.md} +3 -3
- data/docs/{Receipts.md → accounting/Receipts.md} +3 -3
- data/docs/{RepeatingInvoice.md → accounting/RepeatingInvoice.md} +3 -3
- data/docs/{RepeatingInvoices.md → accounting/RepeatingInvoices.md} +3 -3
- data/docs/{Report.md → accounting/Report.md} +4 -4
- data/docs/{ReportAttribute.md → accounting/ReportAttribute.md} +3 -3
- data/docs/{ReportCell.md → accounting/ReportCell.md} +3 -3
- data/docs/{ReportFields.md → accounting/ReportFields.md} +3 -3
- data/docs/{ReportRow.md → accounting/ReportRow.md} +3 -3
- data/docs/{ReportRows.md → accounting/ReportRows.md} +3 -3
- data/docs/{ReportWithRow.md → accounting/ReportWithRow.md} +3 -3
- data/docs/{ReportWithRows.md → accounting/ReportWithRows.md} +3 -3
- data/docs/{Reports.md → accounting/Reports.md} +3 -3
- data/docs/{RequestEmpty.md → accounting/RequestEmpty.md} +3 -3
- data/docs/{RowType.md → accounting/RowType.md} +3 -3
- data/docs/{SalesTrackingCategory.md → accounting/SalesTrackingCategory.md} +3 -3
- data/docs/{Schedule.md → accounting/Schedule.md} +3 -3
- data/docs/{TaxComponent.md → accounting/TaxComponent.md} +3 -3
- data/docs/{TaxRate.md → accounting/TaxRate.md} +3 -3
- data/docs/{TaxRates.md → accounting/TaxRates.md} +3 -3
- data/docs/{TaxType.md → accounting/TaxType.md} +3 -3
- data/docs/{TenNinteyNineContact.md → accounting/TenNinetyNineContact.md} +3 -3
- data/docs/{TimeZone.md → accounting/TimeZone.md} +3 -3
- data/docs/{TrackingCategories.md → accounting/TrackingCategories.md} +3 -3
- data/docs/{TrackingCategory.md → accounting/TrackingCategory.md} +3 -3
- data/docs/{TrackingOption.md → accounting/TrackingOption.md} +3 -3
- data/docs/{TrackingOptions.md → accounting/TrackingOptions.md} +3 -3
- data/docs/{User.md → accounting/User.md} +3 -3
- data/docs/{Users.md → accounting/Users.md} +3 -3
- data/docs/{ValidationError.md → accounting/ValidationError.md} +3 -3
- data/docs/assets/Asset.md +45 -0
- data/docs/assets/AssetApi.md +438 -0
- data/docs/{CurrencyCode.md → assets/AssetStatus.md} +3 -3
- data/docs/assets/AssetStatusQueryParam.md +16 -0
- data/docs/assets/AssetType.md +29 -0
- data/docs/assets/Assets.md +19 -0
- data/docs/assets/BookDepreciationDetail.md +29 -0
- data/docs/assets/BookDepreciationSetting.md +31 -0
- data/docs/assets/Error.md +25 -0
- data/docs/assets/FieldValidationErrorsElement.md +27 -0
- data/docs/assets/Pagination.md +23 -0
- data/docs/assets/ResourceValidationErrorsElement.md +25 -0
- data/docs/assets/Setting.md +31 -0
- data/docs/projects/Amount.md +19 -0
- data/docs/{AccountType.md → projects/ChargeType.md} +3 -3
- data/docs/{CountryCode.md → projects/CurrencyCode.md} +3 -3
- data/docs/projects/Error.md +19 -0
- data/docs/projects/Pagination.md +23 -0
- data/docs/projects/Project.md +59 -0
- data/docs/projects/ProjectApi.md +979 -0
- data/docs/projects/ProjectCreateOrUpdate.md +23 -0
- data/docs/projects/ProjectPatch.md +17 -0
- data/docs/{LineAmountTypes.md → projects/ProjectStatus.md} +3 -3
- data/docs/projects/ProjectUser.md +21 -0
- data/docs/projects/ProjectUsers.md +19 -0
- data/docs/projects/Projects.md +19 -0
- data/docs/projects/Task.md +45 -0
- data/docs/projects/TaskCreateOrUpdate.md +23 -0
- data/docs/projects/Tasks.md +19 -0
- data/docs/projects/TimeEntries.md +19 -0
- data/docs/projects/TimeEntry.md +33 -0
- data/docs/projects/TimeEntryCreateOrUpdate.md +25 -0
- data/lib/xero-ruby.rb +148 -122
- data/lib/xero-ruby/api/accounting_api.rb +166 -29
- data/lib/xero-ruby/api/asset_api.rb +452 -0
- data/lib/xero-ruby/api/project_api.rb +1035 -0
- data/lib/xero-ruby/api_client.rb +237 -74
- data/lib/xero-ruby/api_error.rb +2 -2
- data/lib/xero-ruby/configuration.rb +35 -25
- data/lib/xero-ruby/models/{account.rb → accounting/account.rb} +65 -24
- data/lib/xero-ruby/models/{account_type.rb → accounting/account_type.rb} +3 -3
- data/lib/xero-ruby/models/{accounts.rb → accounting/accounts.rb} +12 -7
- data/lib/xero-ruby/models/{accounts_payable.rb → accounting/accounts_payable.rb} +15 -9
- data/lib/xero-ruby/models/{accounts_receivable.rb → accounting/accounts_receivable.rb} +15 -9
- data/lib/xero-ruby/models/{address.rb → accounting/address.rb} +23 -16
- data/lib/xero-ruby/models/accounting/allocation.rb +295 -0
- data/lib/xero-ruby/models/{allocations.rb → accounting/allocations.rb} +12 -7
- data/lib/xero-ruby/models/{attachment.rb → accounting/attachment.rb} +16 -12
- data/lib/xero-ruby/models/{attachments.rb → accounting/attachments.rb} +12 -7
- data/lib/xero-ruby/models/{balances.rb → accounting/balances.rb} +13 -7
- data/lib/xero-ruby/models/{bank_transaction.rb → accounting/bank_transaction.rb} +47 -28
- data/lib/xero-ruby/models/{bank_transactions.rb → accounting/bank_transactions.rb} +12 -7
- data/lib/xero-ruby/models/{bank_transfer.rb → accounting/bank_transfer.rb} +24 -18
- data/lib/xero-ruby/models/{bank_transfers.rb → accounting/bank_transfers.rb} +12 -7
- data/lib/xero-ruby/models/{batch_payment.rb → accounting/batch_payment.rb} +33 -23
- data/lib/xero-ruby/models/{batch_payment_details.rb → accounting/batch_payment_details.rb} +15 -11
- data/lib/xero-ruby/models/{batch_payments.rb → accounting/batch_payments.rb} +12 -7
- data/lib/xero-ruby/models/{bill.rb → accounting/bill.rb} +12 -7
- data/lib/xero-ruby/models/{branding_theme.rb → accounting/branding_theme.rb} +17 -12
- data/lib/xero-ruby/models/{branding_themes.rb → accounting/branding_themes.rb} +12 -7
- data/lib/xero-ruby/models/{cis_org_setting.rb → accounting/cis_org_setting.rb} +13 -9
- data/lib/xero-ruby/models/{cis_setting.rb → accounting/cis_setting.rb} +12 -8
- data/lib/xero-ruby/models/{cis_settings.rb → accounting/cis_settings.rb} +12 -7
- data/lib/xero-ruby/models/{contact.rb → accounting/contact.rb} +55 -41
- data/lib/xero-ruby/models/{contact_group.rb → accounting/contact_group.rb} +16 -10
- data/lib/xero-ruby/models/{contact_groups.rb → accounting/contact_groups.rb} +12 -7
- data/lib/xero-ruby/models/{contact_person.rb → accounting/contact_person.rb} +14 -10
- data/lib/xero-ruby/models/{contacts.rb → accounting/contacts.rb} +12 -7
- data/lib/xero-ruby/models/{country_code.rb → accounting/country_code.rb} +3 -3
- data/lib/xero-ruby/models/{credit_note.rb → accounting/credit_note.rb} +51 -34
- data/lib/xero-ruby/models/{credit_notes.rb → accounting/credit_notes.rb} +12 -7
- data/lib/xero-ruby/models/{currencies.rb → accounting/currencies.rb} +12 -7
- data/lib/xero-ruby/models/{currency.rb → accounting/currency.rb} +13 -8
- data/lib/xero-ruby/models/{currency_code.rb → accounting/currency_code.rb} +5 -5
- data/lib/xero-ruby/models/{element.rb → accounting/element.rb} +18 -8
- data/lib/xero-ruby/models/{employee.rb → accounting/employee.rb} +21 -12
- data/lib/xero-ruby/models/{employees.rb → accounting/employees.rb} +12 -7
- data/lib/xero-ruby/models/{error.rb → accounting/error.rb} +14 -10
- data/lib/xero-ruby/models/{expense_claim.rb → accounting/expense_claim.rb} +30 -19
- data/lib/xero-ruby/models/{expense_claims.rb → accounting/expense_claims.rb} +12 -7
- data/lib/xero-ruby/models/{external_link.rb → accounting/external_link.rb} +18 -8
- data/lib/xero-ruby/models/{history_record.rb → accounting/history_record.rb} +14 -10
- data/lib/xero-ruby/models/{history_records.rb → accounting/history_records.rb} +12 -7
- data/lib/xero-ruby/models/{invoice.rb → accounting/invoice.rb} +73 -50
- data/lib/xero-ruby/models/{invoice_reminder.rb → accounting/invoice_reminder.rb} +11 -7
- data/lib/xero-ruby/models/{invoice_reminders.rb → accounting/invoice_reminders.rb} +12 -7
- data/lib/xero-ruby/models/{invoices.rb → accounting/invoices.rb} +12 -7
- data/lib/xero-ruby/models/{item.rb → accounting/item.rb} +28 -22
- data/lib/xero-ruby/models/{items.rb → accounting/items.rb} +12 -7
- data/lib/xero-ruby/models/{journal.rb → accounting/journal.rb} +44 -15
- data/lib/xero-ruby/models/{journal_line.rb → accounting/journal_line.rb} +25 -20
- data/lib/xero-ruby/models/{journals.rb → accounting/journals.rb} +12 -7
- data/lib/xero-ruby/models/{line_amount_types.rb → accounting/line_amount_types.rb} +3 -3
- data/lib/xero-ruby/models/{line_item.rb → accounting/line_item.rb} +29 -25
- data/lib/xero-ruby/models/{line_item_tracking.rb → accounting/line_item_tracking.rb} +14 -10
- data/lib/xero-ruby/models/{linked_transaction.rb → accounting/linked_transaction.rb} +29 -17
- data/lib/xero-ruby/models/{linked_transactions.rb → accounting/linked_transactions.rb} +12 -7
- data/lib/xero-ruby/models/{manual_journal.rb → accounting/manual_journal.rb} +29 -19
- data/lib/xero-ruby/models/{manual_journal_line.rb → accounting/manual_journal_line.rb} +30 -16
- data/lib/xero-ruby/models/{manual_journals.rb → accounting/manual_journals.rb} +12 -7
- data/lib/xero-ruby/models/{online_invoice.rb → accounting/online_invoice.rb} +11 -7
- data/lib/xero-ruby/models/{online_invoices.rb → accounting/online_invoices.rb} +12 -7
- data/lib/xero-ruby/models/{organisation.rb → accounting/organisation.rb} +126 -36
- data/lib/xero-ruby/models/{organisations.rb → accounting/organisations.rb} +12 -7
- data/lib/xero-ruby/models/{overpayment.rb → accounting/overpayment.rb} +40 -27
- data/lib/xero-ruby/models/{overpayments.rb → accounting/overpayments.rb} +12 -7
- data/lib/xero-ruby/models/{payment.rb → accounting/payment.rb} +61 -28
- data/lib/xero-ruby/models/{payment_delete.rb → accounting/payment_delete.rb} +11 -7
- data/lib/xero-ruby/models/{payment_service.rb → accounting/payment_service.rb} +16 -12
- data/lib/xero-ruby/models/{payment_services.rb → accounting/payment_services.rb} +12 -7
- data/lib/xero-ruby/models/{payment_term.rb → accounting/payment_term.rb} +13 -7
- data/lib/xero-ruby/models/{payment_term_type.rb → accounting/payment_term_type.rb} +3 -3
- data/lib/xero-ruby/models/{payments.rb → accounting/payments.rb} +12 -7
- data/lib/xero-ruby/models/{phone.rb → accounting/phone.rb} +20 -10
- data/lib/xero-ruby/models/{prepayment.rb → accounting/prepayment.rb} +41 -27
- data/lib/xero-ruby/models/{prepayments.rb → accounting/prepayments.rb} +12 -7
- data/lib/xero-ruby/models/{purchase.rb → accounting/purchase.rb} +15 -11
- data/lib/xero-ruby/models/{purchase_order.rb → accounting/purchase_order.rb} +49 -37
- data/lib/xero-ruby/models/{purchase_orders.rb → accounting/purchase_orders.rb} +12 -7
- data/lib/xero-ruby/models/{quote.rb → accounting/quote.rb} +63 -33
- data/lib/xero-ruby/models/{quote_line_amount_types.rb → accounting/quote_line_amount_types.rb} +3 -3
- data/lib/xero-ruby/models/{quote_status_codes.rb → accounting/quote_status_codes.rb} +4 -3
- data/lib/xero-ruby/models/{quotes.rb → accounting/quotes.rb} +12 -7
- data/lib/xero-ruby/models/{receipt.rb → accounting/receipt.rb} +36 -23
- data/lib/xero-ruby/models/{receipts.rb → accounting/receipts.rb} +12 -7
- data/lib/xero-ruby/models/{repeating_invoice.rb → accounting/repeating_invoice.rb} +34 -21
- data/lib/xero-ruby/models/{repeating_invoices.rb → accounting/repeating_invoices.rb} +12 -7
- data/lib/xero-ruby/models/{report.rb → accounting/report.rb} +19 -13
- data/lib/xero-ruby/models/{report_attribute.rb → accounting/report_attribute.rb} +13 -7
- data/lib/xero-ruby/models/{report_cell.rb → accounting/report_cell.rb} +13 -7
- data/lib/xero-ruby/models/{report_fields.rb → accounting/report_fields.rb} +14 -7
- data/lib/xero-ruby/models/{report_row.rb → accounting/report_row.rb} +14 -7
- data/lib/xero-ruby/models/{report_rows.rb → accounting/report_rows.rb} +15 -7
- data/lib/xero-ruby/models/{report_with_row.rb → accounting/report_with_row.rb} +19 -13
- data/lib/xero-ruby/models/{report_with_rows.rb → accounting/report_with_rows.rb} +12 -7
- data/lib/xero-ruby/models/{reports.rb → accounting/reports.rb} +12 -7
- data/lib/xero-ruby/models/{request_empty.rb → accounting/request_empty.rb} +11 -7
- data/lib/xero-ruby/models/{row_type.rb → accounting/row_type.rb} +3 -3
- data/lib/xero-ruby/models/{sales_tracking_category.rb → accounting/sales_tracking_category.rb} +12 -8
- data/lib/xero-ruby/models/{schedule.rb → accounting/schedule.rb} +27 -15
- data/lib/xero-ruby/models/{tax_component.rb → accounting/tax_component.rb} +15 -11
- data/lib/xero-ruby/models/{tax_rate.rb → accounting/tax_rate.rb} +104 -22
- data/lib/xero-ruby/models/{tax_rates.rb → accounting/tax_rates.rb} +12 -7
- data/lib/xero-ruby/models/{tax_type.rb → accounting/tax_type.rb} +7 -3
- data/lib/xero-ruby/models/{ten_nintey_nine_contact.rb → accounting/ten_ninety_nine_contact.rb} +46 -42
- data/lib/xero-ruby/models/{time_zone.rb → accounting/time_zone.rb} +3 -3
- data/lib/xero-ruby/models/{tracking_categories.rb → accounting/tracking_categories.rb} +12 -7
- data/lib/xero-ruby/models/{tracking_category.rb → accounting/tracking_category.rb} +19 -12
- data/lib/xero-ruby/models/{tracking_option.rb → accounting/tracking_option.rb} +17 -10
- data/lib/xero-ruby/models/{tracking_options.rb → accounting/tracking_options.rb} +12 -7
- data/lib/xero-ruby/models/{user.rb → accounting/user.rb} +24 -13
- data/lib/xero-ruby/models/{users.rb → accounting/users.rb} +12 -7
- data/lib/xero-ruby/models/{validation_error.rb → accounting/validation_error.rb} +11 -7
- data/lib/xero-ruby/models/assets/asset.rb +353 -0
- data/lib/xero-ruby/models/assets/asset_status.rb +38 -0
- data/lib/xero-ruby/models/assets/asset_status_query_param.rb +38 -0
- data/lib/xero-ruby/models/assets/asset_type.rb +278 -0
- data/lib/xero-ruby/models/assets/assets.rb +220 -0
- data/lib/xero-ruby/models/assets/book_depreciation_detail.rb +268 -0
- data/lib/xero-ruby/models/assets/book_depreciation_setting.rb +347 -0
- data/lib/xero-ruby/models/assets/error.rb +252 -0
- data/lib/xero-ruby/models/assets/field_validation_errors_element.rb +258 -0
- data/lib/xero-ruby/models/assets/pagination.rb +238 -0
- data/lib/xero-ruby/models/assets/resource_validation_errors_element.rb +248 -0
- data/lib/xero-ruby/models/assets/setting.rb +278 -0
- data/lib/xero-ruby/models/projects/amount.rb +218 -0
- data/lib/xero-ruby/models/projects/charge_type.rb +38 -0
- data/lib/xero-ruby/models/projects/currency_code.rb +199 -0
- data/lib/xero-ruby/models/projects/error.rb +218 -0
- data/lib/xero-ruby/models/{allocation.rb → projects/pagination.rb} +48 -48
- data/lib/xero-ruby/models/projects/project.rb +423 -0
- data/lib/xero-ruby/models/projects/project_create_or_update.rb +243 -0
- data/lib/xero-ruby/models/projects/project_patch.rb +213 -0
- data/lib/xero-ruby/models/projects/project_status.rb +37 -0
- data/lib/xero-ruby/models/projects/project_user.rb +228 -0
- data/lib/xero-ruby/models/projects/project_users.rb +220 -0
- data/lib/xero-ruby/models/projects/projects.rb +220 -0
- data/lib/xero-ruby/models/projects/task.rb +385 -0
- data/lib/xero-ruby/models/projects/task_create_or_update.rb +253 -0
- data/lib/xero-ruby/models/projects/tasks.rb +220 -0
- data/lib/xero-ruby/models/projects/time_entries.rb +220 -0
- data/lib/xero-ruby/models/projects/time_entry.rb +324 -0
- data/lib/xero-ruby/models/projects/time_entry_create_or_update.rb +268 -0
- data/lib/xero-ruby/version.rb +3 -3
- data/spec/{api → accounting/api}/accounting_api_spec.rb +31 -6
- data/spec/{models → accounting/models}/account_spec.rb +5 -5
- data/spec/{models → accounting/models}/account_type_spec.rb +5 -5
- data/spec/{models → accounting/models}/accounts_payable_spec.rb +5 -5
- data/spec/{models → accounting/models}/accounts_receivable_spec.rb +5 -5
- data/spec/{models → accounting/models}/accounts_spec.rb +5 -5
- data/spec/{models → accounting/models}/address_spec.rb +5 -5
- data/spec/{models → accounting/models}/allocation_spec.rb +5 -5
- data/spec/{models → accounting/models}/allocations_spec.rb +5 -5
- data/spec/{models → accounting/models}/attachment_spec.rb +5 -5
- data/spec/{models → accounting/models}/attachments_spec.rb +5 -5
- data/spec/{models → accounting/models}/balances_spec.rb +5 -5
- data/spec/{models → accounting/models}/bank_transaction_spec.rb +5 -5
- data/spec/{models → accounting/models}/bank_transactions_spec.rb +5 -5
- data/spec/{models → accounting/models}/bank_transfer_spec.rb +5 -5
- data/spec/{models → accounting/models}/bank_transfers_spec.rb +5 -5
- data/spec/{models → accounting/models}/batch_payment_details_spec.rb +5 -5
- data/spec/{models → accounting/models}/batch_payment_spec.rb +5 -5
- data/spec/{models → accounting/models}/batch_payments_spec.rb +5 -5
- data/spec/{models → accounting/models}/bill_spec.rb +5 -5
- data/spec/{models → accounting/models}/branding_theme_spec.rb +5 -5
- data/spec/{models → accounting/models}/branding_themes_spec.rb +5 -5
- data/spec/{models → accounting/models}/cis_org_setting_spec.rb +5 -5
- data/spec/{models → accounting/models}/cis_setting_spec.rb +5 -5
- data/spec/{models → accounting/models}/cis_settings_spec.rb +5 -5
- data/spec/{models → accounting/models}/contact_group_spec.rb +5 -5
- data/spec/{models → accounting/models}/contact_groups_spec.rb +5 -5
- data/spec/{models → accounting/models}/contact_person_spec.rb +5 -5
- data/spec/{models → accounting/models}/contact_spec.rb +5 -5
- data/spec/{models → accounting/models}/contacts_spec.rb +5 -5
- data/spec/{models → accounting/models}/country_code_spec.rb +5 -5
- data/spec/{models → accounting/models}/credit_note_spec.rb +5 -5
- data/spec/{models → accounting/models}/credit_notes_spec.rb +5 -5
- data/spec/{models → accounting/models}/currencies_spec.rb +5 -5
- data/spec/{models → accounting/models}/currency_code_spec.rb +5 -5
- data/spec/{models → accounting/models}/currency_spec.rb +5 -5
- data/spec/{models → accounting/models}/element_spec.rb +5 -5
- data/spec/{models → accounting/models}/employee_spec.rb +5 -5
- data/spec/{models → accounting/models}/employees_spec.rb +5 -5
- data/spec/{models → accounting/models}/error_spec.rb +5 -5
- data/spec/{models → accounting/models}/expense_claim_spec.rb +5 -5
- data/spec/{models → accounting/models}/expense_claims_spec.rb +5 -5
- data/spec/{models → accounting/models}/external_link_spec.rb +5 -5
- data/spec/{models → accounting/models}/history_record_spec.rb +5 -5
- data/spec/{models → accounting/models}/history_records_spec.rb +5 -5
- data/spec/{models → accounting/models}/invoice_reminder_spec.rb +5 -5
- data/spec/{models → accounting/models}/invoice_reminders_spec.rb +5 -5
- data/spec/{models → accounting/models}/invoice_spec.rb +5 -5
- data/spec/{models → accounting/models}/invoices_spec.rb +5 -5
- data/spec/{models → accounting/models}/item_spec.rb +5 -5
- data/spec/{models → accounting/models}/items_spec.rb +5 -5
- data/spec/{models → accounting/models}/journal_line_spec.rb +5 -5
- data/spec/{models → accounting/models}/journal_spec.rb +5 -5
- data/spec/{models → accounting/models}/journals_spec.rb +5 -5
- data/spec/{models → accounting/models}/line_amount_types_spec.rb +5 -5
- data/spec/{models → accounting/models}/line_item_spec.rb +5 -5
- data/spec/{models → accounting/models}/line_item_tracking_spec.rb +5 -5
- data/spec/{models → accounting/models}/linked_transaction_spec.rb +5 -5
- data/spec/{models → accounting/models}/linked_transactions_spec.rb +5 -5
- data/spec/{models → accounting/models}/manual_journal_line_spec.rb +5 -5
- data/spec/{models → accounting/models}/manual_journal_spec.rb +5 -5
- data/spec/{models → accounting/models}/manual_journals_spec.rb +5 -5
- data/spec/{models → accounting/models}/online_invoice_spec.rb +5 -5
- data/spec/{models → accounting/models}/online_invoices_spec.rb +5 -5
- data/spec/{models → accounting/models}/organisation_spec.rb +5 -5
- data/spec/{models → accounting/models}/organisations_spec.rb +5 -5
- data/spec/{models → accounting/models}/overpayment_spec.rb +5 -5
- data/spec/{models → accounting/models}/overpayments_spec.rb +5 -5
- data/spec/{models → accounting/models}/payment_delete_spec.rb +5 -5
- data/spec/{models → accounting/models}/payment_service_spec.rb +5 -5
- data/spec/{models → accounting/models}/payment_services_spec.rb +5 -5
- data/spec/{models → accounting/models}/payment_spec.rb +11 -5
- data/spec/{models → accounting/models}/payment_term_spec.rb +5 -5
- data/spec/{models → accounting/models}/payment_term_type_spec.rb +5 -5
- data/spec/{models → accounting/models}/payments_spec.rb +5 -5
- data/spec/{models → accounting/models}/phone_spec.rb +5 -5
- data/spec/{models → accounting/models}/prepayment_spec.rb +5 -5
- data/spec/{models → accounting/models}/prepayments_spec.rb +5 -5
- data/spec/{models → accounting/models}/purchase_order_spec.rb +5 -5
- data/spec/{models → accounting/models}/purchase_orders_spec.rb +5 -5
- data/spec/{models → accounting/models}/purchase_spec.rb +5 -5
- data/spec/{models → accounting/models}/quote_line_amount_types_spec.rb +5 -5
- data/spec/{models → accounting/models}/quote_spec.rb +5 -5
- data/spec/{models → accounting/models}/quote_status_codes_spec.rb +5 -5
- data/spec/{models → accounting/models}/quotes_spec.rb +5 -5
- data/spec/{models → accounting/models}/receipt_spec.rb +5 -5
- data/spec/{models → accounting/models}/receipts_spec.rb +5 -5
- data/spec/{models → accounting/models}/repeating_invoice_spec.rb +5 -5
- data/spec/{models → accounting/models}/repeating_invoices_spec.rb +5 -5
- data/spec/{models → accounting/models}/report_attribute_spec.rb +5 -5
- data/spec/{models → accounting/models}/report_cell_spec.rb +5 -5
- data/spec/{models → accounting/models}/report_fields_spec.rb +5 -5
- data/spec/{models → accounting/models}/report_row_spec.rb +5 -5
- data/spec/{models → accounting/models}/report_rows_spec.rb +5 -5
- data/spec/{models → accounting/models}/report_spec.rb +5 -5
- data/spec/{models → accounting/models}/report_with_row_spec.rb +5 -5
- data/spec/{models → accounting/models}/report_with_rows_spec.rb +5 -5
- data/spec/{models → accounting/models}/reports_spec.rb +5 -5
- data/spec/{models → accounting/models}/request_empty_spec.rb +5 -5
- data/spec/{models → accounting/models}/row_type_spec.rb +5 -5
- data/spec/{models → accounting/models}/sales_tracking_category_spec.rb +5 -5
- data/spec/{models → accounting/models}/schedule_spec.rb +5 -5
- data/spec/{models → accounting/models}/tax_component_spec.rb +5 -5
- data/spec/{models → accounting/models}/tax_rate_spec.rb +6 -6
- data/spec/{models → accounting/models}/tax_rates_spec.rb +5 -5
- data/spec/{models → accounting/models}/tax_type_spec.rb +5 -5
- data/spec/{models → accounting/models}/ten_nintey_nine_contact_spec.rb +8 -8
- data/spec/{models → accounting/models}/time_zone_spec.rb +5 -5
- data/spec/{models → accounting/models}/tracking_categories_spec.rb +5 -5
- data/spec/{models → accounting/models}/tracking_category_spec.rb +5 -5
- data/spec/{models → accounting/models}/tracking_option_spec.rb +5 -5
- data/spec/{models → accounting/models}/tracking_options_spec.rb +5 -5
- data/spec/{models → accounting/models}/user_spec.rb +5 -5
- data/spec/{models → accounting/models}/users_spec.rb +5 -5
- data/spec/{models → accounting/models}/validation_error_spec.rb +5 -5
- data/spec/api_client_spec.rb +12 -52
- data/spec/assets/api/asset_api_spec.rb +116 -0
- data/spec/assets/models/asset_spec.rb +125 -0
- data/spec/assets/models/asset_status_query_param_spec.rb +35 -0
- data/spec/assets/models/asset_status_spec.rb +35 -0
- data/spec/assets/models/asset_type_spec.rb +77 -0
- data/spec/assets/models/assets_spec.rb +47 -0
- data/spec/assets/models/book_depreciation_detail_spec.rb +77 -0
- data/spec/assets/models/book_depreciation_setting_spec.rb +95 -0
- data/spec/assets/models/error_spec.rb +65 -0
- data/spec/assets/models/field_validation_errors_element_spec.rb +71 -0
- data/spec/assets/models/pagination_spec.rb +59 -0
- data/spec/assets/models/resource_validation_errors_element_spec.rb +65 -0
- data/spec/assets/models/setting_spec.rb +83 -0
- data/spec/configuration_spec.rb +7 -23
- data/spec/projects/api/project_api_spec.rb +229 -0
- data/spec/projects/models/amount_spec.rb +47 -0
- data/spec/projects/models/charge_type_spec.rb +35 -0
- data/spec/projects/models/currency_code_spec.rb +35 -0
- data/spec/projects/models/error_spec.rb +47 -0
- data/spec/projects/models/pagination_spec.rb +59 -0
- data/spec/projects/models/project_create_or_update_spec.rb +59 -0
- data/spec/projects/models/project_patch_spec.rb +41 -0
- data/spec/projects/models/project_spec.rb +167 -0
- data/spec/projects/models/project_status_spec.rb +35 -0
- data/spec/projects/models/project_user_spec.rb +53 -0
- data/spec/projects/models/project_users_spec.rb +47 -0
- data/spec/projects/models/projects_spec.rb +47 -0
- data/spec/projects/models/task_create_or_update_spec.rb +59 -0
- data/spec/projects/models/task_spec.rb +129 -0
- data/spec/projects/models/tasks_spec.rb +47 -0
- data/spec/projects/models/time_entries_spec.rb +47 -0
- data/spec/projects/models/time_entry_create_or_update_spec.rb +65 -0
- data/spec/projects/models/time_entry_spec.rb +93 -0
- data/spec/spec_helper.rb +2 -2
- data/xero-ruby.gemspec +4 -5
- metadata +611 -482
- data/docs/Allocation.md +0 -21
- data/lib/.DS_Store +0 -0
- data/pkg/xero-ruby-0.1.3.gem +0 -0
- data/pkg/xero-ruby-0.2.2.gem +0 -0
- data/pkg/xero-ruby-0.2.3.gem +0 -0
data/lib/xero-ruby/api_client.rb
CHANGED
|
@@ -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.
|
|
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.
|
|
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 '
|
|
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
|
|
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
|
|
41
|
-
|
|
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
|
-
|
|
50
|
-
|
|
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
|
-
|
|
53
|
-
|
|
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
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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.
|
|
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 =
|
|
126
|
-
|
|
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
|
-
|
|
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, ::
|
|
144
|
-
#
|
|
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
|
|
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
|
-
|
|
240
|
-
|
|
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
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
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
|
|
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}"
|
data/lib/xero-ruby/api_error.rb
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
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.
|
|
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 :
|
|
102
|
+
attr_accessor :ssl_verify
|
|
90
103
|
|
|
91
104
|
### TLS/SSL setting
|
|
92
|
-
#
|
|
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
|
-
|
|
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 :
|
|
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 :
|
|
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
|
-
@
|
|
137
|
-
@
|
|
138
|
-
@
|
|
139
|
-
@
|
|
140
|
-
@
|
|
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
|
-
|
|
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)
|