Skip to content

Commit 63e64b8

Browse files
committed
deserialize if passed a raw hash
1 parent 5769f2d commit 63e64b8

2 files changed

Lines changed: 21 additions & 9 deletions

File tree

lib/ldclient-rb/impl/data_store/store.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ def initialize(flag_change_broadcaster, change_set_broadcaster, logger)
3939
@memory_store = InMemoryFeatureStoreV2.new(logger)
4040

4141
# Used to track dependencies between items in the store
42-
@dependency_tracker = LaunchDarkly::Impl::DependencyTracker.new
42+
@dependency_tracker = LaunchDarkly::Impl::DependencyTracker.new(logger)
4343

4444
# Broadcasters for events
4545
@flag_change_broadcaster = flag_change_broadcaster

lib/ldclient-rb/impl/dependency_tracker.rb

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,24 @@
1+
require "ldclient-rb/impl/model/serialization"
2+
13
module LaunchDarkly
24
module Impl
35
class DependencyTracker
4-
def initialize
6+
def initialize(logger = nil)
57
@from = {}
68
@to = {}
9+
@logger = logger
710
end
811

912
#
1013
# Updates the dependency graph when an item has changed.
1114
#
1215
# @param from_kind [Object] the changed item's kind
1316
# @param from_key [String] the changed item's key
14-
# @param from_item [Object] the changed item
17+
# @param from_item [Object] the changed item (can be a Hash, model object, or nil)
1518
#
1619
def update_dependencies_from(from_kind, from_key, from_item)
1720
from_what = { kind: from_kind, key: from_key }
18-
updated_dependencies = DependencyTracker.compute_dependencies_from(from_kind, from_item)
21+
updated_dependencies = DependencyTracker.compute_dependencies_from(from_kind, from_item, @logger)
1922

2023
old_dependency_set = @from[from_what]
2124
unless old_dependency_set.nil?
@@ -48,19 +51,28 @@ def self.segment_keys_from_clauses(clauses)
4851

4952
#
5053
# @param from_kind [String]
51-
# @param from_item [LaunchDarkly::Impl::Model::FeatureFlag, LaunchDarkly::Impl::Model::Segment]
54+
# @param from_item [Hash, LaunchDarkly::Impl::Model::FeatureFlag, LaunchDarkly::Impl::Model::Segment, nil] the item (can be a hash, model object, or nil)
55+
# @param logger [Logger, nil] optional logger for deserialization
5256
# @return [Set]
5357
#
54-
def self.compute_dependencies_from(from_kind, from_item)
55-
return Set.new if from_item.nil?
58+
def self.compute_dependencies_from(from_kind, from_item, logger = nil)
59+
# Check for deleted items (matches Python: from_item.get('deleted', False))
60+
return Set.new if from_item.nil? || (from_item.is_a?(Hash) && from_item[:deleted])
61+
62+
# Deserialize hash to model object if needed (matches Python: from_kind.decode(from_item) if isinstance(from_item, dict))
63+
from_item = if from_item.is_a?(Hash)
64+
LaunchDarkly::Impl::Model.deserialize(from_kind, from_item, logger)
65+
else
66+
from_item
67+
end
5668

57-
if from_kind == DataStore::FEATURES
69+
if from_kind == DataStore::FEATURES && from_item.is_a?(LaunchDarkly::Impl::Model::FeatureFlag)
5870
prereq_keys = from_item.prerequisites.map { |prereq| {kind: from_kind, key: prereq.key} }
5971
segment_keys = from_item.rules.flat_map { |rule| DependencyTracker.segment_keys_from_clauses(rule.clauses) }
6072

6173
results = Set.new(prereq_keys)
6274
results.merge(segment_keys)
63-
elsif from_kind == DataStore::SEGMENTS
75+
elsif from_kind == DataStore::SEGMENTS && from_item.is_a?(LaunchDarkly::Impl::Model::Segment)
6476
kind_and_keys = from_item.rules.flat_map do |rule|
6577
DependencyTracker.segment_keys_from_clauses(rule.clauses)
6678
end

0 commit comments

Comments
 (0)