mirror of
https://github.com/redmine/redmine.git
synced 2025-11-15 17:56:03 +01:00
<=> operator should return nil when invoked with an incomparable object (#38772).
Patch by Go MAEDA. git-svn-id: https://svn.redmine.org/redmine/trunk@22269 e93f8b46-1217-0410-a6f0-8f06a7374b81
This commit is contained in:
@@ -263,6 +263,8 @@ class CustomField < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(field)
|
||||
return nil unless field.is_a?(CustomField)
|
||||
|
||||
position <=> field.position
|
||||
end
|
||||
|
||||
|
||||
@@ -91,6 +91,8 @@ class Enumeration < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(enumeration)
|
||||
return nil unless enumeration.is_a?(Enumeration)
|
||||
|
||||
position <=> enumeration.position
|
||||
end
|
||||
|
||||
|
||||
@@ -1435,9 +1435,9 @@ class Issue < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(issue)
|
||||
if issue.nil?
|
||||
-1
|
||||
elsif root_id != issue.root_id
|
||||
return nil unless issue.is_a?(Issue)
|
||||
|
||||
if root_id != issue.root_id
|
||||
(root_id || 0) <=> (issue.root_id || 0)
|
||||
else
|
||||
(lft || 0) <=> (issue.lft || 0)
|
||||
|
||||
@@ -43,6 +43,8 @@ class IssueCategory < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(category)
|
||||
return nil unless category.is_a?(IssueCategory)
|
||||
|
||||
name <=> category.name
|
||||
end
|
||||
|
||||
|
||||
@@ -198,6 +198,8 @@ class IssueRelation < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(relation)
|
||||
return nil unless relation.is_a?(IssueRelation)
|
||||
|
||||
r = TYPES[self.relation_type][:order] <=> TYPES[relation.relation_type][:order]
|
||||
r == 0 ? id <=> relation.id : r
|
||||
end
|
||||
|
||||
@@ -82,6 +82,8 @@ class IssueStatus < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(status)
|
||||
return nil unless status.is_a?(IssueStatus)
|
||||
|
||||
position <=> status.position
|
||||
end
|
||||
|
||||
|
||||
@@ -81,6 +81,8 @@ class Member < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(member)
|
||||
return nil unless member.is_a?(Member)
|
||||
|
||||
a, b = roles.sort, member.roles.sort
|
||||
if a == b
|
||||
if principal
|
||||
|
||||
@@ -151,9 +151,11 @@ class Principal < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(principal)
|
||||
if principal.nil?
|
||||
-1
|
||||
elsif self.class.name == principal.class.name
|
||||
# avoid an error when sorting members without roles (#10053)
|
||||
return -1 if principal.nil?
|
||||
return nil unless principal.is_a?(Principal)
|
||||
|
||||
if self.class.name == principal.class.name
|
||||
self.to_s.casecmp(principal.to_s)
|
||||
else
|
||||
# groups after users
|
||||
|
||||
@@ -671,6 +671,8 @@ class Project < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(project)
|
||||
return nil unless project.is_a?(Project)
|
||||
|
||||
name.casecmp(project.name)
|
||||
end
|
||||
|
||||
|
||||
@@ -141,6 +141,8 @@ class Repository < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(repository)
|
||||
return nil unless repository.is_a?(Repository)
|
||||
|
||||
if is_default?
|
||||
-1
|
||||
elsif repository.is_default?
|
||||
|
||||
@@ -155,15 +155,15 @@ class Role < ActiveRecord::Base
|
||||
end
|
||||
|
||||
def <=>(role)
|
||||
if role
|
||||
# returns -1 for nil since r2726
|
||||
return -1 if role.nil?
|
||||
return nil unless role.is_a?(Role)
|
||||
|
||||
if builtin == role.builtin
|
||||
position <=> role.position
|
||||
else
|
||||
builtin <=> role.builtin
|
||||
end
|
||||
else
|
||||
-1
|
||||
end
|
||||
end
|
||||
|
||||
def to_s
|
||||
|
||||
@@ -93,6 +93,8 @@ class Tracker < ActiveRecord::Base
|
||||
def to_s; name end
|
||||
|
||||
def <=>(tracker)
|
||||
return nil unless tracker.is_a?(Tracker)
|
||||
|
||||
position <=> tracker.position
|
||||
end
|
||||
|
||||
|
||||
@@ -316,6 +316,8 @@ class Version < ActiveRecord::Base
|
||||
# Versions are sorted by effective_date and name
|
||||
# Those with no effective_date are at the end, sorted by name
|
||||
def <=>(version)
|
||||
return nil unless version.is_a?(Version)
|
||||
|
||||
if self.effective_date
|
||||
if version.effective_date
|
||||
if self.effective_date == version.effective_date
|
||||
|
||||
@@ -187,6 +187,8 @@ module Redmine
|
||||
end
|
||||
|
||||
def <=>(plugin)
|
||||
return nil unless plugin.is_a?(Plugin)
|
||||
|
||||
self.id.to_s <=> plugin.id.to_s
|
||||
end
|
||||
|
||||
|
||||
@@ -61,6 +61,8 @@ module Redmine
|
||||
end
|
||||
|
||||
def <=>(theme)
|
||||
return nil unless theme.is_a?(Theme)
|
||||
|
||||
name <=> theme.name
|
||||
end
|
||||
|
||||
|
||||
@@ -179,4 +179,10 @@ class EnumerationTest < ActiveSupport::TestCase
|
||||
override.destroy
|
||||
assert_equal [1, 2, 3], [a, b, c].map(&:reload).map(&:position)
|
||||
end
|
||||
|
||||
def test_spaceship_operator_with_incomparable_value_should_return_nil
|
||||
e = Enumeration.first
|
||||
assert_nil e <=> nil
|
||||
assert_nil e <=> 'foo'
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user