activerecord-multi-tenant 1.0.4 → 1.1.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.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +3 -28
  3. data/Appraisals +6 -49
  4. data/Gemfile.lock +77 -61
  5. data/gemfiles/active_record_5.2.gemfile +2 -1
  6. data/gemfiles/active_record_5.2.gemfile.lock +38 -38
  7. data/gemfiles/active_record_6.0.gemfile +1 -1
  8. data/gemfiles/active_record_6.0.gemfile.lock +95 -95
  9. data/gemfiles/rails_5.2.gemfile +2 -1
  10. data/gemfiles/rails_5.2.gemfile.lock +38 -38
  11. data/gemfiles/rails_6.0.gemfile +1 -1
  12. data/gemfiles/rails_6.0.gemfile.lock +95 -95
  13. data/lib/activerecord-multi-tenant/controller_extensions.rb +2 -6
  14. data/lib/activerecord-multi-tenant/copy_from_client.rb +2 -2
  15. data/lib/activerecord-multi-tenant/migrations.rb +2 -2
  16. data/lib/activerecord-multi-tenant/model_extensions.rb +3 -9
  17. data/lib/activerecord-multi-tenant/multi_tenant.rb +1 -0
  18. data/lib/activerecord-multi-tenant/query_rewriter.rb +22 -73
  19. data/lib/activerecord-multi-tenant/sidekiq.rb +2 -1
  20. data/lib/activerecord-multi-tenant/version.rb +1 -1
  21. data/spec/activerecord-multi-tenant/controller_extensions_spec.rb +19 -24
  22. data/spec/activerecord-multi-tenant/model_extensions_spec.rb +6 -30
  23. data/spec/activerecord-multi-tenant/query_rewriter_spec.rb +8 -0
  24. data/spec/activerecord-multi-tenant/sidekiq_spec.rb +4 -4
  25. data/spec/schema.rb +1 -4
  26. data/spec/spec_helper.rb +1 -6
  27. metadata +6 -14
  28. data/gemfiles/active_record_5.1.gemfile +0 -15
  29. data/gemfiles/active_record_5.1.gemfile.lock +0 -180
  30. data/gemfiles/rails_4.2.gemfile +0 -16
  31. data/gemfiles/rails_4.2.gemfile.lock +0 -175
  32. data/gemfiles/rails_5.0.gemfile +0 -15
  33. data/gemfiles/rails_5.0.gemfile.lock +0 -180
  34. data/gemfiles/rails_5.1.gemfile +0 -15
  35. data/gemfiles/rails_5.1.gemfile.lock +0 -180
@@ -18,7 +18,8 @@ module Sidekiq::Middleware::MultiTenant
18
18
  class Server
19
19
  def call(worker_class, msg, queue)
20
20
  if msg.has_key?('multi_tenant')
21
- MultiTenant.with(msg['multi_tenant']['id']) do
21
+ tenant = msg['multi_tenant']['class'].constantize.find(msg['multi_tenant']['id'])
22
+ MultiTenant.with(tenant) do
22
23
  yield
23
24
  end
24
25
  else
@@ -1,3 +1,3 @@
1
1
  module MultiTenant
2
- VERSION = '1.0.4'
2
+ VERSION = '1.1.0'
3
3
  end
@@ -21,11 +21,7 @@ describe "Controller Extensions", type: :controller do
21
21
  describe ApplicationController, type: :controller do
22
22
  controller do
23
23
  def index
24
- if ActionPack::VERSION::MAJOR >= 5
25
- render body: 'custom called'
26
- else
27
- render text: 'custom called'
28
- end
24
+ render body: 'custom called'
29
25
  end
30
26
  end
31
27
 
@@ -35,30 +31,29 @@ describe "Controller Extensions", type: :controller do
35
31
  end
36
32
  end
37
33
 
38
- if ActionPack::VERSION::MAJOR >= 5
39
- class APIApplicationController < ActionController::API
40
- include Rails.application.routes.url_helpers
41
- set_current_tenant_through_filter
42
- before_action :your_method_that_finds_the_current_tenant
43
34
 
44
- def your_method_that_finds_the_current_tenant
45
- current_account = Account.new
46
- current_account.name = 'account1'
47
- set_current_tenant(current_account)
48
- end
35
+ class APIApplicationController < ActionController::API
36
+ include Rails.application.routes.url_helpers
37
+ set_current_tenant_through_filter
38
+ before_action :your_method_that_finds_the_current_tenant
39
+
40
+ def your_method_that_finds_the_current_tenant
41
+ current_account = Account.new
42
+ current_account.name = 'account1'
43
+ set_current_tenant(current_account)
49
44
  end
45
+ end
50
46
 
51
- describe APIApplicationController, type: :controller do
52
- controller do
53
- def index
54
- render body: 'custom called'
55
- end
47
+ describe APIApplicationController, type: :controller do
48
+ controller do
49
+ def index
50
+ render body: 'custom called'
56
51
  end
52
+ end
57
53
 
58
- it 'Finds the correct tenant using the filter command' do
59
- get :index
60
- expect(MultiTenant.current_tenant.name).to eq 'account1'
61
- end
54
+ it 'Finds the correct tenant using the filter command' do
55
+ get :index
56
+ expect(MultiTenant.current_tenant.name).to eq 'account1'
62
57
  end
63
58
  end
64
59
  end
@@ -412,17 +412,13 @@ describe MultiTenant do
412
412
  account1 = Account.create! name: 'Account 1'
413
413
  category1 = Category.create! name: 'Category 1'
414
414
 
415
- expected_sql = if uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR > 0
415
+ expected_sql = if uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 5
416
416
  <<-sql
417
417
  SELECT "projects"."id" AS t0_r0, "projects"."account_id" AS t0_r1, "projects"."name" AS t0_r2, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1 FROM "projects" LEFT OUTER JOIN "project_categories" ON "project_categories"."project_id" = "projects"."id" AND "project_categories"."account_id" = 1 AND "projects"."account_id" = 1 LEFT OUTER JOIN "categories" ON "categories"."id" = "project_categories"."category_id" AND "project_categories"."account_id" = 1 WHERE "projects"."account_id" = 1
418
418
  sql
419
- elsif uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 6
420
- <<-sql
421
- SELECT "projects"."id" AS t0_r0, "projects"."account_id" AS t0_r1, "projects"."name" AS t0_r2, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1 FROM "projects" LEFT OUTER JOIN "project_categories" ON "project_categories"."account_id" = 1 AND "project_categories"."project_id" = "projects"."id" AND "projects"."account_id" = 1 LEFT OUTER JOIN "categories" ON "categories"."id" = "project_categories"."category_id" AND "project_categories"."account_id" = 1 WHERE "projects"."account_id" = 1
422
- sql
423
419
  else
424
420
  <<-sql
425
- SELECT "projects"."id" AS t0_r0, "projects"."account_id" AS t0_r1, "projects"."name" AS t0_r2, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1 FROM "projects" LEFT OUTER JOIN "project_categories" ON "project_categories"."project_id" = "projects"."id" AND "project_categories"."account_id" = "projects"."account_id" AND "project_categories"."account_id" = 1 AND "projects"."account_id" = 1 LEFT OUTER JOIN "categories" ON "categories"."id" = "project_categories"."category_id" AND "project_categories"."account_id" = 1 WHERE "projects"."account_id" = 1
421
+ SELECT "projects"."id" AS t0_r0, "projects"."account_id" AS t0_r1, "projects"."name" AS t0_r2, "categories"."id" AS t1_r0, "categories"."name" AS t1_r1 FROM "projects" LEFT OUTER JOIN "project_categories" ON "project_categories"."account_id" = 1 AND "project_categories"."project_id" = "projects"."id" AND "projects"."account_id" = 1 LEFT OUTER JOIN "categories" ON "categories"."id" = "project_categories"."category_id" AND "project_categories"."account_id" = 1 WHERE "projects"."account_id" = 1
426
422
  sql
427
423
  end
428
424
 
@@ -455,17 +451,13 @@ describe MultiTenant do
455
451
  category1 = Category.create! name: 'Category 1'
456
452
 
457
453
  MultiTenant.with(account1) do
458
- expected_sql = if uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 5 && ActiveRecord::VERSION::MINOR > 0
454
+ expected_sql = if uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 5
459
455
  <<-sql
460
456
  SELECT "tasks".* FROM "tasks" INNER JOIN "projects" ON "projects"."id" = "tasks"."project_id" AND "projects"."account_id" = 1 LEFT JOIN project_categories pc ON project.category_id = pc.id WHERE "tasks"."account_id" = 1
461
457
  sql
462
- elsif uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 6
463
- <<-sql
464
- SELECT "tasks".* FROM "tasks" INNER JOIN "projects" ON "projects"."account_id" = 1 AND "projects"."id" = "tasks"."project_id" LEFT JOIN project_categories pc ON project.category_id = pc.id WHERE "tasks"."account_id" = 1
465
- sql
466
458
  else
467
459
  <<-sql
468
- SELECT "tasks".* FROM "tasks" INNER JOIN "projects" ON "projects"."id" = "tasks"."project_id" AND "projects"."account_id" = "tasks"."account_id" LEFT JOIN project_categories pc ON project.category_id = pc.id WHERE "projects"."account_id" = 1 AND "tasks"."account_id" = 1
460
+ SELECT "tasks".* FROM "tasks" INNER JOIN "projects" ON "projects"."account_id" = 1 AND "projects"."id" = "tasks"."project_id" LEFT JOIN project_categories pc ON project.category_id = pc.id WHERE "tasks"."account_id" = 1
469
461
  sql
470
462
  end
471
463
 
@@ -497,17 +489,9 @@ describe MultiTenant do
497
489
  <<-sql.strip
498
490
  SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = $1 LIMIT $2
499
491
  sql
500
- elsif uses_prepared_statements? && ActiveRecord::VERSION::MAJOR > 4
501
- <<-sql.strip
502
- SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = $1 LIMIT $2
503
- sql
504
- elsif uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 4
505
- <<-sql.strip
506
- SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = $1 LIMIT 1
507
- sql
508
492
  else
509
493
  <<-sql.strip
510
- SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = #{project.id} LIMIT 1
494
+ SELECT "projects".* FROM "projects" WHERE "projects"."account_id" = #{account.id} AND "projects"."id" = $1 LIMIT $2
511
495
  sql
512
496
  end
513
497
 
@@ -520,17 +504,9 @@ describe MultiTenant do
520
504
  <<-sql.strip
521
505
  SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
522
506
  sql
523
- elsif uses_prepared_statements? && ActiveRecord::VERSION::MAJOR > 4
524
- <<-sql.strip
525
- SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
526
- sql
527
- elsif uses_prepared_statements? && ActiveRecord::VERSION::MAJOR == 4
528
- <<-sql.strip
529
- SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT 1
530
- sql
531
507
  else
532
508
  <<-sql.strip
533
- SELECT "projects".* FROM "projects" WHERE "projects"."id" = #{project2.id} LIMIT 1
509
+ SELECT "projects".* FROM "projects" WHERE "projects"."id" = $1 LIMIT $2
534
510
  sql
535
511
  end
536
512
 
@@ -90,4 +90,12 @@ describe "Query Rewriter" do
90
90
  }.to change { Project.count }.from(3).to(1)
91
91
  end
92
92
  end
93
+
94
+ context "when update without arel" do
95
+ it "can call method" do
96
+ expect {
97
+ ActiveRecord::Base.connection.update("SELECT 1")
98
+ }.not_to raise_error
99
+ end
100
+ end
93
101
  end
@@ -4,14 +4,14 @@ require 'activerecord-multi-tenant/sidekiq'
4
4
 
5
5
  describe MultiTenant, 'Sidekiq' do
6
6
  let(:server) { Sidekiq::Middleware::MultiTenant::Server.new }
7
+ let(:account) { Account.create(name: 'test') }
7
8
 
8
9
  describe 'server middleware' do
9
10
  it 'sets the multitenant context when provided in message' do
10
- tenant_id = 1234
11
- server.call(double, {'bogus' => 'message',
12
- 'multi_tenant' => { 'class' => MultiTenant.current_tenant_class, 'id' => tenant_id}},
11
+ server.call(double,{'bogus' => 'message',
12
+ 'multi_tenant' => { 'class' => account.class.name, 'id' => account.id}},
13
13
  'bogus_queue') do
14
- expect(MultiTenant.current_tenant).to eq(tenant_id)
14
+ expect(MultiTenant.current_tenant).to eq(account)
15
15
  end
16
16
  end
17
17
 
@@ -181,10 +181,7 @@ end
181
181
  class Comment < ActiveRecord::Base
182
182
  multi_tenant :account
183
183
  belongs_to :commentable, polymorphic: true
184
-
185
- if ActiveRecord::VERSION::MAJOR >= 4
186
- belongs_to :task, -> { where(comments: { commentable_type: 'Task' }) }, foreign_key: 'commentable_id'
187
- end
184
+ belongs_to :task, -> { where(comments: { commentable_type: 'Task' }) }, foreign_key: 'commentable_id'
188
185
  end
189
186
 
190
187
  class Organization < ActiveRecord::Base
@@ -43,12 +43,7 @@ MultiTenantTest::Application.config.secret_token = 'x' * 40
43
43
  MultiTenantTest::Application.config.secret_key_base = 'y' * 40
44
44
 
45
45
  def uses_prepared_statements?
46
- if ActiveRecord::VERSION::MAJOR == 4
47
- config = ActiveRecord::Base.connection.instance_variable_get(:@config)
48
- config.fetch(:prepared_statements, true)
49
- else
50
- ActiveRecord::Base.connection.prepared_statements
51
- end
46
+ ActiveRecord::Base.connection.prepared_statements
52
47
  end
53
48
 
54
49
  require 'schema'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-multi-tenant
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.4
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Citus Data
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-10-30 00:00:00.000000000 Z
11
+ date: 2020-08-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: request_store
@@ -168,18 +168,10 @@ files:
168
168
  - activerecord-multi-tenant.gemspec
169
169
  - docker-compose.yml
170
170
  - gemfiles/.bundle/config
171
- - gemfiles/active_record_5.1.gemfile
172
- - gemfiles/active_record_5.1.gemfile.lock
173
171
  - gemfiles/active_record_5.2.gemfile
174
172
  - gemfiles/active_record_5.2.gemfile.lock
175
173
  - gemfiles/active_record_6.0.gemfile
176
174
  - gemfiles/active_record_6.0.gemfile.lock
177
- - gemfiles/rails_4.2.gemfile
178
- - gemfiles/rails_4.2.gemfile.lock
179
- - gemfiles/rails_5.0.gemfile
180
- - gemfiles/rails_5.0.gemfile.lock
181
- - gemfiles/rails_5.1.gemfile
182
- - gemfiles/rails_5.1.gemfile.lock
183
175
  - gemfiles/rails_5.2.gemfile
184
176
  - gemfiles/rails_5.2.gemfile.lock
185
177
  - gemfiles/rails_6.0.gemfile
@@ -214,7 +206,7 @@ homepage: https://github.com/citusdata/activerecord-multi-tenant
214
206
  licenses:
215
207
  - MIT
216
208
  metadata: {}
217
- post_install_message:
209
+ post_install_message:
218
210
  rdoc_options: []
219
211
  require_paths:
220
212
  - lib
@@ -229,8 +221,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
229
221
  - !ruby/object:Gem::Version
230
222
  version: '0'
231
223
  requirements: []
232
- rubygems_version: 3.0.3
233
- signing_key:
224
+ rubygems_version: 3.1.2
225
+ signing_key:
234
226
  specification_version: 4
235
227
  summary: ActiveRecord/Rails integration for multi-tenant databases, in particular
236
228
  the Citus extension for PostgreSQL
@@ -1,15 +0,0 @@
1
- # This file was generated by Appraisal
2
-
3
- source "https://rubygems.org"
4
-
5
- gem "appraisal"
6
- gem "activerecord", "~> 5.1.0"
7
- gem "i18n", "~> 0.9.5"
8
- gem "nokogiri", "~> 1.7.1"
9
- gem "nio4r", "~> 2.3.1"
10
- gem "sprockets", "~> 3.7.1"
11
- gem "byebug", "~> 9.0.6"
12
- gem "rake", "12.0.0"
13
- gem "redis", "3.3.3"
14
-
15
- gemspec path: "../"
@@ -1,180 +0,0 @@
1
- PATH
2
- remote: ..
3
- specs:
4
- activerecord-multi-tenant (1.0.4)
5
- rails (>= 4.2)
6
- request_store (>= 1.0.5)
7
-
8
- GEM
9
- remote: https://rubygems.org/
10
- specs:
11
- actioncable (5.1.7)
12
- actionpack (= 5.1.7)
13
- nio4r (~> 2.0)
14
- websocket-driver (~> 0.6.1)
15
- actionmailer (5.1.7)
16
- actionpack (= 5.1.7)
17
- actionview (= 5.1.7)
18
- activejob (= 5.1.7)
19
- mail (~> 2.5, >= 2.5.4)
20
- rails-dom-testing (~> 2.0)
21
- actionpack (5.1.7)
22
- actionview (= 5.1.7)
23
- activesupport (= 5.1.7)
24
- rack (~> 2.0)
25
- rack-test (>= 0.6.3)
26
- rails-dom-testing (~> 2.0)
27
- rails-html-sanitizer (~> 1.0, >= 1.0.2)
28
- actionview (5.1.7)
29
- activesupport (= 5.1.7)
30
- builder (~> 3.1)
31
- erubi (~> 1.4)
32
- rails-dom-testing (~> 2.0)
33
- rails-html-sanitizer (~> 1.0, >= 1.0.3)
34
- activejob (5.1.7)
35
- activesupport (= 5.1.7)
36
- globalid (>= 0.3.6)
37
- activemodel (5.1.7)
38
- activesupport (= 5.1.7)
39
- activerecord (5.1.7)
40
- activemodel (= 5.1.7)
41
- activesupport (= 5.1.7)
42
- arel (~> 8.0)
43
- activesupport (5.1.7)
44
- concurrent-ruby (~> 1.0, >= 1.0.2)
45
- i18n (>= 0.7, < 2)
46
- minitest (~> 5.1)
47
- tzinfo (~> 1.1)
48
- appraisal (2.2.0)
49
- bundler
50
- rake
51
- thor (>= 0.14.0)
52
- arel (8.0.0)
53
- builder (3.2.3)
54
- byebug (9.0.6)
55
- coderay (1.1.2)
56
- concurrent-ruby (1.1.5)
57
- connection_pool (2.2.2)
58
- crass (1.0.4)
59
- diff-lcs (1.3)
60
- erubi (1.9.0)
61
- globalid (0.4.2)
62
- activesupport (>= 4.2.0)
63
- i18n (0.9.5)
64
- concurrent-ruby (~> 1.0)
65
- loofah (2.3.0)
66
- crass (~> 1.0.2)
67
- nokogiri (>= 1.5.9)
68
- mail (2.7.1)
69
- mini_mime (>= 0.1.1)
70
- method_source (0.9.2)
71
- mini_mime (1.0.2)
72
- mini_portile2 (2.1.0)
73
- minitest (5.12.2)
74
- nio4r (2.3.1)
75
- nokogiri (1.7.2)
76
- mini_portile2 (~> 2.1.0)
77
- pg (1.1.4)
78
- pry (0.12.2)
79
- coderay (~> 1.1.0)
80
- method_source (~> 0.9.0)
81
- pry-byebug (3.4.3)
82
- byebug (>= 9.0, < 9.1)
83
- pry (~> 0.10)
84
- rack (2.0.7)
85
- rack-protection (2.0.7)
86
- rack
87
- rack-test (1.1.0)
88
- rack (>= 1.0, < 3)
89
- rails (5.1.7)
90
- actioncable (= 5.1.7)
91
- actionmailer (= 5.1.7)
92
- actionpack (= 5.1.7)
93
- actionview (= 5.1.7)
94
- activejob (= 5.1.7)
95
- activemodel (= 5.1.7)
96
- activerecord (= 5.1.7)
97
- activesupport (= 5.1.7)
98
- bundler (>= 1.3.0)
99
- railties (= 5.1.7)
100
- sprockets-rails (>= 2.0.0)
101
- rails-dom-testing (2.0.3)
102
- activesupport (>= 4.2.0)
103
- nokogiri (>= 1.6)
104
- rails-html-sanitizer (1.3.0)
105
- loofah (~> 2.3)
106
- railties (5.1.7)
107
- actionpack (= 5.1.7)
108
- activesupport (= 5.1.7)
109
- method_source
110
- rake (>= 0.8.7)
111
- thor (>= 0.18.1, < 2.0)
112
- rake (12.0.0)
113
- redis (3.3.3)
114
- request_store (1.4.1)
115
- rack (>= 1.4)
116
- rspec (3.9.0)
117
- rspec-core (~> 3.9.0)
118
- rspec-expectations (~> 3.9.0)
119
- rspec-mocks (~> 3.9.0)
120
- rspec-core (3.9.0)
121
- rspec-support (~> 3.9.0)
122
- rspec-expectations (3.9.0)
123
- diff-lcs (>= 1.2.0, < 2.0)
124
- rspec-support (~> 3.9.0)
125
- rspec-mocks (3.9.0)
126
- diff-lcs (>= 1.2.0, < 2.0)
127
- rspec-support (~> 3.9.0)
128
- rspec-rails (3.9.0)
129
- actionpack (>= 3.0)
130
- activesupport (>= 3.0)
131
- railties (>= 3.0)
132
- rspec-core (~> 3.9.0)
133
- rspec-expectations (~> 3.9.0)
134
- rspec-mocks (~> 3.9.0)
135
- rspec-support (~> 3.9.0)
136
- rspec-support (3.9.0)
137
- sidekiq (5.0.4)
138
- concurrent-ruby (~> 1.0)
139
- connection_pool (~> 2.2, >= 2.2.0)
140
- rack-protection (>= 1.5.0)
141
- redis (~> 3.3, >= 3.3.3)
142
- sprockets (3.7.2)
143
- concurrent-ruby (~> 1.0)
144
- rack (> 1, < 3)
145
- sprockets-rails (3.2.1)
146
- actionpack (>= 4.0)
147
- activesupport (>= 4.0)
148
- sprockets (>= 3.0.0)
149
- thor (0.20.3)
150
- thread_safe (0.3.6)
151
- tzinfo (1.2.5)
152
- thread_safe (~> 0.1)
153
- websocket-driver (0.6.5)
154
- websocket-extensions (>= 0.1.0)
155
- websocket-extensions (0.1.4)
156
-
157
- PLATFORMS
158
- ruby
159
-
160
- DEPENDENCIES
161
- activerecord (~> 5.1.0)
162
- activerecord-multi-tenant!
163
- appraisal
164
- byebug (~> 9.0.6)
165
- i18n (~> 0.9.5)
166
- nio4r (~> 2.3.1)
167
- nokogiri (~> 1.7.1)
168
- pg
169
- pry
170
- pry-byebug
171
- rake (= 12.0.0)
172
- redis (= 3.3.3)
173
- rspec (>= 3.0)
174
- rspec-rails
175
- sidekiq
176
- sprockets (~> 3.7.1)
177
- thor
178
-
179
- BUNDLED WITH
180
- 1.17.3