role_model 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/.travis.yml CHANGED
@@ -1,6 +1,7 @@
1
1
  rvm:
2
2
  - 1.8.7
3
3
  - 1.9.2
4
+ - 1.9.3
4
5
  - jruby
5
6
  notifications:
6
7
  recipients:
data/README.rdoc CHANGED
@@ -11,12 +11,18 @@ It works like this:
11
11
  require 'role_model'
12
12
 
13
13
  class User
14
- attr_accessor :roles_mask # in real life this would be an persisted attribute
15
-
14
+ attr_accessor :roles_mask # just for demo purposes
15
+ # in real life this would usuallt be a persistent attribute,
16
+ # e.g. if your User model is persisted in a SQL-DB add an integer
17
+ # column named roles_mask to your users table -- just remove/replace
18
+ # above attr_accessor line with whatever is needed for your
19
+ # persistence solution
20
+
16
21
  include RoleModel
17
22
 
18
- # optionally set the integer attribute to store the roles in,
19
- # :roles_mask is the default
23
+ # if you want to use a different integer attribute to store the
24
+ # roles in, set it with roles_attribute :my_roles_attribute,
25
+ # :roles_mask is the default name
20
26
  roles_attribute :roles_mask
21
27
 
22
28
  # declare the valid roles -- do not change the order if you add more
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.1
1
+ 0.8.0
@@ -34,7 +34,27 @@ module RoleModel
34
34
  #
35
35
  # declare valid roles
36
36
  def roles(*roles)
37
+ opts = roles.last.is_a?(Hash) ? roles.pop : {}
37
38
  self.valid_roles = roles.flatten.map(&:to_sym)
39
+ unless (opts[:dynamic] == false)
40
+ self.define_dynamic_queries(self.valid_roles)
41
+ end
42
+ end
43
+
44
+ # Defines dynamic queries for :role
45
+ # #is_<:role>?
46
+ # #<:role>?
47
+ #
48
+ # Defines new methods which call #is?(:role)
49
+ def define_dynamic_queries(roles)
50
+ dynamic_module = Module.new do
51
+ roles.each do |role|
52
+ ["#{role}?".to_sym, "is_#{role}?".to_sym].each do |method|
53
+ define_method(method) { is? role }
54
+ end
55
+ end
56
+ end
57
+ include dynamic_module
38
58
  end
39
59
  end
40
60
  end
@@ -44,5 +44,20 @@ module RoleModel
44
44
  alias_method :is_any_of?, :has_any_role?
45
45
  alias_method :has_role?, :has_any_role?
46
46
 
47
+ # :call-seq:
48
+ # has_only_roles?(:role)
49
+ # has_only_roles?('role')
50
+ # has_only_roles?(:role_1, ..., :role_n)
51
+ # has_only_roles?('role_1', ..., 'role_n')
52
+ # has_only_roles?([:role_1, ..., :role_n])
53
+ # has_only_roles?(['role_1', ..., 'role_n'])
54
+ #
55
+ # check if ONLY of the given roles have been assigned
56
+ # this method is aliased as #is_exactly?
57
+ def has_only_roles?(*roles)
58
+ self.send("#{self.class.roles_attribute_name}") == self.class.mask_for(*roles)
59
+ end
60
+ alias_method :is_exactly?, :has_only_roles?
61
+
47
62
  end
48
63
  end
data/role_model.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = "role_model"
8
- s.version = "0.7.1"
8
+ s.version = "0.8.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Martin Rehfeld"]
12
- s.date = "2012-05-13"
12
+ s.date = "2012-10-29"
13
13
  s.description = "Ever needed to assign roles to a model, say a User, and build conditional behaviour on top of that? Enter RoleModel -- roles have never been easier! Just declare your roles and you are done. Assigned roles will be stored as a bitmask."
14
14
  s.email = "martin.rehfeld@glnetworks.de"
15
15
  s.extra_rdoc_files = [
@@ -296,6 +296,78 @@ describe RoleModel do
296
296
  end
297
297
  end
298
298
  end
299
+
300
+ describe "dynamically query for an individual role" do
301
+ subject { model_class.new }
302
+
303
+ it "should return true when the given role was assigned" do
304
+ subject.roles = :foo
305
+ subject.is_foo?.should be_true
306
+ subject.foo?.should be_true
307
+ end
308
+
309
+ it "should return false when the given role was not assigned" do
310
+ subject.roles = :bar
311
+ subject.is_foo?.should be_false
312
+ subject.foo?.should be_false
313
+ end
314
+
315
+ it "should return false when no role was assigned" do
316
+ subject.is_foo?.should be_false
317
+ subject.bar?.should be_false
318
+ end
319
+
320
+ it "should throw NoMethodError when asked for an undefined role" do
321
+ lambda { subject.baz? }.should raise_error(NoMethodError)
322
+ lambda { subject.is_baz? }.should raise_error(NoMethodError)
323
+ end
324
+
325
+ it "should not define dynamic finders when opting out" do
326
+ non_dynamic_klass = Class.new do
327
+ attr_accessor :roles_mask
328
+ attr_accessor :custom_roles_mask
329
+ include RoleModel
330
+ roles :foo, :bar, :third, :dynamic => false
331
+ end
332
+
333
+ model = non_dynamic_klass.new
334
+ lambda { model.is_foo? }.should raise_error(NoMethodError)
335
+ lambda { model.bar? }.should raise_error(NoMethodError)
336
+ end
337
+
338
+ it "should be able to override the default dynamic query methods and call super" do
339
+ klass = Class.new do
340
+ def bar?
341
+ return false
342
+ end
343
+
344
+ attr_accessor :roles_mask
345
+ attr_accessor :custom_roles_mask
346
+ include RoleModel
347
+ roles :foo, :bar, :baz
348
+
349
+ def is_baz?
350
+ return false
351
+ end
352
+
353
+ def foo?
354
+ ret = super
355
+ !ret
356
+ end
357
+ end
358
+
359
+ model = klass.new
360
+ model.roles = [:foo, :bar, :baz]
361
+
362
+ model.foo?.should be_false
363
+
364
+ model.bar?.should be_false
365
+ model.is_bar?.should be_true
366
+
367
+ model.is_baz?.should be_false
368
+ model.baz?.should be_true
369
+ end
370
+ end
299
371
 
300
372
  context "query for multiple roles" do
301
373
  [:has_any_role?, :is_any_of?, :has_role?].each do |check_role_assignment_method|
@@ -318,6 +390,11 @@ describe RoleModel do
318
390
  describe "##{check_role_assignment_method}" do
319
391
  subject { model_class.new }
320
392
 
393
+ it "returns true when the assigned roles include the given roles" do
394
+ subject.roles = [:foo, :bar, :third]
395
+ subject.send(check_role_assignment_method, :foo, :bar).should be_true
396
+ end
397
+
321
398
  it "should return true when all of the given roles were assigned" do
322
399
  subject.roles = [:foo, :bar]
323
400
  subject.send(check_role_assignment_method, :foo, :bar).should be_true
@@ -336,6 +413,29 @@ describe RoleModel do
336
413
  end
337
414
  end
338
415
 
416
+ context "query for exact roles" do
417
+ [:has_only_roles?, :is_exactly?].each do |check_role_assignment_method|
418
+ describe "##{check_role_assignment_method}" do
419
+ subject { model_class.new }
420
+
421
+ it "returns false when the given roles are a subset of those assigned" do
422
+ subject.roles = [:foo, :bar, :third]
423
+ subject.send(check_role_assignment_method, :foo, :bar).should be_false
424
+ end
425
+
426
+ it "returns true when the given roles exactly match those assigned" do
427
+ subject.roles = [:foo, :bar]
428
+ subject.send(check_role_assignment_method, :foo, :bar).should be_true
429
+ end
430
+
431
+ it "should return false when only some of the given roles were assigned" do
432
+ subject.roles = [:foo, :bar]
433
+ subject.send(check_role_assignment_method, :bar, :baz).should be_false
434
+ end
435
+ end
436
+ end
437
+ end
438
+
339
439
  context "query for roles when none defined in model" do
340
440
  [:has_any_role?, :is_any_of?, :has_role?, :has_all_roles?, :is?, :has_roles?].each do |check_role_assignment_method|
341
441
  describe "##{check_role_assignment_method}" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: role_model
3
3
  version: !ruby/object:Gem::Version
4
- hash: 1
4
+ hash: 63
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 7
9
- - 1
10
- version: 0.7.1
8
+ - 8
9
+ - 0
10
+ version: 0.8.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Martin Rehfeld
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2012-05-13 00:00:00 Z
18
+ date: 2012-10-29 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  requirement: &id001 !ruby/object:Gem::Requirement