xero 0.0.3 → 0.0.4

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.
@@ -4,17 +4,18 @@ module Xero
4
4
  extend ActiveSupport::Concern
5
5
 
6
6
  module ClassMethods
7
+
7
8
  def belongs_to(association_name, options = {})
8
9
 
9
10
  attr_accessor :"#{association_name}_id"
10
11
 
11
12
  define_method association_name do
12
- instance_variable_get(:"#{association_name}")
13
+ instance_variable_get(:"@#{association_name}")
13
14
  end
14
15
 
15
16
  define_method "#{association_name}=" do |value|
16
17
  instance_variable_set(:"@#{association_name}", value)
17
- send "#{association_name}_id", value.id
18
+ send "#{association_name}_id=", value.id
18
19
  end
19
20
  end
20
21
  end
data/lib/xero/client.rb CHANGED
@@ -53,14 +53,20 @@ module Xero
53
53
  def save(model)
54
54
  model.tap do |item|
55
55
  response = self.connection.post(model.class.path, model.to_xero_xml)
56
- attrs = Hash.from_xml(response.body)['Response'][
57
- "#{model.class.to_s.demodulize.pluralize}"
58
- ][model.class.to_s.demodulize]
59
- model.attributes = attrs
56
+
57
+ Hash.from_xml(response.body)['Response'].tap do |resp|
58
+ klass = model.class.to_s.demodulize
59
+ model.attributes = resp[klass.pluralize][klass]
60
+ end
61
+
60
62
  model.new_record = false
61
63
  end
62
64
  end
63
65
 
66
+ def build_invoice(attributes = {})
67
+ build_model Xero::Models::Invoice, attributes
68
+ end
69
+
64
70
  def build_item(attributes = {})
65
71
  build_model Xero::Models::Item, attributes
66
72
  end
@@ -1,7 +1,14 @@
1
1
  module Xero
2
2
  class Configuration
3
3
 
4
- attr_accessor :logger, :consumer_key, :consumer_secret, :private_key_path
4
+ attr_accessor :logger, :consumer_key, :consumer_secret, :private_key_path,
5
+ :invoice_due_days
6
+
7
+ def initialize(options = {})
8
+ default_options = { invoice_due_days: 30 }.merge(options)
9
+ default_options.each { |key, value| self.send("#{key}=", value) }
10
+ self
11
+ end
5
12
 
6
13
  def logger
7
14
  @logger || Logger.new(STDOUT)
@@ -14,8 +14,7 @@ module Xero
14
14
 
15
15
  def consumer
16
16
  @consumer ||= ::OAuth::Consumer.new(
17
- Xero.configuration.consumer_key,
18
- Xero.configuration.consumer_secret,
17
+ Xero.configuration.consumer_key, Xero.configuration.consumer_secret,
19
18
  self.consumer_options
20
19
  )
21
20
  end
@@ -47,11 +46,20 @@ module Xero
47
46
 
48
47
  headers = { 'charset' => 'utf-8' }
49
48
 
49
+ Xero.configuration.logger.debug(
50
+ "XERO::Connection #{method.upcase} #{uri} with #{params}"
51
+ )
52
+
50
53
  if method == :get
51
54
  response = access_token.get(uri, params)
52
55
  else
53
56
  response = access_token.post(uri, params, headers)
54
57
  end
58
+
59
+ Xero.configuration.logger.debug(
60
+ "XERO::Connection RESPONSE code: #{response} body: #{response.body}"
61
+ )
62
+
55
63
  handle_response(response)
56
64
  end
57
65
 
@@ -2,6 +2,7 @@ module Xero
2
2
  module Models
3
3
  class BaseModel
4
4
  include ActiveAttr::Model
5
+ include ActiveAttr::Attributes
5
6
  include Xero::Associations
6
7
 
7
8
  class << self
@@ -13,12 +14,14 @@ module Xero
13
14
  attr_accessor :new_record, :client
14
15
 
15
16
  def initialize(attributes = {})
17
+ super(cleanup_hash(attributes))
16
18
  @new_record = true
17
- self.attributes = attributes
18
19
  end
19
20
 
20
21
  def attributes=(attrs)
21
- cleanup_hash(attrs).each { |key, value| send("#{key}=", value) }
22
+ cleanup_hash(attrs).each do |key, value|
23
+ send("#{key}=", value) unless value.blank?
24
+ end
22
25
  end
23
26
 
24
27
  def save
@@ -28,13 +31,14 @@ module Xero
28
31
 
29
32
  def xero_attributes(attrs = nil)
30
33
  attrs ||= attributes.clone
31
- attrs.delete('id')
34
+ id = attrs.delete('id')
32
35
  attrs.delete('updated_date_utc')
33
36
  attrs.keys.each do |key|
34
37
  value = attrs.delete(key)
35
38
  value = xero_attributes(value) if value.is_a?(Hash)
36
39
  attrs[key.to_s.camelize] = value.to_s unless value.blank?
37
40
  end
41
+ attrs.merge!("#{self.class.to_s.demodulize}ID" => id) unless id.blank?
38
42
  attrs
39
43
  end
40
44
 
@@ -24,6 +24,12 @@ module Xero
24
24
  has_many :phones
25
25
 
26
26
  validates :name, presence: true
27
+
28
+ def xero_attributes(attrs = nil)
29
+ attrs = super(attrs)
30
+ attrs.merge!('Addresses' => addresses.xero_attributes)
31
+ attrs
32
+ end
27
33
  end
28
34
  end
29
35
  end
@@ -8,7 +8,8 @@ module Xero
8
8
 
9
9
  attribute :type
10
10
  attribute :date, type: Date
11
- attribute :due_date, type: Date
11
+ attribute :due_date, type: Date, default:
12
+ lambda { Date.parse(Xero.configuration.invoice_due_days.days.from_now.to_s).to_s }
12
13
  attribute :line_amount_type
13
14
  attribute :invoice_number
14
15
  attribute :reference
@@ -38,13 +39,26 @@ module Xero
38
39
  validates :line_items, presence: true
39
40
 
40
41
  def to_xero_xml
41
- xero_attributes(attributes.clone).
42
- merge('Contact' => contact.xero_attributes).
43
- merge('LineItems' => line_items.xero_attributes).
44
- merge('Payments' => payments.xero_attributes).
45
- to_xml(root: 'Invoice')
42
+ xero_attributes(attributes.clone).tap do |attrs|
43
+ merge_contact(attrs) unless contact.blank?
44
+ merge_line_items(attrs) unless line_items.blank?
45
+ merge_payments(attrs) unless payments.blank?
46
+ end.to_xml(root: 'Invoice')
46
47
  end
47
48
 
49
+ private
50
+
51
+ def merge_contact(attrs)
52
+ attrs.merge!('Contact' => contact.xero_attributes)
53
+ end
54
+
55
+ def merge_line_items(attrs)
56
+ attrs.merge!('LineItems' => line_items.xero_attributes)
57
+ end
58
+
59
+ def merge_payments(attrs)
60
+ attrs.merge!('Payments' => payments.xero_attributes)
61
+ end
48
62
  end
49
63
  end
50
64
  end
@@ -9,17 +9,29 @@ module Xero
9
9
  attribute :updated_date_utc, type: DateTime
10
10
 
11
11
  validates :code, presence: true
12
- validates :purchase_details, presence: true
13
- validates :sales_details, presence: true
14
12
 
15
13
  has_one :purchase_details, class_name: :item_detail
16
14
  has_one :sales_details, class_name: :item_detail
17
15
 
16
+ has_many :line_items
17
+
18
18
  def to_xero_xml
19
- xero_attributes(attributes.clone).
20
- merge('PurchaseDetails' => self.purchase_details.xero_attributes).
21
- merge('SalesDetails' => self.sales_details.xero_attributes).
22
- to_xml(root: 'Item')
19
+ xero_attributes(attributes.clone).tap do |attrs|
20
+ merge_purchase_details(attrs) unless purchase_details.blank?
21
+ merge_sales_details(attrs) unless sales_details.blank?
22
+ end.to_xml(root: 'Item')
23
+ end
24
+
25
+ private
26
+
27
+ def merge_purchase_details(attrs)
28
+ attrs.merge!(
29
+ 'PurchaseDetails' => self.purchase_details.xero_attributes
30
+ )
31
+ end
32
+
33
+ def merge_sales_details(attrs)
34
+ attrs.merge!('SalesDetails' => self.sales_details.xero_attributes)
23
35
  end
24
36
  end
25
37
  end
@@ -7,10 +7,19 @@ module Xero
7
7
  attribute :unit_amount, type: Float
8
8
  attribute :account_code
9
9
 
10
- validates :description, presence: true
10
+ validates :description, presence: true, unless: :item
11
11
  validates :quantity, presence: true
12
- validates :unit_amount, presence: true
13
- validates :account_code, presence: true
12
+ validates :unit_amount, presence: true, unless: :item
13
+ validates :account_code, presence: true, unless: :item
14
+
15
+ belongs_to :invoice
16
+ belongs_to :item
17
+
18
+ def xero_attributes(attrs = nil)
19
+ attrs = super(attrs)
20
+ attrs.merge!('ItemCode' => item.code) if item
21
+ attrs
22
+ end
14
23
  end
15
24
  end
16
25
  end
data/lib/xero/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Xero
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -167,18 +167,32 @@ describe Xero::Clients::PrivateApplication do
167
167
  )
168
168
  end
169
169
 
170
+ let(:address) do
171
+ Xero::Models::Address.new(
172
+ address_type: 'STREET', address_line1: Faker::Address.street_address,
173
+ city: Faker::Address.city, region: Faker::Address.state,
174
+ postal_code: Faker::Address.zip_code, country: 'Germany'
175
+ )
176
+ end
177
+
170
178
  let(:contact) do
171
- Xero::Models::Contact.new(name: 'Xero Gem Test Contact')
179
+ Xero::Models::Contact.new(
180
+ name: 'Xero Gem Test Contact', addresses: [address]
181
+ )
172
182
  end
173
183
 
174
184
  let(:line_items) { [line_item] }
175
185
 
176
186
  let(:line_item) do
177
187
  Xero::Models::LineItem.new(
178
- description: 'A test line item from the xero gem',
179
- quantity: 2.0,
180
- unit_amount: 150.5,
181
- account_code: 200
188
+ quantity: 2.0, item: item, description: 'asdfsdafdf'
189
+ )
190
+ end
191
+
192
+ let(:item) do
193
+ Xero::Models::Item.new(
194
+ code: 'stepstone', description: 'some bullshit description',
195
+ id: '99213658-83c4-438a-b104-1172b1e69790'
182
196
  )
183
197
  end
184
198
 
@@ -2,9 +2,19 @@ require 'spec_helper'
2
2
 
3
3
  describe Xero::Models::Invoice do
4
4
 
5
+ before { configure }
6
+
5
7
  it { should validate_presence_of(:type) }
6
8
 
7
9
  it { should validate_presence_of(:contact) }
8
10
 
9
11
  it { should validate_presence_of(:line_items) }
12
+
13
+ describe 'defaults' do
14
+ let(:invoice) { Xero::Models::Invoice.new }
15
+
16
+ it 'should default due date to 30 days from now' do
17
+ invoice.due_date.to_s.should eql(Date.parse(30.days.from_now.to_s).to_s)
18
+ end
19
+ end
10
20
  end
@@ -35,14 +35,6 @@ describe Xero::Models::Item do
35
35
  subject.should match(/SalesDetails/)
36
36
  end
37
37
 
38
- it 'should not include the id' do
39
- subject.should_not match(/ItemId/)
40
- end
41
-
42
- it 'should not include the id value' do
43
- subject.should_not match(/34b3fc86\-483e\-4112\-8106\-9b23d36f925c/)
44
- end
45
-
46
38
  it 'should include the code' do
47
39
  subject.should match(/Code/)
48
40
  end
@@ -9,4 +9,22 @@ describe Xero::Models::LineItem do
9
9
  it { should validate_presence_of(:unit_amount) }
10
10
 
11
11
  it { should validate_presence_of(:account_code) }
12
+
13
+ context 'when item is set' do
14
+ let(:line_item) do
15
+ Xero::Models::LineItem.new(item: Xero::Models::Item.new)
16
+ end
17
+
18
+ it 'should not require description' do
19
+ line_item.should_not validate_presence_of(:description)
20
+ end
21
+
22
+ it 'should not require unit amount' do
23
+ line_item.should_not validate_presence_of(:unit_amount)
24
+ end
25
+
26
+ it 'should not require account code' do
27
+ line_item.should_not validate_presence_of(:account_code)
28
+ end
29
+ end
12
30
  end
data/spec/spec_helper.rb CHANGED
@@ -7,6 +7,7 @@
7
7
 
8
8
  require 'active_attr/rspec'
9
9
  require 'bundler/setup'
10
+ require 'faker'
10
11
  require 'xero'
11
12
  require 'rubygems'
12
13
  require 'shoulda-matchers'
@@ -1,9 +1,13 @@
1
1
  module Helpers
2
2
  def configure
3
+ logger = Logger.new(STDOUT)
4
+ logger.level = Logger::INFO
5
+
3
6
  Xero.configure do |config|
4
7
  config.consumer_key = 'TYMATGTPO5QEAWP8I307AOMBHSOJI2'
5
8
  config.consumer_secret = 'VWZPP3PBRGERW7UFSULKZMBRZDRXIM'
6
9
  config.private_key_path = 'spec/support/privatekey.pem'
10
+ config.logger = logger
7
11
  end
8
12
  end
9
13
  end
@@ -5,7 +5,7 @@ http_interactions:
5
5
  uri: https://api.xero.com/api.xro/2.0/Invoices
6
6
  body:
7
7
  encoding: US-ASCII
8
- string: xml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3CInvoice%3E%0A%20%20%3CType%3EACCREC%3C%2FType%3E%0A%20%20%3CContact%3E%0A%20%20%20%20%3CName%3EXero%20Gem%20Test%20Contact%3C%2FName%3E%0A%20%20%3C%2FContact%3E%0A%20%20%3CLineItems%20type%3D%22array%22%3E%0A%20%20%20%20%3CLineItem%3E%0A%20%20%20%20%20%20%3CDescription%3EA%20test%20line%20item%20from%20the%20xero%20gem%3C%2FDescription%3E%0A%20%20%20%20%20%20%3CQuantity%3E2.0%3C%2FQuantity%3E%0A%20%20%20%20%20%20%3CUnitAmount%3E150.5%3C%2FUnitAmount%3E%0A%20%20%20%20%20%20%3CAccountCode%3E200%3C%2FAccountCode%3E%0A%20%20%20%20%3C%2FLineItem%3E%0A%20%20%3C%2FLineItems%3E%0A%20%20%3CPayments%20type%3D%22array%22%2F%3E%0A%3C%2FInvoice%3E%0A
8
+ string: xml=%3C%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%3F%3E%0A%3CInvoice%3E%0A%20%20%3CType%3EACCREC%3C%2FType%3E%0A%20%20%3CContact%3E%0A%20%20%20%20%3CName%3EXero%20Gem%20Test%20Contact%3C%2FName%3E%0A%20%20%20%20%3CAddresses%20type%3D%22array%22%3E%0A%20%20%20%20%20%20%3CAddress%3E%0A%20%20%20%20%20%20%20%20%3CAddressType%3ESTREET%3C%2FAddressType%3E%0A%20%20%20%20%20%20%20%20%3CAddressLine1%3E1684%20Schuster%20Ferry%3C%2FAddressLine1%3E%0A%20%20%20%20%20%20%20%20%3CCity%3EJewessview%3C%2FCity%3E%0A%20%20%20%20%20%20%20%20%3CRegion%3EFlorida%3C%2FRegion%3E%0A%20%20%20%20%20%20%20%20%3CPostalCode%3E61960%3C%2FPostalCode%3E%0A%20%20%20%20%20%20%20%20%3CCountry%3EGermany%3C%2FCountry%3E%0A%20%20%20%20%20%20%3C%2FAddress%3E%0A%20%20%20%20%3C%2FAddresses%3E%0A%20%20%3C%2FContact%3E%0A%20%20%3CLineItems%20type%3D%22array%22%3E%0A%20%20%20%20%3CLineItem%3E%0A%20%20%20%20%20%20%3CDescription%3Easdfsdafdf%3C%2FDescription%3E%0A%20%20%20%20%20%20%3CQuantity%3E2.0%3C%2FQuantity%3E%0A%20%20%20%20%20%20%3CItemCode%3Estepstone%3C%2FItemCode%3E%0A%20%20%20%20%3C%2FLineItem%3E%0A%20%20%3C%2FLineItems%3E%0A%3C%2FInvoice%3E%0A
9
9
  headers:
10
10
  charset:
11
11
  - utf-8
@@ -18,9 +18,9 @@ http_interactions:
18
18
  content-type:
19
19
  - application/x-www-form-urlencoded
20
20
  authorization:
21
- - OAuth oauth_consumer_key="TYMATGTPO5QEAWP8I307AOMBHSOJI2", oauth_nonce="op3Dhu2katMP8le9vB7p3vC1UHIJPHjNmMSZD3RYJ4",
22
- oauth_signature="XDBdEuzFijTwE68oekbRE%2BArEv0gt13xMS6izN7qkCf4s6BuRt%2FtIjFKPCHsDXBfaPS%2FVykUTG77PNvvciWc7ImNQv5c23Gm7Mrvtkzw3aH1g%2Fd75QknBp%2FBo8Ik80Rn87Ug3NgKTCCgzlXe7uJ5Nvps02E7LLsb2uWd4nLyEQA%3D",
23
- oauth_signature_method="RSA-SHA1", oauth_timestamp="1351978764", oauth_token="TYMATGTPO5QEAWP8I307AOMBHSOJI2",
21
+ - OAuth oauth_consumer_key="TYMATGTPO5QEAWP8I307AOMBHSOJI2", oauth_nonce="UspJpriFboClY5jaVCE1tcEaoeKcmq2B0KhVvA",
22
+ oauth_signature="3KLWj2gbnpIWD8RKLc9Bn52wl48OsNRvvU3gwMeHAJZkc5QZjevSg000eFMOn8f95hnn5oWTkS84EtBBkO9FC2iYimgnbLeHko9WeSsVCSQDgOlrXk2wzF0YmX06nVtOct4bhJOs0Wr8SzzZIvz0THrmK2F1PV2FYdP3yV25578%3D",
23
+ oauth_signature_method="RSA-SHA1", oauth_timestamp="1352106612", oauth_token="TYMATGTPO5QEAWP8I307AOMBHSOJI2",
24
24
  oauth_version="1.0"
25
25
  response:
26
26
  status:
@@ -44,40 +44,43 @@ http_interactions:
44
44
  x-powered-by:
45
45
  - ASP.NET
46
46
  date:
47
- - Sat, 03 Nov 2012 21:39:22 GMT
47
+ - Mon, 05 Nov 2012 09:10:14 GMT
48
48
  connection:
49
49
  - close
50
50
  content-length:
51
- - '2343'
51
+ - '2588'
52
52
  body:
53
53
  encoding: US-ASCII
54
54
  string: ! "<Response xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n
55
- \ <Id>5321e06c-062f-4b99-9fe5-e48b56e04c5a</Id>\r\n <Status>OK</Status>\r\n
56
- \ <ProviderName>GoHiring</ProviderName>\r\n <DateTimeUTC>2012-11-03T21:39:22.937917Z</DateTimeUTC>\r\n
55
+ \ <Id>8f83bc92-52f5-47b0-ae93-e2db97205cb4</Id>\r\n <Status>OK</Status>\r\n
56
+ \ <ProviderName>GoHiring</ProviderName>\r\n <DateTimeUTC>2012-11-05T09:10:14.8934283Z</DateTimeUTC>\r\n
57
57
  \ <Invoices>\r\n <Invoice>\r\n <Contact>\r\n <ContactID>a18c8d85-7ac1-4f14-b470-50adf56ee45f</ContactID>\r\n
58
58
  \ <ContactStatus>ACTIVE</ContactStatus>\r\n <Name>Xero Gem Test
59
59
  Contact</Name>\r\n <Addresses>\r\n <Address>\r\n <AddressType>POBOX</AddressType>\r\n
60
60
  \ </Address>\r\n <Address>\r\n <AddressType>STREET</AddressType>\r\n
61
- \ </Address>\r\n </Addresses>\r\n <Phones>\r\n <Phone>\r\n
62
- \ <PhoneType>DDI</PhoneType>\r\n </Phone>\r\n <Phone>\r\n
63
- \ <PhoneType>MOBILE</PhoneType>\r\n </Phone>\r\n <Phone>\r\n
64
- \ <PhoneType>FAX</PhoneType>\r\n </Phone>\r\n <Phone>\r\n
65
- \ <PhoneType>DEFAULT</PhoneType>\r\n </Phone>\r\n </Phones>\r\n
66
- \ <UpdatedDateUTC>2012-11-03T21:39:17.313</UpdatedDateUTC>\r\n <IsSupplier>false</IsSupplier>\r\n
67
- \ <IsCustomer>true</IsCustomer>\r\n </Contact>\r\n <Date>2012-11-03T00:00:00</Date>\r\n
68
- \ <Status>DRAFT</Status>\r\n <LineAmountTypes>Exclusive</LineAmountTypes>\r\n
69
- \ <LineItems>\r\n <LineItem>\r\n <Description>A test line
70
- item from the xero gem</Description>\r\n <UnitAmount>150.50</UnitAmount>\r\n
71
- \ <TaxType>OUTPUT</TaxType>\r\n <TaxAmount>0.00</TaxAmount>\r\n
72
- \ <LineAmount>301.00</LineAmount>\r\n <AccountCode>200</AccountCode>\r\n
61
+ \ <AddressLine1>1684 Schuster Ferry</AddressLine1>\r\n <City>Jewessview</City>\r\n
62
+ \ <Region>Florida</Region>\r\n <PostalCode>61960</PostalCode>\r\n
63
+ \ <Country>Germany</Country>\r\n </Address>\r\n </Addresses>\r\n
64
+ \ <Phones>\r\n <Phone>\r\n <PhoneType>DDI</PhoneType>\r\n
65
+ \ </Phone>\r\n <Phone>\r\n <PhoneType>MOBILE</PhoneType>\r\n
66
+ \ </Phone>\r\n <Phone>\r\n <PhoneType>FAX</PhoneType>\r\n
67
+ \ </Phone>\r\n <Phone>\r\n <PhoneType>DEFAULT</PhoneType>\r\n
68
+ \ </Phone>\r\n </Phones>\r\n <UpdatedDateUTC>2012-11-05T09:10:14.72</UpdatedDateUTC>\r\n
69
+ \ <IsSupplier>false</IsSupplier>\r\n <IsCustomer>true</IsCustomer>\r\n
70
+ \ </Contact>\r\n <Date>2012-11-05T00:00:00</Date>\r\n <Status>DRAFT</Status>\r\n
71
+ \ <LineAmountTypes>Exclusive</LineAmountTypes>\r\n <LineItems>\r\n
72
+ \ <LineItem>\r\n <Description>asdfsdafdf</Description>\r\n
73
+ \ <UnitAmount>1095.00</UnitAmount>\r\n <TaxType>OUTPUT</TaxType>\r\n
74
+ \ <TaxAmount>0.00</TaxAmount>\r\n <LineAmount>2190.00</LineAmount>\r\n
75
+ \ <AccountCode>200</AccountCode>\r\n <ItemCode>stepstone</ItemCode>\r\n
73
76
  \ <Quantity>2.0000</Quantity>\r\n </LineItem>\r\n </LineItems>\r\n
74
- \ <SubTotal>301.00</SubTotal>\r\n <TotalTax>0.00</TotalTax>\r\n <Total>301.00</Total>\r\n
75
- \ <UpdatedDateUTC>2012-11-03T21:39:22.89</UpdatedDateUTC>\r\n <CurrencyCode>EUR</CurrencyCode>\r\n
76
- \ <Type>ACCREC</Type>\r\n <InvoiceID>22f90b95-d952-4664-88f9-06900af307e5</InvoiceID>\r\n
77
- \ <InvoiceNumber>INV-0003</InvoiceNumber>\r\n <AmountDue>301.00</AmountDue>\r\n
77
+ \ <SubTotal>2190.00</SubTotal>\r\n <TotalTax>0.00</TotalTax>\r\n
78
+ \ <Total>2190.00</Total>\r\n <UpdatedDateUTC>2012-11-05T09:10:14.753</UpdatedDateUTC>\r\n
79
+ \ <CurrencyCode>EUR</CurrencyCode>\r\n <Type>ACCREC</Type>\r\n <InvoiceID>de3b19f2-1ed0-4eca-aec2-6d1d247a0bd7</InvoiceID>\r\n
80
+ \ <InvoiceNumber>INV-0005</InvoiceNumber>\r\n <AmountDue>2190.00</AmountDue>\r\n
78
81
  \ <AmountPaid>0.00</AmountPaid>\r\n <SentToContact>false</SentToContact>\r\n
79
82
  \ <CurrencyRate>1.000000</CurrencyRate>\r\n <HasAttachments>false</HasAttachments>\r\n
80
83
  \ </Invoice>\r\n </Invoices>\r\n</Response>"
81
84
  http_version: '1.1'
82
- recorded_at: Sat, 03 Nov 2012 21:39:27 GMT
85
+ recorded_at: Mon, 05 Nov 2012 09:10:15 GMT
83
86
  recorded_with: VCR 2.2.5
data/xero.gemspec CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |gem|
20
20
  gem.add_dependency('active_attr')
21
21
  gem.add_dependency('oauth')
22
22
 
23
+ gem.add_development_dependency('faker')
23
24
  gem.add_development_dependency('fakeweb')
24
25
  gem.add_development_dependency('guard')
25
26
  gem.add_development_dependency('guard-rspec')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-04 00:00:00.000000000 Z
12
+ date: 2012-11-05 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: active_attr
@@ -43,6 +43,22 @@ dependencies:
43
43
  - - ! '>='
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: faker
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
46
62
  - !ruby/object:Gem::Dependency
47
63
  name: fakeweb
48
64
  requirement: !ruby/object:Gem::Requirement