strongbolt 0.3.8 → 0.3.9

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c67e76eb347b2f56147ce3ea4edb40c0abbec16c
4
- data.tar.gz: fe67b27504d1db3bcd74cd861aee53b979dcbc84
3
+ metadata.gz: 085945fde7504a693c9d0bd3a6a98b04da72911f
4
+ data.tar.gz: cde8841b764409146e570aab407bd352e626c373
5
5
  SHA512:
6
- metadata.gz: b456dbe25f2c8fa8a2492cff18a864b1e21f76b3b38fe9427da888d06c17e6cbab82778863d37f5e68cb878e2f3e7599abf1f8f9d3c3e15538ec4cdaeebc3cdd
7
- data.tar.gz: f077745183044f7feb443bda2dc0d4e438b7597ad7034ed7f089a6eb088d835bf1de72c293bec8c255867a52360b6df96c630e35a4a220d18594e2845ad551b5
6
+ metadata.gz: f57f6215dfaf0cd3b095d02fbc5c88073d52514de38767903a451e93c8fc3afd43b2fcee1bdbbcc77f54451683e73dd5a0d517b88122888974e0ef5a919415bd
7
+ data.tar.gz: 96236affc3e1b2eed63fe6a9e4ce4cbc1a4a323fd8cc408bca2c46ed08c093e1c861aeef96f8427dd0a1914527989c5a31307d34aa8530ce13b2249e7b137f86
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- strongbolt (0.3.7)
4
+ strongbolt (0.3.8)
5
5
  awesome_nested_set (~> 3.0.0)
6
6
  grant (~> 3.0)
7
7
  simple_form (~> 3.0)
data/README.md CHANGED
@@ -112,6 +112,81 @@ To achieve this, use the following within your model:
112
112
  authorize_as "Movie"
113
113
  ```
114
114
 
115
+ All ActiveRecord models will get the following methods added by Strongbolt.
116
+
117
+ ##### ::bolted?
118
+
119
+ Returns true if authorization checks are enabled.
120
+
121
+ ##### ::unbolted?
122
+
123
+ Returns true if authorization checks are disabled.
124
+
125
+ ##### ::owned?
126
+
127
+ Returns true when the model is owned by user (has a belongs_to association with the user class). Example: `Client.owned?`
128
+
129
+ ##### ::owner_attribute
130
+
131
+ The attribute of the model which is used to determine the owner. Example: `Client.owner_attribute` would return `:user_id`, `User.owner_attribute` would `:id`.
132
+
133
+ ##### ::tenant?
134
+
135
+ Returns true when the model is a tenant (see below for a description of tenants).
136
+
137
+ ##### ::authorize_as
138
+
139
+ See above. Allows a different model to be used for authorization checks instead.
140
+
141
+ ##### ::name_for_authorization
142
+
143
+ See above. Returns the name of the model to be used for authorization checks.
144
+
145
+ ### Users
146
+
147
+ Your user class (configured in the initializer via `config.user_class`) will have the following methods added by Strongbolt.
148
+
149
+ ##### #capabilities
150
+
151
+ Returns all capabilities assigned to the user, including inherited ones. The return type is an array of `Strongbolt::Capability` instances. Example: `user.capabilities`
152
+
153
+ ##### #add_tenant(tenant_instance)
154
+
155
+ Give the user access to the given tenant (see below for a description of tenants). Example: `user.add_tenant Client.find_by(name: 'AMG')`
156
+
157
+ ##### #owns?(instance)
158
+
159
+ Checks whether the user own the given instance and returns a boolean. `instance` can be any instance of an ActiveRecord model. If the model has an attribute `user_id` it is compared to the user's ID to decide if he owns it. A user owns his own user instance. Example: `user.owns? Client.find_by(name: 'AMG')`, `user.owns? user`
160
+
161
+ ##### #can?(action, instance, attrs = :any, all_instance = false)
162
+
163
+ Return true/false and determines whether the user is authorized to perform `action` on `instance`. `action` has to be a symbol (`:find, :create, :update, :destroy`). `instance` has to be a class or instance of an ActiveRecord model. `attrs` has to be `:any` always for now (it could be used for attribute level authorization, but that's not supported yet). `all_instance` can be set to true when `instance` is a call, to check whether the user can perform `action` on all instances of that class.
164
+ Examples:
165
+ - `user.can?(:find, Client.find_by(name: 'AMG'))`
166
+ - `user.can?(:create, Plan)`
167
+ - `user.can?(:update, Client, :any, true)`
168
+
169
+ ##### #cannot?(...)
170
+
171
+ Inverse of `user.can?(...)`
172
+
173
+ ##### #user_groups
174
+
175
+ ActiveRecord has_may Association with `Strongbolt::UserGroup`
176
+
177
+ ##### #roles
178
+
179
+ ActiveRecord has_may Association with `Strongbolt::Role` through `Strongbolt::UserGroup`
180
+
181
+ ##### #{tenants}
182
+
183
+ ActiveRecord has_may Association with the tenant model. The name is the pluralized version of the tenant model name. Example: `User.clients`
184
+
185
+ ##### #accessible_{tenants}
186
+
187
+ Method returning all tenants of the type the user has access to. Example: `User.accessible_clients`
188
+
189
+
115
190
  ### Tenants
116
191
 
117
192
  Strongbolt allows the utilization of _tenants_. Tenants are vertical scopes within your application.
@@ -9,6 +9,9 @@ module Strongbolt
9
9
 
10
10
  @user_group.users << @user unless @user_group.users.include?(@user)
11
11
 
12
+ redirect_to request.referrer || user_group_path(@user_group)
13
+ rescue ActiveRecord::RecordNotUnique
14
+ # user was already in the group, just ignoring this
12
15
  redirect_to request.referrer || user_group_path(@user_group)
13
16
  end
14
17
 
@@ -0,0 +1,19 @@
1
+ require "strongbolt/generators/migration"
2
+
3
+ module Strongbolt
4
+ module Generators
5
+ #
6
+ # Creates a migration to fix a has many through with users tenants problem
7
+ #
8
+ class FixUniqueGroupMembersGenerator < Rails::Generators::Base
9
+ include Strongbolt::Generators::Migration
10
+
11
+ source_root File.expand_path('../templates', __FILE__)
12
+
13
+ def copy_fix
14
+ copy_migration "fix_unique_group_members", "fix_unique_group_members"
15
+ end
16
+
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ class FixUniqueGroupMembers < ActiveRecord::Migration
2
+ def change
3
+ add_index :strongbolt_user_groups_users, [:user_group_id, :user_id], unique: true, name: :index_strongbolt_user_groups_users_unique
4
+ end
5
+ end
@@ -68,6 +68,8 @@ class CreateStrongboltTables < ActiveRecord::Migration
68
68
  add_index :strongbolt_users_tenants, :tenant_id
69
69
  add_index :strongbolt_users_tenants, :type
70
70
  add_index :strongbolt_users_tenants, [:tenant_id, :type]
71
+
72
+ add_index :strongbolt_user_groups_users, [:user_group_id, :user_id], unique: true, name: :index_strongbolt_user_groups_users_unique
71
73
  end
72
74
  end
73
75
 
data/lib/strongbolt.rb CHANGED
@@ -104,16 +104,6 @@ module Strongbolt
104
104
  Grant::User.current_user = user unless Grant::User.current_user == user
105
105
  end
106
106
 
107
- #
108
- # Ensures the user instance given is a valid user for that configuration
109
- # It checks whether the class or the base_class (in case of STI) of the instance class
110
- # has been configured as the user model
111
- #
112
- def self.valid_user? user
113
- user.class.name == Strongbolt::Configuration.user_class ||
114
- user.class.base_class.name == Strongbolt::Configuration.user_class
115
- end
116
-
117
107
  #
118
108
  # Setting up Strongbolt
119
109
  #
@@ -180,6 +170,17 @@ Error message:
180
170
  ! enabled?
181
171
  end
182
172
 
173
+ #
174
+ # Ensures the user instance given is a valid user for that configuration
175
+ # It checks whether the class or the base_class (in case of STI) of the instance class
176
+ # has been configured as the user model
177
+ #
178
+ def self.valid_user? user
179
+ user.class.name == Strongbolt::Configuration.user_class ||
180
+ user.class.base_class.name == Strongbolt::Configuration.user_class
181
+ end
182
+ private_class_method :valid_user?
183
+
183
184
  # Include helpers in the given scope to AC and AV.
184
185
  def self.include_helpers(scope)
185
186
  ActiveSupport.on_load(:action_controller) do
@@ -191,10 +192,11 @@ Error message:
191
192
  end
192
193
  end
193
194
 
194
- # Not to use directly
195
+ # Not to use directly, only used in tests
195
196
  def self.tenants= tenants
196
197
  @@tenants = tenants
197
198
  end
199
+ private_class_method :tenants=
198
200
  end
199
201
 
200
202
  #
@@ -17,7 +17,7 @@ module Strongbolt
17
17
 
18
18
  #
19
19
  # Not secure if Grant is disabled, there's no current user
20
- # or if we're using Rails console
20
+ # or if we're using Rails console
21
21
  #
22
22
  def unbolted?
23
23
  Grant::Status.grant_disabled? || (defined?(Rails) && defined?(Rails.console)) ||
@@ -29,20 +29,7 @@ module Strongbolt
29
29
  # relationship with the user class
30
30
  #
31
31
  def owned?
32
- @owned ||= name == Configuration.user_class || owner_association.present?
33
- end
34
-
35
- #
36
- # Returns the association to the user, if present
37
- #
38
- def owner_association
39
- @owner_association ||= reflect_on_all_associations(:belongs_to).select do |assoc|
40
- unless assoc.options.has_key? :polymorphic
41
- assoc.klass.name == Configuration.user_class
42
- else
43
- false
44
- end
45
- end.try(:first)
32
+ @owned ||= self <= Configuration.user_class.constantize || owner_association.present?
46
33
  end
47
34
 
48
35
  #
@@ -51,13 +38,20 @@ module Strongbolt
51
38
  def owner_attribute
52
39
  return unless owned?
53
40
 
54
- @owner_attribute ||= if name == Configuration.user_class
41
+ @owner_attribute ||= if self <= Configuration.user_class.constantize
55
42
  :id
56
43
  else
57
44
  owner_association.foreign_key.to_sym
58
45
  end
59
46
  end
60
47
 
48
+ #
49
+ # Authorize as another model
50
+ #
51
+ def authorize_as model_name
52
+ @name_for_authorization = model_name
53
+ end
54
+
61
55
  #
62
56
  # Returns the model name for authorization
63
57
  #
@@ -65,11 +59,19 @@ module Strongbolt
65
59
  @name_for_authorization ||= self.name
66
60
  end
67
61
 
62
+ private
63
+
68
64
  #
69
- # Authorize as another model
65
+ # Returns the association to the user, if present
70
66
  #
71
- def authorize_as model_name
72
- @name_for_authorization = model_name
67
+ def owner_association
68
+ @owner_association ||= reflect_on_all_associations(:belongs_to).select do |assoc|
69
+ unless assoc.options.has_key? :polymorphic
70
+ assoc.klass <= Configuration.user_class.constantize
71
+ else
72
+ false
73
+ end
74
+ end.try(:first)
73
75
  end
74
76
 
75
77
  end
@@ -4,6 +4,8 @@ module Strongbolt
4
4
 
5
5
  def tenant?() (@tenant.present? && @tenant) || Strongbolt.tenants.include?(name); end
6
6
 
7
+ private
8
+
7
9
  #
8
10
  # Returns associations potential name
9
11
  #
@@ -14,8 +16,6 @@ module Strongbolt
14
16
  @plural_association_name ||= self.name.demodulize.underscore.pluralize.to_sym
15
17
  end
16
18
 
17
- private
18
-
19
19
  #
20
20
  # Specifies that the class can be tenanted
21
21
  # It will traverse all the has_many relationships
@@ -52,10 +52,10 @@ module Strongbolt
52
52
  # Determine the model name and the actual model (if we need to traverse the hierarchy)
53
53
  if instance.is_a?(ActiveRecord::Base)
54
54
  model = instance.class
55
- model_name = model.name_for_authorization
55
+ model_name = model.send(:name_for_authorization)
56
56
  elsif instance.is_a?(Class)
57
57
  model = instance
58
- model_name = model.name_for_authorization
58
+ model_name = model.send(:name_for_authorization)
59
59
  else
60
60
  model = nil # We could do model_name.constantize, but there's a big cost to doing this
61
61
  # if we don't need it, so just defer until we determine there's an actual need
@@ -87,6 +87,7 @@ module Strongbolt
87
87
  end
88
88
 
89
89
 
90
+ private
90
91
 
91
92
  #
92
93
  # Populate the capabilities cache
@@ -144,7 +145,6 @@ module Strongbolt
144
145
 
145
146
 
146
147
 
147
-
148
148
  #----------------------------------------------------------#
149
149
  # #
150
150
  # Checks if the user can perform 'action' on 'instance' #
@@ -228,14 +228,14 @@ module Strongbolt
228
228
  begin
229
229
  if instance.class == tenant
230
230
  tenant_ids = [instance.id]
231
- elsif instance.respond_to?(tenant.singular_association_name)
232
- if instance.send(tenant.singular_association_name).present?
233
- tenant_ids = [instance.send(tenant.singular_association_name).id]
231
+ elsif instance.respond_to?(tenant.send(:singular_association_name))
232
+ if instance.send(tenant.send(:singular_association_name)).present?
233
+ tenant_ids = [instance.send(tenant.send(:singular_association_name)).id]
234
234
  else
235
235
  tenant_ids = []
236
236
  end
237
- elsif instance.respond_to?(tenant.plural_association_name)
238
- tenant_ids = instance.send("#{tenant.singular_association_name}_ids")
237
+ elsif instance.respond_to?(tenant.send(:plural_association_name))
238
+ tenant_ids = instance.send("#{tenant.send(:singular_association_name)}_ids")
239
239
  else
240
240
  next result
241
241
  end
@@ -260,7 +260,7 @@ module Strongbolt
260
260
  @tenants_cache = {}
261
261
  # Go over each tenants
262
262
  Strongbolt.tenants.each do |tenant|
263
- @tenants_cache[tenant.name] = send("accessible_#{tenant.plural_association_name}").pluck(:id)
263
+ @tenants_cache[tenant.name] = send("accessible_#{tenant.send(:plural_association_name)}").pluck(:id)
264
264
  Strongbolt.logger.debug "#{@tenants_cache[tenant.name].size} #{tenant.name}"
265
265
  end
266
266
  end
@@ -1,3 +1,3 @@
1
1
  module Strongbolt
2
- VERSION = "0.3.8"
2
+ VERSION = "0.3.9"
3
3
  end
Binary file
@@ -0,0 +1,5 @@
1
+ class FixUniqueGroupMembers < ActiveRecord::Migration
2
+ def change
3
+ add_index :strongbolt_user_groups_users, [:user_group_id, :user_id], unique: true, name: :index_strongbolt_user_groups_users_unique
4
+ end
5
+ end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20150630212251) do
14
+ ActiveRecord::Schema.define(version: 20160531110509) do
15
15
 
16
16
  create_table "strongbolt_capabilities", force: true do |t|
17
17
  t.string "name"
@@ -67,6 +67,7 @@ ActiveRecord::Schema.define(version: 20150630212251) do
67
67
  t.integer "user_id"
68
68
  end
69
69
 
70
+ add_index "strongbolt_user_groups_users", ["user_group_id", "user_id"], name: "index_strongbolt_user_groups_users_unique", unique: true
70
71
  add_index "strongbolt_user_groups_users", ["user_group_id"], name: "index_strongbolt_user_groups_users_on_user_group_id"
71
72
  add_index "strongbolt_user_groups_users", ["user_id"], name: "index_strongbolt_user_groups_users_on_user_id"
72
73
 
Binary file
@@ -3,7 +3,7 @@ require "spec_helper"
3
3
  module Strongbolt
4
4
 
5
5
  describe Bolted do
6
-
6
+
7
7
  #
8
8
  # Bolted?
9
9
  #
@@ -67,7 +67,7 @@ module Strongbolt
67
67
  expect(User.owner_attribute).to eq :id
68
68
  end
69
69
  end
70
-
70
+
71
71
  context 'when model is ownable' do
72
72
 
73
73
  before do
@@ -91,11 +91,11 @@ module Strongbolt
91
91
  it "should have the right owner attribute" do
92
92
  expect(OwnedModel.owner_attribute).to eq :user_id
93
93
  end
94
-
94
+
95
95
  end
96
-
96
+
97
97
  context 'when model isnt ownable' do
98
-
98
+
99
99
  it "should be true" do
100
100
  expect(UnownedModel).not_to be_owned
101
101
  end
@@ -105,7 +105,7 @@ module Strongbolt
105
105
  UnownedModel.new.strongbolt_owner_id
106
106
  end.to raise_error ModelNotOwned
107
107
  end
108
-
108
+
109
109
  end
110
110
 
111
111
  end
@@ -115,7 +115,7 @@ module Strongbolt
115
115
  #
116
116
  describe 'name_for_authorization' do
117
117
  it "should default to model name" do
118
- expect(Model.name_for_authorization).to eq "Model"
118
+ expect(Model.send(:name_for_authorization)).to eq "Model"
119
119
  end
120
120
  end
121
121
 
@@ -123,14 +123,14 @@ module Strongbolt
123
123
  # Authorize as
124
124
  #
125
125
  describe 'authorize_as' do
126
-
126
+
127
127
  before { Model.authorize_as "ParentModel" }
128
128
  after { Model.authorize_as nil }
129
129
 
130
130
  it "should have changed name for authorization" do
131
- expect(Model.name_for_authorization).to eq "ParentModel"
131
+ expect(Model.send(:name_for_authorization)).to eq "ParentModel"
132
132
  end
133
133
 
134
134
  end
135
135
 
136
- end
136
+ end
@@ -1,7 +1,7 @@
1
1
  require "spec_helper"
2
2
 
3
3
  describe Strongbolt::Tenantable do
4
-
4
+
5
5
  it "should have been included in ActiveRecord::Base" do
6
6
  expect(ActiveRecord::Base.included_modules).to include Strongbolt::Tenantable
7
7
  end
@@ -109,7 +109,7 @@ describe Strongbolt::Tenantable do
109
109
  self.table_name = "child_models"
110
110
 
111
111
  belongs_to :other_child_model, foreign_key: :model_id
112
- end
112
+ end
113
113
 
114
114
  #
115
115
  # Cousin of second degree child
@@ -119,7 +119,7 @@ describe Strongbolt::Tenantable do
119
119
 
120
120
  belongs_to :model, polymorphic: true
121
121
  has_one :unowned_model, foreign_key: :model_id
122
- end
122
+ end
123
123
 
124
124
  #
125
125
  # Top level model, parent of Tenant Model
@@ -202,9 +202,9 @@ describe Strongbolt::Tenantable do
202
202
  #
203
203
  # When an association lacks an inverse (none configured and none found)
204
204
  #
205
-
205
+
206
206
  context "when an association lacks an inverse" do
207
-
207
+
208
208
  before(:all) do
209
209
  #
210
210
  # Tenant Model
@@ -242,9 +242,9 @@ describe Strongbolt::Tenantable do
242
242
  #
243
243
  # When a direct association lacks a reference to the tenant
244
244
  #
245
-
245
+
246
246
  context "when an association lacks an inverse" do
247
-
247
+
248
248
  before(:all) do
249
249
  #
250
250
  # Tenant Model
@@ -76,7 +76,7 @@ describe Strongbolt::UserAbilities do
76
76
  @other_tenant_model = TenantModel.create!
77
77
  # Add to the user
78
78
  user.add_tenant @tenant_model
79
-
79
+
80
80
  # Another user
81
81
  @other_user = User.create!
82
82
  # A owned model, owned
@@ -123,7 +123,7 @@ describe Strongbolt::UserAbilities do
123
123
  # But can create setting only the attribute name
124
124
  @role.capabilities.create! model: "UnownedModel", action: "create", attr: "name",
125
125
  :require_tenant_access => false
126
-
126
+
127
127
  # Admin can do whatever
128
128
  @other_role.capabilities.create! model: "UnownedModel", action: "create"
129
129
  end
@@ -135,7 +135,7 @@ describe Strongbolt::UserAbilities do
135
135
  # Adding a tenant to the user
136
136
  #
137
137
  describe "add_tenant" do
138
-
138
+
139
139
  context 'when instance is from a tenant' do
140
140
  let(:model) { TenantModel.create! }
141
141
 
@@ -172,38 +172,38 @@ describe Strongbolt::UserAbilities do
172
172
  before { create_fixtures }
173
173
 
174
174
  context "when same tenant" do
175
-
175
+
176
176
  it "should be true when model is tenant" do
177
- expect(user.has_access_to_tenants? @tenant_model).to eq true
177
+ expect(user.send :has_access_to_tenants?, @tenant_model).to eq true
178
178
  end
179
179
 
180
180
  it "should be true when model is first child" do
181
- expect(user.has_access_to_tenants? @unowned_model).to eq true
181
+ expect(user.send :has_access_to_tenants?, @unowned_model).to eq true
182
182
  end
183
183
 
184
184
  it "should be true when grand child" do
185
- expect(user.has_access_to_tenants? @child_model).to eq true
185
+ expect(user.send :has_access_to_tenants?, @child_model).to eq true
186
186
  end
187
187
 
188
188
  it "should be true for a user defined association" do
189
- expect(user.has_access_to_tenants? @linked_to_tenant).to eq true
189
+ expect(user.send :has_access_to_tenants?, @linked_to_tenant).to eq true
190
190
  end
191
191
 
192
192
  end
193
193
 
194
194
  context "when different tenant" do
195
195
  it "should be false when model is tenant" do
196
- expect(user.has_access_to_tenants? @other_tenant_model).to eq false
196
+ expect(user.send :has_access_to_tenants?, @other_tenant_model).to eq false
197
197
  end
198
198
 
199
199
  it "should be false when model is first child" do
200
- expect(user.has_access_to_tenants? @unmanaged_model).to eq false
200
+ expect(user.send :has_access_to_tenants?, @unmanaged_model).to eq false
201
201
  end
202
202
  end
203
203
 
204
204
  context "when model doesn't have link to tenant" do
205
205
  it "should return true" do
206
- expect(user.has_access_to_tenants? @model).to eq true
206
+ expect(user.send :has_access_to_tenants?, @model).to eq true
207
207
  end
208
208
  end
209
209
  end
@@ -214,7 +214,7 @@ describe Strongbolt::UserAbilities do
214
214
  # All Capabilities
215
215
  #
216
216
  describe 'capabilities' do
217
-
217
+
218
218
  before { create_fixtures }
219
219
 
220
220
  let(:capabilities) { user.capabilities }
@@ -233,11 +233,11 @@ describe Strongbolt::UserAbilities do
233
233
  #
234
234
 
235
235
  describe "can?" do
236
-
236
+
237
237
  before { create_fixtures }
238
238
 
239
239
  describe "creating an owned model" do
240
-
240
+
241
241
  context "when authorized" do
242
242
  let(:tenant_model) { TenantModel.create! }
243
243
 
@@ -284,7 +284,7 @@ describe Strongbolt::UserAbilities do
284
284
  ]
285
285
  end
286
286
  end
287
- after do
287
+ after do
288
288
  Strongbolt.setup do |config|
289
289
  config.default_capabilities = []
290
290
  end
@@ -320,7 +320,7 @@ describe Strongbolt::UserAbilities do
320
320
  end # Updating an owned model
321
321
 
322
322
  describe "creating a model with attribute restriction" do
323
-
323
+
324
324
  context "when requiring all attributes" do
325
325
  it "should return false" do
326
326
  expect(user.can? :create, UnownedModel, :all).to eq false
@@ -392,13 +392,13 @@ describe Strongbolt::UserAbilities do
392
392
  #
393
393
 
394
394
  describe "Populate Capabilities Cache" do
395
-
395
+
396
396
  #
397
397
  # We create some fixtures for the population of cache to be tested
398
398
  #
399
399
  before { create_fixtures }
400
400
 
401
- let(:cache) { user.populate_capabilities_cache }
401
+ let(:cache) { user.send(:populate_capabilities_cache) }
402
402
 
403
403
  subject { cache }
404
404
 
@@ -430,14 +430,14 @@ describe Strongbolt::UserAbilities do
430
430
  # OWNS?
431
431
  #
432
432
  describe "owns?" do
433
-
433
+
434
434
  #
435
435
  # Another user
436
436
  #
437
437
  context "when testing against a user" do
438
438
 
439
439
  context 'when other user' do
440
-
440
+
441
441
  let(:other_user) { User.create! }
442
442
 
443
443
  it "should not own it" do
@@ -459,7 +459,7 @@ describe Strongbolt::UserAbilities do
459
459
  # Another object
460
460
  #
461
461
  context "when testing against another model having user_id" do
462
-
462
+
463
463
  context "when owning it" do
464
464
  let(:model) { Model.create! user_id: user.id }
465
465
 
@@ -467,7 +467,7 @@ describe Strongbolt::UserAbilities do
467
467
  expect(user.owns? model).to eq true
468
468
  end
469
469
  end
470
-
470
+
471
471
  context "when not owning it" do
472
472
  let(:model) { Model.create! user_id: 0 }
473
473
 
@@ -485,7 +485,7 @@ describe Strongbolt::UserAbilities do
485
485
  # Another object unowned
486
486
  #
487
487
  context "when testing against a model not having user id" do
488
-
488
+
489
489
  let(:model) { UnownedModel.create! }
490
490
 
491
491
  it "should not own it" do
@@ -506,4 +506,4 @@ describe Strongbolt::UserAbilities do
506
506
  end
507
507
  end
508
508
 
509
- end
509
+ end
@@ -123,6 +123,8 @@ class TestsMigrations < ActiveRecord::Migration
123
123
  add_index :strongbolt_users_tenants, :tenant_id
124
124
  add_index :strongbolt_users_tenants, :type
125
125
  add_index :strongbolt_users_tenants, [:tenant_id, :type]
126
+
127
+ add_index :strongbolt_user_groups_users, [:user_group_id, :user_id], unique: true, name: :index_strongbolt_user_groups_users_unique
126
128
  end
127
129
  end
128
130
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: strongbolt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.8
4
+ version: 0.3.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Césaré-Herriau
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-05-16 00:00:00.000000000 Z
12
+ date: 2016-05-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: awesome_nested_set
@@ -208,9 +208,11 @@ files:
208
208
  - app/views/strongbolt/user_groups/new.html.erb
209
209
  - app/views/strongbolt/user_groups/show.html.erb
210
210
  - lib/generators/strongbolt/fix_generator.rb
211
+ - lib/generators/strongbolt/fix_unique_group_members_generator.rb
211
212
  - lib/generators/strongbolt/indexes_generator.rb
212
213
  - lib/generators/strongbolt/install_generator.rb
213
214
  - lib/generators/strongbolt/templates/fix.rb
215
+ - lib/generators/strongbolt/templates/fix_unique_group_members.rb
214
216
  - lib/generators/strongbolt/templates/indexes.rb
215
217
  - lib/generators/strongbolt/templates/migration.rb
216
218
  - lib/generators/strongbolt/templates/strongbolt.rb
@@ -286,6 +288,7 @@ files:
286
288
  - spec/dummy/db/development.sqlite3
287
289
  - spec/dummy/db/migrate/20150630212236_create_strongbolt_tables.rb
288
290
  - spec/dummy/db/migrate/20150630212251_create_strongbolt_tables_indexes.rb
291
+ - spec/dummy/db/migrate/20160531110509_fix_unique_group_members.rb
289
292
  - spec/dummy/db/schema.rb
290
293
  - spec/dummy/db/test.sqlite3
291
294
  - spec/dummy/lib/assets/.keep
@@ -389,6 +392,7 @@ test_files:
389
392
  - spec/dummy/db/development.sqlite3
390
393
  - spec/dummy/db/migrate/20150630212236_create_strongbolt_tables.rb
391
394
  - spec/dummy/db/migrate/20150630212251_create_strongbolt_tables_indexes.rb
395
+ - spec/dummy/db/migrate/20160531110509_fix_unique_group_members.rb
392
396
  - spec/dummy/db/schema.rb
393
397
  - spec/dummy/db/test.sqlite3
394
398
  - spec/dummy/lib/assets/.keep