Class: Toggly::FeatureDefinition
- Inherits:
-
Object
- Object
- Toggly::FeatureDefinition
- Defined in:
- lib/toggly/feature_definition.rb
Overview
Represents a feature flag definition.
Constant Summary collapse
- TYPES =
Feature types
%w[Release Experiment Ops Permission].freeze
Instance Attribute Summary collapse
-
#context_kind ⇒ Time?
readonly
When the feature was last updated.
-
#context_requirement_type ⇒ Time?
readonly
When the feature was last updated.
-
#created_at ⇒ Time?
readonly
When the feature was created.
-
#description ⇒ String?
readonly
Feature description.
-
#enabled ⇒ Boolean
readonly
Whether the feature is globally enabled.
-
#feature_key ⇒ String
readonly
Unique feature key.
-
#feature_type ⇒ String
readonly
Feature type (Release, Experiment, Ops, Permission).
-
#metadata ⇒ Hash
readonly
Additional metadata.
-
#requirement_type ⇒ Time?
readonly
When the feature was last updated.
-
#rules ⇒ Array<Hash>
readonly
Evaluation rules.
-
#updated_at ⇒ Time?
readonly
When the feature was last updated.
Class Method Summary collapse
-
.from_hash(hash) ⇒ FeatureDefinition
Create from a hash (e.g., from JSON).
Instance Method Summary collapse
-
#==(other) ⇒ Boolean
(also: #eql?)
Equality check.
-
#experiment? ⇒ Boolean
Check if feature is an experiment.
-
#hash ⇒ Integer
Hash code for use in collections.
-
#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
constructor
rubocop:disable Metrics/ParameterLists.
-
#ops? ⇒ Boolean
Check if feature is an ops toggle.
-
#permission? ⇒ Boolean
Check if feature is a permission toggle.
-
#release? ⇒ Boolean
Check if feature is a release toggle.
-
#rules? ⇒ Boolean
Check if feature has rules.
-
#to_h ⇒ Hash
Convert to hash for serialization.
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_kind ⇒ Time? (readonly)
Returns 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_type ⇒ Time? (readonly)
Returns 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_at ⇒ Time? (readonly)
Returns When the feature was created.
30 31 32 |
# File 'lib/toggly/feature_definition.rb', line 30 def created_at @created_at end |
#description ⇒ String? (readonly)
Returns Feature description.
36 37 38 |
# File 'lib/toggly/feature_definition.rb', line 36 def description @description end |
#enabled ⇒ Boolean (readonly)
Returns Whether the feature is globally enabled.
21 22 23 |
# File 'lib/toggly/feature_definition.rb', line 21 def enabled @enabled end |
#feature_key ⇒ String (readonly)
Returns Unique feature key.
15 16 17 |
# File 'lib/toggly/feature_definition.rb', line 15 def feature_key @feature_key end |
#feature_type ⇒ String (readonly)
Returns Feature type (Release, Experiment, Ops, Permission).
18 19 20 |
# File 'lib/toggly/feature_definition.rb', line 18 def feature_type @feature_type end |
#metadata ⇒ Hash (readonly)
Returns Additional metadata.
27 28 29 |
# File 'lib/toggly/feature_definition.rb', line 27 def @metadata end |
#requirement_type ⇒ Time? (readonly)
Returns When the feature was last updated.
33 34 35 |
# File 'lib/toggly/feature_definition.rb', line 33 def requirement_type @requirement_type end |
#rules ⇒ Array<Hash> (readonly)
Returns Evaluation rules.
24 25 26 |
# File 'lib/toggly/feature_definition.rb', line 24 def rules @rules end |
#updated_at ⇒ Time? (readonly)
Returns 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)
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
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
135 136 137 |
# File 'lib/toggly/feature_definition.rb', line 135 def experiment? @feature_type == "Experiment" end |
#hash ⇒ Integer
Hash code for use in collections
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
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
149 150 151 |
# File 'lib/toggly/feature_definition.rb', line 149 def @feature_type == "Permission" end |
#release? ⇒ Boolean
Check if feature is a release toggle
128 129 130 |
# File 'lib/toggly/feature_definition.rb', line 128 def release? @feature_type == "Release" end |
#rules? ⇒ Boolean
Check if feature has rules
121 122 123 |
# File 'lib/toggly/feature_definition.rb', line 121 def rules? !@rules.empty? end |
#to_h ⇒ Hash
Convert to hash for serialization
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 |