Class: Ace::Review::Atoms::FeedbackStateValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/ace/review/atoms/feedback_state_validator.rb

Overview

Validates state transitions for feedback items.

Implements the feedback item state machine:

draft -> (verify valid=true) -> pending -> (resolve) -> done [archived]
draft -> (verify valid=false) -> invalid [archived]
draft -> (skip) -> skip [archived]
pending -> (skip) -> skip [archived]

Terminal states (invalid, skip, done) cannot transition further.

Examples:

Check if a transition is valid

FeedbackStateValidator.valid_transition?("draft", "pending")
#=> true

FeedbackStateValidator.valid_transition?("done", "pending")
#=> false

Get allowed transitions from a status

FeedbackStateValidator.allowed_transitions("draft")
#=> ["pending", "invalid", "skip"]

Constant Summary collapse

TRANSITIONS =

Define the state machine transitions Maps from_status => [allowed target statuses]

{
  "draft" => %w[pending invalid skip],
  "pending" => %w[done skip],
  "invalid" => [],  # Terminal state
  "skip" => [],     # Terminal state
  "done" => []      # Terminal state
}.freeze
TERMINAL_STATES =

Terminal states that require archiving

%w[invalid skip done].freeze

Class Method Summary collapse

Class Method Details

.allowed_transitions(status) ⇒ Array<String>

Get the list of allowed target statuses from a given status

Examples:

FeedbackStateValidator.allowed_transitions("draft")
#=> ["pending", "invalid", "skip"]

Parameters:

  • status (String)

    Current status

Returns:

  • (Array<String>)

    List of valid target statuses (empty for terminal states)



69
70
71
# File 'lib/ace/review/atoms/feedback_state_validator.rb', line 69

def self.allowed_transitions(status)
  TRANSITIONS.fetch(status, []).dup
end

.should_archive?(status) ⇒ Boolean

Check if a status requires archiving

Parameters:

  • status (String)

    Status to check

Returns:

  • (Boolean)

    True if items with this status should be archived



92
93
94
# File 'lib/ace/review/atoms/feedback_state_validator.rb', line 92

def self.should_archive?(status)
  terminal?(status)
end

.terminal?(status) ⇒ Boolean

Check if a status is terminal (requires archiving, no further transitions)

Examples:

FeedbackStateValidator.terminal?("done")
#=> true

FeedbackStateValidator.terminal?("pending")
#=> false

Parameters:

  • status (String)

    Status to check

Returns:

  • (Boolean)

    True if status is terminal



84
85
86
# File 'lib/ace/review/atoms/feedback_state_validator.rb', line 84

def self.terminal?(status)
  TERMINAL_STATES.include?(status)
end

.valid_transition?(from_status, to_status) ⇒ Boolean

Check if a state transition is valid

Examples:

Valid transition

FeedbackStateValidator.valid_transition?("draft", "pending")
#=> true

Invalid transition

FeedbackStateValidator.valid_transition?("draft", "done")
#=> false

Parameters:

  • from_status (String)

    Current status

  • to_status (String)

    Target status

Returns:

  • (Boolean)

    True if the transition is allowed



54
55
56
57
58
59
# File 'lib/ace/review/atoms/feedback_state_validator.rb', line 54

def self.valid_transition?(from_status, to_status)
  allowed = TRANSITIONS[from_status]
  return false if allowed.nil?

  allowed.include?(to_status)
end