>>>>>>>>>>>>>> This breaks the API. <<<<<<<<<<<<<<<<<<<<<<<<<<
[rubyvote] / lib / rubyvote / election.rb
index 4499233ebb0bda4e0f305c6a853bbbf7c96ed454..3655a034e7575d7be3541ab49e1be12a80fb0c17 100644 (file)
@@ -42,7 +42,11 @@ class ElectionVote
     if votes
       if votes.instance_of?( Array )
         votes.each do |vote|
-          self.tally_vote(vote) if self.verify_vote(vote)
+          if self.verify_vote(vote)
+            self.tally_vote(vote)
+          else
+            raise InvalidVoteError.new("Invalid vote object", vote)
+          end
         end
       else
         raise ElectionError, "Votes must be in the form of an array.", caller
@@ -62,15 +66,6 @@ class ElectionVote
     self.verify_vote(vote)
   end
 
-  def filter_out(winner)
-    if winner.winners[0].class == Array
-      to_filter = winner.winners[0]
-    else
-      to_filter = [winner.winners[0]]
-    end
-    @candidates.delete_if {|x| to_filter.include?(x)}
-  end
-
 end
 
 class PluralityVote < ElectionVote
@@ -80,7 +75,7 @@ class PluralityVote < ElectionVote
   
   protected
   def verify_vote(vote=nil)
-    vote.instance_of?( String )
+    vote ? true : false
   end
 
   def tally_vote(candidate)
@@ -119,7 +114,7 @@ end
 
 class ElectionResult
   attr_reader :winners
-  attr_accessor :full_results
+  attr_reader :election
 
   def initialize(voteobj=nil)
     unless voteobj and voteobj.kind_of?( ElectionVote )
@@ -128,7 +123,6 @@ class ElectionResult
 
     @election = voteobj
     @winners = Array.new
-    @full_results = Array.new
   end
 
   def winner
@@ -136,18 +130,15 @@ class ElectionResult
   end
 
   def winner?
-    @winners.length > 0
-  end
-
-  def get_full_results
-    @full_results.collect {|x| x.winners}
+    @winners.length > 0 and not @winners[0].nil?
   end
-
+  
 end
 
 class PluralityResult < ElectionResult
   attr_reader :ranked_candidates
-
+  attr_reader :points
+  
   def initialize(voteobj=nil)
     super(voteobj)
 
@@ -158,6 +149,8 @@ class PluralityResult < ElectionResult
       b[1] <=> a[1]
     end.collect {|a| a[0]}
     
+    @points = @election.votes
+    
     # winners are anyone who has the same number of votes as the
     # first person
     @winners = @ranked_candidates.find_all do |i|
@@ -174,3 +167,10 @@ end
 class ElectionError < ArgumentError
 end
 
+class InvalidVoteError < ElectionError
+  attr_accessor :voteobj
+  def initialize(msg=nil, voteobj=nil)
+    super(msg)
+    @voteobj=voteobj
+  end
+end

Benjamin Mako Hill || Want to submit a patch?