Module: LaunchDarkly::Impl::Model

Defined in:
lib/ldclient-rb/impl/model/serialization.rb

Overview

Since:

  • 5.5.0

Class Method Summary collapse

Class Method Details

.deserialize(kind, json) ⇒ Object

Abstraction of deserializing a feature flag or segment that was read from a data store or received from LaunchDarkly.

Since:

  • 5.5.0



7
8
9
10
11
12
# File 'lib/ldclient-rb/impl/model/serialization.rb', line 7

def self.deserialize(kind, json)
  return nil if json.nil?
  item = JSON.parse(json, symbolize_names: true)
  postprocess_item_after_deserializing!(kind, item)
  item
end

.make_all_store_data(received_data) ⇒ Object

Translates a { flags: …, segments: … } object received from LaunchDarkly to the data store format.

Since:

  • 5.5.0



21
22
23
24
25
26
27
# File 'lib/ldclient-rb/impl/model/serialization.rb', line 21

def self.make_all_store_data(received_data)
  flags = received_data[:flags]
  postprocess_items_after_deserializing!(FEATURES, flags)
  segments = received_data[:segments]
  postprocess_items_after_deserializing!(SEGMENTS, segments)
  { FEATURES => flags, SEGMENTS => segments }
end

.postprocess_item_after_deserializing!(kind, item) ⇒ Object

Called after we have deserialized a model item from JSON (because we received it from LaunchDarkly, or read it from a persistent data store). This allows us to precompute some derived attributes that will never change during the lifetime of that item.

Since:

  • 5.5.0



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/ldclient-rb/impl/model/serialization.rb', line 32

def self.postprocess_item_after_deserializing!(kind, item)
  return if !item
  # Currently we are special-casing this for FEATURES; eventually it will be handled by delegating
  # to the "kind" object or the item class.
  if kind.eql? FEATURES
    # For feature flags, we precompute all possible parameterized EvaluationReason instances.
    prereqs = item[:prerequisites]
    if !prereqs.nil?
      prereqs.each do |prereq|
        prereq[:_reason] = EvaluationReason::prerequisite_failed(prereq[:key])
      end
    end
    rules = item[:rules]
    if !rules.nil?
      rules.each_index do |i|
        rule = rules[i]
        rule[:_reason] = EvaluationReason::rule_match(i, rule[:id])
      end
    end
  end
end

.postprocess_items_after_deserializing!(kind, items_map) ⇒ Object

Since:

  • 5.5.0



54
55
56
57
58
59
# File 'lib/ldclient-rb/impl/model/serialization.rb', line 54

def self.postprocess_items_after_deserializing!(kind, items_map)
  return items_map if !items_map
  items_map.each do |key, item|
    postprocess_item_after_deserializing!(kind, item)
  end
end

.serialize(kind, item) ⇒ Object

Abstraction of serializing a feature flag or segment that will be written to a data store. Currently we just call to_json.

Since:

  • 5.5.0



16
17
18
# File 'lib/ldclient-rb/impl/model/serialization.rb', line 16

def self.serialize(kind, item)
  item.to_json
end