Module: ABMeter

Extended by:
ErrorSafety
Defined in:
lib/abmeter.rb,
lib/abmeter/core.rb,
lib/abmeter/client.rb,
lib/abmeter/version.rb,
lib/abmeter/api_error.rb,
lib/abmeter/constants.rb,
lib/abmeter/core/user.rb,
lib/abmeter/error_safety.rb,
lib/abmeter/async_submitter.rb,
lib/abmeter/resolver_provider.rb,
lib/abmeter/core/protocol/type.rb,
lib/abmeter/core/utils/num_utils.rb,
lib/abmeter/core/assignment_config.rb,
lib/abmeter/core/assignment_config/space.rb,
lib/abmeter/core/user_parameter_resolver.rb,
lib/abmeter/core/assignment_config/variant.rb,
lib/abmeter/core/assignment_config/audience.rb,
lib/abmeter/core/assignment_config/exposable.rb,
lib/abmeter/core/assignment_config/parameter.rb,
lib/abmeter/core/assignment_config/experiment.rb,
lib/abmeter/core/assignment_config/feature_flag.rb

Defined Under Namespace

Modules: Core, ErrorSafety Classes: APIError, AsyncSubmitter, Client, Config, ResolverProvider

Constant Summary collapse

User =

Top-level alias for the canonical user value object. Lets callers write ABMeter::User.new(user_id: ...) instead of reaching into Core::User, mirroring abmeter.User(...) in the Python SDK. Same class object, so is_a?/===/instance_of? keep working; Core::User stays canonical.

Core::User
VERSION =
'0.4.0'.freeze
DEFAULT_BATCH_SIZE =
100
DEFAULT_FLUSH_INTERVAL =

seconds

60
DEFAULT_FETCH_INTERVAL =

seconds

60
DEFAULT_BASE_URL =
'https://abmeter.ai'
DEFAULT_MAX_SUBMIT_ATTEMPTS =
3
DEFAULT_MAX_RETRY_QUEUE_SIZE =
1000
DEFAULT_LOG_LEVEL =
:error

Class Method Summary collapse

Methods included from ErrorSafety

included

Class Method Details

.clientObject



32
33
34
35
36
37
38
# File 'lib/abmeter.rb', line 32

def client
  unless @client
    raise 'ABMeter not configured or configured with "static" JSON. Call ABMeter.configure { |config| ... } first.'
  end

  @client
end

.configObject



26
27
28
29
30
# File 'lib/abmeter.rb', line 26

def config
  raise 'ABMeter not configured. Call ABMeter.configure { |config| ... } first.' unless @config

  @config
end

.configure {|config| ... } ⇒ Object

Yields:



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
# File 'lib/abmeter.rb', line 46

def configure
  config = Config.new
  config.base_url = DEFAULT_BASE_URL
  yield(config)
  config.validate!
  # Set logger level if both logger and log_level are configured
  config.send(:set_logger_level, config.log_level)
  @config = config

  if config.static_config
    # JSON-based configuration
    @resolver_provider = ResolverProvider.new(config: config)
  else
    # API-based configuration
    @client = Client.new(config)

    @resolver_provider = ResolverProvider.new(config: config, api_client: @client)

    # Configure and start async submitter
    AsyncSubmitter.configure(
      api_client: @client,
      config: config
    )
    AsyncSubmitter.start
  end
end

.get_exposure(user:, parameter_slug:) ⇒ Object

Only evaluates exposure with all details, including resolved value, without submitting it to the API Useful for testing/debugging



109
110
111
# File 'lib/abmeter.rb', line 109

def get_exposure(user:, parameter_slug:)
  resolver_provider.get_exposure(user: user, parameter_slug: parameter_slug)
end

.reset(timeout: AsyncSubmitter::DEFAULT_SHUTDOWN_TIMEOUT) ⇒ Object

Graceful, lossless, bounded blocking. Flushes pending exposures/events before clearing state. Returns true on clean shutdown, false if the timeout elapsed and the worker had to be killed.



76
77
78
79
80
81
82
# File 'lib/abmeter.rb', line 76

def reset(timeout: AsyncSubmitter::DEFAULT_SHUTDOWN_TIMEOUT)
  result = AsyncSubmitter.reset(timeout: timeout)
  @config = nil
  @client = nil
  @resolver_provider = nil
  result
end

.reset!Object

Immediate, lossy, non-blocking. Kills the worker thread and discards queued exposures/events without any network I/O.



86
87
88
89
90
91
92
# File 'lib/abmeter.rb', line 86

def reset!
  AsyncSubmitter.reset!
  @config = nil
  @client = nil
  @resolver_provider = nil
  nil
end

.resolve_parameter(user:, parameter_slug:) ⇒ Object

resolves paramater and submits parameter exposure to the API



102
103
104
# File 'lib/abmeter.rb', line 102

def resolve_parameter(user:, parameter_slug:)
  resolver_provider.resolve_parameter(user: user, parameter_slug: parameter_slug)
end

.resolver_providerObject



40
41
42
43
44
# File 'lib/abmeter.rb', line 40

def resolver_provider
  raise 'ABMeter not configured. Call ABMeter.configure { |config| ... } first.' unless @resolver_provider

  @resolver_provider
end

.track_event(event_name, user_id, data) ⇒ Object



94
95
96
97
98
# File 'lib/abmeter.rb', line 94

def track_event(event_name, user_id, data)
  # Queue the event for background processing
  AsyncSubmitter.queue_event(event_name, user_id, data)
  nil
end