attributes_sort 0.1.0 → 0.2.0

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 CHANGED
@@ -1 +1 @@
1
- 0.1.0
1
+ 0.2.0
@@ -1,21 +1,32 @@
1
1
  module AttributesSort
2
2
  def self.included(receiver)
3
+ receiver.instance_eval do
4
+ def build_attributes(attributes)
5
+ "[" + attributes.map!{|a| "object.#{a}"}.join(",") + "]"
6
+ end
7
+
8
+ def do_attributes_sort(collection, options={})
9
+ attributes = build_attributes(options[:sort_by])
10
+ collection.sort_by{|object| eval(attributes)}
11
+ end
12
+ end
3
13
  Array.class_eval do
4
- def attr_sort(options = {})
5
- raise "You must pass in sort_by criteria" unless options[:sort_by]
14
+ def class_type
6
15
  klass = self.first.class
7
- klass.instance_eval do
8
- def do_attributes_sort(collection, options={})
9
- attributes = options[:sort_by].inject("["){|attribute_string, attribute| attribute_string << "object.#{attribute},"} + "]"
10
- collection.sort_by{|object| eval(attributes)}
11
- end
16
+ is_same = self.all?{|object| object.class == klass}
17
+ raise "All objects must be of the same class type" unless is_same
18
+ klass
19
+ end
20
+
21
+ def attr_sort(options = {})
22
+ raise "You must pass in sort_by criteria" unless options[:sort_by]
23
+ begin
24
+ class_type.do_attributes_sort(self, options)
25
+ rescue NoMethodError
26
+ raise "You must sort by an attribute that exists in the object that you are sorting"
12
27
  end
13
- begin
14
- klass.do_attributes_sort(self, options)
15
- rescue NoMethodError
16
- raise "You must sort by an attribute that exists in the object that you are sorting"
17
- end
18
28
  end
19
29
  end
20
30
  end
21
31
  end
32
+
@@ -4,7 +4,7 @@ class Person
4
4
  include AttributesSort
5
5
 
6
6
  attr_accessor :firstname,:lastname,:age
7
-
7
+
8
8
  def initialize(firstname="",lastname="",age=0)
9
9
  @firstname = firstname
10
10
  @lastname = lastname
@@ -14,52 +14,67 @@ end
14
14
 
15
15
 
16
16
  describe "AttributesSort" do
17
- before(:each) do
18
- @p1 = Person.new("joe","blow",89)
19
- @p2 = Person.new("joe","blow",12)
20
- @p3 = Person.new("mary","watson",32)
21
- @p4 = Person.new("annie","watson",9)
22
- @p5 = Person.new("bob","builder",12)
23
- @people = [@p1, @p2, @p3, @p4, @p5]
24
- end
25
-
26
- def test_sort(criteria, result)
27
- @people.attr_sort(:sort_by => criteria).should == result
28
- end
17
+ before(:each) do
18
+ @p1 = Person.new("joe","blow",89)
19
+ @p2 = Person.new("joe","blow",12)
20
+ @p3 = Person.new("mary","watson",32)
21
+ @p4 = Person.new("annie","watson",9)
22
+ @p5 = Person.new("bob","builder",12)
23
+ @people = [@p1, @p2, @p3, @p4, @p5]
24
+ end
25
+
26
+ def test_sort(criteria, result)
27
+ @people.attr_sort(:sort_by => criteria).should == result
28
+ end
29
+
30
+ it "sort_by standard ruby" do
31
+ @people.sort_by{|person| [person.age,person.firstname]}.should == [@p4, @p5, @p2, @p3, @p1]
32
+ end
29
33
 
30
34
  it "object must have attr accessible attributes for sort_by to work" do
31
- p = Person.new
32
- p.should respond_to(:firstname)
33
- p.should respond_to(:lastname)
34
- p.should respond_to(:age)
35
- end
36
-
37
- it "sort by last name" do
38
- test_sort([:lastname], [@p1, @p2, @p5, @p4, @p3])
39
- end
40
-
41
- it "sort by age" do
42
- test_sort([:age], [@p4, @p2, @p5, @p3, @p1])
43
- end
44
-
45
- it "sort by age then by first name" do
46
- test_sort([:age, :firstname], [@p4, @p5, @p2, @p3, @p1])
47
- end
48
-
49
- it "sort by age then by last name" do
50
- test_sort([:age, :lastname], [@p4, @p2, @p5, @p3, @p1])
51
- end
52
-
53
- it "sort by last name then by first name then by age" do
54
- test_sort([:lastname,:firstname,:age], [@p2, @p1, @p5, @p4, @p3])
55
- end
56
-
57
- it "raise error if criteria is not provided" do
58
- lambda {test_sort(nil, [@p1, @p2, @p5, @p4, @p3])}.should raise_error("You must pass in sort_by criteria")
59
- end
60
-
61
- it "raise error if criteria is not a valid attribute of class" do
62
- lambda {test_sort([:blah], [@p1, @p2, @p5, @p4, @p3])}.should raise_error("You must sort by an attribute that exists in the object that you are sorting")
63
- end
64
-
35
+ p = Person.new
36
+ p.should respond_to(:firstname)
37
+ p.should respond_to(:lastname)
38
+ p.should respond_to(:age)
39
+ end
40
+
41
+ it "build attributes string array to be eval'd at deferred time in sort_by block'" do
42
+ criteria = [:lastname, :age, :firstname]
43
+ Person.build_attributes(criteria).should == "[object.lastname,object.age,object.firstname]"
44
+ end
45
+
46
+ it "sort by last name" do
47
+ test_sort([:lastname], [@p1, @p2, @p5, @p4, @p3])
48
+ end
49
+
50
+ it "sort by age" do
51
+ test_sort([:age], [@p4, @p2, @p5, @p3, @p1])
52
+ end
53
+
54
+ it "sort by age then by first name" do
55
+ test_sort([:age, :firstname], [@p4, @p5, @p2, @p3, @p1])
56
+ end
57
+
58
+ it "sort by age then by last name" do
59
+ test_sort([:age, :lastname], [@p4, @p2, @p5, @p3, @p1])
60
+ end
61
+
62
+ it "sort by last name then by first name then by age" do
63
+ test_sort([:lastname,:firstname,:age], [@p2, @p1, @p5, @p4, @p3])
64
+ end
65
+
66
+ it "raise error if criteria is not provided" do
67
+ lambda {test_sort(nil, [@p1, @p2, @p5, @p4, @p3])}.should raise_error("You must pass in sort_by criteria")
68
+ end
69
+
70
+ it "raise error if criteria is not a valid attribute of class" do
71
+ lambda {test_sort([:blah], [@p1, @p2, @p5, @p4, @p3])}.should raise_error("You must sort by an attribute that exists in the object that you are sorting")
72
+ end
73
+
74
+ it "raise error if objects are not of same class type" do
75
+ @people << "some other object"
76
+ lambda {test_sort([:age],[@p1, @p2, @p5, @p4, @p3])}.should raise_error("All objects must be of the same class type")
77
+ end
78
+
65
79
  end
80
+
metadata CHANGED
@@ -1,7 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: attributes_sort
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 2
8
+ - 0
9
+ version: 0.2.0
5
10
  platform: ruby
6
11
  authors:
7
12
  - Karmen Blake
@@ -9,7 +14,7 @@ autorequire:
9
14
  bindir: bin
10
15
  cert_chain: []
11
16
 
12
- date: 2009-10-30 00:00:00 -07:00
17
+ date: 2010-03-23 00:00:00 -07:00
13
18
  default_executable:
14
19
  dependencies: []
15
20
 
@@ -46,18 +51,20 @@ required_ruby_version: !ruby/object:Gem::Requirement
46
51
  requirements:
47
52
  - - ">="
48
53
  - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
49
56
  version: "0"
50
- version:
51
57
  required_rubygems_version: !ruby/object:Gem::Requirement
52
58
  requirements:
53
59
  - - ">="
54
60
  - !ruby/object:Gem::Version
61
+ segments:
62
+ - 0
55
63
  version: "0"
56
- version:
57
64
  requirements: []
58
65
 
59
66
  rubyforge_project:
60
- rubygems_version: 1.3.5
67
+ rubygems_version: 1.3.6
61
68
  signing_key:
62
69
  specification_version: 3
63
70
  summary: A slick way to sort a collection objects.