chargehound 2.2.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 31be9dbdfb185724f781b20725eb877783e3c664
4
- data.tar.gz: 9319f70f475d27941ba96704aec1eacf799ae49d
2
+ SHA256:
3
+ metadata.gz: 3a82e732eb0a7cdf16eaf13488aa3802d99b14f39ea1270e588ac92f9e6ec7f9
4
+ data.tar.gz: a14307daea1deb3817aba7767d6f88bc0e84395af7502c55acbc5508415df4f1
5
5
  SHA512:
6
- metadata.gz: f02ea14de6beeb51ab586ebd55a2be71b9e2ac0398b6a0f5350b16fbfbcfb723b6ba3185ef746aa38ad3682e1dc74ec19907d5d4997558c218fc81614a888930
7
- data.tar.gz: 16ec1a8b42319611385c23586084898dc5be3ec2ebf17d85945d3ac2ff25981e1aa69c38f5c0318cabb9e8fb6a79ec9e24f3f102528cef2280b43d8247d93a41
6
+ metadata.gz: 3c2cc970865ac3e79011460b39636fd0fe4399abae617428fb4edd6a59a1ceeca1ae103fcad2fa89f0bfe272da1ae97b05379a6c253ff060e8d4b7544300c711
7
+ data.tar.gz: 0a821e6464dbac1257fcb0d73a91c58894e97ed2968729b00abdf8e2d311fd2812c5f45c3f7faafe51fc3722031c2138f94755b77e49cec0f6d7bc1e686c6019
@@ -0,0 +1,24 @@
1
+ name: Ruby
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby: [ '2.4', '2.5', '2.6']
15
+ name: Test Ruby ${{ matrix.ruby }}
16
+ steps:
17
+ - uses: actions/checkout@v2
18
+ - uses: actions/setup-ruby@v1
19
+ with:
20
+ ruby-version: ${{ matrix.ruby }}
21
+ - run: |
22
+ gem install bundler
23
+ bundle install --jobs 4 --retry 3
24
+ bundle exec rake test
@@ -0,0 +1,36 @@
1
+ name: JRuby
2
+
3
+ on:
4
+ push:
5
+ branches: [ main ]
6
+ pull_request:
7
+ branches: [ main ]
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ ruby: [ 'jruby-9.2.9.0', 'jruby-head' ]
15
+ name: Test Ruby ${{ matrix.ruby }}
16
+ steps:
17
+ - name: Install libraries
18
+ run: sudo apt install haveged
19
+ - uses: actions/checkout@v2
20
+ - name: Set up RVM
21
+ run: |
22
+ curl -sSL https://get.rvm.io | bash
23
+ - name: Set up Ruby
24
+ run: |
25
+ source $HOME/.rvm/scripts/rvm
26
+ rvm install ${{ matrix.ruby }} --binary
27
+ rvm --default use ${{ matrix.ruby }}
28
+ - name: Install dependencies
29
+ run: |
30
+ source $HOME/.rvm/scripts/rvm
31
+ gem install bundler --no-document
32
+ bundle install
33
+ - name: Run test
34
+ run: |
35
+ source $HOME/.rvm/scripts/rvm
36
+ rake test
data/.rubocop.yml CHANGED
@@ -1,5 +1,23 @@
1
1
  Metrics/MethodLength:
2
2
  Enabled: false
3
3
 
4
+ Metrics/BlockLength:
5
+ Enabled: false
6
+
7
+ Gemspec/RequiredRubyVersion:
8
+ Enabled: false
9
+
10
+ Style/SymbolArray:
11
+ Enabled: false
12
+
4
13
  Style/SpecialGlobalVars:
5
14
  Enabled: false
15
+
16
+ Metrics/ClassLength:
17
+ Enabled: false
18
+
19
+ Metrics/AbcSize:
20
+ Enabled: false
21
+
22
+ Style/BlockDelimiters:
23
+ Enabled: false
data/CHANGELOG CHANGED
@@ -14,3 +14,13 @@
14
14
  - Add Accept endpoint
15
15
  2.2.0 November, 2017
16
16
  - Add support for overriding version
17
+ 2.2.1 Febuary, 2018
18
+ - Update rubocop version
19
+ 2.2.2 September, 2018
20
+ - Update docs
21
+ 2.3.0 April, 2019
22
+ - Add Correspondence model
23
+ 2.4.0 Sept, 2019
24
+ - Add PastPayment model
25
+ 2.5.0 Feb, 2021
26
+ - Surface error types
data/chargehound.gemspec CHANGED
@@ -6,18 +6,18 @@ Gem::Specification.new do |spec|
6
6
  spec.name = 'chargehound'
7
7
  spec.version = Chargehound::VERSION
8
8
  spec.platform = Gem::Platform::RUBY
9
- spec.required_ruby_version = '>= 1.9.3'
9
+ spec.required_ruby_version = '>= 2.0.0'
10
10
  spec.authors = ['Chargehound']
11
11
  spec.email = ['support@chargehound.com']
12
12
  spec.homepage = 'https://www.chargehound.com'
13
13
  spec.summary = 'Ruby bindings for the Chargehound API'
14
- spec.description = 'Automatically fight disputes in Stripe'
14
+ spec.description = 'Automatically fight disputes'
15
15
  spec.license = 'MIT'
16
16
 
17
- spec.add_development_dependency 'bundler', '~> 1.5'
17
+ spec.add_development_dependency 'bundler'
18
18
  spec.add_development_dependency 'minitest', '~> 5.8'
19
- spec.add_development_dependency 'rake', '~> 11.1'
20
- spec.add_development_dependency 'rubocop', '0.41.0'
19
+ spec.add_development_dependency 'rake', '~> 12.3'
20
+ spec.add_development_dependency 'rubocop', '~> 0.49'
21
21
  spec.add_development_dependency 'webmock', '~> 2.3'
22
22
 
23
23
  spec.files = `git ls-files`.split($/)
@@ -39,10 +39,7 @@ module Chargehound
39
39
  end
40
40
 
41
41
  def build_http_opts
42
- {
43
- use_ssl: true,
44
- read_timeout: Chargehound.timeout
45
- }
42
+ { use_ssl: true, read_timeout: Chargehound.timeout }
46
43
  end
47
44
 
48
45
  def build_headers(body)
@@ -100,7 +97,15 @@ module Chargehound
100
97
  def convert(dict)
101
98
  case dict['object']
102
99
  when 'dispute'
103
- dict['products'].map! { |item| Product.new(item) }
100
+ dict['products'] = dict.fetch('products', []).map { |item|
101
+ Product.new(item)
102
+ }
103
+ dict['correspondence'] = dict.fetch('correspondence', []).map { |item|
104
+ CorrespondenceItem.new(item)
105
+ }
106
+ dict['past_payments'] = dict.fetch('past_payments', []).map { |item|
107
+ PastPayment.new(item)
108
+ }
104
109
  Dispute.new(dict)
105
110
  when 'list'
106
111
  dict['data'].map! { |item| convert item }
@@ -11,7 +11,8 @@ module Chargehound
11
11
  end
12
12
 
13
13
  # A list of disputes
14
- # This endpoint will list all the disputes that we have synced from Stripe.
14
+ # This endpoint will list all the disputes that we have synced from your
15
+ # payment processor.
15
16
  # By default the disputes will be ordered by `created` with the most recent
16
17
  # dispute first. { }`has_more` will be `true` if more results are available.
17
18
  # @option [Hash] params the query parameters
@@ -37,9 +38,9 @@ module Chargehound
37
38
 
38
39
  # Submitting a dispute
39
40
  # You will want to submit the dispute through Chargehound after you recieve
40
- # a notification from Stripe of a new dispute. With one `POST` request
41
- # you can update a dispute with the evidence fields and send the generated
42
- # response to Stripe.
41
+ # a webhook notification of a new dispute. With one `POST` request
42
+ # you can update a dispute with the evidence fields and submit the generated
43
+ # response.
43
44
  # The response will have a `201` status if the submit was successful.
44
45
  # The dispute will also be in the submitted state.
45
46
  # @param dispute_id A dispute id
@@ -1,11 +1,12 @@
1
1
  module Chargehound
2
2
  # Cast Chargehound API errors to custom error types
3
3
  class ChargehoundError < StandardError
4
- attr_reader :status, :message
4
+ attr_reader :status, :message, :type
5
5
 
6
6
  def initialize(error_response)
7
7
  @message = error_response['message']
8
8
  @status = error_response['status']
9
+ @type = error_response['type']
9
10
  status_string = @status.nil? ? '' : "(Status #{@status}) "
10
11
  super("#{status_string}#{message}")
11
12
  end
@@ -40,6 +40,12 @@ module Chargehound
40
40
  class Product < ChargehoundObject
41
41
  end
42
42
 
43
+ class CorrespondenceItem < ChargehoundObject
44
+ end
45
+
46
+ class PastPayment < ChargehoundObject
47
+ end
48
+
43
49
  # Expose response properties via this struct on response objects
44
50
  HTTPResponse = Struct.new(:status)
45
51
  end
@@ -1,3 +1,3 @@
1
1
  module Chargehound
2
- VERSION = '2.2.0'.freeze
2
+ VERSION = '2.5.0'.freeze
3
3
  end
@@ -75,18 +75,100 @@ dispute_with_product_info_response = {
75
75
  ]
76
76
  }
77
77
 
78
- dispute_response = {
78
+ dispute_with_correspondence_info_update = {
79
+ fields: {
80
+ customer_name: 'Susie'
81
+ },
82
+ correspondence: [
83
+ {
84
+ to: 'customer@example.com',
85
+ from: 'noreply@example.com',
86
+ subject: 'Your Order',
87
+ body: 'Your order was received.',
88
+ caption: 'Order confirmation email.'
89
+ }, {
90
+ to: 'customer@example.com',
91
+ from: 'noreply@example.com',
92
+ subject: 'Your Order',
93
+ body: 'Your order was delivered.',
94
+ caption: 'Delivery confirmation email.'
95
+ }
96
+ ]
97
+ }
98
+
99
+ dispute_with_correspondence_info_response = {
100
+ id: 'dp_123',
101
+ object: 'dispute',
102
+ fields: {
103
+ customer_name: 'Susie'
104
+ },
105
+ correspondence: [
106
+ {
107
+ to: 'customer@example.com',
108
+ from: 'noreply@example.com',
109
+ subject: 'Your Order',
110
+ body: 'Your order was received.',
111
+ caption: 'Order confirmation email.'
112
+ }, {
113
+ to: 'customer@example.com',
114
+ from: 'noreply@example.com',
115
+ subject: 'Your Order',
116
+ body: 'Your order was delivered.',
117
+ caption: 'Delivery confirmation email.'
118
+ }
119
+ ]
120
+ }
121
+
122
+ dispute_with_past_payments_update = {
123
+ fields: {
124
+ customer_name: 'Susie'
125
+ },
126
+ past_payments: [
127
+ {
128
+ id: 'ch_1',
129
+ amount: 20_000,
130
+ currency: 'usd',
131
+ charged_at: '2019-09-10 11:09:41PM UTC'
132
+ }, {
133
+ id: 'ch_2',
134
+ amount: 50_000,
135
+ currency: 'usd',
136
+ charged_at: '2019-09-03 11:09:41PM UTC'
137
+ }
138
+ ]
139
+ }
140
+
141
+ dispute_with_past_payments_response = {
79
142
  id: 'dp_123',
80
143
  object: 'dispute',
81
- products: []
144
+ fields: {
145
+ customer_name: 'Susie'
146
+ },
147
+ past_payments: [
148
+ {
149
+ id: 'ch_1',
150
+ amount: 20_000,
151
+ currency: 'usd',
152
+ charged_at: '2019-09-10 11:09:41PM UTC'
153
+ }, {
154
+ id: 'ch_2',
155
+ amount: 50_000,
156
+ currency: 'usd',
157
+ charged_at: '2019-09-03 11:09:41PM UTC'
158
+ }
159
+ ]
160
+ }
161
+
162
+ dispute_response = {
163
+ id: 'dp_123',
164
+ object: 'dispute'
82
165
  }
83
166
 
84
167
  dispute_list_response = {
85
168
  object: 'list',
86
169
  data: [{
87
170
  id: 'dp_123',
88
- object: 'dispute',
89
- products: []
171
+ object: 'dispute'
90
172
  }]
91
173
  }
92
174
 
@@ -145,7 +227,9 @@ describe Chargehound::Disputes do
145
227
  data: [{
146
228
  id: 'dp_123',
147
229
  object: 'dispute',
148
- products: []
230
+ products: [],
231
+ correspondence: [],
232
+ past_payments: []
149
233
  }],
150
234
  response: {
151
235
  status: '200'
@@ -174,6 +258,24 @@ describe Chargehound::Disputes do
174
258
  assert_requested stub
175
259
  end
176
260
 
261
+ it 'can list disputes filtered by state' do
262
+ stub = stub_request(:get, 'https://api.chargehound.com/v1/disputes?state=needs_response')
263
+ .with(headers: get_headers)
264
+ .to_return(body: dispute_list_response.to_json)
265
+
266
+ Chargehound::Disputes.list(state: %w[needs_response])
267
+ assert_requested stub
268
+ end
269
+
270
+ it 'can list disputes filtered by multiple states' do
271
+ stub = stub_request(:get, 'https://api.chargehound.com/v1/disputes?state=needs_response&state=warning_needs_response')
272
+ .with(headers: get_headers)
273
+ .to_return(body: dispute_list_response.to_json)
274
+
275
+ Chargehound::Disputes.list(state: %w[needs_response warning_needs_response])
276
+ assert_requested stub
277
+ end
278
+
177
279
  it 'can retrieve a dispute' do
178
280
  stub = stub_request(:get, 'https://api.chargehound.com/v1/disputes/dp_123')
179
281
  .with(headers: get_headers)
@@ -242,6 +344,59 @@ describe Chargehound::Disputes do
242
344
  assert_requested stub
243
345
  end
244
346
 
347
+ it 'can submit a dispute with correspondence data' do
348
+ stub = stub_request(:post, 'https://api.chargehound.com/v1/disputes/dp_123/submit')
349
+ .with(headers: post_headers,
350
+ body: dispute_with_correspondence_info_update.to_json)
351
+ .to_return(body: dispute_with_correspondence_info_response.to_json,
352
+ status: 201)
353
+
354
+ Chargehound::Disputes.submit('dp_123',
355
+ dispute_with_correspondence_info_update)
356
+ assert_requested stub
357
+ end
358
+
359
+ it 'has a model for correspondence data' do
360
+ stub = stub_request(:post, 'https://api.chargehound.com/v1/disputes/dp_123/submit')
361
+ .with(headers: post_headers,
362
+ body: dispute_with_correspondence_info_update.to_json)
363
+ .to_return(body: dispute_with_correspondence_info_response.to_json,
364
+ status: 201)
365
+
366
+ dispute = Chargehound::Disputes.submit(
367
+ 'dp_123', dispute_with_correspondence_info_update
368
+ )
369
+
370
+ assert_instance_of(Chargehound::CorrespondenceItem,
371
+ dispute.correspondence[0])
372
+ assert_requested stub
373
+ end
374
+
375
+ it 'can submit a dispute with past payments data' do
376
+ stub = stub_request(:post, 'https://api.chargehound.com/v1/disputes/dp_123/submit')
377
+ .with(headers: post_headers,
378
+ body: dispute_with_past_payments_update.to_json)
379
+ .to_return(body: dispute_with_past_payments_response.to_json,
380
+ status: 201)
381
+
382
+ Chargehound::Disputes.submit('dp_123', dispute_with_past_payments_update)
383
+ assert_requested stub
384
+ end
385
+
386
+ it 'has a model for past payments data' do
387
+ stub = stub_request(:post, 'https://api.chargehound.com/v1/disputes/dp_123/submit')
388
+ .with(headers: post_headers,
389
+ body: dispute_with_past_payments_update.to_json)
390
+ .to_return(body: dispute_with_past_payments_response.to_json,
391
+ status: 201)
392
+
393
+ dispute = Chargehound::Disputes.submit('dp_123',
394
+ dispute_with_past_payments_update)
395
+
396
+ assert_instance_of(Chargehound::PastPayment, dispute.past_payments[0])
397
+ assert_requested stub
398
+ end
399
+
245
400
  it 'can update a dispute' do
246
401
  stub = stub_request(:put, 'https://api.chargehound.com/v1/disputes/dp_123')
247
402
  .with(headers: post_headers, body: dispute_update.to_json)
@@ -260,4 +415,15 @@ describe Chargehound::Disputes do
260
415
  Chargehound::Disputes.update('dp_123', dispute_with_product_info_update)
261
416
  assert_requested stub
262
417
  end
418
+
419
+ it 'can update a dispute with correspondence data' do
420
+ stub = stub_request(:put, 'https://api.chargehound.com/v1/disputes/dp_123')
421
+ .with(headers: post_headers,
422
+ body: dispute_with_correspondence_info_update.to_json)
423
+ .to_return(body: dispute_response.to_json)
424
+
425
+ Chargehound::Disputes.update('dp_123',
426
+ dispute_with_correspondence_info_update)
427
+ assert_requested stub
428
+ end
263
429
  end
data/test/error_test.rb CHANGED
@@ -7,6 +7,14 @@ error_response = {
7
7
  }
8
8
  }
9
9
 
10
+ error_response_typed = {
11
+ 'error' => {
12
+ 'status' => 400,
13
+ 'message' => 'Bad Request',
14
+ 'type' => 'invalid_request'
15
+ }
16
+ }
17
+
10
18
  describe Chargehound::ChargehoundError do
11
19
  before do
12
20
  Chargehound.api_key = 'API_KEY'
@@ -19,7 +27,13 @@ describe Chargehound::ChargehoundError do
19
27
  it 'should propagate errors' do
20
28
  stub_request(:any, 'https://api.chargehound.com/v1/disputes').to_raise(StandardError)
21
29
 
22
- assert_raises(StandardError, proc { Chargehound::Disputes.list })
30
+ # `assert_raises` has trouble on jruby,
31
+ # so we simply write the code
32
+ begin
33
+ Chargehound::Disputes.list
34
+ rescue StandardError => error
35
+ assert(error.is_a?(StandardError))
36
+ end
23
37
  end
24
38
 
25
39
  it 'should return typed chargehound errors from the API' do
@@ -38,6 +52,35 @@ describe Chargehound::ChargehoundError do
38
52
  end
39
53
  end
40
54
 
55
+ it 'should surface the error type' do
56
+ stub_request(:any, 'https://api.chargehound.com/v1/disputes').to_raise(StandardError)
57
+
58
+ # `assert_raises` has trouble on jruby,
59
+ # so we simply write the code
60
+ begin
61
+ Chargehound::Disputes.list
62
+ rescue StandardError => error
63
+ assert(error.is_a?(StandardError))
64
+ end
65
+ end
66
+
67
+ it 'should return typed chargehound errors from the API' do
68
+ stub_request(:any, 'https://api.chargehound.com/v1/disputes')
69
+ .to_return(status: 400, body: error_response_typed.to_json)
70
+
71
+ # `assert_raises` doesn't like Chargehound::ChargehoundBadRequestError,
72
+ # so we simply write the code
73
+ begin
74
+ Chargehound::Disputes.list
75
+ rescue Chargehound::ChargehoundBadRequestError => error
76
+ assert(error.is_a?(Chargehound::ChargehoundBadRequestError))
77
+ assert_equal(400, error.status)
78
+ assert_equal('Bad Request', error.message)
79
+ assert_equal('invalid_request', error.type)
80
+ assert_equal('(Status 400) Bad Request', error.to_s)
81
+ end
82
+ end
83
+
41
84
  it 'should throw a typed error on timeout' do
42
85
  stub_request(:any, 'https://api.chargehound.com/v1/disputes').to_timeout
43
86
 
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: chargehound
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Chargehound
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-11-07 00:00:00.000000000 Z
11
+ date: 2021-02-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.5'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.5'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: minitest
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,28 +44,28 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '11.1'
47
+ version: '12.3'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: '11.1'
54
+ version: '12.3'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '='
59
+ - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.41.0
61
+ version: '0.49'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '='
66
+ - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.41.0
68
+ version: '0.49'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: webmock
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -80,7 +80,7 @@ dependencies:
80
80
  - - "~>"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '2.3'
83
- description: Automatically fight disputes in Stripe
83
+ description: Automatically fight disputes
84
84
  email:
85
85
  - support@chargehound.com
86
86
  executables: []
@@ -88,9 +88,10 @@ extensions: []
88
88
  extra_rdoc_files:
89
89
  - README.md
90
90
  files:
91
+ - ".github/workflows/ruby.yml"
92
+ - ".github/workflows/rvm.yml"
91
93
  - ".gitignore"
92
94
  - ".rubocop.yml"
93
- - ".travis.yml"
94
95
  - CHANGELOG
95
96
  - Gemfile
96
97
  - LICENSE
@@ -112,7 +113,7 @@ homepage: https://www.chargehound.com
112
113
  licenses:
113
114
  - MIT
114
115
  metadata: {}
115
- post_install_message:
116
+ post_install_message:
116
117
  rdoc_options: []
117
118
  require_paths:
118
119
  - lib
@@ -120,16 +121,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
120
121
  requirements:
121
122
  - - ">="
122
123
  - !ruby/object:Gem::Version
123
- version: 1.9.3
124
+ version: 2.0.0
124
125
  required_rubygems_version: !ruby/object:Gem::Requirement
125
126
  requirements:
126
127
  - - ">="
127
128
  - !ruby/object:Gem::Version
128
129
  version: '0'
129
130
  requirements: []
130
- rubyforge_project:
131
- rubygems_version: 2.6.11
132
- signing_key:
131
+ rubygems_version: 3.1.4
132
+ signing_key:
133
133
  specification_version: 4
134
134
  summary: Ruby bindings for the Chargehound API
135
135
  test_files:
data/.travis.yml DELETED
@@ -1,13 +0,0 @@
1
- language: ruby
2
-
3
- rvm:
4
- - 2.0.0
5
- - 2.1
6
- - 2.2
7
- - 2.3.0
8
- - 2.3.1
9
- - jruby-9.1.5.0
10
-
11
- sudo: false
12
-
13
- script: bundle exec rake test