xero 0.0.6 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 3a6709590e45fb8983ef2f6ecaa194745c52f495
4
+ data.tar.gz: 934906f3430f1ce438e5e8d38886ff691ad59d16
5
+ SHA512:
6
+ metadata.gz: 1582a31370715524cfe8cd62bcefa74fdef67d17936118f644f57dc6c5010a566ee149b8695af439253638c294a684172664f1b0b7bcbe8da30d5a6b7cf068f5
7
+ data.tar.gz: bfb845ce8ce89f101e436c1d0b6c6e2739595a5b014a76fe8e8b0ebe6b7fe52d0dd11119a2d90438678353453411893afd430fb6a108ba2b698ee42dd87e0690
@@ -12,6 +12,7 @@ require 'xero/clients/partner_application'
12
12
  require 'xero/clients/private_application'
13
13
  require 'xero/configuration'
14
14
  require 'xero/connection'
15
+ require 'xero/errors/bad_request'
15
16
  require 'xero/models/base_model'
16
17
  require 'xero/models/account'
17
18
  require 'xero/models/address'
@@ -60,11 +60,22 @@ module Xero
60
60
  "XERO::Connection RESPONSE code: #{response} body: #{response.body}"
61
61
  )
62
62
 
63
- handle_response(response)
63
+ handle_response(params, response)
64
64
  end
65
65
 
66
- def handle_response(response)
67
- response
66
+ def handle_response(request, response)
67
+ if response.code.to_i == 200
68
+ response
69
+ else
70
+ handle_error(request, response)
71
+ end
72
+ end
73
+
74
+ def handle_error(request, response)
75
+ case response.code.to_i
76
+ when 400
77
+ raise Xero::Errors::BadRequest.new(request, response.body)
78
+ end
68
79
  end
69
80
  end
70
81
  end
@@ -0,0 +1,23 @@
1
+ module Xero
2
+ module Errors
3
+ class BadRequest < StandardError
4
+
5
+ attr_reader :request_xml, :response_xml, :type, :message
6
+
7
+ def initialize(request_xml, response_xml)
8
+ @request_xml = request_xml
9
+ @response_xml = response_xml
10
+ Hash.from_xml(response_xml).tap do |data|
11
+ @type = data['ApiException']['Type']
12
+ @message = data['ApiException']['Message']
13
+ @error_number = data['ApiException']['ErrorNumber']
14
+ end
15
+ self
16
+ end
17
+
18
+ def message
19
+ "#{@type}: #{@message}"
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,3 +1,3 @@
1
1
  module Xero
2
- VERSION = "0.0.6"
2
+ VERSION = '0.0.7'
3
3
  end
@@ -210,6 +210,20 @@ describe Xero::Clients::PrivateApplication do
210
210
  end
211
211
  end
212
212
 
213
+ context 'when saving an invalid invoice' do
214
+ before { configure }
215
+
216
+ let(:invoice) { Xero::Models::Invoice.new }
217
+
218
+ let(:response) do
219
+ VCR.use_cassette('save_invalid_invoice') { client.save(invoice) }
220
+ end
221
+
222
+ it 'should raise a BadRequest exception' do
223
+ expect { response }.to raise_error(Xero::Errors::BadRequest)
224
+ end
225
+ end
226
+
213
227
  describe '#get_item' do
214
228
 
215
229
  before { configure }
@@ -0,0 +1,76 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.xero.com/api.xro/2.0/Invoices
6
+ body:
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%3CDueDate%3E2012-12-12%3C%2FDueDate%3E%0A%3C%2FInvoice%3E%0A
9
+ headers:
10
+ charset:
11
+ - utf-8
12
+ accept:
13
+ - ! '*/*'
14
+ user-agent:
15
+ - OAuth gem v0.4.7
16
+ content-length:
17
+ - '0'
18
+ content-type:
19
+ - application/x-www-form-urlencoded
20
+ authorization:
21
+ - OAuth oauth_consumer_key="TYMATGTPO5QEAWP8I307AOMBHSOJI2", oauth_nonce="knfwvngQrAeAmKXDXHWBeRzQnNbYvrk3IF2i5SmPCqY",
22
+ oauth_signature="uUJ1Ni0IiEz42VbQ7A1g6HwrNbA2gjir8l9gbikJju%2BOiBmPJz7d2DUTHMiFc5l%2B7gKT6NwXVWOsETu8FN1vzGC5e9InIYPJMU27Cf5Yw1T1jirSo7R595wrb%2Ffcyi6BytVL4Q0xeZOFFj2LcxbpzJhN4IKaCGRE%2BwKae4w5H%2Fg%3D",
23
+ oauth_signature_method="RSA-SHA1", oauth_timestamp="1352748950", oauth_token="TYMATGTPO5QEAWP8I307AOMBHSOJI2",
24
+ oauth_version="1.0"
25
+ response:
26
+ status:
27
+ code: 400
28
+ message: Bad Request
29
+ headers:
30
+ cache-control:
31
+ - private
32
+ content-type:
33
+ - text/xml; charset=utf-8
34
+ server:
35
+ - Microsoft-IIS/7.0
36
+ x-aspnetmvc-version:
37
+ - '2.0'
38
+ www-authenticate:
39
+ - OAuth Realm="api.xero.com"
40
+ x-aspnet-version:
41
+ - 4.0.30319
42
+ x-s:
43
+ - api2
44
+ x-powered-by:
45
+ - ASP.NET
46
+ date:
47
+ - Mon, 12 Nov 2012 19:35:56 GMT
48
+ connection:
49
+ - close
50
+ content-length:
51
+ - '1666'
52
+ body:
53
+ encoding: US-ASCII
54
+ string: ! "<ApiException xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\r\n
55
+ \ <ErrorNumber>10</ErrorNumber>\r\n <Type>ValidationException</Type>\r\n
56
+ \ <Message>A validation exception occurred</Message>\r\n <Elements>\r\n <DataContractBase
57
+ xsi:type=\"Invoice\">\r\n <ValidationErrors>\r\n <ValidationError>\r\n
58
+ \ <Message>One or more line items must be specified</Message>\r\n
59
+ \ </ValidationError>\r\n <ValidationError>\r\n <Message>Invoice
60
+ Type must be specified</Message>\r\n </ValidationError>\r\n <ValidationError>\r\n
61
+ \ <Message>A Contact must be specified for this type of transaction</Message>\r\n
62
+ \ </ValidationError>\r\n </ValidationErrors>\r\n <Warnings
63
+ />\r\n <Date>2012-11-12T00:00:00</Date>\r\n <DueDate>2012-12-12T00:00:00</DueDate>\r\n
64
+ \ <BrandingThemeID xsi:nil=\"true\" />\r\n <Status>DRAFT</Status>\r\n
65
+ \ <LineAmountTypes>Exclusive</LineAmountTypes>\r\n <LineItems />\r\n
66
+ \ <SubTotal>0.00</SubTotal>\r\n <TotalTax>0.00</TotalTax>\r\n <Total>0.00</Total>\r\n
67
+ \ <UpdatedDateUTC xsi:nil=\"true\" />\r\n <CurrencyCode>EUR</CurrencyCode>\r\n
68
+ \ <FullyPaidOnDate xsi:nil=\"true\" />\r\n <InvoiceID>00000000-0000-0000-0000-000000000000</InvoiceID>\r\n
69
+ \ <Payments />\r\n <CreditNotes />\r\n <AmountDue xsi:nil=\"true\"
70
+ />\r\n <AmountPaid xsi:nil=\"true\" />\r\n <AmountCredited xsi:nil=\"true\"
71
+ />\r\n <SentToContact xsi:nil=\"true\" />\r\n <CurrencyRate xsi:nil=\"true\"
72
+ />\r\n <TotalDiscount xsi:nil=\"true\" />\r\n <HasAttachments>false</HasAttachments>\r\n
73
+ \ <Attachments />\r\n </DataContractBase>\r\n </Elements>\r\n</ApiException>"
74
+ http_version: '1.1'
75
+ recorded_at: Mon, 12 Nov 2012 19:35:53 GMT
76
+ recorded_with: VCR 2.2.5
@@ -27,6 +27,7 @@ Gem::Specification.new do |gem|
27
27
  gem.add_development_dependency('guard-rspec')
28
28
  gem.add_development_dependency('rb-fsevent')
29
29
  gem.add_development_dependency('rspec')
30
+ gem.add_development_dependency('rspec-spies')
30
31
  gem.add_development_dependency('shoulda-matchers')
31
32
  gem.add_development_dependency('vcr')
32
33
  end
metadata CHANGED
@@ -1,190 +1,181 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xero
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
5
- prerelease:
4
+ version: 0.0.7
6
5
  platform: ruby
7
6
  authors:
8
7
  - Matt Beedle
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-11-06 00:00:00.000000000 Z
11
+ date: 2013-04-17 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: active_attr
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - '>='
20
18
  - !ruby/object:Gem::Version
21
19
  version: '0'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - '>='
28
25
  - !ruby/object:Gem::Version
29
26
  version: '0'
30
27
  - !ruby/object:Gem::Dependency
31
28
  name: activesupport
32
29
  requirement: !ruby/object:Gem::Requirement
33
- none: false
34
30
  requirements:
35
- - - ! '>='
31
+ - - '>='
36
32
  - !ruby/object:Gem::Version
37
33
  version: '0'
38
34
  type: :runtime
39
35
  prerelease: false
40
36
  version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
37
  requirements:
43
- - - ! '>='
38
+ - - '>='
44
39
  - !ruby/object:Gem::Version
45
40
  version: '0'
46
41
  - !ruby/object:Gem::Dependency
47
42
  name: oauth
48
43
  requirement: !ruby/object:Gem::Requirement
49
- none: false
50
44
  requirements:
51
- - - ! '>='
45
+ - - '>='
52
46
  - !ruby/object:Gem::Version
53
47
  version: '0'
54
48
  type: :runtime
55
49
  prerelease: false
56
50
  version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
51
  requirements:
59
- - - ! '>='
52
+ - - '>='
60
53
  - !ruby/object:Gem::Version
61
54
  version: '0'
62
55
  - !ruby/object:Gem::Dependency
63
56
  name: faker
64
57
  requirement: !ruby/object:Gem::Requirement
65
- none: false
66
58
  requirements:
67
- - - ! '>='
59
+ - - '>='
68
60
  - !ruby/object:Gem::Version
69
61
  version: '0'
70
62
  type: :development
71
63
  prerelease: false
72
64
  version_requirements: !ruby/object:Gem::Requirement
73
- none: false
74
65
  requirements:
75
- - - ! '>='
66
+ - - '>='
76
67
  - !ruby/object:Gem::Version
77
68
  version: '0'
78
69
  - !ruby/object:Gem::Dependency
79
70
  name: fakeweb
80
71
  requirement: !ruby/object:Gem::Requirement
81
- none: false
82
72
  requirements:
83
- - - ! '>='
73
+ - - '>='
84
74
  - !ruby/object:Gem::Version
85
75
  version: '0'
86
76
  type: :development
87
77
  prerelease: false
88
78
  version_requirements: !ruby/object:Gem::Requirement
89
- none: false
90
79
  requirements:
91
- - - ! '>='
80
+ - - '>='
92
81
  - !ruby/object:Gem::Version
93
82
  version: '0'
94
83
  - !ruby/object:Gem::Dependency
95
84
  name: guard
96
85
  requirement: !ruby/object:Gem::Requirement
97
- none: false
98
86
  requirements:
99
- - - ! '>='
87
+ - - '>='
100
88
  - !ruby/object:Gem::Version
101
89
  version: '0'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
- none: false
106
93
  requirements:
107
- - - ! '>='
94
+ - - '>='
108
95
  - !ruby/object:Gem::Version
109
96
  version: '0'
110
97
  - !ruby/object:Gem::Dependency
111
98
  name: guard-rspec
112
99
  requirement: !ruby/object:Gem::Requirement
113
- none: false
114
100
  requirements:
115
- - - ! '>='
101
+ - - '>='
116
102
  - !ruby/object:Gem::Version
117
103
  version: '0'
118
104
  type: :development
119
105
  prerelease: false
120
106
  version_requirements: !ruby/object:Gem::Requirement
121
- none: false
122
107
  requirements:
123
- - - ! '>='
108
+ - - '>='
124
109
  - !ruby/object:Gem::Version
125
110
  version: '0'
126
111
  - !ruby/object:Gem::Dependency
127
112
  name: rb-fsevent
128
113
  requirement: !ruby/object:Gem::Requirement
129
- none: false
130
114
  requirements:
131
- - - ! '>='
115
+ - - '>='
132
116
  - !ruby/object:Gem::Version
133
117
  version: '0'
134
118
  type: :development
135
119
  prerelease: false
136
120
  version_requirements: !ruby/object:Gem::Requirement
137
- none: false
138
121
  requirements:
139
- - - ! '>='
122
+ - - '>='
140
123
  - !ruby/object:Gem::Version
141
124
  version: '0'
142
125
  - !ruby/object:Gem::Dependency
143
126
  name: rspec
144
127
  requirement: !ruby/object:Gem::Requirement
145
- none: false
146
128
  requirements:
147
- - - ! '>='
129
+ - - '>='
148
130
  - !ruby/object:Gem::Version
149
131
  version: '0'
150
132
  type: :development
151
133
  prerelease: false
152
134
  version_requirements: !ruby/object:Gem::Requirement
153
- none: false
154
135
  requirements:
155
- - - ! '>='
136
+ - - '>='
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rspec-spies
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - '>='
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - '>='
156
151
  - !ruby/object:Gem::Version
157
152
  version: '0'
158
153
  - !ruby/object:Gem::Dependency
159
154
  name: shoulda-matchers
160
155
  requirement: !ruby/object:Gem::Requirement
161
- none: false
162
156
  requirements:
163
- - - ! '>='
157
+ - - '>='
164
158
  - !ruby/object:Gem::Version
165
159
  version: '0'
166
160
  type: :development
167
161
  prerelease: false
168
162
  version_requirements: !ruby/object:Gem::Requirement
169
- none: false
170
163
  requirements:
171
- - - ! '>='
164
+ - - '>='
172
165
  - !ruby/object:Gem::Version
173
166
  version: '0'
174
167
  - !ruby/object:Gem::Dependency
175
168
  name: vcr
176
169
  requirement: !ruby/object:Gem::Requirement
177
- none: false
178
170
  requirements:
179
- - - ! '>='
171
+ - - '>='
180
172
  - !ruby/object:Gem::Version
181
173
  version: '0'
182
174
  type: :development
183
175
  prerelease: false
184
176
  version_requirements: !ruby/object:Gem::Requirement
185
- none: false
186
177
  requirements:
187
- - - ! '>='
178
+ - - '>='
188
179
  - !ruby/object:Gem::Version
189
180
  version: '0'
190
181
  description: Library for communicating with the xero API
@@ -213,6 +204,7 @@ files:
213
204
  - lib/xero/clients/private_application.rb
214
205
  - lib/xero/configuration.rb
215
206
  - lib/xero/connection.rb
207
+ - lib/xero/errors/bad_request.rb
216
208
  - lib/xero/models/account.rb
217
209
  - lib/xero/models/address.rb
218
210
  - lib/xero/models/base_model.rb
@@ -251,31 +243,31 @@ files:
251
243
  - spec/vcr_cassettes/get_item.yml
252
244
  - spec/vcr_cassettes/get_items.yml
253
245
  - spec/vcr_cassettes/invoices.yml
246
+ - spec/vcr_cassettes/save_invalid_invoice.yml
254
247
  - spec/vcr_cassettes/save_invoice.yml
255
248
  - xero.gemspec
256
249
  homepage: https://github.com/mattbeedle/xero
257
250
  licenses: []
251
+ metadata: {}
258
252
  post_install_message:
259
253
  rdoc_options: []
260
254
  require_paths:
261
255
  - lib
262
256
  required_ruby_version: !ruby/object:Gem::Requirement
263
- none: false
264
257
  requirements:
265
- - - ! '>='
258
+ - - '>='
266
259
  - !ruby/object:Gem::Version
267
260
  version: '0'
268
261
  required_rubygems_version: !ruby/object:Gem::Requirement
269
- none: false
270
262
  requirements:
271
- - - ! '>='
263
+ - - '>='
272
264
  - !ruby/object:Gem::Version
273
265
  version: '0'
274
266
  requirements: []
275
267
  rubyforge_project:
276
- rubygems_version: 1.8.24
268
+ rubygems_version: 2.0.3
277
269
  signing_key:
278
- specification_version: 3
270
+ specification_version: 4
279
271
  summary: Library for communicating with the xero API
280
272
  test_files:
281
273
  - spec/lib/xero/client_spec.rb
@@ -303,4 +295,5 @@ test_files:
303
295
  - spec/vcr_cassettes/get_item.yml
304
296
  - spec/vcr_cassettes/get_items.yml
305
297
  - spec/vcr_cassettes/invoices.yml
298
+ - spec/vcr_cassettes/save_invalid_invoice.yml
306
299
  - spec/vcr_cassettes/save_invoice.yml