rollbar 3.0.0 → 3.2.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.
@@ -157,8 +157,7 @@ module Rollbar
157
157
  def script_tag(content, env)
158
158
  if (nonce = rails5_nonce(env))
159
159
  script_tag_content = "\n<script type=\"text/javascript\" nonce=\"#{nonce}\">#{content}</script>"
160
- elsif secure_headers_nonce?
161
- nonce = ::SecureHeaders.content_security_policy_script_nonce(::Rack::Request.new(env))
160
+ elsif (nonce = secure_headers_nonce(env))
162
161
  script_tag_content = "\n<script type=\"text/javascript\" nonce=\"#{nonce}\">#{content}</script>"
163
162
  else
164
163
  script_tag_content = "\n<script type=\"text/javascript\">#{content}</script>"
@@ -172,29 +171,40 @@ module Rollbar
172
171
  string
173
172
  end
174
173
 
175
- # Rails 5.2 Secure Content Policy
174
+ # Rails 5.2+ Secure Content Policy
176
175
  def rails5_nonce(env)
177
- # The nonce is the preferred method, however 'unsafe-inline' is also possible.
178
- # The app gets to decide, so we handle both. If the script_src key is missing,
179
- # Rails will not add the nonce to the headers, so we should not add it either.
180
- # If the 'unsafe-inline' value is present, the app should not add a nonce and
181
- # we should ignore it if they do.
182
- req = ::ActionDispatch::Request.new env
176
+ req = ::ActionDispatch::Request.new(env)
177
+
178
+ # Rails will only return a nonce if the app has set a nonce generator.
179
+ # So if we get a valid nonce here, we know we should use it.
180
+ #
181
+ # Having both 'unsafe-inline' and a nonce is a valid and preferred
182
+ # browser compatibility configuration.
183
+ #
184
+ # If the script_src key is missing, Rails will not add the nonce to the headers,
185
+ # so we detect this and will not add it in this case.
183
186
  req.respond_to?(:content_security_policy) &&
184
187
  req.content_security_policy &&
185
188
  req.content_security_policy.directives['script-src'] &&
186
- !req.content_security_policy.directives['script-src'].include?("'unsafe-inline'") &&
187
189
  req.content_security_policy_nonce
188
190
  end
189
191
 
190
192
  # Secure Headers gem
191
- def secure_headers_nonce?
192
- secure_headers.append_nonce?
193
+ def secure_headers_nonce(env)
194
+ req = ::Rack::Request.new(env)
195
+
196
+ return unless secure_headers(req).append_nonce?
197
+
198
+ ::SecureHeaders.content_security_policy_script_nonce(req)
193
199
  end
194
200
 
195
- def secure_headers
201
+ def secure_headers(req)
196
202
  return SecureHeadersFalse.new unless defined?(::SecureHeaders::Configuration)
197
203
 
204
+ # If the nonce key has been set, the app is using nonces for this request.
205
+ # If it hasn't, we shouldn't cause one to be added to script_src, so return now.
206
+ return SecureHeadersFalse.new unless secure_headers_nonce_key(req)
207
+
198
208
  config = ::SecureHeaders::Configuration
199
209
 
200
210
  secure_headers_cls = nil
@@ -212,6 +222,10 @@ module Rollbar
212
222
  secure_headers_cls.new
213
223
  end
214
224
 
225
+ def secure_headers_nonce_key(req)
226
+ defined?(::SecureHeaders::NONCE_KEY) && req.env[::SecureHeaders::NONCE_KEY]
227
+ end
228
+
215
229
  class SecureHeadersResolver
216
230
  def append_nonce?
217
231
  csp_needs_nonce?(find_csp)
@@ -224,16 +238,12 @@ module Rollbar
224
238
  end
225
239
 
226
240
  def csp_needs_nonce?(csp)
227
- !opt_out?(csp) && !unsafe_inline?(csp)
241
+ !opt_out?(csp)
228
242
  end
229
243
 
230
244
  def opt_out?(_csp)
231
245
  raise NotImplementedError
232
246
  end
233
-
234
- def unsafe_inline?(csp)
235
- csp[:script_src].to_a.include?("'unsafe-inline'")
236
- end
237
247
  end
238
248
 
239
249
  class SecureHeadersFalse < SecureHeadersResolver
@@ -640,7 +640,11 @@ module Rollbar
640
640
  request = Net::HTTP::Post.new(uri.request_uri)
641
641
 
642
642
  request.body = pack_ruby260_bytes(body)
643
- request.add_field('X-Rollbar-Access-Token', access_token)
643
+
644
+ # Ensure the payload token will be used if the option is set.
645
+ unless (configuration.use_payload_access_token)
646
+ request.add_field('X-Rollbar-Access-Token', access_token)
647
+ end
644
648
 
645
649
  handle_net_retries { http.request(request) }
646
650
  end
@@ -9,7 +9,7 @@ Rollbar.plugins.define('sidekiq >= 3') do
9
9
 
10
10
  Sidekiq.configure_server do |config|
11
11
  config.server_middleware do |chain|
12
- chain.add Rollbar::Sidekiq::ClearScope
12
+ chain.add Rollbar::Sidekiq::ResetScope
13
13
  end
14
14
 
15
15
  config.error_handlers << proc do |e, context|
@@ -4,21 +4,39 @@ module Rollbar
4
4
  class Sidekiq
5
5
  PARAM_BLACKLIST = %w[backtrace error_backtrace error_message error_class].freeze
6
6
 
7
- class ClearScope
8
- def call(_worker, _msg, _queue)
9
- Rollbar.reset_notifier!
7
+ class ResetScope
8
+ def call(_worker, msg, _queue)
9
+ Rollbar.reset_notifier! # clears scope
10
10
 
11
- yield
11
+ return yield unless Rollbar.configuration.sidekiq_use_scoped_block
12
+
13
+ Rollbar.scoped(Rollbar::Sidekiq.job_scope(msg)) { yield }
12
14
  end
13
15
  end
14
16
 
15
- def self.handle_exception(ctx_hash, e)
16
- job_hash = ctx_hash && (ctx_hash[:job] || ctx_hash)
17
- return if skip_report?(job_hash, e)
17
+ def self.handle_exception(msg, e)
18
+ return if skip_report?(msg, e)
19
+
20
+ Rollbar.scope(job_scope(msg)).error(e, :use_exception_level_filters => true)
21
+ end
22
+
23
+ def self.skip_report?(msg, _e)
24
+ job_hash = job_hash_from_msg(msg)
25
+
26
+ return false if job_hash.nil?
27
+
28
+ # when rollbar middleware catches, sidekiq's retry_job processor hasn't set
29
+ # the retry_count for the current job yet, so adding 1 gives the actual retry count
30
+ actual_retry_count = job_hash.fetch('retry_count', -1) + 1
31
+ job_hash['retry'] && actual_retry_count < ::Rollbar.configuration.sidekiq_threshold
32
+ end
18
33
 
34
+ def self.job_scope(msg)
19
35
  scope = {
20
36
  :framework => "Sidekiq: #{::Sidekiq::VERSION}"
21
37
  }
38
+ job_hash = job_hash_from_msg(msg)
39
+
22
40
  unless job_hash.nil?
23
41
  params = job_hash.reject { |k| PARAM_BLACKLIST.include?(k) }
24
42
  scope[:request] = { :params => scrub_params(params) }
@@ -26,7 +44,7 @@ module Rollbar
26
44
  scope[:queue] = params['queue']
27
45
  end
28
46
 
29
- Rollbar.scope(scope).error(e, :use_exception_level_filters => true)
47
+ scope
30
48
  end
31
49
 
32
50
  def self.scrub_params(params)
@@ -38,22 +56,21 @@ module Rollbar
38
56
  Rollbar::Scrubbers::Params.call(options)
39
57
  end
40
58
 
41
- def self.skip_report?(job_hash, _e)
42
- return false if job_hash.nil?
43
-
44
- # when rollbar middleware catches, sidekiq's retry_job processor hasn't set
45
- # the retry_count for the current job yet, so adding 1 gives the actual retry count
46
- actual_retry_count = job_hash.fetch('retry_count', -1) + 1
47
- job_hash['retry'] && actual_retry_count < ::Rollbar.configuration.sidekiq_threshold
48
- end
49
-
59
+ # see https://github.com/mperham/sidekiq/wiki/Middleware#server-middleware
50
60
  def call(_worker, msg, _queue)
51
- Rollbar.reset_notifier!
61
+ Rollbar.reset_notifier! # clears scope
52
62
 
53
- yield
63
+ return yield unless Rollbar.configuration.sidekiq_use_scoped_block
64
+
65
+ Rollbar.scoped(Rollbar::Sidekiq.job_scope(msg)) { yield }
54
66
  rescue Exception => e
55
67
  Rollbar::Sidekiq.handle_exception(msg, e)
56
68
  raise
57
69
  end
70
+
71
+ def self.job_hash_from_msg(msg)
72
+ msg && (msg[:job] || msg)
73
+ end
74
+ private_class_method :job_hash_from_msg
58
75
  end
59
76
  end
@@ -1,13 +1,14 @@
1
1
  Rollbar.plugins.define('thread') do
2
- execute do
3
- Thread.class_eval do
4
- def initialize_with_rollbar(*args, &block)
2
+ module Rollbar
3
+ module ThreadPlugin
4
+ def initialize(*args)
5
5
  self[:_rollbar_notifier] ||= Rollbar.notifier.scope
6
- initialize_without_rollbar(*args, &block)
6
+ super
7
7
  end
8
-
9
- alias_method :initialize_without_rollbar, :initialize
10
- alias_method :initialize, :initialize_with_rollbar
11
8
  end
12
9
  end
10
+
11
+ execute do
12
+ Thread.send(:prepend, Rollbar::ThreadPlugin) # rubocop:disable Lint/SendWithMixinArgument
13
+ end
13
14
  end
@@ -13,7 +13,7 @@ module Rollbar
13
13
  end
14
14
 
15
15
  def call(options = {})
16
- url = options[:url]
16
+ url = ascii_encode(options[:url])
17
17
 
18
18
  filter(url,
19
19
  build_regex(options[:scrub_fields]),
@@ -29,6 +29,20 @@ module Rollbar
29
29
 
30
30
  private
31
31
 
32
+ def ascii_encode(url)
33
+ # In some cases non-ascii characters won't be properly encoded, so we do it here.
34
+ #
35
+ # The standard encoders (the CGI and URI methods) are not reliable when the query string
36
+ # is already embedded in the full URL, but the inconsistencies are limited to issues
37
+ # with characters in the ascii range. (For example, the '#' if it appears in an unexpected place.)
38
+ # For escaping non-ascii, they are all OK, so we'll take care to skip the ascii chars.
39
+
40
+ return url if url.ascii_only?
41
+
42
+ # Iterate each char and only escape non-ascii characters.
43
+ url.each_char.map { |c| c.ascii_only? ? c : CGI.escape(c) }.join
44
+ end
45
+
32
46
  def build_whitelist_regex(whitelist)
33
47
  fields = whitelist.find_all { |f| f.is_a?(String) || f.is_a?(Symbol) }
34
48
  return unless fields.any?
@@ -1,3 +1,3 @@
1
1
  module Rollbar
2
- VERSION = '3.0.0'.freeze
2
+ VERSION = '3.2.0'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rollbar
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.0
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rollbar, Inc.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-08-28 00:00:00.000000000 Z
11
+ date: 2021-05-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Easy and powerful exception tracking for Ruby
14
14
  email:
@@ -20,10 +20,10 @@ extra_rdoc_files: []
20
20
  files:
21
21
  - ".codeclimate.yml"
22
22
  - ".github/pull_request_template.md"
23
+ - ".github/workflows/ci.yml"
23
24
  - ".gitignore"
24
25
  - ".gitmodules"
25
26
  - ".rubocop.yml"
26
- - ".travis.yml"
27
27
  - Appraisals
28
28
  - CHANGELOG.md
29
29
  - Gemfile
@@ -47,6 +47,7 @@ files:
47
47
  - gemfiles/rails51.gemfile
48
48
  - gemfiles/rails52.gemfile
49
49
  - gemfiles/rails60.gemfile
50
+ - gemfiles/rails61.gemfile
50
51
  - lib/generators/rollbar/rollbar_generator.rb
51
52
  - lib/generators/rollbar/templates/initializer.rb
52
53
  - lib/rails/rollbar_runner.rb
@@ -160,7 +161,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
160
161
  - !ruby/object:Gem::Version
161
162
  version: '0'
162
163
  requirements: []
163
- rubygems_version: 3.1.2
164
+ rubygems_version: 3.1.4
164
165
  signing_key:
165
166
  specification_version: 4
166
167
  summary: Reports exceptions to Rollbar
data/.travis.yml DELETED
@@ -1,268 +0,0 @@
1
- sudo: false
2
- dist: trusty
3
- services:
4
- - redis-server
5
- language: ruby
6
-
7
- rvm:
8
- - 2.0.0
9
- - 2.1.0
10
- - 2.2.2
11
- - 2.3.8
12
- - 2.4.5
13
- - 2.5.3
14
- - 2.6.5
15
- - 2.7.0
16
- - rbx
17
- # Travis's own rvm installer is failing on JRuby builds, TODO: reenable when fixed.
18
- # - jruby-9.1.9.0
19
-
20
- #
21
- # # About legacy JRuby
22
- #
23
- # Legacy JRubies (jruby-18mode, jruby-19mode) have been disabled for some time by
24
- # listing all possible targets in either the exclude or allow_failures sections.
25
- # I have taken a look at getting them running, and have found that no valid
26
- # combination of dependencies is possible for Rails 3.0 and higher. It appears
27
- # Rails 2.2 is meant to work, though I haven't tried it.
28
- #
29
- # For Rails 3.0, it is possible to get a working bundle with all gem dependencies,
30
- # but the JDBC adapter gem needs an earlier version of ActiveSupport, and it will
31
- # fail at runtime.
32
- #
33
- # For Rails 3.1 and 3.2, Rack 1.3.x and higher require Ruby 2.x, while Rails 3.x will
34
- # not accept any 1.2.x version of Rack. Even if this could be resolved, one would
35
- # hit the above runtime issue amyway.
36
- #
37
- # # About current JRuby
38
- #
39
- # While current JRuby builds aim to be Ruby 2.5.x compatible, the JDBC adapter
40
- # gem is constrained to only Rails 5.0, 5.1 and 5.2 at this time. (Old versions
41
- # of the gem allow >= Rails 2.2, but in practice it will not work with Rails 3.0
42
- # and higher because of the ActiveSupport issue described above.) For as long as
43
- # the test suite relies on Rails and SqlLite, it is not possible to include
44
- # earlier Rails for JRuby.
45
-
46
- jdk:
47
- # These are the JDKs currently supported on Travis (Trusty - Ubuntu 14.04)
48
- - openjdk7
49
- - openjdk8
50
- - oraclejdk8
51
- - oraclejdk9
52
- gemfile:
53
- - gemfiles/rails30.gemfile
54
- - gemfiles/rails31.gemfile
55
- - gemfiles/rails32.gemfile
56
- - gemfiles/rails40.gemfile
57
- - gemfiles/rails41.gemfile
58
- - gemfiles/rails42.gemfile
59
- - gemfiles/rails50.gemfile
60
- - gemfiles/rails51.gemfile
61
- - gemfiles/rails52.gemfile
62
- - gemfiles/rails60.gemfile
63
- matrix:
64
- include: []
65
-
66
- allow_failures:
67
- - rvm: ruby-head
68
- - rvm: jruby-head
69
- # oraclejdk9 has a dependency issue that needs to be investigated
70
- - jdk: oraclejdk9
71
-
72
- exclude:
73
- # Don't run tests for non-jruby environments with the JDK.
74
- # NOTE: openjdk7 is missing from these exclusions so that Travis will run at least 1 build for the given rvm.
75
- - rvm: 2.0.0
76
- jdk: openjdk8
77
- - rvm: 2.0.0
78
- jdk: oraclejdk8
79
- - rvm: 2.0.0
80
- jdk: oraclejdk9
81
- - rvm: 2.1.0
82
- jdk: openjdk8
83
- - rvm: 2.1.0
84
- jdk: oraclejdk8
85
- - rvm: 2.1.0
86
- jdk: oraclejdk9
87
- - rvm: 2.2.2
88
- jdk: openjdk8
89
- - rvm: 2.2.2
90
- jdk: oraclejdk8
91
- - rvm: 2.2.2
92
- jdk: oraclejdk9
93
- - rvm: 2.3.8
94
- jdk: openjdk8
95
- - rvm: 2.3.8
96
- jdk: oraclejdk8
97
- - rvm: 2.3.8
98
- jdk: oraclejdk9
99
- - rvm: 2.4.5
100
- jdk: openjdk8
101
- - rvm: 2.4.5
102
- jdk: oraclejdk8
103
- - rvm: 2.4.5
104
- jdk: oraclejdk9
105
- - rvm: 2.5.3
106
- jdk: openjdk8
107
- - rvm: 2.5.3
108
- jdk: oraclejdk8
109
- - rvm: 2.5.3
110
- jdk: oraclejdk9
111
- - rvm: 2.6.5
112
- jdk: openjdk8
113
- - rvm: 2.6.5
114
- jdk: oraclejdk8
115
- - rvm: 2.6.5
116
- jdk: oraclejdk9
117
- - rvm: 2.7.0
118
- jdk: openjdk8
119
- - rvm: 2.7.0
120
- jdk: oraclejdk8
121
- - rvm: 2.7.0
122
- jdk: oraclejdk9
123
-
124
- - rvm: ruby-head
125
- jdk: openjdk8
126
- - rvm: ruby-head
127
- jdk: oraclejdk8
128
- - rvm: ruby-head
129
- jdk: oraclejdk9
130
- - rvm: rbx
131
- jdk: openjdk8
132
- - rvm: rbx
133
- jdk: oraclejdk8
134
- - rvm: rbx
135
- jdk: oraclejdk9
136
-
137
- # Rails 6.x requires Ruby 2.5.0 or higher
138
- - rvm: 2.2.2
139
- gemfile: gemfiles/rails60.gemfile
140
- - rvm: 2.3.8
141
- gemfile: gemfiles/rails60.gemfile
142
- - rvm: 2.4.5
143
- gemfile: gemfiles/rails60.gemfile
144
- # Rails 5.x requires Ruby 2.2.2 or higher
145
- - rvm: 2.0.0
146
- gemfile: gemfiles/rails50.gemfile
147
- - rvm: 2.0.0
148
- gemfile: gemfiles/rails51.gemfile
149
- - rvm: 2.0.0
150
- gemfile: gemfiles/rails52.gemfile
151
- - rvm: 2.0.0
152
- gemfile: gemfiles/rails60.gemfile
153
- # Rails 5.x requires Ruby 2.2.2 or higher
154
- - rvm: 2.1.0
155
- gemfile: gemfiles/rails50.gemfile
156
- - rvm: 2.1.0
157
- gemfile: gemfiles/rails51.gemfile
158
- - rvm: 2.1.0
159
- gemfile: gemfiles/rails52.gemfile
160
- - rvm: 2.1.0
161
- gemfile: gemfiles/rails60.gemfile
162
- # MRI 2.2.2 supports Rails 3.2.x and higher, except Rails 5.2.4 and higher*
163
- # * ActionDispatch 5.2.4 uses Ruby 3.x safe navigation operator.
164
- - rvm: 2.2.2
165
- gemfile: gemfiles/rails30.gemfile
166
- - rvm: 2.2.2
167
- gemfile: gemfiles/rails31.gemfile
168
- - rvm: 2.2.2
169
- gemfile: gemfiles/rails52.gemfile
170
- # MRI 2.3.x supports Rails 4.0.x and higher
171
- - rvm: 2.3.8
172
- gemfile: gemfiles/rails30.gemfile
173
- - rvm: 2.3.8
174
- gemfile: gemfiles/rails31.gemfile
175
- - rvm: 2.3.8
176
- gemfile: gemfiles/rails32.gemfile
177
- - rvm: 2.3.8
178
- gemfile: gemfiles/rails40.gemfile
179
- - rvm: 2.3.8
180
- gemfile: gemfiles/rails41.gemfile
181
- # MRI 2.4.x and higher (e.g. 2.5.x, 2.6.x, etc) supports Rails 4.2.8 and higher
182
- # Rails lower than 4.2.8 is incompatible with Ruby 2.4 Integer class
183
- - rvm: 2.4.5
184
- gemfile: gemfiles/rails30.gemfile
185
- - rvm: 2.4.5
186
- gemfile: gemfiles/rails31.gemfile
187
- - rvm: 2.4.5
188
- gemfile: gemfiles/rails32.gemfile
189
- - rvm: 2.4.5
190
- gemfile: gemfiles/rails40.gemfile
191
- - rvm: 2.4.5
192
- gemfile: gemfiles/rails41.gemfile
193
- - rvm: 2.5.3
194
- gemfile: gemfiles/rails30.gemfile
195
- - rvm: 2.5.3
196
- gemfile: gemfiles/rails31.gemfile
197
- - rvm: 2.5.3
198
- gemfile: gemfiles/rails32.gemfile
199
- - rvm: 2.5.3
200
- gemfile: gemfiles/rails40.gemfile
201
- - rvm: 2.5.3
202
- gemfile: gemfiles/rails41.gemfile
203
- - rvm: 2.6.5
204
- gemfile: gemfiles/rails30.gemfile
205
- - rvm: 2.6.5
206
- gemfile: gemfiles/rails31.gemfile
207
- - rvm: 2.6.5
208
- gemfile: gemfiles/rails32.gemfile
209
- - rvm: 2.6.5
210
- gemfile: gemfiles/rails40.gemfile
211
- - rvm: 2.6.5
212
- gemfile: gemfiles/rails41.gemfile
213
- - rvm: 2.6.5
214
- gemfile: gemfiles/rails42.gemfile
215
- # Rails 6.x tries to be compatible with Ruby 2.7, though
216
- # it still throws a lot of warnings. No point testing earlier
217
- # Rails with Ruby 2.7.
218
- - rvm: 2.7.0
219
- gemfile: gemfiles/rails30.gemfile
220
- - rvm: 2.7.0
221
- gemfile: gemfiles/rails31.gemfile
222
- - rvm: 2.7.0
223
- gemfile: gemfiles/rails32.gemfile
224
- - rvm: 2.7.0
225
- gemfile: gemfiles/rails40.gemfile
226
- - rvm: 2.7.0
227
- gemfile: gemfiles/rails41.gemfile
228
- - rvm: 2.7.0
229
- gemfile: gemfiles/rails42.gemfile
230
- - rvm: 2.7.0
231
- gemfile: gemfiles/rails50.gemfile
232
- - rvm: 2.7.0
233
- gemfile: gemfiles/rails51.gemfile
234
- - rvm: 2.7.0
235
- gemfile: gemfiles/rails52.gemfile
236
- # JRuby JDBC Adapter is only compatible with Rails >= 5.x
237
- - rvm: jruby-9.1.9.0
238
- gemfile: gemfiles/rails30.gemfile
239
- - rvm: jruby-9.1.9.0
240
- gemfile: gemfiles/rails31.gemfile
241
- - rvm: jruby-9.1.9.0
242
- gemfile: gemfiles/rails32.gemfile
243
- - rvm: jruby-9.1.9.0
244
- gemfile: gemfiles/rails40.gemfile
245
- - rvm: jruby-9.1.9.0
246
- gemfile: gemfiles/rails41.gemfile
247
- - rvm: jruby-9.1.9.0
248
- gemfile: gemfiles/rails42.gemfile
249
- - rvm: rbx
250
- gemfile: gemfiles/rails30.gemfile
251
- - rvm: rbx
252
- gemfile: gemfiles/rails31.gemfile
253
- - rvm: rbx
254
- gemfile: gemfiles/rails32.gemfile
255
- - rvm: rbx
256
- gemfile: gemfiles/rails40.gemfile
257
- - rvm: rbx
258
- gemfile: gemfiles/rails41.gemfile
259
- - rvm: rbx
260
- gemfile: gemfiles/rails42.gemfile
261
- - rvm: rbx
262
- gemfile: gemfiles/rails50.gemfile
263
- - rvm: rbx
264
- gemfile: gemfiles/rails51.gemfile
265
- - rvm: rbx
266
- gemfile: gemfiles/rails52.gemfile
267
- - rvm: rbx
268
- gemfile: gemfiles/rails60.gemfile