diff --git a/VERSION b/VERSION index c18d72b..100435b 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.8.1 \ No newline at end of file +0.8.2 diff --git a/lib/role_model/class_methods.rb b/lib/role_model/class_methods.rb index 6c40e15..b965243 100644 --- a/lib/role_model/class_methods.rb +++ b/lib/role_model/class_methods.rb @@ -23,7 +23,11 @@ module RoleModel (valid_roles & sanitized_roles).inject(0) { |sum, role| sum + 2**valid_roles.index(role) } end - + + def roles_from_mask(mask) + valid_roles.reject { |role| (mask.to_i & 2**valid_roles.index(role)).zero? } + end + protected # :call-seq: diff --git a/spec/role_model_spec.rb b/spec/role_model_spec.rb index c22f038..bd2a7f4 100644 --- a/spec/role_model_spec.rb +++ b/spec/role_model_spec.rb @@ -51,6 +51,31 @@ describe RoleModel do end end + describe '.roles_from_mask(mask)' do + subject { model_class.roles_from_mask(mask) } + + before do + model_class.instance_eval do + include RoleModel + roles :foo, :bar, :third + end + end + + context 'when roles_mask is 0' do + let(:mask) { 0 } + it 'returns empty set' do + subject.should eq [] + end + end + + context 'when valid roles_mask' do + let(:mask) { 3 } + it 'returns the list of roles associated with a roles_mask' do + subject.should eq [:foo, :bar] + end + end + end + [:roles, :role_symbols].each do |role_query_method| describe "##{role_query_method}" do let(:model) { model_class.new }