Module: Featurevisor::Events

Defined in:
lib/featurevisor/events.rb

Overview

Events module for generating event parameters

Class Method Summary collapse

Class Method Details

.get_params_for_datafile_set_event(previous_reader, new_reader, replace = false) ⇒ Hash

Get parameters for datafile set event

Parameters:

  • previous_reader (InstanceEvaluationDataProvider)

    Previous datafile

  • new_reader (InstanceEvaluationDataProvider)

    New datafile

Returns:

  • (Hash)

    Event parameters



36
37
38
39
40
41
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
67
68
69
70
71
72
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/featurevisor/events.rb', line 36

def self.get_params_for_datafile_set_event(previous_reader, new_reader, replace = false)
  previous_revision = previous_reader.get_revision
  previous_feature_keys = previous_reader.get_feature_keys

  new_revision = new_reader.get_revision
  new_feature_keys = new_reader.get_feature_keys
  previous_variable_keys = previous_reader.get_variable_keys
  new_variable_keys = new_reader.get_variable_keys

  # results
  removed_features = []
  changed_features = []
  added_features = []

  # checking against existing datafile
  previous_feature_keys.each do |previous_feature_key|
    if !new_feature_keys.include?(previous_feature_key)
      # feature was removed in new datafile
      removed_features << previous_feature_key
      next
    end

    # feature exists in both datafiles, check if it was changed
    previous_feature = previous_reader.get_feature(previous_feature_key)
    new_feature = new_reader.get_feature(previous_feature_key)

    if previous_feature && new_feature &&
       (previous_feature[:hash].nil? || new_feature[:hash].nil? || previous_feature[:hash] != new_feature[:hash])
      # feature was changed in new datafile
      changed_features << previous_feature_key
    end
  end

  # checking against new datafile
  new_feature_keys.each do |new_feature_key|
    if !previous_feature_keys.include?(new_feature_key)
      # feature was added in new datafile
      added_features << new_feature_key
    end
  end

  # combine all affected feature keys
  all_affected_features = (removed_features + changed_features + added_features).uniq
  all_affected_variables = (previous_variable_keys + new_variable_keys).uniq.select do |key|
    previous = previous_reader.get_global_variable(key)
    current = new_reader.get_global_variable(key)
    previous.nil? || current.nil? || previous[:hash].nil? || current[:hash].nil? || previous[:hash] != current[:hash]
  end


  changed_segments = (previous_reader.get_segment_keys + new_reader.get_segment_keys).uniq.select do |key|
    previous_reader.get_segment(key) != new_reader.get_segment(key)
  end.map(&:to_s)
  feature_keys = (previous_feature_keys + new_feature_keys).uniq
  loop do
    before = all_affected_features.length
    feature_keys.each do |key|
      next if all_affected_features.include?(key)

      candidates = [previous_reader.get_feature(key), new_reader.get_feature(key)].compact
      all_affected_features << key if candidates.any? do |feature|
        dependency = feature_dependencies(feature)
        !(dependency[:segments].map(&:to_s) & changed_segments).empty? ||
          !(dependency[:features].map(&:to_s) & all_affected_features.map(&:to_s)).empty?
      end
    end
    break if before == all_affected_features.length
  end

  (previous_variable_keys + new_variable_keys).uniq.each do |key|
    next if all_affected_variables.include?(key)

    candidates = [previous_reader.get_global_variable(key), new_reader.get_global_variable(key)].compact
    all_affected_variables << key if candidates.any? do |variable|
      dependency = global_variable_dependencies(variable)
      !(dependency[:segments].map(&:to_s) & changed_segments).empty? ||
        !(dependency[:features].map(&:to_s) & all_affected_features.map(&:to_s)).empty?
    end
  end

  {
    revision: new_revision,
    previousRevision: previous_revision,
    revisionChanged: previous_revision != new_revision,
    features: all_affected_features,
    variables: all_affected_variables,
    replaced: replace
  }
end

.get_params_for_sticky_features_set_event(previous_sticky = {}, new_sticky = {}, replace = false) ⇒ Hash

Get parameters for sticky set event

Parameters:

  • previous_sticky (Hash) (defaults to: {})

    Previous sticky features

  • new_sticky (Hash) (defaults to: {})

    New sticky features

  • replace (Boolean) (defaults to: false)

    Whether features were replaced

Returns:

  • (Hash)

    Event parameters



13
14
15
16
17
18
19
20
21
22
23
# File 'lib/featurevisor/events.rb', line 13

def self.get_params_for_sticky_features_set_event(previous_sticky = {}, new_sticky = {}, replace = false)
  keys_before = previous_sticky.keys
  keys_after = new_sticky.keys

  all_keys = (keys_before + keys_after).uniq

  {
    features: all_keys,
    replaced: replace
  }
end

.get_params_for_sticky_variables_set_event(previous_sticky = {}, new_sticky = {}, replace = false) ⇒ Object



25
26
27
28
29
30
# File 'lib/featurevisor/events.rb', line 25

def self.get_params_for_sticky_variables_set_event(previous_sticky = {}, new_sticky = {}, replace = false)
  {
    variables: (previous_sticky.keys + new_sticky.keys).uniq,
    replaced: replace
  }
end