diff options
author | Marius Mathiesen <marius.mathiesen@gmail.com> | 2009-03-12 15:13:02 +0100 |
---|---|---|
committer | Johan Sørensen <johan@johansorensen.com> | 2009-04-22 15:16:29 +0200 |
commit | c5074d3bd9fc7a3adf371d970609268d410e96c7 (patch) | |
tree | 15e7fb55936651f95d89c91b7bb26129270c7513 /app/models/merge_request.rb | |
parent | 3c76b4701d102266f6c0399977475ab1b11a80d9 (diff) | |
download | gitorious-mainline-outdated-c5074d3bd9fc7a3adf371d970609268d410e96c7.zip gitorious-mainline-outdated-c5074d3bd9fc7a3adf371d970609268d410e96c7.tar.gz gitorious-mainline-outdated-c5074d3bd9fc7a3adf371d970609268d410e96c7.tar.bz2 |
Moved the state machine logic in MergeRequest where it belongs, in a state machine.
Diffstat (limited to 'app/models/merge_request.rb')
-rw-r--r-- | app/models/merge_request.rb | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index a5170d9..83137bc 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -38,6 +38,25 @@ class MergeRequest < ActiveRecord::Base STATUS_MERGED = 2 STATUS_REJECTED = 3 + state_machine :status, :initial => :pending do + state :pending, :value => ::MergeRequest::STATUS_PENDING_ACCEPTANCE_OF_TERMS + state :open, :value => ::MergeRequest::STATUS_OPEN + state :merged, :value => ::MergeRequest::STATUS_MERGED + state :rejected, :value => ::MergeRequest::STATUS_REJECTED + + event :open do + transition :pending => :open + end + + event :reject do + transition :open => :rejected + end + + event :merge do + transition :open => :merged + end + end + named_scope :open, :conditions => { :status => STATUS_OPEN } named_scope :closed, :conditions => ["status in (?)", [STATUS_MERGED, STATUS_REJECTED]] @@ -45,14 +64,17 @@ class MergeRequest < ActiveRecord::Base I18n.t("activerecord.models.merge_request") end - def self.statuses - { "Open" => STATUS_OPEN, "Merged" => STATUS_MERGED, "Rejected" => STATUS_REJECTED, 'Pending' => STATUS_PENDING_ACCEPTANCE_OF_TERMS } - end - def self.count_open count(:all, :conditions => {:status => STATUS_OPEN}) end + def self.statuses + @statuses ||= state_machines[:status].states.inject({}){ |result, state | + result[state.name.to_s.capitalize] = state.value + result + } + end + def status_string self.class.status_string(status) end @@ -61,20 +83,20 @@ class MergeRequest < ActiveRecord::Base statuses.invert[status_code.to_i].downcase end - def open? - status == STATUS_OPEN - end + # def open? + # status == STATUS_OPEN + # end - def merged? - status == STATUS_MERGED - end - - def rejected? - status == STATUS_REJECTED - end + # def merged? + # status == STATUS_MERGED + # end + # + # def rejected? + # status == STATUS_REJECTED + # end def pending_acceptance_of_terms? - status == STATUS_PENDING_ACCEPTANCE_OF_TERMS + pending? end def possible_next_states @@ -89,12 +111,13 @@ class MergeRequest < ActiveRecord::Base end def can_transition_to?(new_state) - return possible_next_states.include?(new_state.to_i) + send("can_#{new_state}?") end + def transition_to(status) if can_transition_to?(status) - self.status = status + send(status) yield return true end |