7 Commits
1.3.2 ... 1.3.4

Author SHA1 Message Date
Ryan Bates
04b523eea4 releasing version 1.3.4 2010-08-31 15:46:26 -07:00
Ryan Bates
5a353c1cba don't stop at cannot definition when checking class - closes #131 2010-08-30 15:20:06 -07:00
Ryan Bates
4fe44af45d be more clear about blocks not working with accessible_by - closes #130 2010-08-30 13:40:31 -07:00
Ryan Bates
a10a38c82f releasing version 1.3.3 2010-08-20 16:27:25 -07:00
Ryan Bates
caed4fcee5 use RSpec namespace for matcher - closes #119 2010-08-18 16:22:43 -07:00
Ryan Bates
e893e12260 fixing broken spec and minor improvements to tableized_conditions method 2010-08-18 16:04:08 -07:00
McClain Looney
3d7742ea43 fix for bug 123 2010-08-17 09:33:11 -05:00
9 changed files with 48 additions and 16 deletions

View File

@@ -1,3 +1,15 @@
1.3.4 (August 31, 2010)
* Don't stop at +cannot+ with hash conditions when checking class (thanks tamoya) - see issue #131
1.3.3 (August 20, 2010)
* Switching to Rspec namespace to remove deprecation warning in Rspec 2 - see issue #119
* Pluralize nested associations for conditions in accessible_by (thanks mlooney) - see issue #123
1.3.2 (August 7, 2010) 1.3.2 (August 7, 2010)
* Fixing slice error when passing in custom resource name - see issue #112 * Fixing slice error when passing in custom resource name - see issue #112
@@ -14,8 +26,7 @@
* Adding :singleton option to load_resource - see issue #93 * Adding :singleton option to load_resource - see issue #93
* Supporting multiple resources in :through option for polymorphic * Supporting multiple resources in :through option for polymorphic associations - see issue #73
associations - see issue #73
* Supporting Single Table Inheritance for "can" comparisons - see issue #55 * Supporting Single Table Inheritance for "can" comparisons - see issue #55

View File

@@ -135,7 +135,7 @@ In the controller +index+ action you may want to fetch only the records which th
@articles = Article.accessible_by(current_ability) @articles = Article.accessible_by(current_ability)
See {Fetching Records}[http://wiki.github.com/ryanb/cancan/fetching-records] for more information. This will only work when abilities are defined using hash conditions, not blocks. See {Fetching Records}[http://wiki.github.com/ryanb/cancan/fetching-records] for more information.
== Additional Docs == Additional Docs

View File

@@ -1,6 +1,6 @@
Gem::Specification.new do |s| Gem::Specification.new do |s|
s.name = "cancan" s.name = "cancan"
s.version = "1.3.2" s.version = "1.3.4"
s.author = "Ryan Bates" s.author = "Ryan Bates"
s.email = "ryan@railscasts.com" s.email = "ryan@railscasts.com"
s.homepage = "http://github.com/ryanb/cancan" s.homepage = "http://github.com/ryanb/cancan"

View File

@@ -216,7 +216,7 @@ module CanCan
def relevant_can_definitions_for_query(action, subject) def relevant_can_definitions_for_query(action, subject)
relevant_can_definitions(action, subject).each do |can_definition| relevant_can_definitions(action, subject).each do |can_definition|
if can_definition.only_block? if can_definition.only_block?
raise Error, "Cannot determine SQL conditions or joins from block for #{action.inspect} #{subject.inspect}" raise Error, "The accessible_by call cannot be used with a block 'can' definition. The SQL cannot be determined for #{action.inspect} #{subject.inspect}"
end end
end end
end end

View File

@@ -30,18 +30,18 @@ module CanCan
elsif @conditions.kind_of?(Hash) && subject.class != Class elsif @conditions.kind_of?(Hash) && subject.class != Class
matches_conditions_hash?(subject) matches_conditions_hash?(subject)
else else
true @base_behavior
end end
end end
# Returns a hash of conditions, pluralizing the table names def tableized_conditions(conditions = @conditions)
def tableized_conditions conditions.inject({}) do |result_hash, (name, value)|
if @conditions if value.kind_of? Hash
@conditions.inject({}) do |tableized_conditions, (name, value)| name = name.to_s.tableize.to_sym
name = name.to_s.tableize.to_sym if value.kind_of? Hash value = tableized_conditions(value)
tableized_conditions[name] = value
tableized_conditions
end end
result_hash[name] = value
result_hash
end end
end end

View File

@@ -1,4 +1,5 @@
Spec::Matchers.define :be_able_to do |*args| RSpec = Spec unless defined? RSpec # for RSpec 1 compatability
RSpec::Matchers.define :be_able_to do |*args|
match do |ability| match do |ability|
ability.can?(*args) ability.can?(*args)
end end

View File

@@ -246,6 +246,14 @@ describe CanCan::Ability do
@ability.can?(:read, [[4, 5, 6]]).should be_false @ability.can?(:read, [[4, 5, 6]]).should be_false
end end
it "should not stop at cannot definition when comparing class" do
@ability.can :read, Array
@ability.cannot :read, Array, :first => 1
@ability.can?(:read, [2, 3, 5]).should be_true
@ability.can?(:read, [1, 3, 5]).should be_false
@ability.can?(:read, Array).should be_true
end
it "should has eated cheezburger" do it "should has eated cheezburger" do
lambda { lambda {
@ability.can? :has, :cheezburger @ability.can? :has, :cheezburger

View File

@@ -31,8 +31,8 @@ describe CanCan::ActiveRecordAdditions do
@ability.can :read, @model_class, :too => {:car => 1, :far => {:bar => 1}} @ability.can :read, @model_class, :too => {:car => 1, :far => {:bar => 1}}
condition_variants = [ condition_variants = [
'(toos.far.bar=1 AND toos.car=1) OR (foos.bar=1)', # faked sql sanitizer is stupid ;-) '(toos.fars.bar=1 AND toos.car=1) OR (foos.bar=1)', # faked sql sanitizer is stupid ;-)
'(toos.car=1 AND toos.far.bar=1) OR (foos.bar=1)' '(toos.car=1 AND toos.fars.bar=1) OR (foos.bar=1)'
] ]
joins_variants = [ joins_variants = [
[:foo, {:too => [:far]}], [:foo, {:too => [:far]}],

View File

@@ -31,6 +31,18 @@ describe CanCan::CanDefinition do
@can.associations_hash.should == {:foo => {:bar => {}}} @can.associations_hash.should == {:foo => {:bar => {}}}
end end
it "should tableize correctly for absurdly complex permissions" do
@conditions[:unit] = {:property=>{:landlord=>{:weasle_id=>560}}}
@conditions[:test] = 1
@can.tableized_conditions.should == {:units => {:properties => {:landlords=>{:weasle_id=>560}}}, :test => 1}
end
it "should tableize correctly for complex permissions" do
@conditions[:unit] = {:property=>{:landlord_id=>560}}
@conditions[:test] = 1
@can.tableized_conditions.should == {:units => {:properties => {:landlord_id=>560}}, :test => 1}
end
it "should return table names in conditions for association joins" do it "should return table names in conditions for association joins" do
@conditions[:foo] = {:bar => 1} @conditions[:foo] = {:bar => 1}
@conditions[:test] = 1 @conditions[:test] = 1