Class: Treaty::Entity::Attribute::Option::Conditionals::Base

Inherits:
Base
  • Object
show all
Defined in:
lib/treaty/entity/attribute/option/conditionals/base.rb

Overview

Base class for conditional option processors.

Purpose

Conditionals control whether an attribute should be processed at all. Unlike validators (which check data) and modifiers (which transform data), conditionals determine attribute visibility based on runtime conditions.

Key Difference from Validators/Modifiers

  • Validators: Check if data is valid
  • Modifiers: Transform data values
  • Conditionals: Decide if attribute exists in output

Processing

Conditionals are evaluated BEFORE validators and modifiers:

  1. If condition evaluates to false → attribute is skipped entirely
  2. If condition evaluates to true → attribute is processed normally

Mode Support

Conditionals do NOT support simple/advanced modes. They only accept lambda/proc directly:

# Correct
integer :rating, if: ->(**attributes) { attributes.dig(:post, :published_at).present? }
array :tags, if: ->(post:) { post[:published_at].present? }

# Incorrect - no simple/advanced mode
integer :rating, if: true  # Not supported
integer :rating, if: { is: ..., message: ... }  # Not supported

Implementation

Subclasses must implement:

  • validate_schema! - Validate the conditional schema at definition time
  • evaluate_condition(data) - Evaluate condition with runtime data

Direct Known Subclasses

IfConditional, UnlessConditional

Instance Method Summary collapse

Methods inherited from Base

#initialize, #target_name, #transforms_name?

Constructor Details

This class inherits a constructor from Treaty::Entity::Attribute::Option::Base

Instance Method Details

#evaluate_condition(_data) ⇒ Boolean

Evaluates the conditional with runtime data Must be overridden in subclasses

Parameters:

  • _data (Hash)

    Raw data to evaluate condition against

Returns:

  • (Boolean)

    True if attribute should be processed, false otherwise

Raises:



65
66
67
68
# File 'lib/treaty/entity/attribute/option/conditionals/base.rb', line 65

def evaluate_condition(_data)
  raise Treaty::Exceptions::NotImplemented,
        "#{self.class} must implement #evaluate_condition"
end

#transform_value(value) ⇒ Object

Conditionals do not transform values This is a no-op for conditionals

Parameters:

  • value (Object)

    The value to pass through

Returns:

  • (Object)

    The unchanged value



84
85
86
# File 'lib/treaty/entity/attribute/option/conditionals/base.rb', line 84

def transform_value(value)
  value
end

#validate_schema!void

This method returns an undefined value.

Phase 1: Validates conditional schema Must be overridden in subclasses

Raises:



54
55
56
57
# File 'lib/treaty/entity/attribute/option/conditionals/base.rb', line 54

def validate_schema!
  raise Treaty::Exceptions::NotImplemented,
        "#{self.class} must implement #validate_schema!"
end

#validate_value!(_value) ⇒ void

This method returns an undefined value.

Conditionals do not validate values This is a no-op for conditionals

Parameters:

  • _value (Object)

    The value (unused)



75
76
77
# File 'lib/treaty/entity/attribute/option/conditionals/base.rb', line 75

def validate_value!(_value)
  # No-op: conditionals don't validate values
end