Class: Quonfig::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/quonfig/evaluator.rb

Overview

Evaluates configs pulled from a ConfigStore against a Context.

Public API shape mirrors sdk-node’s Evaluator (src/evaluator.ts):

evaluator = Quonfig::Evaluator.new(store)
result    = evaluator.evaluate_config(cfg, context, resolver: resolver)

Since qfg-dk6.10 this class owns the full operator matrix against the JSON Criterion shape (propertyName / operator / valueToMatch). It accepts configs in either of two shapes:

  • The ConfigResponse hash produced by Quonfig::Datadir.to_config_response and IntegrationTestHelpers.to_config_response — symbol or string keys at the top level (id, key, type, value_type/valueType, default, environment) with JSON rules/criteria inside as plain hashes with string keys.

The legacy protobuf-shaped Config object is no longer supported.

evaluate_config returns an EvalResult that exposes the matched value via #unwrapped_value (coerced into a native Ruby type per value.type) and #value (the raw JSON Value hash). If nothing matches it returns nil, which Resolver#get relays to callers.

Constant Summary collapse

OP_NOT_SET =

Operator constants — kept as strings for direct comparison with the wire format (no symbol conversion on the hot path).

'NOT_SET'
OP_ALWAYS_TRUE =
'ALWAYS_TRUE'
OP_PROP_IS_ONE_OF =
'PROP_IS_ONE_OF'
OP_PROP_IS_NOT_ONE_OF =
'PROP_IS_NOT_ONE_OF'
OP_PROP_STARTS_WITH_ONE_OF =
'PROP_STARTS_WITH_ONE_OF'
OP_PROP_DOES_NOT_START_WITH_ONE_OF =
'PROP_DOES_NOT_START_WITH_ONE_OF'
OP_PROP_ENDS_WITH_ONE_OF =
'PROP_ENDS_WITH_ONE_OF'
OP_PROP_DOES_NOT_END_WITH_ONE_OF =
'PROP_DOES_NOT_END_WITH_ONE_OF'
OP_PROP_CONTAINS_ONE_OF =
'PROP_CONTAINS_ONE_OF'
OP_PROP_DOES_NOT_CONTAIN_ONE_OF =
'PROP_DOES_NOT_CONTAIN_ONE_OF'
OP_PROP_MATCHES =
'PROP_MATCHES'
OP_PROP_DOES_NOT_MATCH =
'PROP_DOES_NOT_MATCH'
OP_HIERARCHICAL_MATCH =
'HIERARCHICAL_MATCH'
OP_IN_INT_RANGE =
'IN_INT_RANGE'
OP_PROP_GREATER_THAN =
'PROP_GREATER_THAN'
OP_PROP_GREATER_THAN_OR_EQUAL =
'PROP_GREATER_THAN_OR_EQUAL'
OP_PROP_LESS_THAN =
'PROP_LESS_THAN'
OP_PROP_LESS_THAN_OR_EQUAL =
'PROP_LESS_THAN_OR_EQUAL'
OP_PROP_BEFORE =
'PROP_BEFORE'
OP_PROP_AFTER =
'PROP_AFTER'
OP_PROP_SEMVER_LESS_THAN =
'PROP_SEMVER_LESS_THAN'
OP_PROP_SEMVER_EQUAL =
'PROP_SEMVER_EQUAL'
OP_PROP_SEMVER_GREATER_THAN =
'PROP_SEMVER_GREATER_THAN'
OP_IN_SEG =
'IN_SEG'
OP_NOT_IN_SEG =
'NOT_IN_SEG'
MAGIC_CURRENT_TIME_PROPS =
%w[quonfig.current-time prefab.current-time reforge.current-time].freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(store, project_env_id: 0, env_id: nil, namespace: nil, base_client: nil) ⇒ Evaluator

Returns a new instance of Evaluator.



60
61
62
63
64
65
66
# File 'lib/quonfig/evaluator.rb', line 60

def initialize(store, project_env_id: 0, env_id: nil, namespace: nil, base_client: nil)
  @store = store
  @project_env_id = project_env_id
  @env_id = env_id
  @namespace = namespace
  @base_client = base_client
end

Instance Attribute Details

#env_idObject

Returns the value of attribute env_id.



58
59
60
# File 'lib/quonfig/evaluator.rb', line 58

def env_id
  @env_id
end

#project_env_idObject

Returns the value of attribute project_env_id.



58
59
60
# File 'lib/quonfig/evaluator.rb', line 58

def project_env_id
  @project_env_id
end

#storeObject (readonly)

Returns the value of attribute store.



57
58
59
# File 'lib/quonfig/evaluator.rb', line 57

def store
  @store
end

Instance Method Details

#evaluate_config(config, context, resolver: nil) ⇒ Object

Evaluate config against context and return an EvalResult (or nil if no rule matched). context may be a Quonfig::Context or a plain Hash.



70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/quonfig/evaluator.rb', line 70

def evaluate_config(config, context, resolver: nil)
  ctx = coerce_context(context)
  env = config_environment(config)

  if env && @env_id && env_id_of(env) == @env_id
    match = evaluate_rules(env_rules(env), ctx, config)
    return match if match
  end

  default_rules = default_rules_of(config)
  match = evaluate_rules(default_rules, ctx, config)
  return match if match

  nil
end