Class: Fino::Library

Inherits:
Object
  • Object
show all
Includes:
AbTestingAnalysisSupport, FeatureTogglesSupport
Defined in:
lib/fino/library.rb

Defined Under Namespace

Modules: AbTestingAnalysisSupport, FeatureTogglesSupport

Constant Summary

Constants included from AbTestingAnalysisSupport

AbTestingAnalysisSupport::AdapterDoesNotSupportAbTestingAnalysis, AbTestingAnalysisSupport::SettingNotAbTested

Instance Method Summary collapse

Methods included from AbTestingAnalysisSupport

#analyse, #convert, #convert!, #reset_analysis!

Methods included from FeatureTogglesSupport

#disable, #disabled?, #enable, #enabled?

Constructor Details

#initialize(configuration) ⇒ Library

Returns a new instance of Library.



9
10
11
# File 'lib/fino/library.rb', line 9

def initialize(configuration)
  @configuration = configuration
end

Instance Method Details

#add_override(setting_name, at: nil, **overrides) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/fino/library.rb', line 40

def add_override(setting_name, at: nil, **overrides)
  setting_definition = build_setting_definition(setting_name, at: at)
  current_setting = pipeline.read(setting_definition)

  deserialized_overrides = overrides.transform_values { |v| setting_definition.deserialize(v) }
  merged_overrides = current_setting.overrides.merge(deserialized_overrides)

  variants = current_setting.experiment&.variants || []

  pipeline.write(
    setting_definition,
    current_setting.global_value,
    merged_overrides,
    variants
  )

  true
end

#persisted_keysObject



108
109
110
# File 'lib/fino/library.rb', line 108

def persisted_keys
  adapter.read_persisted_setting_keys
end

#set(**data) ⇒ Object



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
# File 'lib/fino/library.rb', line 59

def set(**data)
  at = data.delete(:at)
  raw_overrides = data.delete(:overrides) || {}
  raw_variants = data.delete(:variants) || {}

  setting_name, raw_value = data.first
  setting_definition = build_setting_definition(setting_name, at: at)
  value = setting_definition.deserialize(raw_value)

  overrides = raw_overrides.transform_values { |v| setting_definition.deserialize(v) }

  experiment = Fino::AbTesting::Experiment.new(setting_definition)

  raw_variants.map do |percentage, value|
    experiment << Fino::AbTesting::Variant.new(
      percentage: percentage,
      value: setting_definition.deserialize(value)
    )
  end

  pipeline.write(
    setting_definition,
    value,
    overrides,
    experiment.variants
  )

  true
end

#setting(setting_name, at: nil) ⇒ Object



21
22
23
# File 'lib/fino/library.rb', line 21

def setting(setting_name, at: nil)
  pipeline.read(build_setting_definition(setting_name, at: at))
end

#settings(*setting_names, at: Fino::EMPTINESS) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/fino/library.rb', line 25

def settings(*setting_names, at: Fino::EMPTINESS)
  setting_definitions =
    if setting_names.empty? && at.equal?(Fino::EMPTINESS)
      configuration.registry.setting_definitions
    elsif at.equal?(Fino::EMPTINESS)
      setting_names.map { |name| build_setting_definition(name) }
    elsif setting_names.empty?
      configuration.registry.setting_definitions(at: at)
    else
      setting_names.map { |name| build_setting_definition(name, at: at) }
    end

  pipeline.read_multi(setting_definitions)
end

#slice(*settings) ⇒ Object



89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/fino/library.rb', line 89

def slice(*settings)
  setting_definitions = settings.each_with_object([]) do |symbol_or_hash, memo|
    case symbol_or_hash
    when Symbol
      memo << build_setting_definition(symbol_or_hash)
    when Hash
      symbol_or_hash.each do |section_name, setting_names|
        Array(setting_names).each do |setting_name|
          memo << build_setting_definition(setting_name, at: section_name)
        end
      end
    else
      raise ArgumentError, "Settings to preload should be either symbols or hashes"
    end
  end

  pipeline.read_multi(setting_definitions)
end

#value(setting_name, at: nil, **context) ⇒ Object



13
14
15
# File 'lib/fino/library.rb', line 13

def value(setting_name, at: nil, **context)
  setting(setting_name, at: at).value(**context)
end

#values(*setting_names, at: nil, **context) ⇒ Object



17
18
19
# File 'lib/fino/library.rb', line 17

def values(*setting_names, at: nil, **context)
  settings(*setting_names, at: at).map { |s| s.value(**context) }
end