attributes_sort 0.2.1 → 0.2.2
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.
- data/VERSION +1 -1
- data/lib/attributes_sort.rb +16 -11
- data/spec/attributes_sort_spec.rb +19 -2
- metadata +3 -3
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.2.
|
1
|
+
0.2.2
|
data/lib/attributes_sort.rb
CHANGED
@@ -2,29 +2,34 @@ module AttributesSort
|
|
2
2
|
def self.included(receiver)
|
3
3
|
receiver.instance_eval do
|
4
4
|
def build_attributes(attributes)
|
5
|
-
"["
|
5
|
+
"[" << attributes.map!{|attribute| "object.#{attribute}"}.join(",") << "]"
|
6
6
|
end
|
7
7
|
|
8
8
|
def do_attributes_sort(collection, attributes)
|
9
|
-
|
10
|
-
collection.sort_by{|object| eval(
|
9
|
+
attribute_array_string = build_attributes(attributes)
|
10
|
+
collection.sort_by{|object| eval(attribute_array_string)}
|
11
11
|
end
|
12
12
|
end
|
13
13
|
Array.class_eval do
|
14
|
+
def sortable_attributes?
|
15
|
+
self.all? {|object| @attributes.all?{|attribute| object.respond_to?(attribute)}}
|
16
|
+
end
|
17
|
+
|
14
18
|
def class_type
|
15
19
|
klass = self.first.class
|
16
|
-
|
17
|
-
|
20
|
+
|
21
|
+
#use duck type check respond to check instead
|
22
|
+
#is_same = self.all?{|object| object.class == klass}
|
23
|
+
#raise "All objects must be of the same class type" unless is_same
|
24
|
+
|
25
|
+
raise "All objects must respond to sort criteria"unless sortable_attributes?
|
18
26
|
klass
|
19
27
|
end
|
20
28
|
|
21
29
|
def attr_sort(options = {})
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
rescue NoMethodError
|
26
|
-
raise "You must sort by an attribute that exists in the object that you are sorting"
|
27
|
-
end
|
30
|
+
@attributes = options[:sort_by]
|
31
|
+
raise "You must pass in sort_by criteria" unless @attributes
|
32
|
+
class_type.do_attributes_sort(self, @attributes)
|
28
33
|
end
|
29
34
|
end
|
30
35
|
end
|
@@ -67,14 +67,31 @@ describe "AttributesSort" do
|
|
67
67
|
lambda {test_sort(nil, [@p1, @p2, @p5, @p4, @p3])}.should raise_error("You must pass in sort_by criteria")
|
68
68
|
end
|
69
69
|
|
70
|
-
it "raise error
|
71
|
-
lambda {test_sort([:blah], [@p1, @p2, @p5, @p4, @p3])}.should raise_error("
|
70
|
+
it "raise error object does not respond to method call" do
|
71
|
+
lambda {test_sort([:blah], [@p1, @p2, @p5, @p4, @p3])}.should raise_error("All objects must respond to sort criteria")
|
72
72
|
end
|
73
73
|
|
74
74
|
it "raise error if objects are not of same class type" do
|
75
|
+
pending "using duck type check instead"
|
75
76
|
@people << "some other object"
|
76
77
|
lambda {test_sort([:age],[@p1, @p2, @p5, @p4, @p3])}.should raise_error("All objects must be of the same class type")
|
77
78
|
end
|
78
79
|
|
80
|
+
class Dog
|
81
|
+
attr_accessor :firstname,:lastname,:age
|
82
|
+
|
83
|
+
def initialize(firstname="",lastname="",age=0)
|
84
|
+
@firstname = firstname
|
85
|
+
@lastname = lastname
|
86
|
+
@age = age
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
it "duck typed objects can be sorted as long as they all respond to same methods" do
|
91
|
+
dog = Dog.new("fido", "zib", 7)
|
92
|
+
@people << dog
|
93
|
+
test_sort([:lastname,:firstname,:age], [@p2, @p1, @p5, @p4, @p3, dog])
|
94
|
+
end
|
95
|
+
|
79
96
|
end
|
80
97
|
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 2
|
9
|
+
version: 0.2.2
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Karmen Blake
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-03-
|
17
|
+
date: 2010-03-24 00:00:00 -07:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|