|
| 1 | +require "ldclient-rb/impl/model/serialization" |
| 2 | + |
1 | 3 | module LaunchDarkly |
2 | 4 | module Impl |
3 | 5 | class DependencyTracker |
4 | | - def initialize |
| 6 | + def initialize(logger = nil) |
5 | 7 | @from = {} |
6 | 8 | @to = {} |
| 9 | + @logger = logger |
7 | 10 | end |
8 | 11 |
|
9 | 12 | # |
10 | 13 | # Updates the dependency graph when an item has changed. |
11 | 14 | # |
12 | 15 | # @param from_kind [Object] the changed item's kind |
13 | 16 | # @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) |
15 | 18 | # |
16 | 19 | def update_dependencies_from(from_kind, from_key, from_item) |
17 | 20 | 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) |
19 | 22 |
|
20 | 23 | old_dependency_set = @from[from_what] |
21 | 24 | unless old_dependency_set.nil? |
@@ -48,19 +51,28 @@ def self.segment_keys_from_clauses(clauses) |
48 | 51 |
|
49 | 52 | # |
50 | 53 | # @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 |
52 | 56 | # @return [Set] |
53 | 57 | # |
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 |
56 | 68 |
|
57 | | - if from_kind == DataStore::FEATURES |
| 69 | + if from_kind == DataStore::FEATURES && from_item.is_a?(LaunchDarkly::Impl::Model::FeatureFlag) |
58 | 70 | prereq_keys = from_item.prerequisites.map { |prereq| {kind: from_kind, key: prereq.key} } |
59 | 71 | segment_keys = from_item.rules.flat_map { |rule| DependencyTracker.segment_keys_from_clauses(rule.clauses) } |
60 | 72 |
|
61 | 73 | results = Set.new(prereq_keys) |
62 | 74 | results.merge(segment_keys) |
63 | | - elsif from_kind == DataStore::SEGMENTS |
| 75 | + elsif from_kind == DataStore::SEGMENTS && from_item.is_a?(LaunchDarkly::Impl::Model::Segment) |
64 | 76 | kind_and_keys = from_item.rules.flat_map do |rule| |
65 | 77 | DependencyTracker.segment_keys_from_clauses(rule.clauses) |
66 | 78 | end |
|
0 commit comments