Class: ABMeter::Core::AssignmentConfig::Experiment

Inherits:
Object
  • Object
show all
Includes:
Exposable
Defined in:
lib/abmeter/core/assignment_config/experiment.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(id:, range:, audience_variants:, space_id:, salt:, space_salt:) ⇒ Experiment

The six keyword args are this value object’s assignment inputs; a params object would only add indirection for a plain data holder.



13
14
15
16
17
18
19
20
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 13

def initialize(id:, range:, audience_variants:, space_id:, salt:, space_salt:) # rubocop:disable Metrics/ParameterLists
  @id = id
  @range = range
  @audience_variants = audience_variants
  @space_id = space_id
  @salt = salt
  @space_salt = space_salt
end

Instance Attribute Details

#audience_variantsObject (readonly)

Returns the value of attribute audience_variants.



9
10
11
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 9

def audience_variants
  @audience_variants
end

#idObject (readonly)

Returns the value of attribute id.



9
10
11
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 9

def id
  @id
end

#rangeObject (readonly)

Returns the value of attribute range.



9
10
11
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 9

def range
  @range
end

#saltObject (readonly)

Returns the value of attribute salt.



9
10
11
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 9

def salt
  @salt
end

#space_idObject (readonly)

Returns the value of attribute space_id.



9
10
11
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 9

def space_id
  @space_id
end

#space_saltObject (readonly)

Returns the value of attribute space_salt.



9
10
11
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 9

def space_salt
  @space_salt
end

Class Method Details

.from_json(json, space_salts) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 22

def self.from_json(json, space_salts)
  json.map do |exp|
    space_salt = space_salts[exp[:space_id]]
    raise "Space with id #{exp[:space_id]} not found" unless space_salt

    audience_variants = exp[:audience_variants].map do |av|
      [Audience.from_json(av[:audience]), av[:variant] ? Variant.from_json(av[:variant]) : nil]
    end

    new(
      id: exp[:id],
      range: Range.new(exp[:range][0], exp[:range][1]),
      audience_variants: audience_variants,
      space_id: exp[:space_id],
      salt: exp[:salt],
      space_salt: space_salt
    )
  end
end

Instance Method Details

#expose_parameter(user, parameter, variant, audience) ⇒ Object

Expose parameter for experiments For experiments: audience is required, variant is optional (nil for control)



58
59
60
61
62
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 58

def expose_parameter(user, parameter, variant, audience)
  validate_expose_parameter_args!(user.user_id, parameter, audience)

  make_exposure(user, parameter, 'Experiment', id, audience, variant)
end

#serializeObject



42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/abmeter/core/assignment_config/experiment.rb', line 42

def serialize
  {
    id: id,
    space_id: space_id,
    range: [range.begin, range.end],
    audience_variants: audience_variants.map do |audience_variant|
      {
        audience: audience_variant.first.serialize,
        variant: audience_variant.last&.serialize
      }
    end
  }
end