Class: Toggly::FeatureDefinition

Inherits:
Object
  • Object
show all
Defined in:
lib/toggly/feature_definition.rb

Overview

Represents a feature flag definition.

Examples:

definition = Toggly::FeatureDefinition.new(
  feature_key: "dark-mode",
  feature_type: "Release",
  enabled: true,
  rules: [{ "type" => "percentage", "value" => 50 }]
)

Constant Summary collapse

TYPES =

Feature types

%w[Release Experiment Ops Permission].freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(feature_key:, feature_type: "Release", enabled: false, rules: [], metadata: {}, description: nil, created_at: nil, updated_at: nil, requirement_type: "Any", context_kind: nil, context_requirement_type: nil) ⇒ FeatureDefinition

rubocop:disable Metrics/ParameterLists



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/toggly/feature_definition.rb', line 42

def initialize(
  feature_key:,
  feature_type: "Release",
  enabled: false,
  rules: [],
  metadata: {},
  description: nil,
  created_at: nil,
  updated_at: nil,
  requirement_type: "Any",
  context_kind: nil,
  context_requirement_type: nil
)
  @feature_key = feature_key.to_s
  @feature_type = validate_type(feature_type)
  @enabled = enabled ? true : false
  @rules = Array(rules)
  @metadata =  || {}
  @description = description
  @created_at = parse_time(created_at)
  @updated_at = parse_time(updated_at)
  @requirement_type = requirement_type || "Any"
  @context_kind = context_kind
  @context_requirement_type = context_requirement_type
end

Instance Attribute Details

#context_kindTime? (readonly)

Returns When the feature was last updated.

Returns:

  • (Time, nil)

    When the feature was last updated



33
34
35
# File 'lib/toggly/feature_definition.rb', line 33

def context_kind
  @context_kind
end

#context_requirement_typeTime? (readonly)

Returns When the feature was last updated.

Returns:

  • (Time, nil)

    When the feature was last updated



33
34
35
# File 'lib/toggly/feature_definition.rb', line 33

def context_requirement_type
  @context_requirement_type
end

#created_atTime? (readonly)

Returns When the feature was created.

Returns:

  • (Time, nil)

    When the feature was created



30
31
32
# File 'lib/toggly/feature_definition.rb', line 30

def created_at
  @created_at
end

#descriptionString? (readonly)

Returns Feature description.

Returns:

  • (String, nil)

    Feature description



36
37
38
# File 'lib/toggly/feature_definition.rb', line 36

def description
  @description
end

#enabledBoolean (readonly)

Returns Whether the feature is globally enabled.

Returns:

  • (Boolean)

    Whether the feature is globally enabled



21
22
23
# File 'lib/toggly/feature_definition.rb', line 21

def enabled
  @enabled
end

#feature_keyString (readonly)

Returns Unique feature key.

Returns:

  • (String)

    Unique feature key



15
16
17
# File 'lib/toggly/feature_definition.rb', line 15

def feature_key
  @feature_key
end

#feature_typeString (readonly)

Returns Feature type (Release, Experiment, Ops, Permission).

Returns:

  • (String)

    Feature type (Release, Experiment, Ops, Permission)



18
19
20
# File 'lib/toggly/feature_definition.rb', line 18

def feature_type
  @feature_type
end

#metadataHash (readonly)

Returns Additional metadata.

Returns:

  • (Hash)

    Additional metadata



27
28
29
# File 'lib/toggly/feature_definition.rb', line 27

def 
  @metadata
end

#requirement_typeTime? (readonly)

Returns When the feature was last updated.

Returns:

  • (Time, nil)

    When the feature was last updated



33
34
35
# File 'lib/toggly/feature_definition.rb', line 33

def requirement_type
  @requirement_type
end

#rulesArray<Hash> (readonly)

Returns Evaluation rules.

Returns:

  • (Array<Hash>)

    Evaluation rules



24
25
26
# File 'lib/toggly/feature_definition.rb', line 24

def rules
  @rules
end

#updated_atTime? (readonly)

Returns When the feature was last updated.

Returns:

  • (Time, nil)

    When the feature was last updated



33
34
35
# File 'lib/toggly/feature_definition.rb', line 33

def updated_at
  @updated_at
end

Class Method Details

.from_hash(hash) ⇒ FeatureDefinition

Create from a hash (e.g., from JSON)

Parameters:

  • hash (Hash)

    Feature definition hash

Returns:



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'lib/toggly/feature_definition.rb', line 73

def self.from_hash(hash)
  hash = symbolize_keys(hash)

  # Map API "filters" to internal "rules" format
  rules = hash[:rules] || hash[:filters] || []

  # In Toggly's model, features are enabled based on filter evaluation.
  # If the API doesn't send "enabled", derive it from whether filters exist.
  enabled = if hash.key?(:enabled)
              hash[:enabled]
            else
              !rules.empty?
            end

  new(
    feature_key: hash[:featureKey] || hash[:feature_key],
    feature_type: hash[:featureType] || hash[:feature_type] || "Release",
    enabled: enabled,
    rules: rules,
    metadata: hash[:metadata] || {},
    description: hash[:description],
    created_at: hash[:createdAt] || hash[:created_at],
    updated_at: hash[:updatedAt] || hash[:updated_at],
    requirement_type: hash[:requirementType] || hash[:requirement_type] || "Any",
    context_kind: hash[:contextKind] || hash[:context_kind],
    context_requirement_type: hash[:contextRequirementType] || hash[:context_requirement_type]
  )
end

Instance Method Details

#==(other) ⇒ Boolean Also known as: eql?

Equality check

Parameters:

Returns:

  • (Boolean)


157
158
159
160
161
162
163
164
# File 'lib/toggly/feature_definition.rb', line 157

def ==(other)
  return false unless other.is_a?(FeatureDefinition)

  @feature_key == other.feature_key &&
    @feature_type == other.feature_type &&
    @enabled == other.enabled &&
    @rules == other.rules
end

#experiment?Boolean

Check if feature is an experiment

Returns:

  • (Boolean)


135
136
137
# File 'lib/toggly/feature_definition.rb', line 135

def experiment?
  @feature_type == "Experiment"
end

#hashInteger

Hash code for use in collections

Returns:

  • (Integer)


170
171
172
# File 'lib/toggly/feature_definition.rb', line 170

def hash
  [@feature_key, @feature_type, @enabled, @rules].hash
end

#ops?Boolean

Check if feature is an ops toggle

Returns:

  • (Boolean)


142
143
144
# File 'lib/toggly/feature_definition.rb', line 142

def ops?
  @feature_type == "Ops"
end

#permission?Boolean

Check if feature is a permission toggle

Returns:

  • (Boolean)


149
150
151
# File 'lib/toggly/feature_definition.rb', line 149

def permission?
  @feature_type == "Permission"
end

#release?Boolean

Check if feature is a release toggle

Returns:

  • (Boolean)


128
129
130
# File 'lib/toggly/feature_definition.rb', line 128

def release?
  @feature_type == "Release"
end

#rules?Boolean

Check if feature has rules

Returns:

  • (Boolean)


121
122
123
# File 'lib/toggly/feature_definition.rb', line 121

def rules?
  !@rules.empty?
end

#to_hHash

Convert to hash for serialization

Returns:

  • (Hash)


105
106
107
108
109
110
111
112
113
114
115
116
# File 'lib/toggly/feature_definition.rb', line 105

def to_h
  {
    feature_key: @feature_key,
    feature_type: @feature_type,
    enabled: @enabled,
    rules: @rules,
    metadata: @metadata,
    description: @description,
    created_at: @created_at&.iso8601,
    updated_at: @updated_at&.iso8601
  }
end