From 97e65ba201d1692124cc24c9d219f7f92d3ec60a Mon Sep 17 00:00:00 2001 From: AnKa Date: Tue, 13 Jun 2017 15:18:55 +0200 Subject: [PATCH 1/4] Allow strings as tenant_ids to support UUIDs --- lib/milia.rb | 1 + lib/milia/base.rb | 10 +- lib/milia/support.rb | 14 +++ test/Gemfile.lock | 165 ++++++++++++++++---------------- test/test/fixtures/tenants.yml | 4 + test/test/models/member_test.rb | 2 + test/test/models/tenant_test.rb | 8 +- test/test/models/user_test.rb | 2 +- 8 files changed, 118 insertions(+), 88 deletions(-) create mode 100644 lib/milia/support.rb diff --git a/lib/milia.rb b/lib/milia.rb index 59239ee..25dd091 100644 --- a/lib/milia.rb +++ b/lib/milia.rb @@ -3,6 +3,7 @@ require File.dirname(__FILE__) + '/milia/control' require File.dirname(__FILE__) + '/milia/password_generator' require File.dirname(__FILE__) + '/milia/invite_member' +require File.dirname(__FILE__) + '/milia/support' require File.dirname(__FILE__) + '/milia/railtie' if defined?(Rails::Railtie) diff --git a/lib/milia/base.rb b/lib/milia/base.rb index 5755013..0091188 100644 --- a/lib/milia/base.rb +++ b/lib/milia/base.rb @@ -53,7 +53,7 @@ def acts_as_universal() # ..........................callback enforcers............................ before_save do |obj| # force tenant_id to be universal if obj.tenant_id.present? - raise ::Milia::Control::InvalidTenantAccess + raise ::Milia::Control::InvalidTenantAccess, 'fuxk of' end end @@ -77,9 +77,7 @@ def acts_as_universal_and_determines_account() # validate that a tenant exists prior to a user creation before_create do |new_user| - if Thread.current[:tenant_id].blank? || - !Thread.current[:tenant_id].kind_of?(Integer) || - Thread.current[:tenant_id].zero? + unless Milia::Support::valid_tenant_id?(Thread.current[:tenant_id]) raise ::Milia::Control::InvalidTenantAccess, "no existing valid current tenant" @@ -90,7 +88,7 @@ def acts_as_universal_and_determines_account() after_create do |new_user| tenant = Tenant.find(Thread.current[:tenant_id]) unless tenant.users.include?(new_user) - new_user.skip_reconfirmation! # For details why this is needed see milia issue #68 + new_user.skip_reconfirmation! # For details why this is needed see milia issue #68 tenant.users << new_user # add user to this tenant if not already there end end # before_create do @@ -153,6 +151,8 @@ def set_current_tenant(tenant) tenant_id = tenant.id when Integer then tenant_id = tenant + when String then + tenant_id = tenant else raise ArgumentError, "invalid tenant object or id" end # case diff --git a/lib/milia/support.rb b/lib/milia/support.rb new file mode 100644 index 0000000..9cfef28 --- /dev/null +++ b/lib/milia/support.rb @@ -0,0 +1,14 @@ +module Milia + module Support + + # Validate the content and type of the given tenant_id. Currently + # Integers and Strings (UUID) are supported. + def self.valid_tenant_id?(tenant_id) + return false if tenant_id.blank? + return false if tenant_id.kind_of?(Integer) && tenant_id.zero? + return false if !(tenant_id.kind_of?(Integer) || tenant_id.kind_of?(String)) + true + end + + end +end diff --git a/test/Gemfile.lock b/test/Gemfile.lock index a492ba0..cbb45f0 100644 --- a/test/Gemfile.lock +++ b/test/Gemfile.lock @@ -1,77 +1,77 @@ GIT remote: https://github.com/rails/activerecord-session_store.git - revision: 177936e5207603a94a4deeabf6936363693ab96e + revision: e97fa9f0d20fd932ecee6124b0b46d244d6f7ce6 specs: - activerecord-session_store (1.0.0) - actionpack (>= 4.0, < 5.1) - activerecord (>= 4.0, < 5.1) + activerecord-session_store (1.1.0) + actionpack (>= 4.0, < 5.2) + activerecord (>= 4.0, < 5.2) multi_json (~> 1.11, >= 1.11.2) rack (>= 1.5.2, < 3) - railties (>= 4.0, < 5.1) + railties (>= 4.0, < 5.2) GIT remote: https://github.com/rails/rails.git - revision: 5aef21717f9fa7b309aed218aa04a461d2cb54c7 + revision: 4b77bc116e31202e6a16387530e3805961e08e60 branch: 5-0-stable specs: - actioncable (5.0.1) - actionpack (= 5.0.1) + actioncable (5.0.3) + actionpack (= 5.0.3) nio4r (>= 1.2, < 3.0) websocket-driver (~> 0.6.1) - actionmailer (5.0.1) - actionpack (= 5.0.1) - actionview (= 5.0.1) - activejob (= 5.0.1) + actionmailer (5.0.3) + actionpack (= 5.0.3) + actionview (= 5.0.3) + activejob (= 5.0.3) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.0.1) - actionview (= 5.0.1) - activesupport (= 5.0.1) + actionpack (5.0.3) + actionview (= 5.0.3) + activesupport (= 5.0.3) rack (~> 2.0) rack-test (~> 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.0.1) - activesupport (= 5.0.1) + actionview (5.0.3) + activesupport (= 5.0.3) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.0.1) - activesupport (= 5.0.1) + activejob (5.0.3) + activesupport (= 5.0.3) globalid (>= 0.3.6) - activemodel (5.0.1) - activesupport (= 5.0.1) - activerecord (5.0.1) - activemodel (= 5.0.1) - activesupport (= 5.0.1) + activemodel (5.0.3) + activesupport (= 5.0.3) + activerecord (5.0.3) + activemodel (= 5.0.3) + activesupport (= 5.0.3) arel (~> 7.0) - activesupport (5.0.1) + activesupport (5.0.3) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (~> 0.7) minitest (~> 5.1) tzinfo (~> 1.1) - rails (5.0.1) - actioncable (= 5.0.1) - actionmailer (= 5.0.1) - actionpack (= 5.0.1) - actionview (= 5.0.1) - activejob (= 5.0.1) - activemodel (= 5.0.1) - activerecord (= 5.0.1) - activesupport (= 5.0.1) + rails (5.0.3) + actioncable (= 5.0.3) + actionmailer (= 5.0.3) + actionpack (= 5.0.3) + actionview (= 5.0.3) + activejob (= 5.0.3) + activemodel (= 5.0.3) + activerecord (= 5.0.3) + activesupport (= 5.0.3) bundler (>= 1.3.0, < 2.0) - railties (= 5.0.1) + railties (= 5.0.3) sprockets-rails (>= 2.0.0) - railties (5.0.1) - actionpack (= 5.0.1) - activesupport (= 5.0.1) + railties (5.0.3) + actionpack (= 5.0.3) + activesupport (= 5.0.3) method_source rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) PATH - remote: ../../milia + remote: .. specs: milia (1.3.1) devise (~> 4.2) @@ -84,73 +84,74 @@ GEM arel (7.1.4) bcrypt (3.1.11) builder (3.2.3) - coffee-rails (4.2.1) + coffee-rails (4.2.2) coffee-script (>= 2.2.0) - railties (>= 4.0.0, < 5.2.x) + railties (>= 4.0.0) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.0.4) - devise (4.2.0) + concurrent-ruby (1.0.5) + devise (4.3.0) bcrypt (~> 3.0) orm_adapter (~> 0.1) - railties (>= 4.1.0, < 5.1) + railties (>= 4.1.0, < 5.2) responders warden (~> 1.2.3) - devise_invitable (1.7.0) - actionmailer (>= 4.0.0) + devise_invitable (1.7.2) + actionmailer (>= 4.1.0) devise (>= 4.0.0) erubis (2.7.0) execjs (2.7.0) - globalid (0.3.7) - activesupport (>= 4.1.0) - haml (4.0.7) + globalid (0.4.0) + activesupport (>= 4.2.0) + haml (5.0.1) + temple (>= 0.8.0) tilt - haml-rails (0.9.0) + haml-rails (1.0.0) actionpack (>= 4.0.1) activesupport (>= 4.0.1) - haml (>= 4.0.6, < 5.0) + haml (>= 4.0.6, < 6.0) html2haml (>= 1.0.1) railties (>= 4.0.1) - html2haml (2.1.0) + html2haml (2.2.0) erubis (~> 2.7.0) - haml (~> 4.0) + haml (>= 4.0, < 6) nokogiri (>= 1.6.0) ruby_parser (~> 3.5) - i18n (0.7.0) - jbuilder (2.6.1) - activesupport (>= 3.0.0, < 5.1) - multi_json (~> 1.2) - jquery-rails (4.2.2) + i18n (0.8.4) + jbuilder (2.7.0) + activesupport (>= 4.2.0) + multi_json (>= 1.2) + jquery-rails (4.3.1) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) json (1.8.6) - libv8 (3.16.14.17) + libv8 (3.16.14.19) loofah (2.0.3) nokogiri (>= 1.5.9) - mail (2.6.4) + mail (2.6.6) mime-types (>= 1.16, < 4) method_source (0.8.2) mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) - mini_portile2 (2.1.0) - minitest (5.10.1) + mini_portile2 (2.2.0) + minitest (5.10.2) multi_json (1.12.1) - nio4r (2.0.0) - nokogiri (1.7.0.1) - mini_portile2 (~> 2.1.0) + nio4r (2.1.0) + nokogiri (1.8.0) + mini_portile2 (~> 2.2.0) orm_adapter (0.5.0) - puma (3.7.0) - rack (2.0.1) + puma (3.9.1) + rack (2.0.3) rack-test (0.6.3) rack (>= 1.0) rack-timeout (0.4.2) - rails-dom-testing (2.0.2) - activesupport (>= 4.2.0, < 6.0) - nokogiri (~> 1.6) + rails-dom-testing (2.0.3) + activesupport (>= 4.2.0) + nokogiri (>= 1.6) rails-html-sanitizer (1.0.3) loofah (~> 2.0) rails_12factor (0.0.3) @@ -160,14 +161,15 @@ GEM rails_stdout_logging (0.0.5) rake (12.0.0) rdoc (4.3.0) - recaptcha (4.0.1) + recaptcha (4.3.1) json ref (2.0.0) - responders (2.3.0) - railties (>= 4.2.0, < 5.1) - ruby_parser (3.8.4) + responders (2.4.0) + actionpack (>= 4.2.0, < 5.3) + railties (>= 4.2.0, < 5.3) + ruby_parser (3.9.0) sexp_processor (~> 4.1) - sass (3.4.23) + sass (3.4.24) sass-rails (5.0.6) railties (>= 4.0.0, < 6) sass (~> 3.1) @@ -177,7 +179,7 @@ GEM sdoc (0.4.2) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) - sexp_processor (4.7.0) + sexp_processor (4.9.0) shoulda (3.5.0) shoulda-context (~> 1.0, >= 1.0.1) shoulda-matchers (>= 1.4.1, < 3.0) @@ -192,15 +194,16 @@ GEM activesupport (>= 4.0) sprockets (>= 3.0.0) sqlite3 (1.3.13) + temple (0.8.0) therubyracer (0.12.3) libv8 (~> 3.16.14.15) ref thor (0.19.4) - thread_safe (0.3.5) - tilt (2.0.6) - tzinfo (1.2.2) + thread_safe (0.3.6) + tilt (2.0.7) + tzinfo (1.2.3) thread_safe (~> 0.1) - uglifier (3.0.4) + uglifier (3.2.0) execjs (>= 0.3.0, < 3) warden (1.2.7) rack (>= 1.0) @@ -240,4 +243,4 @@ RUBY VERSION ruby 2.3.1p112 BUNDLED WITH - 1.13.7 + 1.15.1 diff --git a/test/test/fixtures/tenants.yml b/test/test/fixtures/tenants.yml index 7a0c5a5..0098fd6 100644 --- a/test/test/fixtures/tenants.yml +++ b/test/test/fixtures/tenants.yml @@ -10,3 +10,7 @@ tenant_3: id: 3 name: tenant_3 +tenant_4: + id: '2237b3f8-0c8b-4d0f-b8e6-47e42d3346c3' + name: tenant_4 + diff --git a/test/test/models/member_test.rb b/test/test/models/member_test.rb index c320507..d372aad 100644 --- a/test/test/models/member_test.rb +++ b/test/test/models/member_test.rb @@ -39,6 +39,8 @@ class MemberTest < ActiveSupport::TestCase # setup new user user = User.new(email: "limesublime@example.com") + puts '-x-x-x-x-x-x-x-x-x-x-x-x-x-' + puts Tenant.current_tenant.inspect assert user.save_and_invite_member assert user.errors.empty? diff --git a/test/test/models/tenant_test.rb b/test/test/models/tenant_test.rb index 39f1756..9f7d78f 100644 --- a/test/test/models/tenant_test.rb +++ b/test/test/models/tenant_test.rb @@ -134,10 +134,16 @@ class TenantTest < ActiveSupport::TestCase assert_equal tenants( :tenant_3 ).id, Tenant.current_tenant_id end # should do + should 'set current tenant - tenant id as string' do + assert_equal tenants( :tenant_1 ).id, Tenant.current_tenant_id + Tenant.set_current_tenant( tenants( :tenant_4 ).id ) + assert_equal tenants( :tenant_4 ).id, Tenant.current_tenant_id + end # should do + should 'NOT set current tenant - invalid arg' do assert_equal tenants( :tenant_1 ).id, Tenant.current_tenant_id assert_raise(ArgumentError) { - Tenant.set_current_tenant( '2' ) + Tenant.set_current_tenant( 2.2 ) } assert_equal tenants( :tenant_1 ).id, Tenant.current_tenant_id end # should do diff --git a/test/test/models/user_test.rb b/test/test/models/user_test.rb index effcdd9..8e47516 100644 --- a/test/test/models/user_test.rb +++ b/test/test/models/user_test.rb @@ -102,7 +102,7 @@ class UserTest < ActiveSupport::TestCase should 'NOT create new user when invalid current tenant - string' do # force the current_tenant to be unexpected object - Thread.current[:tenant_id] = 'peanut clusters' + Thread.current[:tenant_id] = 2.2 assert_no_difference("User.count") do assert_raise(::Milia::Control::InvalidTenantAccess, From a56c8a0db6934943e0500b339316568816e960f2 Mon Sep 17 00:00:00 2001 From: AnKa Date: Tue, 13 Jun 2017 17:09:15 +0200 Subject: [PATCH 2/4] Update `where_restrict_tenant` to support string ids --- lib/milia/base.rb | 4 +++- test/test/fixtures/tenants.yml | 2 +- test/test/models/member_test.rb | 2 -- test/test/models/tenant_test.rb | 11 +++++++++-- 4 files changed, 13 insertions(+), 6 deletions(-) diff --git a/lib/milia/base.rb b/lib/milia/base.rb index 0091188..a3a67d0 100644 --- a/lib/milia/base.rb +++ b/lib/milia/base.rb @@ -175,7 +175,9 @@ def set_current_tenant(tenant) # for each of the subordinate models in the join seems like a nice safety issue. # ------------------------------------------------------------------------ def where_restrict_tenant(*args) - args.map { |klass| "#{klass.table_name}.tenant_id = #{Thread.current[:tenant_id]}" }.join(" AND ") + tenant_id = Thread.current[:tenant_id] + clause = args.map { |klass| "#{klass.table_name}.tenant_id = ?" }.join(" AND ") + clause.gsub('?', (tenant_id.kind_of?(String) ? "'#{tenant_id}'" : tenant_id.to_s)) end # ------------------------------------------------------------------------ diff --git a/test/test/fixtures/tenants.yml b/test/test/fixtures/tenants.yml index 0098fd6..9dd0eeb 100644 --- a/test/test/fixtures/tenants.yml +++ b/test/test/fixtures/tenants.yml @@ -11,6 +11,6 @@ tenant_3: name: tenant_3 tenant_4: - id: '2237b3f8-0c8b-4d0f-b8e6-47e42d3346c3' + id: 'AAAAAAAA-AAAA-AAAA-AAAA-AAAAAAAAAAAA' name: tenant_4 diff --git a/test/test/models/member_test.rb b/test/test/models/member_test.rb index d372aad..c320507 100644 --- a/test/test/models/member_test.rb +++ b/test/test/models/member_test.rb @@ -39,8 +39,6 @@ class MemberTest < ActiveSupport::TestCase # setup new user user = User.new(email: "limesublime@example.com") - puts '-x-x-x-x-x-x-x-x-x-x-x-x-x-' - puts Tenant.current_tenant.inspect assert user.save_and_invite_member assert user.errors.empty? diff --git a/test/test/models/tenant_test.rb b/test/test/models/tenant_test.rb index 9f7d78f..bd5872e 100644 --- a/test/test/models/tenant_test.rb +++ b/test/test/models/tenant_test.rb @@ -136,8 +136,8 @@ class TenantTest < ActiveSupport::TestCase should 'set current tenant - tenant id as string' do assert_equal tenants( :tenant_1 ).id, Tenant.current_tenant_id - Tenant.set_current_tenant( tenants( :tenant_4 ).id ) - assert_equal tenants( :tenant_4 ).id, Tenant.current_tenant_id + Tenant.set_current_tenant( 'AA-AA-AA-AA' ) + assert_equal 'AA-AA-AA-AA', Tenant.current_tenant_id end # should do should 'NOT set current tenant - invalid arg' do @@ -150,9 +150,16 @@ class TenantTest < ActiveSupport::TestCase RESTRICT_SNIPPET = 'posts.tenant_id = 1 AND zines.tenant_id = 1' should 'prepare a restrict tenant snippet' do + Tenant.set_current_tenant( tenants( :tenant_1 ).id ) assert_equal RESTRICT_SNIPPET, Tenant.where_restrict_tenant( Post, Zine ) end # should do +RESTRICT_STRING_SNIPPET = "posts.tenant_id = 'AA-AA-AA-AA' AND zines.tenant_id = 'AA-AA-AA-AA'" + should 'prepare a restrict tenant snippet with strings' do + Tenant.set_current_tenant( 'AA-AA-AA-AA' ) + assert_equal RESTRICT_STRING_SNIPPET, Tenant.where_restrict_tenant( Post, Zine ) + end # should do + should 'clear tenant.users when tenant destroyed' do target = tenants(:tenant_2) Tenant.set_current_tenant( target ) From 99b344e2f4fb27d3ffa11faced24f726c10c64f1 Mon Sep 17 00:00:00 2001 From: AnKa Date: Tue, 13 Jun 2017 17:15:49 +0200 Subject: [PATCH 3/4] Remove unnecessary debug output --- lib/milia/base.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/milia/base.rb b/lib/milia/base.rb index a3a67d0..7b7a75d 100644 --- a/lib/milia/base.rb +++ b/lib/milia/base.rb @@ -53,7 +53,7 @@ def acts_as_universal() # ..........................callback enforcers............................ before_save do |obj| # force tenant_id to be universal if obj.tenant_id.present? - raise ::Milia::Control::InvalidTenantAccess, 'fuxk of' + raise ::Milia::Control::InvalidTenantAccess end end From 75b5ed1559f3484226b84c35845511276191e2f4 Mon Sep 17 00:00:00 2001 From: AnKa Date: Tue, 13 Jun 2017 17:17:39 +0200 Subject: [PATCH 4/4] Replace Gemfile.lock with origninal content --- test/Gemfile.lock | 161 +++++++++++++++++++++++----------------------- 1 file changed, 79 insertions(+), 82 deletions(-) diff --git a/test/Gemfile.lock b/test/Gemfile.lock index cbb45f0..fac55f6 100644 --- a/test/Gemfile.lock +++ b/test/Gemfile.lock @@ -1,71 +1,71 @@ GIT remote: https://github.com/rails/activerecord-session_store.git - revision: e97fa9f0d20fd932ecee6124b0b46d244d6f7ce6 + revision: 177936e5207603a94a4deeabf6936363693ab96e specs: - activerecord-session_store (1.1.0) - actionpack (>= 4.0, < 5.2) - activerecord (>= 4.0, < 5.2) + activerecord-session_store (1.0.0) + actionpack (>= 4.0, < 5.1) + activerecord (>= 4.0, < 5.1) multi_json (~> 1.11, >= 1.11.2) rack (>= 1.5.2, < 3) - railties (>= 4.0, < 5.2) + railties (>= 4.0, < 5.1) GIT remote: https://github.com/rails/rails.git - revision: 4b77bc116e31202e6a16387530e3805961e08e60 + revision: 5aef21717f9fa7b309aed218aa04a461d2cb54c7 branch: 5-0-stable specs: - actioncable (5.0.3) - actionpack (= 5.0.3) + actioncable (5.0.1) + actionpack (= 5.0.1) nio4r (>= 1.2, < 3.0) websocket-driver (~> 0.6.1) - actionmailer (5.0.3) - actionpack (= 5.0.3) - actionview (= 5.0.3) - activejob (= 5.0.3) + actionmailer (5.0.1) + actionpack (= 5.0.1) + actionview (= 5.0.1) + activejob (= 5.0.1) mail (~> 2.5, >= 2.5.4) rails-dom-testing (~> 2.0) - actionpack (5.0.3) - actionview (= 5.0.3) - activesupport (= 5.0.3) + actionpack (5.0.1) + actionview (= 5.0.1) + activesupport (= 5.0.1) rack (~> 2.0) rack-test (~> 0.6.3) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.2) - actionview (5.0.3) - activesupport (= 5.0.3) + actionview (5.0.1) + activesupport (= 5.0.1) builder (~> 3.1) erubis (~> 2.7.0) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.0, >= 1.0.3) - activejob (5.0.3) - activesupport (= 5.0.3) + activejob (5.0.1) + activesupport (= 5.0.1) globalid (>= 0.3.6) - activemodel (5.0.3) - activesupport (= 5.0.3) - activerecord (5.0.3) - activemodel (= 5.0.3) - activesupport (= 5.0.3) + activemodel (5.0.1) + activesupport (= 5.0.1) + activerecord (5.0.1) + activemodel (= 5.0.1) + activesupport (= 5.0.1) arel (~> 7.0) - activesupport (5.0.3) + activesupport (5.0.1) concurrent-ruby (~> 1.0, >= 1.0.2) i18n (~> 0.7) minitest (~> 5.1) tzinfo (~> 1.1) - rails (5.0.3) - actioncable (= 5.0.3) - actionmailer (= 5.0.3) - actionpack (= 5.0.3) - actionview (= 5.0.3) - activejob (= 5.0.3) - activemodel (= 5.0.3) - activerecord (= 5.0.3) - activesupport (= 5.0.3) + rails (5.0.1) + actioncable (= 5.0.1) + actionmailer (= 5.0.1) + actionpack (= 5.0.1) + actionview (= 5.0.1) + activejob (= 5.0.1) + activemodel (= 5.0.1) + activerecord (= 5.0.1) + activesupport (= 5.0.1) bundler (>= 1.3.0, < 2.0) - railties (= 5.0.3) + railties (= 5.0.1) sprockets-rails (>= 2.0.0) - railties (5.0.3) - actionpack (= 5.0.3) - activesupport (= 5.0.3) + railties (5.0.1) + actionpack (= 5.0.1) + activesupport (= 5.0.1) method_source rake (>= 0.8.7) thor (>= 0.18.1, < 2.0) @@ -84,74 +84,73 @@ GEM arel (7.1.4) bcrypt (3.1.11) builder (3.2.3) - coffee-rails (4.2.2) + coffee-rails (4.2.1) coffee-script (>= 2.2.0) - railties (>= 4.0.0) + railties (>= 4.0.0, < 5.2.x) coffee-script (2.4.1) coffee-script-source execjs coffee-script-source (1.12.2) - concurrent-ruby (1.0.5) - devise (4.3.0) + concurrent-ruby (1.0.4) + devise (4.2.0) bcrypt (~> 3.0) orm_adapter (~> 0.1) - railties (>= 4.1.0, < 5.2) + railties (>= 4.1.0, < 5.1) responders warden (~> 1.2.3) - devise_invitable (1.7.2) - actionmailer (>= 4.1.0) + devise_invitable (1.7.0) + actionmailer (>= 4.0.0) devise (>= 4.0.0) erubis (2.7.0) execjs (2.7.0) - globalid (0.4.0) - activesupport (>= 4.2.0) - haml (5.0.1) - temple (>= 0.8.0) + globalid (0.3.7) + activesupport (>= 4.1.0) + haml (4.0.7) tilt - haml-rails (1.0.0) + haml-rails (0.9.0) actionpack (>= 4.0.1) activesupport (>= 4.0.1) - haml (>= 4.0.6, < 6.0) + haml (>= 4.0.6, < 5.0) html2haml (>= 1.0.1) railties (>= 4.0.1) - html2haml (2.2.0) + html2haml (2.1.0) erubis (~> 2.7.0) - haml (>= 4.0, < 6) + haml (~> 4.0) nokogiri (>= 1.6.0) ruby_parser (~> 3.5) - i18n (0.8.4) - jbuilder (2.7.0) - activesupport (>= 4.2.0) - multi_json (>= 1.2) - jquery-rails (4.3.1) + i18n (0.7.0) + jbuilder (2.6.1) + activesupport (>= 3.0.0, < 5.1) + multi_json (~> 1.2) + jquery-rails (4.2.2) rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) json (1.8.6) - libv8 (3.16.14.19) + libv8 (3.16.14.17) loofah (2.0.3) nokogiri (>= 1.5.9) - mail (2.6.6) + mail (2.6.4) mime-types (>= 1.16, < 4) method_source (0.8.2) mime-types (3.1) mime-types-data (~> 3.2015) mime-types-data (3.2016.0521) - mini_portile2 (2.2.0) - minitest (5.10.2) + mini_portile2 (2.1.0) + minitest (5.10.1) multi_json (1.12.1) - nio4r (2.1.0) - nokogiri (1.8.0) - mini_portile2 (~> 2.2.0) + nio4r (2.0.0) + nokogiri (1.7.0.1) + mini_portile2 (~> 2.1.0) orm_adapter (0.5.0) - puma (3.9.1) - rack (2.0.3) + puma (3.7.0) + rack (2.0.1) rack-test (0.6.3) rack (>= 1.0) rack-timeout (0.4.2) - rails-dom-testing (2.0.3) - activesupport (>= 4.2.0) - nokogiri (>= 1.6) + rails-dom-testing (2.0.2) + activesupport (>= 4.2.0, < 6.0) + nokogiri (~> 1.6) rails-html-sanitizer (1.0.3) loofah (~> 2.0) rails_12factor (0.0.3) @@ -161,15 +160,14 @@ GEM rails_stdout_logging (0.0.5) rake (12.0.0) rdoc (4.3.0) - recaptcha (4.3.1) + recaptcha (4.0.1) json ref (2.0.0) - responders (2.4.0) - actionpack (>= 4.2.0, < 5.3) - railties (>= 4.2.0, < 5.3) - ruby_parser (3.9.0) + responders (2.3.0) + railties (>= 4.2.0, < 5.1) + ruby_parser (3.8.4) sexp_processor (~> 4.1) - sass (3.4.24) + sass (3.4.23) sass-rails (5.0.6) railties (>= 4.0.0, < 6) sass (~> 3.1) @@ -179,7 +177,7 @@ GEM sdoc (0.4.2) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) - sexp_processor (4.9.0) + sexp_processor (4.7.0) shoulda (3.5.0) shoulda-context (~> 1.0, >= 1.0.1) shoulda-matchers (>= 1.4.1, < 3.0) @@ -194,16 +192,15 @@ GEM activesupport (>= 4.0) sprockets (>= 3.0.0) sqlite3 (1.3.13) - temple (0.8.0) therubyracer (0.12.3) libv8 (~> 3.16.14.15) ref thor (0.19.4) - thread_safe (0.3.6) - tilt (2.0.7) - tzinfo (1.2.3) + thread_safe (0.3.5) + tilt (2.0.6) + tzinfo (1.2.2) thread_safe (~> 0.1) - uglifier (3.2.0) + uglifier (3.0.4) execjs (>= 0.3.0, < 3) warden (1.2.7) rack (>= 1.0)