fastbill-automatic 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (46) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.rspec +1 -0
  4. data/Gemfile +8 -0
  5. data/LICENSE +23 -0
  6. data/README.md +203 -0
  7. data/Rakefile +8 -0
  8. data/doc/API-Doku_FBA_V1-8.pdf +0 -0
  9. data/fastbill-automatic.gemspec +20 -0
  10. data/lib/data/fastbill.crt +17 -0
  11. data/lib/fastbill-automatic/article.rb +14 -0
  12. data/lib/fastbill-automatic/base.rb +35 -0
  13. data/lib/fastbill-automatic/coupon.rb +12 -0
  14. data/lib/fastbill-automatic/customer.rb +16 -0
  15. data/lib/fastbill-automatic/invoice.rb +25 -0
  16. data/lib/fastbill-automatic/item.rb +10 -0
  17. data/lib/fastbill-automatic/request/base.rb +36 -0
  18. data/lib/fastbill-automatic/request/connection.rb +37 -0
  19. data/lib/fastbill-automatic/request/info.rb +32 -0
  20. data/lib/fastbill-automatic/request/validator.rb +33 -0
  21. data/lib/fastbill-automatic/services/cancel.rb +22 -0
  22. data/lib/fastbill-automatic/services/changearticle.rb +19 -0
  23. data/lib/fastbill-automatic/services/complete.rb +22 -0
  24. data/lib/fastbill-automatic/services/create.rb +19 -0
  25. data/lib/fastbill-automatic/services/delete.rb +22 -0
  26. data/lib/fastbill-automatic/services/delete_item.rb +21 -0
  27. data/lib/fastbill-automatic/services/get.rb +28 -0
  28. data/lib/fastbill-automatic/services/sendbyemail.rb +19 -0
  29. data/lib/fastbill-automatic/services/sendbypost.rb +22 -0
  30. data/lib/fastbill-automatic/services/setaddon.rb +19 -0
  31. data/lib/fastbill-automatic/services/setpaid.rb +19 -0
  32. data/lib/fastbill-automatic/services/setusagedata.rb +21 -0
  33. data/lib/fastbill-automatic/services/sign.rb +22 -0
  34. data/lib/fastbill-automatic/services/update.rb +28 -0
  35. data/lib/fastbill-automatic/subscription.rb +16 -0
  36. data/lib/fastbill-automatic/template.rb +12 -0
  37. data/lib/fastbill-automatic/usage_data.rb +171 -0
  38. data/lib/fastbill-automatic/version.rb +5 -0
  39. data/lib/fastbill-automatic.rb +93 -0
  40. data/spec/fastbill-automatic/base_spec.rb +35 -0
  41. data/spec/fastbill-automatic/customer_spec.rb +100 -0
  42. data/spec/fastbill-automatic/subscription_spec.rb +61 -0
  43. data/spec/fastbill-automatic/usage_data_spec.rb +340 -0
  44. data/spec/fastbill-automatic_spec.rb +37 -0
  45. data/spec/spec_helper.rb +10 -0
  46. metadata +116 -0
@@ -0,0 +1,61 @@
1
+ require "spec_helper"
2
+
3
+ describe Fastbill::Automatic::Subscription do
4
+
5
+ let(:valid_attributes) do
6
+ {
7
+ subscription_id: 285664,
8
+ subscription_ext_uid: "",
9
+ hash: "178cdae035d59c637318bf808e78bad3",
10
+ article_code: "1004",
11
+ quantity: "1",
12
+ start_date: "2014-06-16 16:07:57",
13
+ last_event: "2014-06-16 16:07:58",
14
+ next_event: "2014-06-17 16:07:58",
15
+ cancellation_date: "0000-00-00 00:00:00",
16
+ status: "trial",
17
+ expiration_date: "2014-06-17 16:07:58",
18
+ addons: [{article_code: "2101", quantity: "1"}, {article_code: "2001", quantity: "1"}],
19
+ created: "2014-06-16 16:07:59"
20
+ }
21
+
22
+ end
23
+
24
+ let (:subscription) do
25
+ Fastbill::Automatic::Subscription.new(valid_attributes)
26
+ end
27
+
28
+ describe "#initialize" do
29
+
30
+ it "initializes all attributes correctly" do
31
+ subscription.subscription_id.should eql(285664)
32
+ subscription.subscription_ext_uid.should eql("")
33
+ subscription.article_code.should eql("1004")
34
+ subscription.quantity.should eql("1")
35
+ subscription.start_date.should eql("2014-06-16 16:07:57")
36
+ subscription.last_event.should eql("2014-06-16 16:07:58")
37
+ subscription.next_event.should eql("2014-06-17 16:07:58")
38
+ subscription.cancellation_date.should eql("0000-00-00 00:00:00")
39
+ subscription.status.should eql("trial")
40
+ subscription.expiration_date.should eql("2014-06-17 16:07:58")
41
+ subscription.created.should eql("2014-06-16 16:07:59")
42
+ subscription.addons.should eql [{article_code: "2101", quantity: "1"}, {article_code: "2001", quantity: "1"}]
43
+ end
44
+
45
+ it 'should not overwrite the hash method' do
46
+ subscription.hash.class.should eql Fixnum
47
+ end
48
+
49
+ end
50
+
51
+ describe ".attributes" do
52
+ it "makes all attributes accessible by hash" do
53
+ subscription.attributes.should eql(valid_attributes)
54
+ subscription.attributes[:hash].should eql("178cdae035d59c637318bf808e78bad3")
55
+ end
56
+ end
57
+
58
+ end
59
+
60
+
61
+
@@ -0,0 +1,340 @@
1
+ require "spec_helper"
2
+
3
+ describe Fastbill::Automatic::UsageData do
4
+
5
+ let(:valid_attributes) do
6
+ {
7
+ subscription_id: "294282",
8
+ customer_id: "672782",
9
+ article_number: "2458",
10
+ unit_price: '6.0000',
11
+ description: "Standardtermin",
12
+ currency_code: "EUR",
13
+ status: "open",
14
+ usage_date: "2014-06-26 14:46:19",
15
+ created: "2014-06-26 14:46:19",
16
+ quantity: "1"
17
+ }
18
+ end
19
+
20
+ let (:usage_data) do
21
+ Fastbill::Automatic::UsageData.new(valid_attributes)
22
+ end
23
+
24
+ describe "#initialize" do
25
+ it "initializes all attributes correctly" do
26
+ usage_data.customer_id.should eql('672782')
27
+ usage_data.subscription_id.should eql('294282')
28
+ usage_data.article_number.should eql('2458')
29
+ usage_data.unit_price.should eql(6.0)
30
+ usage_data.description.should eql('Standardtermin')
31
+ usage_data.currency_code.should eql('EUR')
32
+ usage_data.status.should eql('open')
33
+ usage_data.usage_date.should eql(Time.local(2014,06,26,14,46,19))
34
+ usage_data.created.should eql(Time.local(2014,6,26,14,46,19))
35
+ usage_data.quantity.should eql(1)
36
+ end
37
+
38
+ it "takes care of wrongly set array on currency_code" do
39
+ usage_data = Fastbill::Automatic::UsageData.new(:currency_code => [])
40
+ usage_data.currency_code.should eql('')
41
+ end
42
+
43
+ end
44
+
45
+ describe '#create' do
46
+
47
+ let(:success_response) do
48
+ {"RESPONSE" => { "STATUS" => "success"}}
49
+ end
50
+
51
+ let(:get_usage_params) do
52
+ {subscription_id: '294282', start: "2014-06-26 14:46:19", end: "2014-06-26 14:46:19"}
53
+ end
54
+
55
+ let (:get_response) do
56
+ {
57
+ "RESPONSE" => {
58
+ "ITEMS"=>[
59
+ {"USAGEDATA_ID"=>"345278",
60
+ "CUSTOMER_ID"=>"285664",
61
+ "SUBSCRIPTION_ID"=>"294282",
62
+ "ARTICLE_NUMBER"=>"2458",
63
+ "UNIT_PRICE"=>"6.0000",
64
+ "DESCRIPTION"=>"Standardtermin",
65
+ "CURRENCY_CODE"=>[],
66
+ "STATUS"=>"open",
67
+ "USAGE_DATE"=>"2014-06-26 14:46:19",
68
+ "CREATED"=>"2014-06-26 15:04:36",
69
+ "QUANTITY"=>"1"}
70
+ ]
71
+ }
72
+ }
73
+ end
74
+
75
+ before do
76
+ Fastbill::Automatic.should_receive(:request).with("subscription.setusagedata", valid_attributes)
77
+ Fastbill::Automatic.should_receive(:request).with("subscription.getusagedata", get_usage_params).
78
+ and_return(get_response)
79
+ end
80
+
81
+ it 'should create and then get the usagedata_id' do
82
+ usage_data.create
83
+ usage_data.usagedata_id.should eql('345278')
84
+ end
85
+
86
+ end
87
+
88
+ describe '#where' do
89
+
90
+ let (:empty_response) do
91
+ {
92
+ "RESPONSE" => { "ITEMS"=>[] }
93
+ }
94
+ end
95
+
96
+ let (:two_items_response) do
97
+ {
98
+ "RESPONSE" => {
99
+ "ITEMS"=>[
100
+ {"USAGEDATA_ID"=>"345278",
101
+ "CUSTOMER_ID"=>"672782",
102
+ "SUBSCRIPTION_ID"=>"294282",
103
+ "ARTICLE_NUMBER"=>"2458",
104
+ "UNIT_PRICE"=>"6.0000",
105
+ "DESCRIPTION"=>"Standardtermin",
106
+ "CURRENCY_CODE"=>"EUR",
107
+ "STATUS"=>"open",
108
+ "USAGE_DATE"=>"2014-06-26 14:46:19",
109
+ "CREATED" => "2014-06-26 14:46:19",
110
+ "QUANTITY"=>"1"},
111
+ {"USAGEDATA_ID"=>"345279",
112
+ "CUSTOMER_ID"=>"672782",
113
+ "SUBSCRIPTION_ID"=>"294282",
114
+ "ARTICLE_NUMBER"=>"2458",
115
+ "UNIT_PRICE"=>"15.0000",
116
+ "DESCRIPTION"=>"Premiumtermin",
117
+ "CURRENCY_CODE"=>"EUR",
118
+ "STATUS"=>"open",
119
+ "USAGE_DATE"=>"2014-06-26 14:48:19",
120
+ "CREATED" => "2014-06-26 14:48:21",
121
+ "QUANTITY"=>"1"}
122
+ ]
123
+ }
124
+ }
125
+ end
126
+
127
+ let (:expected_items) do
128
+ two_items_response["RESPONSE"]["ITEMS"].map do |item_attributes|
129
+ init_hash = Hash[*item_attributes.map{|k,v| [k.downcase.to_sym, v]}.flatten]
130
+ Fastbill::Automatic::UsageData.new(init_hash)
131
+ end
132
+ end
133
+
134
+ context 'no usage data' do
135
+
136
+ before do
137
+ Fastbill::Automatic.should_receive(:request).with("subscription.getusagedata", {
138
+ subscription_id: '294282'}).and_return(empty_response)
139
+ end
140
+
141
+ it 'returns an empty array' do
142
+ Fastbill::Automatic::UsageData.where(:subscription_id => '294282').should eq []
143
+ end
144
+
145
+ end
146
+
147
+ context 'usage data' do
148
+
149
+ before do
150
+ Fastbill::Automatic.should_receive(:request).with("subscription.getusagedata", {
151
+ subscription_id: '294282'}).and_return(two_items_response)
152
+ end
153
+
154
+ it 'returns an empty array' do
155
+ Fastbill::Automatic::UsageData.where(:subscription_id => '294282').should eq(expected_items)
156
+ end
157
+
158
+ end
159
+
160
+
161
+ end
162
+
163
+ describe '#find_by_usage_date' do
164
+
165
+ let(:existing_usagedata) do
166
+ valid_attributes.merge(:usagedata_id => "345278")
167
+ end
168
+
169
+
170
+ def default_response_hash(currency_code = "EUR")
171
+ {
172
+ "RESPONSE" => {
173
+ "ITEMS"=>[
174
+ {"USAGEDATA_ID"=>"345278",
175
+ "CUSTOMER_ID"=>"672782",
176
+ "SUBSCRIPTION_ID"=>"294282",
177
+ "ARTICLE_NUMBER"=>"2458",
178
+ "UNIT_PRICE"=>"6.0000",
179
+ "DESCRIPTION"=>"Standardtermin",
180
+ "CURRENCY_CODE"=>currency_code,
181
+ "STATUS"=>"open",
182
+ "USAGE_DATE"=>"2014-06-26 14:46:19",
183
+ "CREATED" => "2014-06-26 14:46:19",
184
+ "QUANTITY"=>"1"}
185
+ ]
186
+ }
187
+ }
188
+ end
189
+
190
+ let (:unsuccessful_response) do
191
+ {
192
+ "RESPONSE" => { "ITEMS"=>[] }
193
+ }
194
+ end
195
+
196
+ let (:successful_response) { default_response_hash }
197
+ let (:successful_response_without_currency) { default_response_hash([]) }
198
+
199
+
200
+ context 'no currency code in reponse' do
201
+
202
+ it 'doesnt fail with array value instead of currency code' do
203
+
204
+ Fastbill::Automatic.should_receive(:request).with("subscription.getusagedata", {
205
+ subscription_id: '294282',
206
+ start:"2014-06-26 14:46:19",
207
+ end: "2014-06-26 14:46:19" }).and_return(successful_response_without_currency)
208
+
209
+ existing_item = Fastbill::Automatic::UsageData.new(existing_usagedata)
210
+ usage_item = Fastbill::Automatic::UsageData.find_by_usage_date(existing_usagedata[:subscription_id], Time.local(2014,6,26,14,46,19))
211
+ usage_item.currency_code.should eql('')
212
+ end
213
+
214
+ end
215
+
216
+ context 'there exists a booking at that date' do
217
+
218
+ before do
219
+ Fastbill::Automatic.should_receive(:request).with("subscription.getusagedata", {
220
+ subscription_id: '294282',
221
+ start:"2014-06-26 14:46:19",
222
+ end: "2014-06-26 14:46:19" }).and_return(successful_response)
223
+ end
224
+
225
+ it 'finds the corresponding usage booking by date' do
226
+ existing_item = Fastbill::Automatic::UsageData.new(existing_usagedata)
227
+ usage_item = Fastbill::Automatic::UsageData.find_by_usage_date(existing_usagedata[:subscription_id], Time.local(2014,6,26,14,46,19))
228
+ usage_item.should eq Fastbill::Automatic::UsageData.new(existing_usagedata)
229
+ end
230
+ end
231
+
232
+ context 'there does not exists a booking at that date' do
233
+
234
+ before do
235
+ Fastbill::Automatic.should_receive(:request).with("subscription.getusagedata", {
236
+ subscription_id: 'invalid_subscription_id',
237
+ start:"2014-06-26 14:46:20",
238
+ end: "2014-06-26 14:46:20" }).and_return(unsuccessful_response)
239
+ end
240
+
241
+ it 'should return nil' do
242
+ usage_item = Fastbill::Automatic::UsageData.find_by_usage_date(
243
+ 'invalid_subscription_id', Time.local(2014,6,26,14,46,20))
244
+ expect(usage_item).to be_nil
245
+ end
246
+ end
247
+
248
+ end
249
+
250
+ describe '#update_attributes' do
251
+
252
+ let (:existing_usage_item) do
253
+ Fastbill::Automatic::UsageData.new(valid_attributes.merge(usagedata_id: "345278"))
254
+ end
255
+
256
+ let (:delete_params) do
257
+ { usagedata_id: '345278' }
258
+ end
259
+
260
+ let(:update_params) do
261
+ valid_attributes.merge( {
262
+ article_number: "2459",
263
+ unit_price: '26',
264
+ description: "Premiumtermin"
265
+ })
266
+ end
267
+
268
+ let(:get_params) do
269
+ {subscription_id: '294282', start: "2014-06-26 14:46:19", end: "2014-06-26 14:46:19"}
270
+ end
271
+
272
+ let(:success_response) do
273
+ {"RESPONSE" => { "STATUS" => "success"}}
274
+ end
275
+
276
+ let (:get_response) do
277
+ {
278
+ "RESPONSE" => {
279
+ "ITEMS"=>[
280
+ {"USAGEDATA_ID"=>"345279",
281
+ "CUSTOMER_ID"=>"672782",
282
+ "SUBSCRIPTION_ID"=>"294282",
283
+ "ARTICLE_NUMBER"=>"2459",
284
+ "UNIT_PRICE"=>"26.0000",
285
+ "DESCRIPTION"=>"Premiumtermin",
286
+ "CURRENCY_CODE"=>"EUR",
287
+ "STATUS"=>"open",
288
+ "USAGE_DATE"=>"2014-06-26 14:46:19",
289
+ "CREATED" => "2014-06-26 14:56:19",
290
+ "QUANTITY"=>"1"}
291
+ ]
292
+ }
293
+ }
294
+ end
295
+
296
+ before do
297
+ Fastbill::Automatic.should_receive(:request).with("subscription.deleteusagedata", delete_params).
298
+ and_return(success_response)
299
+ Fastbill::Automatic.should_receive(:request).with("subscription.setusagedata", update_params).
300
+ and_return(success_response)
301
+ Fastbill::Automatic.should_receive(:request).with("subscription.getusagedata", get_params).
302
+ and_return(get_response)
303
+ end
304
+
305
+ it 'allows updating attributes in a familiar manner' do
306
+ existing_usage_item.update_attributes(unit_price: 26, article_number: '2459', description: 'Premiumtermin')
307
+ existing_usage_item.unit_price.should eq(26)
308
+ existing_usage_item.article_number.should eql('2459')
309
+ existing_usage_item.description.should eql('Premiumtermin')
310
+ existing_usage_item.usagedata_id.should eql('345279')
311
+ end
312
+
313
+ end
314
+
315
+ describe '#delete' do
316
+
317
+ let (:usage_data_from_fastbill) do
318
+ Fastbill::Automatic::UsageData.new(valid_attributes.merge(usagedata_id: '123456'))
319
+ end
320
+
321
+ let (:delete_params) do
322
+ { usagedata_id: '123456' }
323
+ end
324
+
325
+ let(:success_response) do
326
+ {"RESPONSE" => { "STATUS" => "success"}}
327
+ end
328
+
329
+ before do
330
+ Fastbill::Automatic.should_receive(:request).with("subscription.deleteusagedata", delete_params).
331
+ and_return(success_response)
332
+ end
333
+
334
+ it 'should delete usage data by id' do
335
+ usage_data_from_fastbill.delete
336
+ end
337
+
338
+ end
339
+
340
+ end
@@ -0,0 +1,37 @@
1
+ require "spec_helper"
2
+
3
+ describe Fastbill::Automatic do
4
+ describe ".request" do
5
+ context "no api key and no email exists" do
6
+ it "raises an authentication error" do
7
+ expect { Fastbill::Automatic.request("Customer.get", {}) }.to raise_error(Fastbill::Automatic::AuthenticationError)
8
+ end
9
+ end
10
+ end
11
+
12
+ describe ".request_method" do
13
+
14
+ before do
15
+ Fastbill::Automatic.request_method = :https
16
+ end
17
+ after do
18
+ Fastbill::Automatic.request_method = :https
19
+ end
20
+
21
+ context "supported request methods" do
22
+ it "is set to HTTPS by default" do
23
+ Fastbill::Automatic.request_method.should equal(:https)
24
+ end
25
+ it "can be set to :test" do
26
+ Fastbill::Automatic.request_method = :test
27
+ Fastbill::Automatic.request_method.should equal(:test)
28
+ end
29
+ end
30
+ context "non supported request method" do
31
+ it "raises an non supported error" do
32
+ expect { Fastbill::Automatic.request_method = :test123 }.to raise_error(Fastbill::Automatic::NonSupportedRequestMethod)
33
+ end
34
+ end
35
+ end
36
+
37
+ end
@@ -0,0 +1,10 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
2
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
3
+ require "fastbill-automatic"
4
+ require "rspec"
5
+ require "rspec/autorun"
6
+ require "webmock/rspec"
7
+ require "pry"
8
+
9
+ RSpec.configure do |config|
10
+ end
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fastbill-automatic
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Sascha Korth
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-08-06 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: json
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ description: API wrapper for Fastbill.
42
+ email:
43
+ - sascha.korth@zweitag.de
44
+ executables: []
45
+ extensions: []
46
+ extra_rdoc_files: []
47
+ files:
48
+ - ".gitignore"
49
+ - ".rspec"
50
+ - Gemfile
51
+ - LICENSE
52
+ - README.md
53
+ - Rakefile
54
+ - doc/API-Doku_FBA_V1-8.pdf
55
+ - fastbill-automatic.gemspec
56
+ - lib/data/fastbill.crt
57
+ - lib/fastbill-automatic.rb
58
+ - lib/fastbill-automatic/article.rb
59
+ - lib/fastbill-automatic/base.rb
60
+ - lib/fastbill-automatic/coupon.rb
61
+ - lib/fastbill-automatic/customer.rb
62
+ - lib/fastbill-automatic/invoice.rb
63
+ - lib/fastbill-automatic/item.rb
64
+ - lib/fastbill-automatic/request/base.rb
65
+ - lib/fastbill-automatic/request/connection.rb
66
+ - lib/fastbill-automatic/request/info.rb
67
+ - lib/fastbill-automatic/request/validator.rb
68
+ - lib/fastbill-automatic/services/cancel.rb
69
+ - lib/fastbill-automatic/services/changearticle.rb
70
+ - lib/fastbill-automatic/services/complete.rb
71
+ - lib/fastbill-automatic/services/create.rb
72
+ - lib/fastbill-automatic/services/delete.rb
73
+ - lib/fastbill-automatic/services/delete_item.rb
74
+ - lib/fastbill-automatic/services/get.rb
75
+ - lib/fastbill-automatic/services/sendbyemail.rb
76
+ - lib/fastbill-automatic/services/sendbypost.rb
77
+ - lib/fastbill-automatic/services/setaddon.rb
78
+ - lib/fastbill-automatic/services/setpaid.rb
79
+ - lib/fastbill-automatic/services/setusagedata.rb
80
+ - lib/fastbill-automatic/services/sign.rb
81
+ - lib/fastbill-automatic/services/update.rb
82
+ - lib/fastbill-automatic/subscription.rb
83
+ - lib/fastbill-automatic/template.rb
84
+ - lib/fastbill-automatic/usage_data.rb
85
+ - lib/fastbill-automatic/version.rb
86
+ - spec/fastbill-automatic/base_spec.rb
87
+ - spec/fastbill-automatic/customer_spec.rb
88
+ - spec/fastbill-automatic/subscription_spec.rb
89
+ - spec/fastbill-automatic/usage_data_spec.rb
90
+ - spec/fastbill-automatic_spec.rb
91
+ - spec/spec_helper.rb
92
+ homepage: https://github.com/skorth/fastbill-automatic
93
+ licenses:
94
+ - MIT
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 2.2.2
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: API wrapper for Fastbill.
116
+ test_files: []