activerecord-multi-tenant 1.0.4 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
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