From 6a4f2552222f34c769d323edc2687a4e8b697567 Mon Sep 17 00:00:00 2001 From: James Kebinger Date: Thu, 18 Sep 2025 16:52:06 -0500 Subject: [PATCH 1/4] Initial bulk renaming of modules, code --- dev/allocation_stats | 6 +- dev/benchmark | 6 +- dev/console | 4 +- dev/script_setup.rb | 2 +- lib/prefab-cloud-ruby.rb | 59 ----------- .../errors/initialization_timeout_error.rb | 13 --- lib/prefab/errors/uninitialized_error.rb | 13 --- lib/prefab_pb.rb | 4 +- lib/reforge-sdk.rb | 59 +++++++++++ .../caching_http_connection.rb | 2 +- lib/{prefab => reforge}/client.rb | 28 ++--- lib/{prefab => reforge}/config_client.rb | 24 ++--- .../config_client_presenter.rb | 2 +- lib/{prefab => reforge}/config_loader.rb | 6 +- lib/{prefab => reforge}/config_resolver.rb | 6 +- .../config_value_unwrapper.rb | 26 ++--- .../config_value_wrapper.rb | 2 +- lib/{prefab => reforge}/context.rb | 6 +- lib/{prefab => reforge}/context_shape.rb | 2 +- .../context_shape_aggregator.rb | 8 +- lib/{prefab => reforge}/criteria_evaluator.rb | 12 +-- lib/{prefab => reforge}/duration.rb | 2 +- lib/{prefab => reforge}/encryption.rb | 2 +- lib/{prefab => reforge}/error.rb | 2 +- .../errors/env_var_parse_error.rb | 4 +- .../errors/initialization_timeout_error.rb | 13 +++ .../errors/invalid_api_key_error.rb | 4 +- .../errors/missing_default_error.rb | 6 +- .../errors/missing_env_var_error.rb | 4 +- lib/reforge/errors/uninitialized_error.rb | 13 +++ lib/{prefab => reforge}/evaluation.rb | 4 +- .../evaluation_summary_aggregator.rb | 8 +- .../example_contexts_aggregator.rb | 8 +- .../exponential_backoff.rb | 2 +- .../feature_flag_client.rb | 4 +- lib/{prefab => reforge}/fixed_size_hash.rb | 2 +- lib/{prefab => reforge}/http_connection.rb | 4 +- lib/{prefab => reforge}/internal_logger.rb | 10 +- lib/{prefab => reforge}/javascript_stub.rb | 8 +- .../local_config_parser.rb | 6 +- .../log_path_aggregator.rb | 8 +- lib/{prefab => reforge}/logger_client.rb | 2 +- lib/{prefab => reforge}/murmer3.rb | 0 lib/{prefab => reforge}/options.rb | 2 +- lib/{prefab => reforge}/periodic_sync.rb | 8 +- lib/{prefab => reforge}/prefab.rb | 18 ++-- lib/{prefab => reforge}/rate_limit_cache.rb | 2 +- .../resolved_config_presenter.rb | 6 +- lib/{prefab => reforge}/semver.rb | 0 lib/{prefab => reforge}/sse_config_client.rb | 10 +- lib/{prefab => reforge}/time_helpers.rb | 2 +- .../weighted_value_resolver.rb | 2 +- lib/{prefab => reforge}/yaml_config_parser.rb | 6 +- prefab-cloud-ruby.gemspec | 100 +++++++++--------- test/integration_test.rb | 16 +-- test/integration_test_helpers.rb | 10 +- test/support/common_helpers.rb | 16 +-- test/support/mock_base_client.rb | 2 +- test/test_caching_http_connection.rb | 2 +- test/test_client.rb | 48 ++++----- test/test_config_client.rb | 38 +++---- test/test_config_loader.rb | 8 +- test/test_config_resolver.rb | 46 ++++---- test/test_config_value_unwrapper.rb | 70 ++++++------ test/test_config_value_wrapper.rb | 12 +-- test/test_context.rb | 70 ++++++------ test/test_context_shape.rb | 4 +- test/test_context_shape_aggregator.rb | 12 +-- test/test_criteria_evaluator.rb | 78 +++++++------- test/test_duration.rb | 2 +- test/test_encryption.rb | 4 +- test/test_evaluation_summary_aggregator.rb | 6 +- test/test_example_contexts_aggregator.rb | 26 ++--- test/test_exponential_backoff.rb | 2 +- test/test_fixed_size_hash.rb | 2 +- test/test_helper.rb | 2 +- test/test_integration.rb | 2 +- test/test_internal_logger.rb | 6 +- test/test_javascript_stub.rb | 8 +- test/test_local_config_parser.rb | 32 +++--- test/test_log_path_aggregator.rb | 10 +- test/test_logger.rb | 14 +-- test/test_logger_initialization.rb | 2 +- test/test_options.rb | 46 ++++---- test/test_prefab.rb | 28 ++--- test/test_rate_limit_cache.rb | 8 +- test/test_sse_config_client.rb | 22 ++-- test/test_weighted_value_resolver.rb | 14 +-- 88 files changed, 615 insertions(+), 615 deletions(-) delete mode 100644 lib/prefab-cloud-ruby.rb delete mode 100644 lib/prefab/errors/initialization_timeout_error.rb delete mode 100644 lib/prefab/errors/uninitialized_error.rb create mode 100644 lib/reforge-sdk.rb rename lib/{prefab => reforge}/caching_http_connection.rb (99%) rename lib/{prefab => reforge}/client.rb (77%) rename lib/{prefab => reforge}/config_client.rb (88%) rename lib/{prefab => reforge}/config_client_presenter.rb (96%) rename lib/{prefab => reforge}/config_loader.rb (94%) rename lib/{prefab => reforge}/config_resolver.rb (93%) rename lib/{prefab => reforge}/config_value_unwrapper.rb (75%) rename lib/{prefab => reforge}/config_value_wrapper.rb (97%) rename lib/{prefab => reforge}/context.rb (98%) rename lib/{prefab => reforge}/context_shape.rb (96%) rename lib/{prefab => reforge}/context_shape_aggregator.rb (89%) rename lib/{prefab => reforge}/criteria_evaluator.rb (96%) rename lib/{prefab => reforge}/duration.rb (98%) rename lib/{prefab => reforge}/encryption.rb (99%) rename lib/{prefab => reforge}/error.rb (82%) rename lib/{prefab => reforge}/errors/env_var_parse_error.rb (80%) create mode 100644 lib/reforge/errors/initialization_timeout_error.rb rename lib/{prefab => reforge}/errors/invalid_api_key_error.rb (87%) rename lib/{prefab => reforge}/errors/missing_default_error.rb (76%) rename lib/{prefab => reforge}/errors/missing_env_var_error.rb (67%) create mode 100644 lib/reforge/errors/uninitialized_error.rb rename lib/{prefab => reforge}/evaluation.rb (91%) rename lib/{prefab => reforge}/evaluation_summary_aggregator.rb (94%) rename lib/{prefab => reforge}/example_contexts_aggregator.rb (91%) rename lib/{prefab => reforge}/exponential_backoff.rb (97%) rename lib/{prefab => reforge}/feature_flag_client.rb (94%) rename lib/{prefab => reforge}/fixed_size_hash.rb (94%) rename lib/{prefab => reforge}/http_connection.rb (90%) rename lib/{prefab => reforge}/internal_logger.rb (68%) rename lib/{prefab => reforge}/javascript_stub.rb (93%) rename lib/{prefab => reforge}/local_config_parser.rb (95%) rename lib/{prefab => reforge}/log_path_aggregator.rb (93%) rename lib/{prefab => reforge}/logger_client.rb (99%) rename lib/{prefab => reforge}/murmer3.rb (100%) rename lib/{prefab => reforge}/options.rb (99%) rename lib/{prefab => reforge}/periodic_sync.rb (89%) rename lib/{prefab => reforge}/prefab.rb (85%) rename lib/{prefab => reforge}/rate_limit_cache.rb (98%) rename lib/{prefab => reforge}/resolved_config_presenter.rb (95%) rename lib/{prefab => reforge}/semver.rb (100%) rename lib/{prefab => reforge}/sse_config_client.rb (92%) rename lib/{prefab => reforge}/time_helpers.rb (86%) rename lib/{prefab => reforge}/weighted_value_resolver.rb (98%) rename lib/{prefab => reforge}/yaml_config_parser.rb (76%) diff --git a/dev/allocation_stats b/dev/allocation_stats index 355995e..0d327b6 100755 --- a/dev/allocation_stats +++ b/dev/allocation_stats @@ -13,12 +13,12 @@ spec.require_paths.each do |path| end spec.require_paths.each do |path| - require "./lib/prefab-cloud-ruby" + require "./lib/reforge-sdk" end -require 'prefab-cloud-ruby' +require 'reforge-sdk' -$prefab = Prefab::Client.new(collect_logger_counts: false, collect_evaluation_summaries: false, +$prefab = Reforge::Client.new(collect_logger_counts: false, collect_evaluation_summaries: false, context_upload_mode: :none) $prefab.get('a.live.integer') diff --git a/dev/benchmark b/dev/benchmark index 02e45cf..01c80e3 100755 --- a/dev/benchmark +++ b/dev/benchmark @@ -13,13 +13,13 @@ spec.require_paths.each do |path| end spec.require_paths.each do |path| - require "./lib/prefab-cloud-ruby" + require "./lib/reforge-sdk" end -require 'prefab-cloud-ruby' +require 'reforge-sdk' require 'benchmark/ips' -prefab = Prefab::Client.new(collect_logger_counts: false, collect_evaluation_summaries: false, +prefab = Reforge::Client.new(collect_logger_counts: false, collect_evaluation_summaries: false, context_upload_mode: :none) prefab.get('prefab.auth.allowed_origins') diff --git a/dev/console b/dev/console index c3b3003..43b315a 100755 --- a/dev/console +++ b/dev/console @@ -4,8 +4,8 @@ require 'irb' require_relative "./script_setup" -if !ENV['PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'] - puts "run with PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug (or trace) for more output" +if !ENV['REFORGE_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'] + puts "run with REFORGE_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL=debug (or trace) for more output" end # Start an IRB session diff --git a/dev/script_setup.rb b/dev/script_setup.rb index 9d52dc9..a3ec270 100644 --- a/dev/script_setup.rb +++ b/dev/script_setup.rb @@ -12,7 +12,7 @@ end spec.require_paths.each do |path| - require "./lib/prefab-cloud-ruby" + require "./lib/reforge-sdk" end SemanticLogger.add_appender(io: $stdout) diff --git a/lib/prefab-cloud-ruby.rb b/lib/prefab-cloud-ruby.rb deleted file mode 100644 index 24071b6..0000000 --- a/lib/prefab-cloud-ruby.rb +++ /dev/null @@ -1,59 +0,0 @@ -# frozen_string_literal: true - -module Prefab - NO_DEFAULT_PROVIDED = :no_default_provided - VERSION = File.read(File.dirname(__FILE__) + '/../VERSION').strip -end - -require 'semantic_logger' -require 'prefab/internal_logger' -require 'concurrent/atomics' -require 'concurrent' -require 'faraday' -require 'openssl' -require 'ld-eventsource' -require 'prefab_pb' -require 'prefab/time_helpers' -require 'prefab/error' -require 'prefab/duration' -require 'prefab/evaluation' -require 'prefab/encryption' -require 'prefab/exponential_backoff' -require 'prefab/errors/initialization_timeout_error' -require 'prefab/errors/invalid_api_key_error' -require 'prefab/errors/missing_default_error' -require 'prefab/errors/env_var_parse_error' -require 'prefab/errors/missing_env_var_error' -require 'prefab/errors/uninitialized_error' -require 'prefab/options' -require 'prefab/rate_limit_cache' -require 'prefab/context_shape_aggregator' -require 'prefab/example_contexts_aggregator' -require 'prefab/evaluation_summary_aggregator' -require 'prefab/log_path_aggregator' -require 'prefab/weighted_value_resolver' -require 'prefab/config_value_wrapper' -require 'prefab/config_value_unwrapper' -require 'prefab/criteria_evaluator' -require 'prefab/config_loader' -require 'prefab/context_shape' -require 'prefab/local_config_parser' -require 'prefab/yaml_config_parser' -require 'prefab/resolved_config_presenter' -require 'prefab/config_resolver' -require 'prefab/http_connection' -require 'prefab/context' -require 'prefab/logger_client' -require 'active_support/deprecation' -require 'active_support' -require 'prefab/sse_config_client' -require 'prefab/client' -require 'prefab/config_client_presenter' -require 'prefab/config_client' -require 'prefab/feature_flag_client' -require 'prefab/prefab' -require 'prefab/murmer3' -require 'prefab/javascript_stub' -require 'prefab/semver' -require 'prefab/fixed_size_hash' -require 'prefab/caching_http_connection' \ No newline at end of file diff --git a/lib/prefab/errors/initialization_timeout_error.rb b/lib/prefab/errors/initialization_timeout_error.rb deleted file mode 100644 index 2b54c98..0000000 --- a/lib/prefab/errors/initialization_timeout_error.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module Prefab - module Errors - class InitializationTimeoutError < Prefab::Error - def initialize(timeout_sec, key) - message = "Prefab couldn't initialize in #{timeout_sec} second timeout. Trying to fetch key `#{key}`." - - super(message) - end - end - end -end diff --git a/lib/prefab/errors/uninitialized_error.rb b/lib/prefab/errors/uninitialized_error.rb deleted file mode 100644 index 7800448..0000000 --- a/lib/prefab/errors/uninitialized_error.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module Prefab - module Errors - class UninitializedError < Prefab::Error - def initialize(key=nil) - message = "Use Prefab.initialize before calling Prefab.get #{key}" - - super(message) - end - end - end -end diff --git a/lib/prefab_pb.rb b/lib/prefab_pb.rb index 3a7509b..aeed92d 100644 --- a/lib/prefab_pb.rb +++ b/lib/prefab_pb.rb @@ -5,9 +5,9 @@ require 'google/protobuf' -descriptor_data = "\n\x0cprefab.proto\x12\x06prefab\"W\n\x14\x43onfigServicePointer\x12\x12\n\nproject_id\x18\x01 \x01(\x03\x12\x13\n\x0bstart_at_id\x18\x02 \x01(\x03\x12\x16\n\x0eproject_env_id\x18\x03 \x01(\x03\"\xb1\x04\n\x0b\x43onfigValue\x12\r\n\x03int\x18\x01 \x01(\x03H\x00\x12\x10\n\x06string\x18\x02 \x01(\tH\x00\x12\x0f\n\x05\x62ytes\x18\x03 \x01(\x0cH\x00\x12\x10\n\x06\x64ouble\x18\x04 \x01(\x01H\x00\x12\x0e\n\x04\x62ool\x18\x05 \x01(\x08H\x00\x12\x31\n\x0fweighted_values\x18\x06 \x01(\x0b\x32\x16.prefab.WeightedValuesH\x00\x12\x33\n\x10limit_definition\x18\x07 \x01(\x0b\x32\x17.prefab.LimitDefinitionH\x00\x12%\n\tlog_level\x18\t \x01(\x0e\x32\x10.prefab.LogLevelH\x00\x12)\n\x0bstring_list\x18\n \x01(\x0b\x32\x12.prefab.StringListH\x00\x12%\n\tint_range\x18\x0b \x01(\x0b\x32\x10.prefab.IntRangeH\x00\x12$\n\x08provided\x18\x0c \x01(\x0b\x32\x10.prefab.ProvidedH\x00\x12\'\n\x08\x64uration\x18\x0f \x01(\x0b\x32\x13.prefab.IsoDurationH\x00\x12\x1c\n\x04json\x18\x10 \x01(\x0b\x32\x0c.prefab.JsonH\x00\x12 \n\x06schema\x18\x11 \x01(\x0b\x32\x0e.prefab.SchemaH\x00\x12\x19\n\x0c\x63onfidential\x18\r \x01(\x08H\x01\x88\x01\x01\x12\x19\n\x0c\x64\x65\x63rypt_with\x18\x0e \x01(\tH\x02\x88\x01\x01\x42\x06\n\x04typeB\x0f\n\r_confidentialB\x0f\n\r_decrypt_with\"\x14\n\x04Json\x12\x0c\n\x04json\x18\x01 \x01(\t\"!\n\x0bIsoDuration\x12\x12\n\ndefinition\x18\x01 \x01(\t\"b\n\x08Provided\x12+\n\x06source\x18\x01 \x01(\x0e\x32\x16.prefab.ProvidedSourceH\x00\x88\x01\x01\x12\x13\n\x06lookup\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_sourceB\t\n\x07_lookup\"B\n\x08IntRange\x12\x12\n\x05start\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x03H\x01\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_end\"\x1c\n\nStringList\x12\x0e\n\x06values\x18\x01 \x03(\t\"C\n\rWeightedValue\x12\x0e\n\x06weight\x18\x01 \x01(\x05\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.prefab.ConfigValue\"~\n\x0eWeightedValues\x12.\n\x0fweighted_values\x18\x01 \x03(\x0b\x32\x15.prefab.WeightedValue\x12\"\n\x15hash_by_property_name\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x18\n\x16_hash_by_property_name\"X\n\x0e\x41piKeyMetadata\x12\x13\n\x06key_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07user_id\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_key_idB\n\n\x08_user_idJ\x04\x08\x02\x10\x03\"\xa0\x02\n\x07\x43onfigs\x12\x1f\n\x07\x63onfigs\x18\x01 \x03(\x0b\x32\x0e.prefab.Config\x12<\n\x16\x63onfig_service_pointer\x18\x02 \x01(\x0b\x32\x1c.prefab.ConfigServicePointer\x12\x34\n\x0f\x61pikey_metadata\x18\x03 \x01(\x0b\x32\x16.prefab.ApiKeyMetadataH\x00\x88\x01\x01\x12\x30\n\x0f\x64\x65\x66\x61ult_context\x18\x04 \x01(\x0b\x32\x12.prefab.ContextSetH\x01\x88\x01\x01\x12\x17\n\nkeep_alive\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x12\n\x10_apikey_metadataB\x12\n\x10_default_contextB\r\n\x0b_keep_alive\"\xa4\x04\n\x06\x43onfig\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x12\n\nproject_id\x18\x02 \x01(\x03\x12\x0b\n\x03key\x18\x03 \x01(\t\x12%\n\nchanged_by\x18\x04 \x01(\x0b\x32\x11.prefab.ChangedBy\x12\x1f\n\x04rows\x18\x05 \x03(\x0b\x32\x11.prefab.ConfigRow\x12-\n\x10\x61llowable_values\x18\x06 \x03(\x0b\x32\x13.prefab.ConfigValue\x12\'\n\x0b\x63onfig_type\x18\x07 \x01(\x0e\x32\x12.prefab.ConfigType\x12\x15\n\x08\x64raft_id\x18\x08 \x01(\x03H\x00\x88\x01\x01\x12,\n\nvalue_type\x18\t \x01(\x0e\x32\x18.prefab.Config.ValueType\x12\x1a\n\x12send_to_client_sdk\x18\n \x01(\x08\x12\x17\n\nschema_key\x18\x0b \x01(\tH\x01\x88\x01\x01\"\xb6\x01\n\tValueType\x12\x16\n\x12NOT_SET_VALUE_TYPE\x10\x00\x12\x07\n\x03INT\x10\x01\x12\n\n\x06STRING\x10\x02\x12\t\n\x05\x42YTES\x10\x03\x12\n\n\x06\x44OUBLE\x10\x04\x12\x08\n\x04\x42OOL\x10\x05\x12\x14\n\x10LIMIT_DEFINITION\x10\x07\x12\r\n\tLOG_LEVEL\x10\t\x12\x0f\n\x0bSTRING_LIST\x10\n\x12\r\n\tINT_RANGE\x10\x0b\x12\x0c\n\x08\x44URATION\x10\x0c\x12\x08\n\x04JSON\x10\rB\x0b\n\t_draft_idB\r\n\x0b_schema_key\"?\n\tChangedBy\x12\x0f\n\x07user_id\x18\x01 \x01(\x03\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x12\n\napi_key_id\x18\x03 \x01(\t\"\xe4\x01\n\tConfigRow\x12\x1b\n\x0eproject_env_id\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12(\n\x06values\x18\x02 \x03(\x0b\x32\x18.prefab.ConditionalValue\x12\x35\n\nproperties\x18\x03 \x03(\x0b\x32!.prefab.ConfigRow.PropertiesEntry\x1a\x46\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.prefab.ConfigValue:\x02\x38\x01\x42\x11\n\x0f_project_env_id\"[\n\x10\x43onditionalValue\x12#\n\x08\x63riteria\x18\x01 \x03(\x0b\x32\x11.prefab.Criterion\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.prefab.ConfigValue\"\x96\x06\n\tCriterion\x12\x15\n\rproperty_name\x18\x01 \x01(\t\x12\x35\n\x08operator\x18\x02 \x01(\x0e\x32#.prefab.Criterion.CriterionOperator\x12+\n\x0evalue_to_match\x18\x03 \x01(\x0b\x32\x13.prefab.ConfigValue\"\x8d\x05\n\x11\x43riterionOperator\x12\x0b\n\x07NOT_SET\x10\x00\x12\x11\n\rLOOKUP_KEY_IN\x10\x01\x12\x15\n\x11LOOKUP_KEY_NOT_IN\x10\x02\x12\n\n\x06IN_SEG\x10\x03\x12\x0e\n\nNOT_IN_SEG\x10\x04\x12\x0f\n\x0b\x41LWAYS_TRUE\x10\x05\x12\x12\n\x0ePROP_IS_ONE_OF\x10\x06\x12\x16\n\x12PROP_IS_NOT_ONE_OF\x10\x07\x12\x19\n\x15PROP_ENDS_WITH_ONE_OF\x10\x08\x12!\n\x1dPROP_DOES_NOT_END_WITH_ONE_OF\x10\t\x12\x16\n\x12HIERARCHICAL_MATCH\x10\n\x12\x10\n\x0cIN_INT_RANGE\x10\x0b\x12\x1b\n\x17PROP_STARTS_WITH_ONE_OF\x10\x0c\x12#\n\x1fPROP_DOES_NOT_START_WITH_ONE_OF\x10\r\x12\x18\n\x14PROP_CONTAINS_ONE_OF\x10\x0e\x12 \n\x1cPROP_DOES_NOT_CONTAIN_ONE_OF\x10\x0f\x12\x12\n\x0ePROP_LESS_THAN\x10\x10\x12\x1b\n\x17PROP_LESS_THAN_OR_EQUAL\x10\x11\x12\x15\n\x11PROP_GREATER_THAN\x10\x12\x12\x1e\n\x1aPROP_GREATER_THAN_OR_EQUAL\x10\x13\x12\x0f\n\x0bPROP_BEFORE\x10\x14\x12\x0e\n\nPROP_AFTER\x10\x15\x12\x10\n\x0cPROP_MATCHES\x10\x16\x12\x17\n\x13PROP_DOES_NOT_MATCH\x10\x17\x12\x19\n\x15PROP_SEMVER_LESS_THAN\x10\x18\x12\x15\n\x11PROP_SEMVER_EQUAL\x10\x19\x12\x1c\n\x18PROP_SEMVER_GREATER_THAN\x10\x1a\"\x89\x01\n\x07Loggers\x12\x1f\n\x07loggers\x18\x01 \x03(\x0b\x32\x0e.prefab.Logger\x12\x10\n\x08start_at\x18\x02 \x01(\x03\x12\x0e\n\x06\x65nd_at\x18\x03 \x01(\x03\x12\x15\n\rinstance_hash\x18\x04 \x01(\t\x12\x16\n\tnamespace\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_namespace\"\xd9\x01\n\x06Logger\x12\x13\n\x0blogger_name\x18\x01 \x01(\t\x12\x13\n\x06traces\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12\x13\n\x06\x64\x65\x62ugs\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x12\n\x05infos\x18\x04 \x01(\x03H\x02\x88\x01\x01\x12\x12\n\x05warns\x18\x05 \x01(\x03H\x03\x88\x01\x01\x12\x13\n\x06\x65rrors\x18\x06 \x01(\x03H\x04\x88\x01\x01\x12\x13\n\x06\x66\x61tals\x18\x07 \x01(\x03H\x05\x88\x01\x01\x42\t\n\x07_tracesB\t\n\x07_debugsB\x08\n\x06_infosB\x08\n\x06_warnsB\t\n\x07_errorsB\t\n\x07_fatals\"\x16\n\x14LoggerReportResponse\"\xdb\x03\n\rLimitResponse\x12\x0e\n\x06passed\x18\x01 \x01(\x08\x12\x12\n\nexpires_at\x18\x02 \x01(\x03\x12\x16\n\x0e\x65nforced_group\x18\x03 \x01(\t\x12\x16\n\x0e\x63urrent_bucket\x18\x04 \x01(\x03\x12\x14\n\x0cpolicy_group\x18\x05 \x01(\t\x12;\n\x0bpolicy_name\x18\x06 \x01(\x0e\x32&.prefab.LimitResponse.LimitPolicyNames\x12\x14\n\x0cpolicy_limit\x18\x07 \x01(\x05\x12\x0e\n\x06\x61mount\x18\x08 \x01(\x03\x12\x16\n\x0elimit_reset_at\x18\t \x01(\x03\x12\x39\n\x0csafety_level\x18\n \x01(\x0e\x32#.prefab.LimitDefinition.SafetyLevel\"\xa9\x01\n\x10LimitPolicyNames\x12\x0b\n\x07NOT_SET\x10\x00\x12\x14\n\x10SECONDLY_ROLLING\x10\x01\x12\x14\n\x10MINUTELY_ROLLING\x10\x03\x12\x12\n\x0eHOURLY_ROLLING\x10\x05\x12\x11\n\rDAILY_ROLLING\x10\x07\x12\x13\n\x0fMONTHLY_ROLLING\x10\x08\x12\x0c\n\x08INFINITE\x10\t\x12\x12\n\x0eYEARLY_ROLLING\x10\n\"\x99\x02\n\x0cLimitRequest\x12\x12\n\naccount_id\x18\x01 \x01(\x03\x12\x16\n\x0e\x61\x63quire_amount\x18\x02 \x01(\x05\x12\x0e\n\x06groups\x18\x03 \x03(\t\x12:\n\x0elimit_combiner\x18\x04 \x01(\x0e\x32\".prefab.LimitRequest.LimitCombiner\x12\x1e\n\x16\x61llow_partial_response\x18\x05 \x01(\x08\x12\x39\n\x0csafety_level\x18\x06 \x01(\x0e\x32#.prefab.LimitDefinition.SafetyLevel\"6\n\rLimitCombiner\x12\x0b\n\x07NOT_SET\x10\x00\x12\x0b\n\x07MINIMUM\x10\x01\x12\x0b\n\x07MAXIMUM\x10\x02\"/\n\nContextSet\x12!\n\x08\x63ontexts\x18\x01 \x03(\x0b\x32\x0f.prefab.Context\"\x96\x01\n\x07\x43ontext\x12\x11\n\x04type\x18\x01 \x01(\tH\x00\x88\x01\x01\x12+\n\x06values\x18\x02 \x03(\x0b\x32\x1b.prefab.Context.ValuesEntry\x1a\x42\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.prefab.ConfigValue:\x02\x38\x01\x42\x07\n\x05_type\"\x93\x01\n\x08Identity\x12\x13\n\x06lookup\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x34\n\nattributes\x18\x02 \x03(\x0b\x32 .prefab.Identity.AttributesEntry\x1a\x31\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_lookup\"\xd6\x02\n\x18\x43onfigEvaluationMetaData\x12\x1d\n\x10\x63onfig_row_index\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17\x63onditional_value_index\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12!\n\x14weighted_value_index\x18\x03 \x01(\x03H\x02\x88\x01\x01\x12%\n\x04type\x18\x04 \x01(\x0e\x32\x12.prefab.ConfigTypeH\x03\x88\x01\x01\x12\x0f\n\x02id\x18\x05 \x01(\x03H\x04\x88\x01\x01\x12\x31\n\nvalue_type\x18\x06 \x01(\x0e\x32\x18.prefab.Config.ValueTypeH\x05\x88\x01\x01\x42\x13\n\x11_config_row_indexB\x1a\n\x18_conditional_value_indexB\x17\n\x15_weighted_value_indexB\x07\n\x05_typeB\x05\n\x03_idB\r\n\x0b_value_type\"\x8b\x03\n\x11\x43lientConfigValue\x12\r\n\x03int\x18\x01 \x01(\x03H\x00\x12\x10\n\x06string\x18\x02 \x01(\tH\x00\x12\x10\n\x06\x64ouble\x18\x03 \x01(\x01H\x00\x12\x0e\n\x04\x62ool\x18\x04 \x01(\x08H\x00\x12%\n\tlog_level\x18\x05 \x01(\x0e\x32\x10.prefab.LogLevelH\x00\x12)\n\x0bstring_list\x18\x07 \x01(\x0b\x32\x12.prefab.StringListH\x00\x12%\n\tint_range\x18\x08 \x01(\x0b\x32\x10.prefab.IntRangeH\x00\x12*\n\x08\x64uration\x18\t \x01(\x0b\x32\x16.prefab.ClientDurationH\x00\x12\x1c\n\x04json\x18\n \x01(\x0b\x32\x0c.prefab.JsonH\x00\x12I\n\x1a\x63onfig_evaluation_metadata\x18\x06 \x01(\x0b\x32 .prefab.ConfigEvaluationMetaDataH\x01\x88\x01\x01\x42\x06\n\x04typeB\x1d\n\x1b_config_evaluation_metadata\"D\n\x0e\x43lientDuration\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x12\r\n\x05nanos\x18\x02 \x01(\x05\x12\x12\n\ndefinition\x18\x03 \x01(\t\"\xa4\x02\n\x11\x43onfigEvaluations\x12\x35\n\x06values\x18\x01 \x03(\x0b\x32%.prefab.ConfigEvaluations.ValuesEntry\x12\x34\n\x0f\x61pikey_metadata\x18\x02 \x01(\x0b\x32\x16.prefab.ApiKeyMetadataH\x00\x88\x01\x01\x12\x30\n\x0f\x64\x65\x66\x61ult_context\x18\x03 \x01(\x0b\x32\x12.prefab.ContextSetH\x01\x88\x01\x01\x1aH\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.prefab.ClientConfigValue:\x02\x38\x01\x42\x12\n\x10_apikey_metadataB\x12\n\x10_default_context\"\xa8\x02\n\x0fLimitDefinition\x12;\n\x0bpolicy_name\x18\x02 \x01(\x0e\x32&.prefab.LimitResponse.LimitPolicyNames\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\r\n\x05\x62urst\x18\x04 \x01(\x05\x12\x12\n\naccount_id\x18\x05 \x01(\x03\x12\x15\n\rlast_modified\x18\x06 \x01(\x03\x12\x12\n\nreturnable\x18\x07 \x01(\x08\x12\x39\n\x0csafety_level\x18\x08 \x01(\x0e\x32#.prefab.LimitDefinition.SafetyLevel\"@\n\x0bSafetyLevel\x12\x0b\n\x07NOT_SET\x10\x00\x12\x12\n\x0eL4_BEST_EFFORT\x10\x04\x12\x10\n\x0cL5_BOMBPROOF\x10\x05\"@\n\x10LimitDefinitions\x12,\n\x0b\x64\x65\x66initions\x18\x01 \x03(\x0b\x32\x17.prefab.LimitDefinition\"\x8a\x01\n\x0f\x42ufferedRequest\x12\x12\n\naccount_id\x18\x01 \x01(\x03\x12\x0e\n\x06method\x18\x02 \x01(\t\x12\x0b\n\x03uri\x18\x03 \x01(\t\x12\x0c\n\x04\x62ody\x18\x04 \x01(\t\x12\x14\n\x0climit_groups\x18\x05 \x03(\t\x12\x14\n\x0c\x63ontent_type\x18\x06 \x01(\t\x12\x0c\n\x04\x66ifo\x18\x07 \x01(\x08\"\x94\x01\n\x0c\x42\x61tchRequest\x12\x12\n\naccount_id\x18\x01 \x01(\x03\x12\x0e\n\x06method\x18\x02 \x01(\t\x12\x0b\n\x03uri\x18\x03 \x01(\t\x12\x0c\n\x04\x62ody\x18\x04 \x01(\t\x12\x14\n\x0climit_groups\x18\x05 \x03(\t\x12\x16\n\x0e\x62\x61tch_template\x18\x06 \x01(\t\x12\x17\n\x0f\x62\x61tch_separator\x18\x07 \x01(\t\" \n\rBasicResponse\x12\x0f\n\x07message\x18\x01 \x01(\t\"3\n\x10\x43reationResponse\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0e\n\x06new_id\x18\x02 \x01(\x03\"h\n\x07IdBlock\x12\x12\n\nproject_id\x18\x01 \x01(\x03\x12\x16\n\x0eproject_env_id\x18\x02 \x01(\x03\x12\x15\n\rsequence_name\x18\x03 \x01(\t\x12\r\n\x05start\x18\x04 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x05 \x01(\x03\"a\n\x0eIdBlockRequest\x12\x12\n\nproject_id\x18\x01 \x01(\x03\x12\x16\n\x0eproject_env_id\x18\x02 \x01(\x03\x12\x15\n\rsequence_name\x18\x03 \x01(\t\x12\x0c\n\x04size\x18\x04 \x01(\x03\"\x8a\x01\n\x0c\x43ontextShape\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x39\n\x0b\x66ield_types\x18\x02 \x03(\x0b\x32$.prefab.ContextShape.FieldTypesEntry\x1a\x31\n\x0f\x46ieldTypesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"[\n\rContextShapes\x12$\n\x06shapes\x18\x01 \x03(\x0b\x32\x14.prefab.ContextShape\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_namespace\"C\n\rEvaluatedKeys\x12\x0c\n\x04keys\x18\x01 \x03(\t\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_namespace\"\x93\x01\n\x0f\x45valuatedConfig\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x16\n\x0e\x63onfig_version\x18\x02 \x01(\x03\x12#\n\x06result\x18\x03 \x01(\x0b\x32\x13.prefab.ConfigValue\x12#\n\x07\x63ontext\x18\x04 \x01(\x0b\x32\x12.prefab.ContextSet\x12\x11\n\ttimestamp\x18\x05 \x01(\x03\"<\n\x10\x45valuatedConfigs\x12(\n\x07\x63onfigs\x18\x01 \x03(\x0b\x32\x17.prefab.EvaluatedConfig\"\xc4\x03\n\x17\x43onfigEvaluationCounter\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x16\n\tconfig_id\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12\x1b\n\x0eselected_index\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x30\n\x0eselected_value\x18\x04 \x01(\x0b\x32\x13.prefab.ConfigValueH\x02\x88\x01\x01\x12\x1d\n\x10\x63onfig_row_index\x18\x05 \x01(\rH\x03\x88\x01\x01\x12$\n\x17\x63onditional_value_index\x18\x06 \x01(\rH\x04\x88\x01\x01\x12!\n\x14weighted_value_index\x18\x07 \x01(\rH\x05\x88\x01\x01\x12\x36\n\x06reason\x18\x08 \x01(\x0e\x32&.prefab.ConfigEvaluationCounter.Reason\"\x15\n\x06Reason\x12\x0b\n\x07UNKNOWN\x10\x00\x42\x0c\n\n_config_idB\x11\n\x0f_selected_indexB\x11\n\x0f_selected_valueB\x13\n\x11_config_row_indexB\x1a\n\x18_conditional_value_indexB\x17\n\x15_weighted_value_index\"{\n\x17\x43onfigEvaluationSummary\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x04type\x18\x02 \x01(\x0e\x32\x12.prefab.ConfigType\x12\x31\n\x08\x63ounters\x18\x03 \x03(\x0b\x32\x1f.prefab.ConfigEvaluationCounter\"k\n\x19\x43onfigEvaluationSummaries\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\x12\x32\n\tsummaries\x18\x03 \x03(\x0b\x32\x1f.prefab.ConfigEvaluationSummary\"Z\n\x15LoggersTelemetryEvent\x12\x1f\n\x07loggers\x18\x01 \x03(\x0b\x32\x0e.prefab.Logger\x12\x10\n\x08start_at\x18\x02 \x01(\x03\x12\x0e\n\x06\x65nd_at\x18\x03 \x01(\x03\"\x98\x02\n\x0eTelemetryEvent\x12\x36\n\tsummaries\x18\x02 \x01(\x0b\x32!.prefab.ConfigEvaluationSummariesH\x00\x12\x33\n\x10\x65xample_contexts\x18\x03 \x01(\x0b\x32\x17.prefab.ExampleContextsH\x00\x12+\n\x0c\x63lient_stats\x18\x04 \x01(\x0b\x32\x13.prefab.ClientStatsH\x00\x12\x30\n\x07loggers\x18\x05 \x01(\x0b\x32\x1d.prefab.LoggersTelemetryEventH\x00\x12/\n\x0e\x63ontext_shapes\x18\x06 \x01(\x0b\x32\x15.prefab.ContextShapesH\x00\x42\t\n\x07payload\"P\n\x0fTelemetryEvents\x12\x15\n\rinstance_hash\x18\x01 \x01(\t\x12&\n\x06\x65vents\x18\x02 \x03(\x0b\x32\x16.prefab.TelemetryEvent\"*\n\x17TelemetryEventsResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\";\n\x0f\x45xampleContexts\x12(\n\x08\x65xamples\x18\x01 \x03(\x0b\x32\x16.prefab.ExampleContext\"K\n\x0e\x45xampleContext\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12&\n\ncontextSet\x18\x02 \x01(\x0b\x32\x12.prefab.ContextSet\"F\n\x0b\x43lientStats\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\x12\x1b\n\x13\x64ropped_event_count\x18\x03 \x01(\x04\"}\n\x06Schema\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12.\n\x0bschema_type\x18\x02 \x01(\x0e\x32\x19.prefab.Schema.SchemaType\"3\n\nSchemaType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03ZOD\x10\x01\x12\x0f\n\x0bJSON_SCHEMA\x10\x02*:\n\x0eProvidedSource\x12\x1b\n\x17PROVIDED_SOURCE_NOT_SET\x10\x00\x12\x0b\n\x07\x45NV_VAR\x10\x01*\x8e\x01\n\nConfigType\x12\x17\n\x13NOT_SET_CONFIG_TYPE\x10\x00\x12\n\n\x06\x43ONFIG\x10\x01\x12\x10\n\x0c\x46\x45\x41TURE_FLAG\x10\x02\x12\r\n\tLOG_LEVEL\x10\x03\x12\x0b\n\x07SEGMENT\x10\x04\x12\x14\n\x10LIMIT_DEFINITION\x10\x05\x12\x0b\n\x07\x44\x45LETED\x10\x06\x12\n\n\x06SCHEMA\x10\x07*a\n\x08LogLevel\x12\x15\n\x11NOT_SET_LOG_LEVEL\x10\x00\x12\t\n\x05TRACE\x10\x01\x12\t\n\x05\x44\x45\x42UG\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x08\n\x04WARN\x10\x05\x12\t\n\x05\x45RROR\x10\x06\x12\t\n\x05\x46\x41TAL\x10\t*G\n\tOnFailure\x12\x0b\n\x07NOT_SET\x10\x00\x12\x10\n\x0cLOG_AND_PASS\x10\x01\x12\x10\n\x0cLOG_AND_FAIL\x10\x02\x12\t\n\x05THROW\x10\x03\x42L\n\x13\x63loud.prefab.domainB\x06PrefabZ-github.com/prefab-cloud/prefab-cloud-go/protob\x06proto3" +descriptor_data = "\n\x0cprefab.proto\x12\x06prefab\"W\n\x14\x43onfigServicePointer\x12\x12\n\nproject_id\x18\x01 \x01(\x03\x12\x13\n\x0bstart_at_id\x18\x02 \x01(\x03\x12\x16\n\x0eproject_env_id\x18\x03 \x01(\x03\"\xf7\x04\n\x0b\x43onfigValue\x12\r\n\x03int\x18\x01 \x01(\x03H\x00\x12\x10\n\x06string\x18\x02 \x01(\tH\x00\x12\x0f\n\x05\x62ytes\x18\x03 \x01(\x0cH\x00\x12\x10\n\x06\x64ouble\x18\x04 \x01(\x01H\x00\x12\x0e\n\x04\x62ool\x18\x05 \x01(\x08H\x00\x12\x31\n\x0fweighted_values\x18\x06 \x01(\x0b\x32\x16.prefab.WeightedValuesH\x00\x12\x33\n\x10limit_definition\x18\x07 \x01(\x0b\x32\x17.prefab.LimitDefinitionH\x00\x12%\n\tlog_level\x18\t \x01(\x0e\x32\x10.prefab.LogLevelH\x00\x12)\n\x0bstring_list\x18\n \x01(\x0b\x32\x12.prefab.StringListH\x00\x12%\n\tint_range\x18\x0b \x01(\x0b\x32\x10.prefab.IntRangeH\x00\x12$\n\x08provided\x18\x0c \x01(\x0b\x32\x10.prefab.ProvidedH\x00\x12\'\n\x08\x64uration\x18\x0f \x01(\x0b\x32\x13.prefab.IsoDurationH\x00\x12\x1c\n\x04json\x18\x10 \x01(\x0b\x32\x0c.prefab.JsonH\x00\x12 \n\x06schema\x18\x11 \x01(\x0b\x32\x0e.prefab.SchemaH\x00\x12\x19\n\x0c\x63onfidential\x18\r \x01(\x08H\x01\x88\x01\x01\x12\x19\n\x0c\x64\x65\x63rypt_with\x18\x0e \x01(\tH\x02\x88\x01\x01\x12\x11\n\x04name\x18\x12 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x13 \x01(\tH\x04\x88\x01\x01\x42\x06\n\x04typeB\x0f\n\r_confidentialB\x0f\n\r_decrypt_withB\x07\n\x05_nameB\x0e\n\x0c_description\"\x14\n\x04Json\x12\x0c\n\x04json\x18\x01 \x01(\t\"!\n\x0bIsoDuration\x12\x12\n\ndefinition\x18\x01 \x01(\t\"b\n\x08Provided\x12+\n\x06source\x18\x01 \x01(\x0e\x32\x16.prefab.ProvidedSourceH\x00\x88\x01\x01\x12\x13\n\x06lookup\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_sourceB\t\n\x07_lookup\"B\n\x08IntRange\x12\x12\n\x05start\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12\x10\n\x03\x65nd\x18\x02 \x01(\x03H\x01\x88\x01\x01\x42\x08\n\x06_startB\x06\n\x04_end\"\x1c\n\nStringList\x12\x0e\n\x06values\x18\x01 \x03(\t\"C\n\rWeightedValue\x12\x0e\n\x06weight\x18\x01 \x01(\x05\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.prefab.ConfigValue\"~\n\x0eWeightedValues\x12.\n\x0fweighted_values\x18\x01 \x03(\x0b\x32\x15.prefab.WeightedValue\x12\"\n\x15hash_by_property_name\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x18\n\x16_hash_by_property_name\"X\n\x0e\x41piKeyMetadata\x12\x13\n\x06key_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x07user_id\x18\x03 \x01(\tH\x01\x88\x01\x01\x42\t\n\x07_key_idB\n\n\x08_user_idJ\x04\x08\x02\x10\x03\"\xa0\x02\n\x07\x43onfigs\x12\x1f\n\x07\x63onfigs\x18\x01 \x03(\x0b\x32\x0e.prefab.Config\x12<\n\x16\x63onfig_service_pointer\x18\x02 \x01(\x0b\x32\x1c.prefab.ConfigServicePointer\x12\x34\n\x0f\x61pikey_metadata\x18\x03 \x01(\x0b\x32\x16.prefab.ApiKeyMetadataH\x00\x88\x01\x01\x12\x30\n\x0f\x64\x65\x66\x61ult_context\x18\x04 \x01(\x0b\x32\x12.prefab.ContextSetH\x01\x88\x01\x01\x12\x17\n\nkeep_alive\x18\x05 \x01(\x08H\x02\x88\x01\x01\x42\x12\n\x10_apikey_metadataB\x12\n\x10_default_contextB\r\n\x0b_keep_alive\"\xa4\x04\n\x06\x43onfig\x12\n\n\x02id\x18\x01 \x01(\x03\x12\x12\n\nproject_id\x18\x02 \x01(\x03\x12\x0b\n\x03key\x18\x03 \x01(\t\x12%\n\nchanged_by\x18\x04 \x01(\x0b\x32\x11.prefab.ChangedBy\x12\x1f\n\x04rows\x18\x05 \x03(\x0b\x32\x11.prefab.ConfigRow\x12-\n\x10\x61llowable_values\x18\x06 \x03(\x0b\x32\x13.prefab.ConfigValue\x12\'\n\x0b\x63onfig_type\x18\x07 \x01(\x0e\x32\x12.prefab.ConfigType\x12\x15\n\x08\x64raft_id\x18\x08 \x01(\x03H\x00\x88\x01\x01\x12,\n\nvalue_type\x18\t \x01(\x0e\x32\x18.prefab.Config.ValueType\x12\x1a\n\x12send_to_client_sdk\x18\n \x01(\x08\x12\x17\n\nschema_key\x18\x0b \x01(\tH\x01\x88\x01\x01\"\xb6\x01\n\tValueType\x12\x16\n\x12NOT_SET_VALUE_TYPE\x10\x00\x12\x07\n\x03INT\x10\x01\x12\n\n\x06STRING\x10\x02\x12\t\n\x05\x42YTES\x10\x03\x12\n\n\x06\x44OUBLE\x10\x04\x12\x08\n\x04\x42OOL\x10\x05\x12\x14\n\x10LIMIT_DEFINITION\x10\x07\x12\r\n\tLOG_LEVEL\x10\t\x12\x0f\n\x0bSTRING_LIST\x10\n\x12\r\n\tINT_RANGE\x10\x0b\x12\x0c\n\x08\x44URATION\x10\x0c\x12\x08\n\x04JSON\x10\rB\x0b\n\t_draft_idB\r\n\x0b_schema_key\"V\n\tChangedBy\x12\x0f\n\x07user_id\x18\x01 \x01(\x03\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x12\n\napi_key_id\x18\x03 \x01(\t\x12\x15\n\ruser_identity\x18\x04 \x01(\t\"\xe4\x01\n\tConfigRow\x12\x1b\n\x0eproject_env_id\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12(\n\x06values\x18\x02 \x03(\x0b\x32\x18.prefab.ConditionalValue\x12\x35\n\nproperties\x18\x03 \x03(\x0b\x32!.prefab.ConfigRow.PropertiesEntry\x1a\x46\n\x0fPropertiesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.prefab.ConfigValue:\x02\x38\x01\x42\x11\n\x0f_project_env_id\"[\n\x10\x43onditionalValue\x12#\n\x08\x63riteria\x18\x01 \x03(\x0b\x32\x11.prefab.Criterion\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.prefab.ConfigValue\"\x96\x06\n\tCriterion\x12\x15\n\rproperty_name\x18\x01 \x01(\t\x12\x35\n\x08operator\x18\x02 \x01(\x0e\x32#.prefab.Criterion.CriterionOperator\x12+\n\x0evalue_to_match\x18\x03 \x01(\x0b\x32\x13.prefab.ConfigValue\"\x8d\x05\n\x11\x43riterionOperator\x12\x0b\n\x07NOT_SET\x10\x00\x12\x11\n\rLOOKUP_KEY_IN\x10\x01\x12\x15\n\x11LOOKUP_KEY_NOT_IN\x10\x02\x12\n\n\x06IN_SEG\x10\x03\x12\x0e\n\nNOT_IN_SEG\x10\x04\x12\x0f\n\x0b\x41LWAYS_TRUE\x10\x05\x12\x12\n\x0ePROP_IS_ONE_OF\x10\x06\x12\x16\n\x12PROP_IS_NOT_ONE_OF\x10\x07\x12\x19\n\x15PROP_ENDS_WITH_ONE_OF\x10\x08\x12!\n\x1dPROP_DOES_NOT_END_WITH_ONE_OF\x10\t\x12\x16\n\x12HIERARCHICAL_MATCH\x10\n\x12\x10\n\x0cIN_INT_RANGE\x10\x0b\x12\x1b\n\x17PROP_STARTS_WITH_ONE_OF\x10\x0c\x12#\n\x1fPROP_DOES_NOT_START_WITH_ONE_OF\x10\r\x12\x18\n\x14PROP_CONTAINS_ONE_OF\x10\x0e\x12 \n\x1cPROP_DOES_NOT_CONTAIN_ONE_OF\x10\x0f\x12\x12\n\x0ePROP_LESS_THAN\x10\x10\x12\x1b\n\x17PROP_LESS_THAN_OR_EQUAL\x10\x11\x12\x15\n\x11PROP_GREATER_THAN\x10\x12\x12\x1e\n\x1aPROP_GREATER_THAN_OR_EQUAL\x10\x13\x12\x0f\n\x0bPROP_BEFORE\x10\x14\x12\x0e\n\nPROP_AFTER\x10\x15\x12\x10\n\x0cPROP_MATCHES\x10\x16\x12\x17\n\x13PROP_DOES_NOT_MATCH\x10\x17\x12\x19\n\x15PROP_SEMVER_LESS_THAN\x10\x18\x12\x15\n\x11PROP_SEMVER_EQUAL\x10\x19\x12\x1c\n\x18PROP_SEMVER_GREATER_THAN\x10\x1a\"\x89\x01\n\x07Loggers\x12\x1f\n\x07loggers\x18\x01 \x03(\x0b\x32\x0e.prefab.Logger\x12\x10\n\x08start_at\x18\x02 \x01(\x03\x12\x0e\n\x06\x65nd_at\x18\x03 \x01(\x03\x12\x15\n\rinstance_hash\x18\x04 \x01(\t\x12\x16\n\tnamespace\x18\x05 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_namespace\"\xd9\x01\n\x06Logger\x12\x13\n\x0blogger_name\x18\x01 \x01(\t\x12\x13\n\x06traces\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12\x13\n\x06\x64\x65\x62ugs\x18\x03 \x01(\x03H\x01\x88\x01\x01\x12\x12\n\x05infos\x18\x04 \x01(\x03H\x02\x88\x01\x01\x12\x12\n\x05warns\x18\x05 \x01(\x03H\x03\x88\x01\x01\x12\x13\n\x06\x65rrors\x18\x06 \x01(\x03H\x04\x88\x01\x01\x12\x13\n\x06\x66\x61tals\x18\x07 \x01(\x03H\x05\x88\x01\x01\x42\t\n\x07_tracesB\t\n\x07_debugsB\x08\n\x06_infosB\x08\n\x06_warnsB\t\n\x07_errorsB\t\n\x07_fatals\"\x16\n\x14LoggerReportResponse\"\xdb\x03\n\rLimitResponse\x12\x0e\n\x06passed\x18\x01 \x01(\x08\x12\x12\n\nexpires_at\x18\x02 \x01(\x03\x12\x16\n\x0e\x65nforced_group\x18\x03 \x01(\t\x12\x16\n\x0e\x63urrent_bucket\x18\x04 \x01(\x03\x12\x14\n\x0cpolicy_group\x18\x05 \x01(\t\x12;\n\x0bpolicy_name\x18\x06 \x01(\x0e\x32&.prefab.LimitResponse.LimitPolicyNames\x12\x14\n\x0cpolicy_limit\x18\x07 \x01(\x05\x12\x0e\n\x06\x61mount\x18\x08 \x01(\x03\x12\x16\n\x0elimit_reset_at\x18\t \x01(\x03\x12\x39\n\x0csafety_level\x18\n \x01(\x0e\x32#.prefab.LimitDefinition.SafetyLevel\"\xa9\x01\n\x10LimitPolicyNames\x12\x0b\n\x07NOT_SET\x10\x00\x12\x14\n\x10SECONDLY_ROLLING\x10\x01\x12\x14\n\x10MINUTELY_ROLLING\x10\x03\x12\x12\n\x0eHOURLY_ROLLING\x10\x05\x12\x11\n\rDAILY_ROLLING\x10\x07\x12\x13\n\x0fMONTHLY_ROLLING\x10\x08\x12\x0c\n\x08INFINITE\x10\t\x12\x12\n\x0eYEARLY_ROLLING\x10\n\"\x99\x02\n\x0cLimitRequest\x12\x12\n\naccount_id\x18\x01 \x01(\x03\x12\x16\n\x0e\x61\x63quire_amount\x18\x02 \x01(\x05\x12\x0e\n\x06groups\x18\x03 \x03(\t\x12:\n\x0elimit_combiner\x18\x04 \x01(\x0e\x32\".prefab.LimitRequest.LimitCombiner\x12\x1e\n\x16\x61llow_partial_response\x18\x05 \x01(\x08\x12\x39\n\x0csafety_level\x18\x06 \x01(\x0e\x32#.prefab.LimitDefinition.SafetyLevel\"6\n\rLimitCombiner\x12\x0b\n\x07NOT_SET\x10\x00\x12\x0b\n\x07MINIMUM\x10\x01\x12\x0b\n\x07MAXIMUM\x10\x02\"/\n\nContextSet\x12!\n\x08\x63ontexts\x18\x01 \x03(\x0b\x32\x0f.prefab.Context\"\x96\x01\n\x07\x43ontext\x12\x11\n\x04type\x18\x01 \x01(\tH\x00\x88\x01\x01\x12+\n\x06values\x18\x02 \x03(\x0b\x32\x1b.prefab.Context.ValuesEntry\x1a\x42\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\"\n\x05value\x18\x02 \x01(\x0b\x32\x13.prefab.ConfigValue:\x02\x38\x01\x42\x07\n\x05_type\"\x93\x01\n\x08Identity\x12\x13\n\x06lookup\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x34\n\nattributes\x18\x02 \x03(\x0b\x32 .prefab.Identity.AttributesEntry\x1a\x31\n\x0f\x41ttributesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\t\n\x07_lookup\"\xd6\x02\n\x18\x43onfigEvaluationMetaData\x12\x1d\n\x10\x63onfig_row_index\x18\x01 \x01(\x03H\x00\x88\x01\x01\x12$\n\x17\x63onditional_value_index\x18\x02 \x01(\x03H\x01\x88\x01\x01\x12!\n\x14weighted_value_index\x18\x03 \x01(\x03H\x02\x88\x01\x01\x12%\n\x04type\x18\x04 \x01(\x0e\x32\x12.prefab.ConfigTypeH\x03\x88\x01\x01\x12\x0f\n\x02id\x18\x05 \x01(\x03H\x04\x88\x01\x01\x12\x31\n\nvalue_type\x18\x06 \x01(\x0e\x32\x18.prefab.Config.ValueTypeH\x05\x88\x01\x01\x42\x13\n\x11_config_row_indexB\x1a\n\x18_conditional_value_indexB\x17\n\x15_weighted_value_indexB\x07\n\x05_typeB\x05\n\x03_idB\r\n\x0b_value_type\"\x8b\x03\n\x11\x43lientConfigValue\x12\r\n\x03int\x18\x01 \x01(\x03H\x00\x12\x10\n\x06string\x18\x02 \x01(\tH\x00\x12\x10\n\x06\x64ouble\x18\x03 \x01(\x01H\x00\x12\x0e\n\x04\x62ool\x18\x04 \x01(\x08H\x00\x12%\n\tlog_level\x18\x05 \x01(\x0e\x32\x10.prefab.LogLevelH\x00\x12)\n\x0bstring_list\x18\x07 \x01(\x0b\x32\x12.prefab.StringListH\x00\x12%\n\tint_range\x18\x08 \x01(\x0b\x32\x10.prefab.IntRangeH\x00\x12*\n\x08\x64uration\x18\t \x01(\x0b\x32\x16.prefab.ClientDurationH\x00\x12\x1c\n\x04json\x18\n \x01(\x0b\x32\x0c.prefab.JsonH\x00\x12I\n\x1a\x63onfig_evaluation_metadata\x18\x06 \x01(\x0b\x32 .prefab.ConfigEvaluationMetaDataH\x01\x88\x01\x01\x42\x06\n\x04typeB\x1d\n\x1b_config_evaluation_metadata\"D\n\x0e\x43lientDuration\x12\x0f\n\x07seconds\x18\x01 \x01(\x03\x12\r\n\x05nanos\x18\x02 \x01(\x05\x12\x12\n\ndefinition\x18\x03 \x01(\t\"\xa4\x02\n\x11\x43onfigEvaluations\x12\x35\n\x06values\x18\x01 \x03(\x0b\x32%.prefab.ConfigEvaluations.ValuesEntry\x12\x34\n\x0f\x61pikey_metadata\x18\x02 \x01(\x0b\x32\x16.prefab.ApiKeyMetadataH\x00\x88\x01\x01\x12\x30\n\x0f\x64\x65\x66\x61ult_context\x18\x03 \x01(\x0b\x32\x12.prefab.ContextSetH\x01\x88\x01\x01\x1aH\n\x0bValuesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.prefab.ClientConfigValue:\x02\x38\x01\x42\x12\n\x10_apikey_metadataB\x12\n\x10_default_context\"\xa8\x02\n\x0fLimitDefinition\x12;\n\x0bpolicy_name\x18\x02 \x01(\x0e\x32&.prefab.LimitResponse.LimitPolicyNames\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\r\n\x05\x62urst\x18\x04 \x01(\x05\x12\x12\n\naccount_id\x18\x05 \x01(\x03\x12\x15\n\rlast_modified\x18\x06 \x01(\x03\x12\x12\n\nreturnable\x18\x07 \x01(\x08\x12\x39\n\x0csafety_level\x18\x08 \x01(\x0e\x32#.prefab.LimitDefinition.SafetyLevel\"@\n\x0bSafetyLevel\x12\x0b\n\x07NOT_SET\x10\x00\x12\x12\n\x0eL4_BEST_EFFORT\x10\x04\x12\x10\n\x0cL5_BOMBPROOF\x10\x05\"@\n\x10LimitDefinitions\x12,\n\x0b\x64\x65\x66initions\x18\x01 \x03(\x0b\x32\x17.prefab.LimitDefinition\"\x8a\x01\n\x0f\x42ufferedRequest\x12\x12\n\naccount_id\x18\x01 \x01(\x03\x12\x0e\n\x06method\x18\x02 \x01(\t\x12\x0b\n\x03uri\x18\x03 \x01(\t\x12\x0c\n\x04\x62ody\x18\x04 \x01(\t\x12\x14\n\x0climit_groups\x18\x05 \x03(\t\x12\x14\n\x0c\x63ontent_type\x18\x06 \x01(\t\x12\x0c\n\x04\x66ifo\x18\x07 \x01(\x08\"\x94\x01\n\x0c\x42\x61tchRequest\x12\x12\n\naccount_id\x18\x01 \x01(\x03\x12\x0e\n\x06method\x18\x02 \x01(\t\x12\x0b\n\x03uri\x18\x03 \x01(\t\x12\x0c\n\x04\x62ody\x18\x04 \x01(\t\x12\x14\n\x0climit_groups\x18\x05 \x03(\t\x12\x16\n\x0e\x62\x61tch_template\x18\x06 \x01(\t\x12\x17\n\x0f\x62\x61tch_separator\x18\x07 \x01(\t\" \n\rBasicResponse\x12\x0f\n\x07message\x18\x01 \x01(\t\"3\n\x10\x43reationResponse\x12\x0f\n\x07message\x18\x01 \x01(\t\x12\x0e\n\x06new_id\x18\x02 \x01(\x03\"h\n\x07IdBlock\x12\x12\n\nproject_id\x18\x01 \x01(\x03\x12\x16\n\x0eproject_env_id\x18\x02 \x01(\x03\x12\x15\n\rsequence_name\x18\x03 \x01(\t\x12\r\n\x05start\x18\x04 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x05 \x01(\x03\"a\n\x0eIdBlockRequest\x12\x12\n\nproject_id\x18\x01 \x01(\x03\x12\x16\n\x0eproject_env_id\x18\x02 \x01(\x03\x12\x15\n\rsequence_name\x18\x03 \x01(\t\x12\x0c\n\x04size\x18\x04 \x01(\x03\"\x8a\x01\n\x0c\x43ontextShape\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x39\n\x0b\x66ield_types\x18\x02 \x03(\x0b\x32$.prefab.ContextShape.FieldTypesEntry\x1a\x31\n\x0f\x46ieldTypesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x05:\x02\x38\x01\"[\n\rContextShapes\x12$\n\x06shapes\x18\x01 \x03(\x0b\x32\x14.prefab.ContextShape\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_namespace\"C\n\rEvaluatedKeys\x12\x0c\n\x04keys\x18\x01 \x03(\t\x12\x16\n\tnamespace\x18\x02 \x01(\tH\x00\x88\x01\x01\x42\x0c\n\n_namespace\"\x93\x01\n\x0f\x45valuatedConfig\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\x16\n\x0e\x63onfig_version\x18\x02 \x01(\x03\x12#\n\x06result\x18\x03 \x01(\x0b\x32\x13.prefab.ConfigValue\x12#\n\x07\x63ontext\x18\x04 \x01(\x0b\x32\x12.prefab.ContextSet\x12\x11\n\ttimestamp\x18\x05 \x01(\x03\"<\n\x10\x45valuatedConfigs\x12(\n\x07\x63onfigs\x18\x01 \x03(\x0b\x32\x17.prefab.EvaluatedConfig\"\xc4\x03\n\x17\x43onfigEvaluationCounter\x12\r\n\x05\x63ount\x18\x01 \x01(\x03\x12\x16\n\tconfig_id\x18\x02 \x01(\x03H\x00\x88\x01\x01\x12\x1b\n\x0eselected_index\x18\x03 \x01(\rH\x01\x88\x01\x01\x12\x30\n\x0eselected_value\x18\x04 \x01(\x0b\x32\x13.prefab.ConfigValueH\x02\x88\x01\x01\x12\x1d\n\x10\x63onfig_row_index\x18\x05 \x01(\rH\x03\x88\x01\x01\x12$\n\x17\x63onditional_value_index\x18\x06 \x01(\rH\x04\x88\x01\x01\x12!\n\x14weighted_value_index\x18\x07 \x01(\rH\x05\x88\x01\x01\x12\x36\n\x06reason\x18\x08 \x01(\x0e\x32&.prefab.ConfigEvaluationCounter.Reason\"\x15\n\x06Reason\x12\x0b\n\x07UNKNOWN\x10\x00\x42\x0c\n\n_config_idB\x11\n\x0f_selected_indexB\x11\n\x0f_selected_valueB\x13\n\x11_config_row_indexB\x1a\n\x18_conditional_value_indexB\x17\n\x15_weighted_value_index\"{\n\x17\x43onfigEvaluationSummary\x12\x0b\n\x03key\x18\x01 \x01(\t\x12 \n\x04type\x18\x02 \x01(\x0e\x32\x12.prefab.ConfigType\x12\x31\n\x08\x63ounters\x18\x03 \x03(\x0b\x32\x1f.prefab.ConfigEvaluationCounter\"k\n\x19\x43onfigEvaluationSummaries\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\x12\x32\n\tsummaries\x18\x03 \x03(\x0b\x32\x1f.prefab.ConfigEvaluationSummary\"Z\n\x15LoggersTelemetryEvent\x12\x1f\n\x07loggers\x18\x01 \x03(\x0b\x32\x0e.prefab.Logger\x12\x10\n\x08start_at\x18\x02 \x01(\x03\x12\x0e\n\x06\x65nd_at\x18\x03 \x01(\x03\"\x98\x02\n\x0eTelemetryEvent\x12\x36\n\tsummaries\x18\x02 \x01(\x0b\x32!.prefab.ConfigEvaluationSummariesH\x00\x12\x33\n\x10\x65xample_contexts\x18\x03 \x01(\x0b\x32\x17.prefab.ExampleContextsH\x00\x12+\n\x0c\x63lient_stats\x18\x04 \x01(\x0b\x32\x13.prefab.ClientStatsH\x00\x12\x30\n\x07loggers\x18\x05 \x01(\x0b\x32\x1d.prefab.LoggersTelemetryEventH\x00\x12/\n\x0e\x63ontext_shapes\x18\x06 \x01(\x0b\x32\x15.prefab.ContextShapesH\x00\x42\t\n\x07payload\"P\n\x0fTelemetryEvents\x12\x15\n\rinstance_hash\x18\x01 \x01(\t\x12&\n\x06\x65vents\x18\x02 \x03(\x0b\x32\x16.prefab.TelemetryEvent\"*\n\x17TelemetryEventsResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\";\n\x0f\x45xampleContexts\x12(\n\x08\x65xamples\x18\x01 \x03(\x0b\x32\x16.prefab.ExampleContext\"K\n\x0e\x45xampleContext\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12&\n\ncontextSet\x18\x02 \x01(\x0b\x32\x12.prefab.ContextSet\"F\n\x0b\x43lientStats\x12\r\n\x05start\x18\x01 \x01(\x03\x12\x0b\n\x03\x65nd\x18\x02 \x01(\x03\x12\x1b\n\x13\x64ropped_event_count\x18\x03 \x01(\x04\"}\n\x06Schema\x12\x0e\n\x06schema\x18\x01 \x01(\t\x12.\n\x0bschema_type\x18\x02 \x01(\x0e\x32\x19.prefab.Schema.SchemaType\"3\n\nSchemaType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03ZOD\x10\x01\x12\x0f\n\x0bJSON_SCHEMA\x10\x02*:\n\x0eProvidedSource\x12\x1b\n\x17PROVIDED_SOURCE_NOT_SET\x10\x00\x12\x0b\n\x07\x45NV_VAR\x10\x01*\x8e\x01\n\nConfigType\x12\x17\n\x13NOT_SET_CONFIG_TYPE\x10\x00\x12\n\n\x06\x43ONFIG\x10\x01\x12\x10\n\x0c\x46\x45\x41TURE_FLAG\x10\x02\x12\r\n\tLOG_LEVEL\x10\x03\x12\x0b\n\x07SEGMENT\x10\x04\x12\x14\n\x10LIMIT_DEFINITION\x10\x05\x12\x0b\n\x07\x44\x45LETED\x10\x06\x12\n\n\x06SCHEMA\x10\x07*a\n\x08LogLevel\x12\x15\n\x11NOT_SET_LOG_LEVEL\x10\x00\x12\t\n\x05TRACE\x10\x01\x12\t\n\x05\x44\x45\x42UG\x10\x02\x12\x08\n\x04INFO\x10\x03\x12\x08\n\x04WARN\x10\x05\x12\t\n\x05\x45RROR\x10\x06\x12\t\n\x05\x46\x41TAL\x10\t*G\n\tOnFailure\x12\x0b\n\x07NOT_SET\x10\x00\x12\x10\n\x0cLOG_AND_PASS\x10\x01\x12\x10\n\x0cLOG_AND_FAIL\x10\x02\x12\t\n\x05THROW\x10\x03\x42L\n\x13\x63loud.prefab.domainB\x06PrefabZ-github.com/prefab-cloud/prefab-cloud-go/protob\x06proto3" -pool = Google::Protobuf::DescriptorPool.generated_pool +pool = ::Google::Protobuf::DescriptorPool.generated_pool pool.add_serialized_file(descriptor_data) module PrefabProto diff --git a/lib/reforge-sdk.rb b/lib/reforge-sdk.rb new file mode 100644 index 0000000..7ff0439 --- /dev/null +++ b/lib/reforge-sdk.rb @@ -0,0 +1,59 @@ +# frozen_string_literal: true + +module Reforge + NO_DEFAULT_PROVIDED = :no_default_provided + VERSION = File.read(File.dirname(__FILE__) + '/../VERSION').strip +end + +require 'semantic_logger' +require 'reforge/internal_logger' +require 'concurrent/atomics' +require 'concurrent' +require 'faraday' +require 'openssl' +require 'ld-eventsource' +require 'prefab_pb' +require 'reforge/time_helpers' +require 'reforge/error' +require 'reforge/duration' +require 'reforge/evaluation' +require 'reforge/encryption' +require 'reforge/exponential_backoff' +require 'reforge/errors/initialization_timeout_error' +require 'reforge/errors/invalid_api_key_error' +require 'reforge/errors/missing_default_error' +require 'reforge/errors/env_var_parse_error' +require 'reforge/errors/missing_env_var_error' +require 'reforge/errors/uninitialized_error' +require 'reforge/options' +require 'reforge/rate_limit_cache' +require 'reforge/context_shape_aggregator' +require 'reforge/example_contexts_aggregator' +require 'reforge/evaluation_summary_aggregator' +require 'reforge/log_path_aggregator' +require 'reforge/weighted_value_resolver' +require 'reforge/config_value_wrapper' +require 'reforge/config_value_unwrapper' +require 'reforge/criteria_evaluator' +require 'reforge/config_loader' +require 'reforge/context_shape' +require 'reforge/local_config_parser' +require 'reforge/yaml_config_parser' +require 'reforge/resolved_config_presenter' +require 'reforge/config_resolver' +require 'reforge/http_connection' +require 'reforge/context' +require 'reforge/logger_client' +require 'active_support/deprecation' +require 'active_support' +require 'reforge/sse_config_client' +require 'reforge/client' +require 'reforge/config_client_presenter' +require 'reforge/config_client' +require 'reforge/feature_flag_client' +require 'reforge/prefab' +require 'reforge/murmer3' +require 'reforge/javascript_stub' +require 'reforge/semver' +require 'reforge/fixed_size_hash' +require 'reforge/caching_http_connection' \ No newline at end of file diff --git a/lib/prefab/caching_http_connection.rb b/lib/reforge/caching_http_connection.rb similarity index 99% rename from lib/prefab/caching_http_connection.rb rename to lib/reforge/caching_http_connection.rb index 01297e2..9457126 100644 --- a/lib/prefab/caching_http_connection.rb +++ b/lib/reforge/caching_http_connection.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class CachingHttpConnection CACHE_SIZE = 2.freeze CacheEntry = Struct.new(:data, :etag, :expires_at) diff --git a/lib/prefab/client.rb b/lib/reforge/client.rb similarity index 77% rename from lib/prefab/client.rb rename to lib/reforge/client.rb index 387fcb0..407a2cb 100644 --- a/lib/prefab/client.rb +++ b/lib/reforge/client.rb @@ -2,16 +2,16 @@ require 'uuid' -module Prefab +module Reforge class Client - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) MAX_SLEEP_SEC = 10 BASE_SLEEP_SEC = 0.5 attr_reader :namespace, :interceptor, :api_key, :options, :instance_hash - def initialize(options = Prefab::Options.new) - @options = options.is_a?(Prefab::Options) ? options : Prefab::Options.new(options) + def initialize(options = Reforge::Options.new) + @options = options.is_a?(Reforge::Options) ? options : Reforge::Options.new(options) @namespace = @options.namespace @stubs = {} @instance_hash = ::UUID.new.generate @@ -22,27 +22,27 @@ def initialize(options = Prefab::Options.new) LOG.debug 'Prefab Running in DataFile Mode' else @api_key = @options.api_key - raise Prefab::Errors::InvalidApiKeyError, @api_key if @api_key.nil? || @api_key.empty? || api_key.count('-') < 1 + raise Reforge::Errors::InvalidApiKeyError, @api_key if @api_key.nil? || @api_key.empty? || api_key.count('-') < 1 end context.clear - Prefab::Context.global_context = @options.global_context + Reforge::Context.global_context = @options.global_context # start config client config_client end def with_context(properties, &block) - Prefab::Context.with_context(properties, &block) + Reforge::Context.with_context(properties, &block) end def context - Prefab::Context.current + Reforge::Context.current end def config_client(timeout: 5.0) - @config_client ||= Prefab::ConfigClient.new(self, timeout) + @config_client ||= Reforge::ConfigClient.new(self, timeout) end def stop @@ -50,7 +50,7 @@ def stop end def feature_flag_client - @feature_flag_client ||= Prefab::FeatureFlagClient.new(self) + @feature_flag_client ||= Reforge::FeatureFlagClient.new(self) end def log_path_aggregator @@ -61,7 +61,7 @@ def log_path_aggregator end def log - @log ||= Prefab::LoggerClient.new(client: self, log_path_aggregator: log_path_aggregator) + @log ||= Reforge::LoggerClient.new(client: self, log_path_aggregator: log_path_aggregator) end def context_shape_aggregator @@ -112,11 +112,11 @@ def get(key, default = NO_DEFAULT_PROVIDED, jit_context = NO_DEFAULT_PROVIDED) end def post(path, body) - Prefab::HttpConnection.new(@options.telemetry_destination, @api_key).post(path, body) + Reforge::HttpConnection.new(@options.telemetry_destination, @api_key).post(path, body) end def inspect - "#" + "#" end def resolver @@ -128,7 +128,7 @@ def resolver # Prefab.fork # end def fork - Prefab::Client.new(@options.for_fork) + Reforge::Client.new(@options.for_fork) end def defined?(key) diff --git a/lib/prefab/config_client.rb b/lib/reforge/config_client.rb similarity index 88% rename from lib/prefab/config_client.rb rename to lib/reforge/config_client.rb index ed64b80..c8cb7f3 100644 --- a/lib/prefab/config_client.rb +++ b/lib/reforge/config_client.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge class ConfigClient - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) DEFAULT_CHECKPOINT_FREQ_SEC = 60 STALE_CACHE_WARN_HOURS = 5 @@ -14,8 +14,8 @@ def initialize(base_client, timeout) @checkpoint_freq_secs = DEFAULT_CHECKPOINT_FREQ_SEC - @config_loader = Prefab::ConfigLoader.new(@base_client) - @config_resolver = Prefab::ConfigResolver.new(@base_client, @config_loader) + @config_loader = Reforge::ConfigLoader.new(@base_client) + @config_resolver = Reforge::ConfigResolver.new(@base_client, @config_loader) @initialization_lock = Concurrent::CountDownLatch.new(1) @@ -44,7 +44,7 @@ def start_streaming end stream_lock = Concurrent::ReadWriteLock.new - @sse_config_client = Prefab::SSEConfigClient.new(@options, @config_loader) + @sse_config_client = Reforge::SSEConfigClient.new(@options, @config_loader) @sse_config_client.start do |configs, _event, source| stream_lock.with_write_lock do @@ -98,7 +98,7 @@ def raw(key) def handle_default(key, default) return default if default != NO_DEFAULT_PROVIDED - raise Prefab::Errors::MissingDefaultError, key if @options.on_no_default == Prefab::Options::ON_NO_DEFAULT::RAISE + raise Reforge::Errors::MissingDefaultError, key if @options.on_no_default == Reforge::Options::ON_NO_DEFAULT::RAISE nil end @@ -107,8 +107,8 @@ def _get(key, properties) # wait timeout sec for the initialization to be complete success = @initialization_lock.wait(@options.initialization_timeout_sec) if !success - unless @options.on_init_failure == Prefab::Options::ON_INITIALIZATION_FAILURE::RETURN - raise Prefab::Errors::InitializationTimeoutError.new(@options.initialization_timeout_sec, key) + unless @options.on_init_failure == Reforge::Options::ON_INITIALIZATION_FAILURE::RETURN + raise Reforge::Errors::InitializationTimeoutError.new(@options.initialization_timeout_sec, key) end LOG.warn("Couldn't Initialize In #{@options.initialization_timeout_sec}. Key #{key}. Returning what we have") @@ -129,7 +129,7 @@ def load_checkpoint def load_source_checkpoint(start_at_id: 0) @options.config_sources.each do |source| - conn = Prefab::CachingHttpConnection.new("#{source}/api/v1/configs/#{start_at_id}", @base_client.api_key) + conn = Reforge::CachingHttpConnection.new("#{source}/api/v1/configs/#{start_at_id}", @base_client.api_key) result = load_url(conn, :remote_api) return true if result end @@ -171,12 +171,12 @@ def load_configs(configs, source) [ context.type, context.values.keys.map do |k| - [k, Prefab::ConfigValueUnwrapper.new(context.values[k], @config_resolver).unwrap] + [k, Reforge::ConfigValueUnwrapper.new(context.values[k], @config_resolver).unwrap] end.to_h ] end.to_h - Prefab::Context.default_context = default_contexts || {} + Reforge::Context.default_context = default_contexts || {} configs.configs.each do |config| @config_loader.set(config, source) @@ -261,7 +261,7 @@ def finish_init!(source, project_id) LOG.debug "Unlocked Config via #{source}" @initialization_lock.count_down - presenter = Prefab::ConfigClientPresenter.new( + presenter = Reforge::ConfigClientPresenter.new( size: @config_resolver.local_store.size, source: source, project_id: project_id, diff --git a/lib/prefab/config_client_presenter.rb b/lib/reforge/config_client_presenter.rb similarity index 96% rename from lib/prefab/config_client_presenter.rb rename to lib/reforge/config_client_presenter.rb index 98558fb..5b61d58 100644 --- a/lib/prefab/config_client_presenter.rb +++ b/lib/reforge/config_client_presenter.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class ConfigClientPresenter def initialize(size:, source:, project_id:, project_env_id:, api_key_id:) @size = size diff --git a/lib/prefab/config_loader.rb b/lib/reforge/config_loader.rb similarity index 94% rename from lib/prefab/config_loader.rb rename to lib/reforge/config_loader.rb index 260b2f7..f7a58fb 100644 --- a/lib/prefab/config_loader.rb +++ b/lib/reforge/config_loader.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge class ConfigLoader - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) attr_reader :highwater_mark @@ -76,7 +76,7 @@ def load_local_overrides def load_glob(glob) rtn = {} Dir.glob(glob).each do |file| - Prefab::YAMLConfigParser.new(file, @base_client).merge(rtn) + Reforge::YAMLConfigParser.new(file, @base_client).merge(rtn) end rtn end diff --git a/lib/prefab/config_resolver.rb b/lib/reforge/config_resolver.rb similarity index 93% rename from lib/prefab/config_resolver.rb rename to lib/reforge/config_resolver.rb index 8259137..4e9d122 100644 --- a/lib/prefab/config_resolver.rb +++ b/lib/reforge/config_resolver.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class ConfigResolver attr_accessor :project_env_id # this will be set by the config_client when it gets an API response attr_reader :local_store @@ -20,7 +20,7 @@ def to_s end def presenter - Prefab::ResolvedConfigPresenter.new(self, @lock, @local_store) + Reforge::ResolvedConfigPresenter.new(self, @lock, @local_store) end def keys @@ -42,7 +42,7 @@ def get(key, properties = NO_DEFAULT_PROVIDED) end def evaluate(config, properties = NO_DEFAULT_PROVIDED) - Prefab::CriteriaEvaluator.new(config, + Reforge::CriteriaEvaluator.new(config, project_env_id: @project_env_id, resolver: self, namespace: @base_client.options.namespace, diff --git a/lib/prefab/config_value_unwrapper.rb b/lib/reforge/config_value_unwrapper.rb similarity index 75% rename from lib/prefab/config_value_unwrapper.rb rename to lib/reforge/config_value_unwrapper.rb index 68f3f29..8de7c6a 100644 --- a/lib/prefab/config_value_unwrapper.rb +++ b/lib/reforge/config_value_unwrapper.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge class ConfigValueUnwrapper - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) CONFIDENTIAL_PREFIX = "*****" attr_reader :weighted_value_index @@ -15,14 +15,14 @@ def initialize(config_value, resolver, weighted_value_index = nil) def reportable_wrapped_value if @config_value.confidential || @config_value.decrypt_with&.length&.positive? # Unique hash for differentiation - Prefab::ConfigValueWrapper.wrap("#{CONFIDENTIAL_PREFIX}#{Digest::MD5.hexdigest(unwrap)[0, 5]}") + Reforge::ConfigValueWrapper.wrap("#{CONFIDENTIAL_PREFIX}#{Digest::MD5.hexdigest(unwrap)[0, 5]}") else @config_value end end def reportable_value - Prefab::ConfigValueUnwrapper.new(reportable_wrapped_value, @resolver, @weighted_value_index).unwrap + Reforge::ConfigValueUnwrapper.new(reportable_wrapped_value, @resolver, @weighted_value_index).unwrap end def raw_config_value @@ -37,7 +37,7 @@ def unwrap(raw_json: false) when :string_list @config_value.string_list.values when :duration - Prefab::Duration.new(@config_value.duration.definition) + Reforge::Duration.new(@config_value.duration.definition) when :json if raw_json @config_value.json.json @@ -54,7 +54,7 @@ def unwrap(raw_json: false) LOG.warn "No value for decryption key #{@config_value.decrypt_with} found." return "" else - unencrypted = Prefab::Encryption.new(decryption_key).decrypt(raw) + unencrypted = Reforge::Encryption.new(decryption_key).decrypt(raw) return unencrypted end end @@ -64,7 +64,7 @@ def unwrap(raw_json: false) def self.deepest_value(config_value, config, context, resolver) if config_value&.type == :weighted_values - value, index = Prefab::WeightedValueResolver.new( + value, index = Reforge::WeightedValueResolver.new( config_value.weighted_values.weighted_values, config.key, context.get(config_value.weighted_values.hash_by_property_name) @@ -76,10 +76,10 @@ def self.deepest_value(config_value, config, context, resolver) if :ENV_VAR == config_value.provided.source raw = ENV[config_value.provided.lookup] if raw.nil? - raise Prefab::Errors::MissingEnvVarError.new("Missing environment variable #{config_value.provided.lookup}") + raise Reforge::Errors::MissingEnvVarError.new("Missing environment variable #{config_value.provided.lookup}") else coerced = coerce_into_type(raw, config, config_value.provided.lookup) - new(Prefab::ConfigValueWrapper.wrap(coerced, confidential: config_value.confidential), resolver) + new(Reforge::ConfigValueWrapper.wrap(coerced, confidential: config_value.confidential), resolver) end else raise "Unknown Provided Source #{config_value.provided.source}" @@ -101,7 +101,7 @@ def self.coerce_into_type(value_string, config, env_var_name) when Array maybe_string_list else - raise raise Prefab::Errors::EnvVarParseError.new(value_string, config, env_var_name) + raise raise Reforge::Errors::EnvVarParseError.new(value_string, config, env_var_name) end when :BOOL then maybe_bool = YAML.load(value_string) @@ -109,15 +109,15 @@ def self.coerce_into_type(value_string, config, env_var_name) when TrueClass, FalseClass maybe_bool else - raise Prefab::Errors::EnvVarParseError.new(value_string, config, env_var_name) + raise Reforge::Errors::EnvVarParseError.new(value_string, config, env_var_name) end when :NOT_SET_VALUE_TYPE YAML.load(value_string) else - raise Prefab::Errors::EnvVarParseError.new(value_string, config, env_var_name) + raise Reforge::Errors::EnvVarParseError.new(value_string, config, env_var_name) end rescue ArgumentError - raise Prefab::Errors::EnvVarParseError.new(value_string, config, env_var_name) + raise Reforge::Errors::EnvVarParseError.new(value_string, config, env_var_name) end end end diff --git a/lib/prefab/config_value_wrapper.rb b/lib/reforge/config_value_wrapper.rb similarity index 97% rename from lib/prefab/config_value_wrapper.rb rename to lib/reforge/config_value_wrapper.rb index df7efcd..57fc0f9 100644 --- a/lib/prefab/config_value_wrapper.rb +++ b/lib/reforge/config_value_wrapper.rb @@ -1,4 +1,4 @@ -module Prefab +module Reforge class ConfigValueWrapper def self.wrap(value, confidential: nil) case value diff --git a/lib/prefab/context.rb b/lib/reforge/context.rb similarity index 98% rename from lib/prefab/context.rb rename to lib/reforge/context.rb index a7d0cde..11c4aa7 100644 --- a/lib/prefab/context.rb +++ b/lib/reforge/context.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class Context BLANK_CONTEXT_NAME = '' @@ -155,7 +155,7 @@ def to_h end def to_s - "#" + "#" end # Visualize a tree of the context up through its parents @@ -231,7 +231,7 @@ def grouped_key include Comparable def <=>(other) - if other.is_a?(Prefab::Context) + if other.is_a?(Reforge::Context) to_h <=> other.to_h else super diff --git a/lib/prefab/context_shape.rb b/lib/reforge/context_shape.rb similarity index 96% rename from lib/prefab/context_shape.rb rename to lib/reforge/context_shape.rb index 3c9bb2d..66cbf89 100644 --- a/lib/prefab/context_shape.rb +++ b/lib/reforge/context_shape.rb @@ -1,4 +1,4 @@ -module Prefab +module Reforge class ContextShape MAPPING = { Integer => 1, diff --git a/lib/prefab/context_shape_aggregator.rb b/lib/reforge/context_shape_aggregator.rb similarity index 89% rename from lib/prefab/context_shape_aggregator.rb rename to lib/reforge/context_shape_aggregator.rb index 4c7e786..0ba997a 100644 --- a/lib/prefab/context_shape_aggregator.rb +++ b/lib/reforge/context_shape_aggregator.rb @@ -2,10 +2,10 @@ require_relative 'periodic_sync' -module Prefab +module Reforge class ContextShapeAggregator - include Prefab::PeriodicSync - LOG = Prefab::InternalLogger.new(self) + include Reforge::PeriodicSync + LOG = Reforge::InternalLogger.new(self) attr_reader :data @@ -24,7 +24,7 @@ def push(context) context.contexts.each_pair do |name, name_context| name_context.to_h.each_pair do |key, value| - @data.add [name, key, Prefab::ContextShape.field_type_number(value)] + @data.add [name, key, Reforge::ContextShape.field_type_number(value)] end end end diff --git a/lib/prefab/criteria_evaluator.rb b/lib/reforge/criteria_evaluator.rb similarity index 96% rename from lib/prefab/criteria_evaluator.rb rename to lib/reforge/criteria_evaluator.rb index fbfb07d..38836bb 100644 --- a/lib/prefab/criteria_evaluator.rb +++ b/lib/reforge/criteria_evaluator.rb @@ -3,11 +3,11 @@ # rubocop:disable Naming/MethodName # We're intentionally keeping the UPCASED method names to match the protobuf # and avoid wasting CPU cycles lowercasing things -module Prefab +module Reforge # This class evaluates a config's criteria. `evaluate` returns the value of # the first match based on the provided properties. class CriteriaEvaluator - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) NAMESPACE_KEY = 'NAMESPACE' NO_MATCHING_ROWS = [].freeze @@ -177,7 +177,7 @@ def evaluate_semver_comparison(criterion, properties, predicate) def evaluate_date_comparison(criterion, properties, predicate) context_millis = as_millis(value_from_properties(criterion, properties)) - config_millis = as_millis(Prefab::ConfigValueUnwrapper.deepest_value(criterion.value_to_match, @config, + config_millis = as_millis(Reforge::ConfigValueUnwrapper.deepest_value(criterion.value_to_match, @config, properties, @resolver).unwrap) unless config_millis && context_millis @@ -227,7 +227,7 @@ def evaluate_for_env(env_id, properties) row.values.each_with_index do |conditional_value, value_index| next unless all_criteria_match?(conditional_value, properties) - return Prefab::Evaluation.new( + return Reforge::Evaluation.new( config: @config, value: conditional_value.value, value_index: value_index, @@ -250,7 +250,7 @@ def in_segment?(criterion, properties) end def matches?(criterion, value, properties) - criterion_value_or_values = Prefab::ConfigValueUnwrapper.deepest_value(criterion.value_to_match, @config, + criterion_value_or_values = Reforge::ConfigValueUnwrapper.deepest_value(criterion.value_to_match, @config, properties, @resolver).unwrap case criterion_value_or_values @@ -289,7 +289,7 @@ def prop_contains_one_of?(criterion, value) def check_regex_match(criterion, properties) begin - regex_definition = Prefab::ConfigValueUnwrapper.deepest_value(criterion.value_to_match, @config.key, + regex_definition = Reforge::ConfigValueUnwrapper.deepest_value(criterion.value_to_match, @config.key, properties, @resolver).unwrap return MatchResult.error unless regex_definition.is_a?(String) diff --git a/lib/prefab/duration.rb b/lib/reforge/duration.rb similarity index 98% rename from lib/prefab/duration.rb rename to lib/reforge/duration.rb index e471e47..1fdae27 100644 --- a/lib/prefab/duration.rb +++ b/lib/reforge/duration.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class Duration PATTERN = /P(?:(?\d+(?:\.\d+)?)D)?(?:T(?:(?\d+(?:\.\d+)?)H)?(?:(?\d+(?:\.\d+)?)M)?(?:(?\d+(?:\.\d+)?)S)?)?/ MINUTES_IN_SECONDS = 60 diff --git a/lib/prefab/encryption.rb b/lib/reforge/encryption.rb similarity index 99% rename from lib/prefab/encryption.rb rename to lib/reforge/encryption.rb index 15b6a16..4954cd0 100644 --- a/lib/prefab/encryption.rb +++ b/lib/reforge/encryption.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class Encryption CIPHER_TYPE = "aes-256-gcm" # 32/12 SEPARATOR = "--" diff --git a/lib/prefab/error.rb b/lib/reforge/error.rb similarity index 82% rename from lib/prefab/error.rb rename to lib/reforge/error.rb index fd08d08..e4f0351 100644 --- a/lib/prefab/error.rb +++ b/lib/reforge/error.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class Error < StandardError end end diff --git a/lib/prefab/errors/env_var_parse_error.rb b/lib/reforge/errors/env_var_parse_error.rb similarity index 80% rename from lib/prefab/errors/env_var_parse_error.rb rename to lib/reforge/errors/env_var_parse_error.rb index b898592..1b6974f 100644 --- a/lib/prefab/errors/env_var_parse_error.rb +++ b/lib/reforge/errors/env_var_parse_error.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge module Errors - class EnvVarParseError < Prefab::Error + class EnvVarParseError < Reforge::Error def initialize(env_var, config, env_var_name) super("Evaluating #{config.key} couldn't coerce #{env_var_name} of #{env_var} to #{config.value_type}") end diff --git a/lib/reforge/errors/initialization_timeout_error.rb b/lib/reforge/errors/initialization_timeout_error.rb new file mode 100644 index 0000000..da2ed31 --- /dev/null +++ b/lib/reforge/errors/initialization_timeout_error.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Reforge + module Errors + class InitializationTimeoutError < Reforge::Error + def initialize(timeout_sec, key) + message = "Reforge couldn't initialize in #{timeout_sec} second timeout. Trying to fetch key `#{key}`." + + super(message) + end + end + end +end diff --git a/lib/prefab/errors/invalid_api_key_error.rb b/lib/reforge/errors/invalid_api_key_error.rb similarity index 87% rename from lib/prefab/errors/invalid_api_key_error.rb rename to lib/reforge/errors/invalid_api_key_error.rb index dc3648b..290dc10 100644 --- a/lib/prefab/errors/invalid_api_key_error.rb +++ b/lib/reforge/errors/invalid_api_key_error.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge module Errors - class InvalidApiKeyError < Prefab::Error + class InvalidApiKeyError < Reforge::Error def initialize(key) if key.nil? || key.empty? message = 'No API key. Set PREFAB_API_KEY env var or use PREFAB_DATASOURCES=LOCAL_ONLY' diff --git a/lib/prefab/errors/missing_default_error.rb b/lib/reforge/errors/missing_default_error.rb similarity index 76% rename from lib/prefab/errors/missing_default_error.rb rename to lib/reforge/errors/missing_default_error.rb index 6320c9b..5ed54fb 100644 --- a/lib/prefab/errors/missing_default_error.rb +++ b/lib/reforge/errors/missing_default_error.rb @@ -1,10 +1,10 @@ # frozen_string_literal: true -module Prefab +module Reforge module Errors - class MissingDefaultError < Prefab::Error + class MissingDefaultError < Reforge::Error def initialize(key) - message = "No value found for key '#{key}' and no default was provided.\n\nIf you'd prefer returning `nil` rather than raising when this occurs, modify the `on_no_default` value you provide in your Prefab::Options." + message = "No value found for key '#{key}' and no default was provided.\n\nIf you'd prefer returning `nil` rather than raising when this occurs, modify the `on_no_default` value you provide in your Reforge::Options." super(message) end diff --git a/lib/prefab/errors/missing_env_var_error.rb b/lib/reforge/errors/missing_env_var_error.rb similarity index 67% rename from lib/prefab/errors/missing_env_var_error.rb rename to lib/reforge/errors/missing_env_var_error.rb index 03d6fdc..28e8f34 100644 --- a/lib/prefab/errors/missing_env_var_error.rb +++ b/lib/reforge/errors/missing_env_var_error.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge module Errors - class MissingEnvVarError < Prefab::Error + class MissingEnvVarError < Reforge::Error def initialize(message) super(message) end diff --git a/lib/reforge/errors/uninitialized_error.rb b/lib/reforge/errors/uninitialized_error.rb new file mode 100644 index 0000000..57a42bb --- /dev/null +++ b/lib/reforge/errors/uninitialized_error.rb @@ -0,0 +1,13 @@ +# frozen_string_literal: true + +module Reforge + module Errors + class UninitializedError < Reforge::Error + def initialize(key=nil) + message = "Use Reforge.initialize before calling Reforge.get #{key}" + + super(message) + end + end + end +end diff --git a/lib/prefab/evaluation.rb b/lib/reforge/evaluation.rb similarity index 91% rename from lib/prefab/evaluation.rb rename to lib/reforge/evaluation.rb index 4be8774..a4732e6 100644 --- a/lib/prefab/evaluation.rb +++ b/lib/reforge/evaluation.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge # Records the result of evaluating a config's criteria and forensics for reporting class Evaluation attr_reader :value, :context @@ -47,7 +47,7 @@ def report(evaluation_summary_aggregator) end def deepest_value - @deepest_value ||= Prefab::ConfigValueUnwrapper.deepest_value(@value, @config, @context, @resolver) + @deepest_value ||= Reforge::ConfigValueUnwrapper.deepest_value(@value, @config, @context, @resolver) end end end diff --git a/lib/prefab/evaluation_summary_aggregator.rb b/lib/reforge/evaluation_summary_aggregator.rb similarity index 94% rename from lib/prefab/evaluation_summary_aggregator.rb rename to lib/reforge/evaluation_summary_aggregator.rb index c0444bf..9bb3c99 100644 --- a/lib/prefab/evaluation_summary_aggregator.rb +++ b/lib/reforge/evaluation_summary_aggregator.rb @@ -2,13 +2,13 @@ require_relative 'periodic_sync' -module Prefab +module Reforge # This class aggregates the number of times each config is evaluated, and # details about how the config is evaluated This data is reported to the # server at a regular interval defined by `sync_interval`. class EvaluationSummaryAggregator - include Prefab::PeriodicSync - LOG = Prefab::InternalLogger.new(self) + include Reforge::PeriodicSync + LOG = Reforge::InternalLogger.new(self) attr_reader :data @@ -52,7 +52,7 @@ def flush(to_ship, start_at_was) summaries_proto = PrefabProto::ConfigEvaluationSummaries.new( start: start_at_was, - end: Prefab::TimeHelpers.now_in_ms, + end: Reforge::TimeHelpers.now_in_ms, summaries: summaries(to_ship) ) diff --git a/lib/prefab/example_contexts_aggregator.rb b/lib/reforge/example_contexts_aggregator.rb similarity index 91% rename from lib/prefab/example_contexts_aggregator.rb rename to lib/reforge/example_contexts_aggregator.rb index 7935c8c..54e9294 100644 --- a/lib/prefab/example_contexts_aggregator.rb +++ b/lib/reforge/example_contexts_aggregator.rb @@ -2,14 +2,14 @@ require_relative 'periodic_sync' -module Prefab +module Reforge # This class aggregates example contexts. It dedupes based on the # concatenation of the keys of the contexts. # # It shouldn't send the same context more than once per hour. class ExampleContextsAggregator - include Prefab::PeriodicSync - LOG = Prefab::InternalLogger.new(self) + include Reforge::PeriodicSync + LOG = Reforge::InternalLogger.new(self) attr_reader :data, :cache @@ -21,7 +21,7 @@ def initialize(client:, max_contexts:, sync_interval:) @name = 'example_contexts_aggregator' @data = Concurrent::Array.new - @cache = Prefab::RateLimitCache.new(ONE_HOUR) + @cache = Reforge::RateLimitCache.new(ONE_HOUR) start_periodic_sync(sync_interval) end diff --git a/lib/prefab/exponential_backoff.rb b/lib/reforge/exponential_backoff.rb similarity index 97% rename from lib/prefab/exponential_backoff.rb rename to lib/reforge/exponential_backoff.rb index 2b54ab4..245102e 100644 --- a/lib/prefab/exponential_backoff.rb +++ b/lib/reforge/exponential_backoff.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge # This class implements exponential backoff with a maximum delay. # # This is the default sync interval for aggregators. diff --git a/lib/prefab/feature_flag_client.rb b/lib/reforge/feature_flag_client.rb similarity index 94% rename from lib/prefab/feature_flag_client.rb rename to lib/reforge/feature_flag_client.rb index 7877ad6..3c34b95 100644 --- a/lib/prefab/feature_flag_client.rb +++ b/lib/reforge/feature_flag_client.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge class FeatureFlagClient - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) def initialize(base_client) @base_client = base_client end diff --git a/lib/prefab/fixed_size_hash.rb b/lib/reforge/fixed_size_hash.rb similarity index 94% rename from lib/prefab/fixed_size_hash.rb rename to lib/reforge/fixed_size_hash.rb index 8c85106..0f0be28 100644 --- a/lib/prefab/fixed_size_hash.rb +++ b/lib/reforge/fixed_size_hash.rb @@ -1,5 +1,5 @@ # frozen_string_literal: true -module Prefab +module Reforge class FixedSizeHash < Hash def initialize(max_size) @max_size = max_size diff --git a/lib/prefab/http_connection.rb b/lib/reforge/http_connection.rb similarity index 90% rename from lib/prefab/http_connection.rb rename to lib/reforge/http_connection.rb index b44f761..c1bad20 100644 --- a/lib/prefab/http_connection.rb +++ b/lib/reforge/http_connection.rb @@ -1,12 +1,12 @@ # frozen_string_literal: true -module Prefab +module Reforge class HttpConnection AUTH_USER = 'authuser' PROTO_HEADERS = { 'Content-Type' => 'application/x-protobuf', 'Accept' => 'application/x-protobuf', - 'X-PrefabCloud-Client-Version' => "prefab-cloud-ruby-#{Prefab::VERSION}" + 'X-ReforgeCloud-Client-Version' => "reforge-cloud-ruby-#{Reforge::VERSION}" }.freeze def initialize(uri, api_key) diff --git a/lib/prefab/internal_logger.rb b/lib/reforge/internal_logger.rb similarity index 68% rename from lib/prefab/internal_logger.rb rename to lib/reforge/internal_logger.rb index 0968c8d..23b7b68 100644 --- a/lib/prefab/internal_logger.rb +++ b/lib/reforge/internal_logger.rb @@ -1,8 +1,8 @@ -module Prefab +module Reforge class InternalLogger < SemanticLogger::Logger def initialize(klass) - default_level = ENV['PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'] ? ENV['PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'].downcase.to_sym : :warn + default_level = ENV['REFORGE_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'] ? ENV['REFORGE_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'].downcase.to_sym : :warn super(klass, default_level) instances << self end @@ -22,9 +22,9 @@ def local_log_id end # Our client outputs debug logging, - # but if you aren't using Prefab logging this could be too chatty. - # If you aren't using prefab log filter, only log warn level and above - def self.using_prefab_log_filter! + # but if you aren't using Reforge logging this could be too chatty. + # If you aren't using reforge log filter, only log warn level and above + def self.using_reforge_log_filter! @@instances.each do |l| l.level = :trace end diff --git a/lib/prefab/javascript_stub.rb b/lib/reforge/javascript_stub.rb similarity index 93% rename from lib/prefab/javascript_stub.rb rename to lib/reforge/javascript_stub.rb index 88e0164..0309bf4 100644 --- a/lib/prefab/javascript_stub.rb +++ b/lib/reforge/javascript_stub.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge class JavaScriptStub - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) CAMELS = {} def initialize(client = nil) @@ -42,11 +42,11 @@ def generate_stub(context, callback = nil) private def underlying_value(value) - v = Prefab::ConfigValueUnwrapper.new(value, @client.resolver).unwrap(raw_json: true) + v = Reforge::ConfigValueUnwrapper.new(value, @client.resolver).unwrap(raw_json: true) case v when Google::Protobuf::RepeatedField v.to_a - when Prefab::Duration + when Reforge::Duration v.as_json else v diff --git a/lib/prefab/local_config_parser.rb b/lib/reforge/local_config_parser.rb similarity index 95% rename from lib/prefab/local_config_parser.rb rename to lib/reforge/local_config_parser.rb index d13ca24..5c680e1 100644 --- a/lib/prefab/local_config_parser.rb +++ b/lib/reforge/local_config_parser.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class LocalConfigParser class << self def parse(key, value, config, file) @@ -40,7 +40,7 @@ def parse(key, value, config, file) def value_from(key, raw) case raw when String - if key.to_s.start_with? Prefab::LoggerClient::BASE_KEY + if key.to_s.start_with? Reforge::LoggerClient::BASE_KEY prefab_log_level_resolve = PrefabProto::LogLevel.resolve(raw.upcase.to_sym) || PrefabProto::LogLevel::NOT_SET_LOG_LEVEL { log_level: prefab_log_level_resolve } else @@ -69,7 +69,7 @@ def feature_flag_config(file, key, value) ] ) - raise Prefab::Error, "Feature flag config `#{key}` #{file} must have a `value`" unless value.key?('value') + raise Reforge::Error, "Feature flag config `#{key}` #{file} must have a `value`" unless value.key?('value') { source: file, diff --git a/lib/prefab/log_path_aggregator.rb b/lib/reforge/log_path_aggregator.rb similarity index 93% rename from lib/prefab/log_path_aggregator.rb rename to lib/reforge/log_path_aggregator.rb index 27f686b..0ef9f7c 100644 --- a/lib/prefab/log_path_aggregator.rb +++ b/lib/reforge/log_path_aggregator.rb @@ -2,10 +2,10 @@ require_relative 'periodic_sync' -module Prefab +module Reforge class LogPathAggregator - LOG = Prefab::InternalLogger.new(self) - include Prefab::PeriodicSync + LOG = Reforge::InternalLogger.new(self) + include Reforge::PeriodicSync INCREMENT = ->(count) { (count || 0) + 1 } @@ -53,7 +53,7 @@ def flush(to_ship, start_at_was) loggers = PrefabProto::LoggersTelemetryEvent.new(loggers: aggregate.values, start_at: start_at_was, - end_at: Prefab::TimeHelpers.now_in_ms) + end_at: Reforge::TimeHelpers.now_in_ms) events = PrefabProto::TelemetryEvents.new( instance_hash: instance_hash, diff --git a/lib/prefab/logger_client.rb b/lib/reforge/logger_client.rb similarity index 99% rename from lib/prefab/logger_client.rb rename to lib/reforge/logger_client.rb index 5a39ba8..019b719 100644 --- a/lib/prefab/logger_client.rb +++ b/lib/reforge/logger_client.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class LoggerClient SEP = '.' BASE_KEY = 'log-level' diff --git a/lib/prefab/murmer3.rb b/lib/reforge/murmer3.rb similarity index 100% rename from lib/prefab/murmer3.rb rename to lib/reforge/murmer3.rb diff --git a/lib/prefab/options.rb b/lib/reforge/options.rb similarity index 99% rename from lib/prefab/options.rb rename to lib/reforge/options.rb index c27e49d..edb7d79 100644 --- a/lib/prefab/options.rb +++ b/lib/reforge/options.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge # This class contains all the options that can be passed to the Prefab client. class Options attr_reader :api_key diff --git a/lib/prefab/periodic_sync.rb b/lib/reforge/periodic_sync.rb similarity index 89% rename from lib/prefab/periodic_sync.rb rename to lib/reforge/periodic_sync.rb index 6a57dd5..bfa471b 100644 --- a/lib/prefab/periodic_sync.rb +++ b/lib/reforge/periodic_sync.rb @@ -1,8 +1,8 @@ # frozen_string_literal: true -module Prefab +module Reforge module PeriodicSync - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) def sync return if @data.size.zero? @@ -10,7 +10,7 @@ def sync LOG.debug "Syncing #{@data.size} items" start_at_was = @start_at - @start_at = Prefab::TimeHelpers.now_in_ms + @start_at = Reforge::TimeHelpers.now_in_ms flush(prepare_data, start_at_was) end @@ -37,7 +37,7 @@ def instance_hash end def start_periodic_sync(sync_interval) - @start_at = Prefab::TimeHelpers.now_in_ms + @start_at = Reforge::TimeHelpers.now_in_ms @sync_interval = calculate_sync_interval(sync_interval) diff --git a/lib/prefab/prefab.rb b/lib/reforge/prefab.rb similarity index 85% rename from lib/prefab/prefab.rb rename to lib/reforge/prefab.rb index 4f6bd2a..19d17b6 100644 --- a/lib/prefab/prefab.rb +++ b/lib/reforge/prefab.rb @@ -1,18 +1,18 @@ # frozen_string_literal: true -module Prefab - LOG = Prefab::InternalLogger.new(self) +module Reforge + LOG = Reforge::InternalLogger.new(self) @@lock = Concurrent::ReadWriteLock.new @config_has_loaded = false - def self.init(options = Prefab::Options.new) + def self.init(options = Reforge::Options.new) unless @singleton.nil? LOG.warn 'Prefab already initialized.' return @singleton end @@lock.with_write_lock { - @singleton = Prefab::Client.new(options) + @singleton = Reforge::Client.new(options) } end @@ -49,7 +49,7 @@ def self.instance end def self.log_filter - InternalLogger.using_prefab_log_filter! + InternalLogger.using_reforge_log_filter! return Proc.new do |log| if defined?(@singleton) && !@singleton.nil? && @singleton.config_client.initialized? @singleton.log.semantic_filter(log) @@ -64,7 +64,7 @@ def self.finish_init! end def self.bootstrap_log_level(log) - level = ENV['PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'] ? ENV['PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'].downcase.to_sym : :warn + level = ENV['REFORGE_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'] ? ENV['REFORGE_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL'].downcase.to_sym : :warn SemanticLogger::Levels.index(level) <= SemanticLogger::Levels.index(log.level) end @@ -90,7 +90,7 @@ def self.is_ff?(key) # console. def self.bootstrap_javascript(context) ensure_initialized - Prefab::JavaScriptStub.new(@singleton).bootstrap(context) + Reforge::JavaScriptStub.new(@singleton).bootstrap(context) end # Generate the JavaScript snippet to *replace* the client SDK. Use this to @@ -111,14 +111,14 @@ def self.bootstrap_javascript(context) # - `Prefab.generate_javascript_stub(context, "(key,value)=>{console.log({eval: 'eval', key,value})}")` def self.generate_javascript_stub(context, callback = nil) ensure_initialized - Prefab::JavaScriptStub.new(@singleton).generate_stub(context, callback) + Reforge::JavaScriptStub.new(@singleton).generate_stub(context, callback) end private def self.ensure_initialized(key = nil) if not defined? @singleton or @singleton.nil? - raise Prefab::Errors::UninitializedError.new(key) + raise Reforge::Errors::UninitializedError.new(key) end end end diff --git a/lib/prefab/rate_limit_cache.rb b/lib/reforge/rate_limit_cache.rb similarity index 98% rename from lib/prefab/rate_limit_cache.rb rename to lib/reforge/rate_limit_cache.rb index e1244cb..6c35252 100644 --- a/lib/prefab/rate_limit_cache.rb +++ b/lib/reforge/rate_limit_cache.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge # A key-based rate limiter that considers a key to be fresh if it has been # seen within the last `duration` seconds. # diff --git a/lib/prefab/resolved_config_presenter.rb b/lib/reforge/resolved_config_presenter.rb similarity index 95% rename from lib/prefab/resolved_config_presenter.rb rename to lib/reforge/resolved_config_presenter.rb index 2dbe119..fcd4002 100644 --- a/lib/prefab/resolved_config_presenter.rb +++ b/lib/reforge/resolved_config_presenter.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class ResolvedConfigPresenter class ConfigRow include Comparable @@ -36,7 +36,7 @@ def each(&block) def to_h hash = {} - Prefab::Context.with_context({}) do + Reforge::Context.with_context({}) do @lock.with_read_lock do @local_store.keys.sort.each do |k| v = @local_store[k] @@ -57,7 +57,7 @@ def to_h def to_s str = "\n" - Prefab::Context.with_context({}) do + Reforge::Context.with_context({}) do @lock.with_read_lock do @local_store.keys.sort.each do |k| v = @local_store[k] diff --git a/lib/prefab/semver.rb b/lib/reforge/semver.rb similarity index 100% rename from lib/prefab/semver.rb rename to lib/reforge/semver.rb diff --git a/lib/prefab/sse_config_client.rb b/lib/reforge/sse_config_client.rb similarity index 92% rename from lib/prefab/sse_config_client.rb rename to lib/reforge/sse_config_client.rb index 31a3cdf..e0bf2e0 100644 --- a/lib/prefab/sse_config_client.rb +++ b/lib/reforge/sse_config_client.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class SSEConfigClient class Options attr_reader :sse_read_timeout, :seconds_between_new_connection, @@ -21,7 +21,7 @@ def initialize(sse_read_timeout: 300, end AUTH_USER = 'authuser' - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) def initialize(prefab_options, config_loader, options = nil, logger = nil) @prefab_options = prefab_options @@ -71,7 +71,7 @@ def connect(&load_configs) headers: headers, read_timeout: @options.sse_read_timeout, reconnect_time: @options.sse_default_reconnect_time, - logger: Prefab::InternalLogger.new(SSE::Client)) do |client| + logger: Reforge::InternalLogger.new(SSE::Client)) do |client| client.on_event do |event| configs = PrefabProto::Configs.decode(Base64.decode64(event.data)) load_configs.call(configs, event, :sse) @@ -92,10 +92,10 @@ def headers auth = "#{AUTH_USER}:#{@prefab_options.api_key}" auth_string = Base64.strict_encode64(auth) return { - 'x-prefab-start-at-id' => @config_loader.highwater_mark, + 'Last-Event-ID' => @config_loader.highwater_mark, 'Authorization' => "Basic #{auth_string}", 'Accept' => 'text/event-stream', - 'X-PrefabCloud-Client-Version' => "prefab-cloud-ruby-#{Prefab::VERSION}" + 'X-ReforgeCloud-Client-Version' => "reforge-cloud-ruby-#{Reforge::VERSION}" } end diff --git a/lib/prefab/time_helpers.rb b/lib/reforge/time_helpers.rb similarity index 86% rename from lib/prefab/time_helpers.rb rename to lib/reforge/time_helpers.rb index e63b3ef..2b9d630 100644 --- a/lib/prefab/time_helpers.rb +++ b/lib/reforge/time_helpers.rb @@ -1,4 +1,4 @@ -module Prefab +module Reforge module TimeHelpers def self.now_in_ms ::Time.now.utc.to_i * 1000 diff --git a/lib/prefab/weighted_value_resolver.rb b/lib/reforge/weighted_value_resolver.rb similarity index 98% rename from lib/prefab/weighted_value_resolver.rb rename to lib/reforge/weighted_value_resolver.rb index 4ffb05e..0331adc 100644 --- a/lib/prefab/weighted_value_resolver.rb +++ b/lib/reforge/weighted_value_resolver.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -module Prefab +module Reforge class WeightedValueResolver MAX_32_FLOAT = 4_294_967_294.0 diff --git a/lib/prefab/yaml_config_parser.rb b/lib/reforge/yaml_config_parser.rb similarity index 76% rename from lib/prefab/yaml_config_parser.rb rename to lib/reforge/yaml_config_parser.rb index 15246b0..a934313 100644 --- a/lib/prefab/yaml_config_parser.rb +++ b/lib/reforge/yaml_config_parser.rb @@ -1,8 +1,8 @@ require 'yaml' -module Prefab +module Reforge class YAMLConfigParser - LOG = Prefab::InternalLogger.new(self) + LOG = Reforge::InternalLogger.new(self) def initialize(file, client) @file = file @@ -13,7 +13,7 @@ def merge(config) yaml = load yaml.each do |k, v| - config = Prefab::LocalConfigParser.parse(k, v, config, @file) + config = Reforge::LocalConfigParser.parse(k, v, config, @file) end config diff --git a/prefab-cloud-ruby.gemspec b/prefab-cloud-ruby.gemspec index 425514b..06aa96c 100644 --- a/prefab-cloud-ruby.gemspec +++ b/prefab-cloud-ruby.gemspec @@ -5,15 +5,15 @@ # stub: prefab-cloud-ruby 1.8.9 ruby lib Gem::Specification.new do |s| - s.name = "prefab-cloud-ruby".freeze + s.name = "reforge-sdk".freeze s.version = "1.8.9" s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version= s.require_paths = ["lib".freeze] s.authors = ["Jeff Dwyer".freeze] s.date = "2025-04-15" - s.description = "Feature Flags, Live Config, and Dynamic Log Levels as a service".freeze - s.email = "jdwyer@prefab.cloud".freeze + s.description = "Feature Flags and Live Config as a service".freeze + s.email = "jeff.dwyer@reforge.com".freeze s.extra_rdoc_files = [ "CHANGELOG.md", "LICENSE.txt", @@ -39,51 +39,51 @@ Gem::Specification.new do |s| "dev/benchmark", "dev/console", "dev/script_setup.rb", - "lib/prefab-cloud-ruby.rb", - "lib/prefab/caching_http_connection.rb", - "lib/prefab/client.rb", - "lib/prefab/config_client.rb", - "lib/prefab/config_client_presenter.rb", - "lib/prefab/config_loader.rb", - "lib/prefab/config_resolver.rb", - "lib/prefab/config_value_unwrapper.rb", - "lib/prefab/config_value_wrapper.rb", - "lib/prefab/context.rb", - "lib/prefab/context_shape.rb", - "lib/prefab/context_shape_aggregator.rb", - "lib/prefab/criteria_evaluator.rb", - "lib/prefab/duration.rb", - "lib/prefab/encryption.rb", - "lib/prefab/error.rb", - "lib/prefab/errors/env_var_parse_error.rb", - "lib/prefab/errors/initialization_timeout_error.rb", - "lib/prefab/errors/invalid_api_key_error.rb", - "lib/prefab/errors/missing_default_error.rb", - "lib/prefab/errors/missing_env_var_error.rb", - "lib/prefab/errors/uninitialized_error.rb", - "lib/prefab/evaluation.rb", - "lib/prefab/evaluation_summary_aggregator.rb", - "lib/prefab/example_contexts_aggregator.rb", - "lib/prefab/exponential_backoff.rb", - "lib/prefab/feature_flag_client.rb", - "lib/prefab/fixed_size_hash.rb", - "lib/prefab/http_connection.rb", - "lib/prefab/internal_logger.rb", - "lib/prefab/javascript_stub.rb", - "lib/prefab/local_config_parser.rb", - "lib/prefab/log_path_aggregator.rb", - "lib/prefab/logger_client.rb", - "lib/prefab/murmer3.rb", - "lib/prefab/options.rb", - "lib/prefab/periodic_sync.rb", - "lib/prefab/prefab.rb", - "lib/prefab/rate_limit_cache.rb", - "lib/prefab/resolved_config_presenter.rb", - "lib/prefab/semver.rb", - "lib/prefab/sse_config_client.rb", - "lib/prefab/time_helpers.rb", - "lib/prefab/weighted_value_resolver.rb", - "lib/prefab/yaml_config_parser.rb", + "lib/reforge-sdk.rb", + "lib/reforge/caching_http_connection.rb", + "lib/reforge/client.rb", + "lib/reforge/config_client.rb", + "lib/reforge/config_client_presenter.rb", + "lib/reforge/config_loader.rb", + "lib/reforge/config_resolver.rb", + "lib/reforge/config_value_unwrapper.rb", + "lib/reforge/config_value_wrapper.rb", + "lib/reforge/context.rb", + "lib/reforge/context_shape.rb", + "lib/reforge/context_shape_aggregator.rb", + "lib/reforge/criteria_evaluator.rb", + "lib/reforge/duration.rb", + "lib/reforge/encryption.rb", + "lib/reforge/error.rb", + "lib/reforge/errors/env_var_parse_error.rb", + "lib/reforge/errors/initialization_timeout_error.rb", + "lib/reforge/errors/invalid_api_key_error.rb", + "lib/reforge/errors/missing_default_error.rb", + "lib/reforge/errors/missing_env_var_error.rb", + "lib/reforge/errors/uninitialized_error.rb", + "lib/reforge/evaluation.rb", + "lib/reforge/evaluation_summary_aggregator.rb", + "lib/reforge/example_contexts_aggregator.rb", + "lib/reforge/exponential_backoff.rb", + "lib/reforge/feature_flag_client.rb", + "lib/reforge/fixed_size_hash.rb", + "lib/reforge/http_connection.rb", + "lib/reforge/internal_logger.rb", + "lib/reforge/javascript_stub.rb", + "lib/reforge/local_config_parser.rb", + "lib/reforge/log_path_aggregator.rb", + "lib/reforge/logger_client.rb", + "lib/reforge/murmer3.rb", + "lib/reforge/options.rb", + "lib/reforge/periodic_sync.rb", + "lib/reforge/prefab.rb", + "lib/reforge/rate_limit_cache.rb", + "lib/reforge/resolved_config_presenter.rb", + "lib/reforge/semver.rb", + "lib/reforge/sse_config_client.rb", + "lib/reforge/time_helpers.rb", + "lib/reforge/weighted_value_resolver.rb", + "lib/reforge/yaml_config_parser.rb", "lib/prefab_pb.rb", "prefab-cloud-ruby.gemspec", "test/.prefab.default.config.yaml", @@ -128,10 +128,10 @@ Gem::Specification.new do |s| "test/test_sse_config_client.rb", "test/test_weighted_value_resolver.rb" ] - s.homepage = "http://github.com/prefab-cloud/prefab-cloud-ruby".freeze + s.homepage = "https://github.com/ReforgeHQ/sdk-ruby".freeze s.licenses = ["MIT".freeze] s.rubygems_version = "3.4.19".freeze - s.summary = "Prefab Ruby Infrastructure".freeze + s.summary = "Reforge SDK Ruby Infrastructure".freeze s.specification_version = 4 diff --git a/test/integration_test.rb b/test/integration_test.rb index 8e2c3db..b0103c3 100644 --- a/test/integration_test.rb +++ b/test/integration_test.rb @@ -88,7 +88,7 @@ def parse_config_input(input) if !input['default'].nil? [input['key'], input['default'], @local_context] elsif @local_context - [input['key'], Prefab::NO_DEFAULT_PROVIDED, @local_context] + [input['key'], Reforge::NO_DEFAULT_PROVIDED, @local_context] else [input['key']] end @@ -112,11 +112,11 @@ def parse_expected(expected) def parse_error_type(error_type) case error_type - when 'missing_default' then Prefab::Errors::MissingDefaultError - when 'initialization_timeout' then Prefab::Errors::InitializationTimeoutError + when 'missing_default' then Reforge::Errors::MissingDefaultError + when 'initialization_timeout' then Reforge::Errors::InitializationTimeoutError when 'unable_to_decrypt' then OpenSSL::Cipher::CipherError - when 'missing_env_var' then Prefab::Errors::MissingEnvVarError - when 'unable_to_coerce_env_var' then Prefab::Errors::EnvVarParseError + when 'missing_env_var' then Reforge::Errors::MissingEnvVarError + when 'unable_to_coerce_env_var' then Reforge::Errors::EnvVarParseError else unless error_type.nil? throw "Unknown error type: #{error_type}" @@ -125,15 +125,15 @@ def parse_error_type(error_type) end def base_client - @_base_client ||= Prefab::Client.new(base_client_options) + @_base_client ||= Reforge::Client.new(base_client_options) end def base_client_options - @_options ||= Prefab::Options.new(**{ + @_options ||= Reforge::Options.new(**{ prefab_config_override_dir: 'none', prefab_config_classpath_dir: 'test', prefab_envs: ['unit_tests'], - prefab_datasources: Prefab::Options::DATASOURCES::ALL, + prefab_datasources: Reforge::Options::DATASOURCES::ALL, api_key: ENV['PREFAB_INTEGRATION_TEST_API_KEY'], sources: [ 'https://belt.staging-prefab.cloud', diff --git a/test/integration_test_helpers.rb b/test/integration_test_helpers.rb index 72d5479..70099d0 100644 --- a/test/integration_test_helpers.rb +++ b/test/integration_test_helpers.rb @@ -18,7 +18,7 @@ def self.find_test_files .select { |file| file =~ /\.ya?ml$/ } end - SEVERITY_LOOKUP = Prefab::LogPathAggregator::SEVERITY_KEY.invert + SEVERITY_LOOKUP = Reforge::LogPathAggregator::SEVERITY_KEY.invert def self.prepare_post_data(it) case it.aggregator @@ -44,7 +44,7 @@ def self.prepare_post_data(it) when "context_shape" aggregator = it.test_client.context_shape_aggregator - context = Prefab::Context.new(it.data) + context = Reforge::Context.new(it.data) aggregator.push(context) @@ -100,7 +100,7 @@ def self.prepare_post_data(it) aggregator = it.test_client.example_contexts_aggregator it.data.each do |key, values| - aggregator.record(Prefab::Context.new({ key => values })) + aggregator.record(Reforge::Context.new({ key => values })) end expected_data = [] @@ -112,7 +112,7 @@ def self.prepare_post_data(it) PrefabProto::Context.new( type: k, values: vs.each_pair.map do |key, value| - [key, Prefab::ConfigValueWrapper.wrap(value)] + [key, Reforge::ConfigValueWrapper.wrap(value)] end.to_h ) ] @@ -127,7 +127,7 @@ def self.prepare_post_data(it) def self.with_block_context_maybe(context, &block) if context - Prefab::Context.with_context(context, &block) + Reforge::Context.with_context(context, &block) else yield end diff --git a/test/support/common_helpers.rb b/test/support/common_helpers.rb index 49056d1..c46862d 100644 --- a/test/support/common_helpers.rb +++ b/test/support/common_helpers.rb @@ -7,16 +7,16 @@ def setup $oldstderr, $stderr = $stderr, StringIO.new $logs = StringIO.new - Prefab::Context.global_context.clear - Prefab::Context.default_context.clear - SemanticLogger.add_appender(io: $logs, filter: Prefab.log_filter) + Reforge::Context.global_context.clear + Reforge::Context.default_context.clear + SemanticLogger.add_appender(io: $logs, filter: Reforge.log_filter) SemanticLogger.sync! end def teardown if $logs && !$logs.string.empty? log_lines = $logs.string.split("\n").reject do |line| - line.match(/Prefab::ConfigClient -- No success loading checkpoints/) + line.match(/Reforge::ConfigClient -- No success loading checkpoints/) end if log_lines.size > 0 @@ -57,7 +57,7 @@ def with_env(key, value, &block) prefab_config_override_dir: 'none', prefab_config_classpath_dir: 'test', prefab_envs: ['unit_tests'], - prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY, + prefab_datasources: Reforge::Options::DATASOURCES::LOCAL_ONLY, collect_sync_interval: EFFECTIVELY_NEVER, }.freeze @@ -65,7 +65,7 @@ def new_client(overrides = {}) config = overrides.delete(:config) project_env_id = overrides.delete(:project_env_id) - Prefab::Client.new(prefab_options(overrides)).tap do |client| + Reforge::Client.new(prefab_options(overrides)).tap do |client| inject_config(client, config) if config client.resolver.project_env_id = project_env_id if project_env_id @@ -73,7 +73,7 @@ def new_client(overrides = {}) end def prefab_options(overrides = {}) - Prefab::Options.new( + Reforge::Options.new( **DEFAULT_NEW_CLIENT_OPTIONS.merge(overrides) ) end @@ -157,7 +157,7 @@ def weighted_value(string, weight) end def context(properties) - Prefab::Context.new(properties) + Reforge::Context.new(properties) end def assert_logged(expected) diff --git a/test/support/mock_base_client.rb b/test/support/mock_base_client.rb index faecf52..19cdae7 100644 --- a/test/support/mock_base_client.rb +++ b/test/support/mock_base_client.rb @@ -6,7 +6,7 @@ class MockBaseClient TEST_ENV_ID = 3 attr_reader :namespace, :logger, :config_client, :options, :posts - def initialize(options = Prefab::Options.new) + def initialize(options = Reforge::Options.new) @options = options @namespace = namespace @config_client = MockConfigClient.new diff --git a/test/test_caching_http_connection.rb b/test/test_caching_http_connection.rb index bccdd31..205dab1 100644 --- a/test/test_caching_http_connection.rb +++ b/test/test_caching_http_connection.rb @@ -2,7 +2,7 @@ require 'test_helper' -module Prefab +module Reforge class CachingHttpConnectionTest < Minitest::Test def setup @uri = 'https://api.example.com' diff --git a/test/test_client.rb b/test/test_client.rb index 7ba735e..df7f391 100644 --- a/test/test_client.rb +++ b/test/test_client.rb @@ -3,7 +3,7 @@ require 'test_helper' class TestClient < Minitest::Test - LOCAL_ONLY = Prefab::Options::DATASOURCES::LOCAL_ONLY + LOCAL_ONLY = Reforge::Options::DATASOURCES::LOCAL_ONLY PROJECT_ENV_ID = 1 KEY = 'the-key' @@ -49,7 +49,7 @@ def test_get_with_default def test_get_with_missing_default client = new_client # it raises by default - err = assert_raises(Prefab::Errors::MissingDefaultError) do + err = assert_raises(Reforge::Errors::MissingDefaultError) do assert_nil client.get('missing_value') end @@ -57,7 +57,7 @@ def test_get_with_missing_default assert_match(/on_no_default/, err.message) # you can opt-in to return `nil` instead - client = new_client(on_no_default: Prefab::Options::ON_NO_DEFAULT::RETURN_NIL) + client = new_client(on_no_default: Reforge::Options::ON_NO_DEFAULT::RETURN_NIL) assert_nil client.get('missing_value') end @@ -74,15 +74,15 @@ def test_ff_enabled_with_user_key_match ctx = { user: { key: 'jimmy' } } assert_equal false, client.enabled?('user_key_match', ctx) - assert_equal false, Prefab::Context.with_context(ctx) { client.enabled?('user_key_match') } + assert_equal false, Reforge::Context.with_context(ctx) { client.enabled?('user_key_match') } ctx = { user: { key: 'abc123' } } assert_equal true, client.enabled?('user_key_match', ctx) - assert_equal true, Prefab::Context.with_context(ctx) { client.enabled?('user_key_match') } + assert_equal true, Reforge::Context.with_context(ctx) { client.enabled?('user_key_match') } ctx = { user: { key: 'xyz987' } } assert_equal true, client.enabled?('user_key_match', ctx) - assert_equal true, Prefab::Context.with_context(ctx) { client.enabled?('user_key_match') } + assert_equal true, Reforge::Context.with_context(ctx) { client.enabled?('user_key_match') } end # NOTE: these are all `false` because we're doing a enabled? on a FF with string variants @@ -92,15 +92,15 @@ def test_ff_enabled_with_context ctx = { user: { domain: 'gmail.com' } } assert_equal false, client.enabled?('just_my_domain', ctx) - assert_equal false, Prefab::Context.with_context(ctx) { client.enabled?('just_my_domain') } + assert_equal false, Reforge::Context.with_context(ctx) { client.enabled?('just_my_domain') } ctx = { user: { domain: 'prefab.cloud' } } assert_equal false, client.enabled?('just_my_domain', ctx) - assert_equal false, Prefab::Context.with_context(ctx) { client.enabled?('just_my_domain') } + assert_equal false, Reforge::Context.with_context(ctx) { client.enabled?('just_my_domain') } ctx = { user: { domain: 'example.com' } } assert_equal false, client.enabled?('just_my_domain', ctx) - assert_equal false, Prefab::Context.with_context(ctx) { client.enabled?('just_my_domain') } + assert_equal false, Reforge::Context.with_context(ctx) { client.enabled?('just_my_domain') } end def test_ff_get_with_context @@ -108,15 +108,15 @@ def test_ff_get_with_context ctx = { user: { domain: 'gmail.com' } } assert_equal 'DEFAULT', client.get('just_my_domain', 'DEFAULT', ctx) - assert_equal 'DEFAULT', Prefab::Context.with_context(ctx) { client.get('just_my_domain', 'DEFAULT') } + assert_equal 'DEFAULT', Reforge::Context.with_context(ctx) { client.get('just_my_domain', 'DEFAULT') } ctx = { user: { domain: 'prefab.cloud' } } assert_equal 'new-version', client.get('just_my_domain', 'DEFAULT', ctx) - assert_equal 'new-version', Prefab::Context.with_context(ctx) { client.get('just_my_domain', 'DEFAULT') } + assert_equal 'new-version', Reforge::Context.with_context(ctx) { client.get('just_my_domain', 'DEFAULT') } ctx = { user: { domain: 'example.com' } } assert_equal 'new-version', client.get('just_my_domain', 'DEFAULT', ctx) - assert_equal 'new-version', Prefab::Context.with_context(ctx) { client.get('just_my_domain', 'DEFAULT') } + assert_equal 'new-version', Reforge::Context.with_context(ctx) { client.get('just_my_domain', 'DEFAULT') } end def test_deprecated_no_dot_notation_ff_enabled_with_jit_context @@ -145,9 +145,9 @@ def test_initialization_with_an_options_object prefab_datasources: LOCAL_ONLY } - options = Prefab::Options.new(options_hash) + options = Reforge::Options.new(options_hash) - client = Prefab::Client.new(options) + client = Reforge::Client.new(options) assert_equal client.namespace, 'test-namespace' end @@ -158,7 +158,7 @@ def test_initialization_with_a_hash prefab_datasources: LOCAL_ONLY } - client = Prefab::Client.new(options_hash) + client = Reforge::Client.new(options_hash) assert_equal client.namespace, 'test-namespace' end @@ -179,13 +179,13 @@ def test_evaluation_summary_aggregator collect_evaluation_summaries: false).evaluation_summary_aggregator # it is not nil when collect_max_evaluation_summaries is true and the datasource is not local_only - assert_equal Prefab::EvaluationSummaryAggregator, + assert_equal Reforge::EvaluationSummaryAggregator, new_client(api_key: fake_api_key, prefab_datasources: :all, collect_evaluation_summaries: true).evaluation_summary_aggregator.class assert_logged [ - "Prefab::ConfigClient -- No success loading checkpoints" + "Reforge::ConfigClient -- No success loading checkpoints" ] end @@ -209,7 +209,7 @@ def test_get_with_basic_value } } - assert_example_contexts client, [Prefab::Context.new({ user: { 'key' => 99 } })] + assert_example_contexts client, [Reforge::Context.new({ user: { 'key' => 99 } })] end def test_get_with_basic_value_with_context @@ -234,7 +234,7 @@ def test_get_with_basic_value_with_context } } - assert_example_contexts client, [Prefab::Context.new({ user: { 'key' => 99 } })] + assert_example_contexts client, [Reforge::Context.new({ user: { 'key' => 99 } })] end def test_get_with_weighted_values @@ -303,9 +303,9 @@ def test_get_with_weighted_values } assert_example_contexts client, [ - Prefab::Context.new(user: { 'key' => '1' }), - Prefab::Context.new(user: { 'key' => '12' }), - Prefab::Context.new(user: { 'key' => '4', admin: true }) + Reforge::Context.new(user: { 'key' => '1' }), + Reforge::Context.new(user: { 'key' => '12' }), + Reforge::Context.new(user: { 'key' => '4', admin: true }) ] end @@ -380,8 +380,8 @@ def test_in_seg } assert_example_contexts client, [ - Prefab::Context.new(user: { key: 'abc', email: 'example@prefab.cloud' }), - Prefab::Context.new(user: { key: 'def', email: 'example@hotmail.com' }) + Reforge::Context.new(user: { key: 'abc', email: 'example@prefab.cloud' }), + Reforge::Context.new(user: { key: 'def', email: 'example@hotmail.com' }) ] end diff --git a/test/test_config_client.rb b/test/test_config_client.rb index 24880f9..3362d1e 100644 --- a/test/test_config_client.rb +++ b/test/test_config_client.rb @@ -5,15 +5,15 @@ class TestConfigClient < Minitest::Test def setup super - options = Prefab::Options.new( + options = Reforge::Options.new( prefab_config_override_dir: 'none', prefab_config_classpath_dir: 'test', prefab_envs: 'unit_tests', - prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY, + prefab_datasources: Reforge::Options::DATASOURCES::LOCAL_ONLY, x_use_local_cache: true, ) - @config_client = Prefab::ConfigClient.new(MockBaseClient.new(options), 10) + @config_client = Reforge::ConfigClient.new(MockBaseClient.new(options), 10) end def test_load @@ -25,50 +25,50 @@ def test_load end def test_initialization_timeout_error - options = Prefab::Options.new( + options = Reforge::Options.new( api_key: '123-ENV-KEY-SDK', initialization_timeout_sec: 0.01 ) - err = assert_raises(Prefab::Errors::InitializationTimeoutError) do - Prefab::Client.new(options).config_client.get('anything') + err = assert_raises(Reforge::Errors::InitializationTimeoutError) do + Reforge::Client.new(options).config_client.get('anything') end assert_match(/couldn't initialize in 0.01 second timeout/, err.message) end def test_prefab_envs_is_forgiving - assert_equal ['my_env'], Prefab::Options.new( + assert_equal ['my_env'], Reforge::Options.new( prefab_envs: 'my_env' ).prefab_envs - assert_equal %w[my_env a_second_env], Prefab::Options.new( + assert_equal %w[my_env a_second_env], Reforge::Options.new( prefab_envs: %w[my_env a_second_env] ).prefab_envs end def test_prefab_envs_env_var ENV['PREFAB_ENVS'] = 'one,two' - assert_equal %w[one two], Prefab::Options.new.prefab_envs + assert_equal %w[one two], Reforge::Options.new.prefab_envs end def test_invalid_api_key_error - options = Prefab::Options.new( + options = Reforge::Options.new( api_key: '' ) - err = assert_raises(Prefab::Errors::InvalidApiKeyError) do - Prefab::Client.new(options).config_client.get('anything') + err = assert_raises(Reforge::Errors::InvalidApiKeyError) do + Reforge::Client.new(options).config_client.get('anything') end assert_match(/No API key/, err.message) - options = Prefab::Options.new( + options = Reforge::Options.new( api_key: 'invalid' ) - err = assert_raises(Prefab::Errors::InvalidApiKeyError) do - Prefab::Client.new(options).config_client.get('anything') + err = assert_raises(Reforge::Errors::InvalidApiKeyError) do + Reforge::Client.new(options).config_client.get('anything') end assert_match(/format is invalid/, err.message) @@ -91,16 +91,16 @@ def test_caching end def test_cache_path_respects_xdg - options = Prefab::Options.new( - prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY, + options = Reforge::Options.new( + prefab_datasources: Reforge::Options::DATASOURCES::LOCAL_ONLY, x_use_local_cache: true, api_key: "123-ENV-KEY-SDK",) - config_client = Prefab::ConfigClient.new(MockBaseClient.new(options), 10) + config_client = Reforge::ConfigClient.new(MockBaseClient.new(options), 10) assert_equal "#{Dir.home}/.cache/prefab.cache.123.json", config_client.send(:cache_path) with_env('XDG_CACHE_HOME', '/tmp') do - config_client = Prefab::ConfigClient.new(MockBaseClient.new(options), 10) + config_client = Reforge::ConfigClient.new(MockBaseClient.new(options), 10) assert_equal "/tmp/prefab.cache.123.json", config_client.send(:cache_path) end end diff --git a/test/test_config_loader.rb b/test/test_config_loader.rb index 02f77e3..e62b8d7 100644 --- a/test/test_config_loader.rb +++ b/test/test_config_loader.rb @@ -5,12 +5,12 @@ class TestConfigLoader < Minitest::Test def setup super - options = Prefab::Options.new( + options = Reforge::Options.new( prefab_config_override_dir: 'none', prefab_config_classpath_dir: 'test', prefab_envs: 'unit_tests' ) - @loader = Prefab::ConfigLoader.new(MockBaseClient.new(options)) + @loader = Reforge::ConfigLoader.new(MockBaseClient.new(options)) end def test_load @@ -33,12 +33,12 @@ def test_invalid_log_level end def test_load_without_unit_test_env - options = Prefab::Options.new( + options = Reforge::Options.new( prefab_config_override_dir: 'none', prefab_config_classpath_dir: 'test' # no prefab_envs ) - @loader = Prefab::ConfigLoader.new(MockBaseClient.new(options)) + @loader = Reforge::ConfigLoader.new(MockBaseClient.new(options)) should_be :string, 'default sample value', 'sample' should_be :bool, true, 'sample_bool' end diff --git a/test/test_config_resolver.rb b/test/test_config_resolver.rb index b0bdb2c..b2ba000 100644 --- a/test/test_config_resolver.rb +++ b/test/test_config_resolver.rb @@ -42,7 +42,7 @@ def test_resolution PrefabProto::Criterion.new( operator: PrefabProto::Criterion::CriterionOperator::HIERARCHICAL_MATCH, value_to_match: PrefabProto::ConfigValue.new(string: 'projectB.subprojectX'), - property_name: Prefab::CriteriaEvaluator::NAMESPACE_KEY + property_name: Reforge::CriteriaEvaluator::NAMESPACE_KEY ) ], value: PrefabProto::ConfigValue.new(string: 'projectB.subprojectX') @@ -52,7 +52,7 @@ def test_resolution PrefabProto::Criterion.new( operator: PrefabProto::Criterion::CriterionOperator::HIERARCHICAL_MATCH, value_to_match: PrefabProto::ConfigValue.new(string: 'projectB.subprojectY'), - property_name: Prefab::CriteriaEvaluator::NAMESPACE_KEY + property_name: Reforge::CriteriaEvaluator::NAMESPACE_KEY ) ], value: PrefabProto::ConfigValue.new(string: 'projectB.subprojectY') @@ -62,7 +62,7 @@ def test_resolution PrefabProto::Criterion.new( operator: PrefabProto::Criterion::CriterionOperator::HIERARCHICAL_MATCH, value_to_match: PrefabProto::ConfigValue.new(string: 'projectA'), - property_name: Prefab::CriteriaEvaluator::NAMESPACE_KEY + property_name: Reforge::CriteriaEvaluator::NAMESPACE_KEY ) ], value: PrefabProto::ConfigValue.new(string: 'valueA') @@ -72,7 +72,7 @@ def test_resolution PrefabProto::Criterion.new( operator: PrefabProto::Criterion::CriterionOperator::HIERARCHICAL_MATCH, value_to_match: PrefabProto::ConfigValue.new(string: 'projectB'), - property_name: Prefab::CriteriaEvaluator::NAMESPACE_KEY + property_name: Reforge::CriteriaEvaluator::NAMESPACE_KEY ) ], value: PrefabProto::ConfigValue.new(string: 'valueB') @@ -82,7 +82,7 @@ def test_resolution PrefabProto::Criterion.new( operator: PrefabProto::Criterion::CriterionOperator::HIERARCHICAL_MATCH, value_to_match: PrefabProto::ConfigValue.new(string: 'projectB.subprojectX'), - property_name: Prefab::CriteriaEvaluator::NAMESPACE_KEY + property_name: Reforge::CriteriaEvaluator::NAMESPACE_KEY ) ], value: PrefabProto::ConfigValue.new(string: 'projectB.subprojectX') @@ -92,7 +92,7 @@ def test_resolution PrefabProto::Criterion.new( operator: PrefabProto::Criterion::CriterionOperator::HIERARCHICAL_MATCH, value_to_match: PrefabProto::ConfigValue.new(string: 'projectB.subprojectY'), - property_name: Prefab::CriteriaEvaluator::NAMESPACE_KEY + property_name: Reforge::CriteriaEvaluator::NAMESPACE_KEY ) ], value: PrefabProto::ConfigValue.new(string: 'projectB.subprojectY') @@ -154,8 +154,8 @@ def test_resolution ] assert_equal @resolverBX.presenter.to_h, { - 'key' => Prefab::ResolvedConfigPresenter::ConfigRow.new('key', 'value_none', nil, nil), - 'key2' => Prefab::ResolvedConfigPresenter::ConfigRow.new('key2', 'valueB2', nil, nil) + 'key' => Reforge::ResolvedConfigPresenter::ConfigRow.new('key', 'value_none', nil, nil), + 'key2' => Reforge::ResolvedConfigPresenter::ConfigRow.new('key2', 'valueB2', nil, nil) } resolved_lines = [] @@ -242,8 +242,8 @@ def test_resolving_in_segment loader = MockConfigLoader.new loader.stub :calc_config, loaded_values do - options = Prefab::Options.new - resolver = Prefab::ConfigResolver.new(MockBaseClient.new(options), loader) + options = Reforge::Options.new + resolver = Reforge::ConfigResolver.new(MockBaseClient.new(options), loader) resolver.project_env_id = PRODUCTION_ENV_ID assert_equal_context_and_jit DEFAULT_VALUE, resolver, CONFIG_KEY, @@ -312,8 +312,8 @@ def test_resolving_not_in_segment loader = MockConfigLoader.new loader.stub :calc_config, loaded_values do - options = Prefab::Options.new - resolver = Prefab::ConfigResolver.new(MockBaseClient.new(options), loader) + options = Reforge::Options.new + resolver = Reforge::ConfigResolver.new(MockBaseClient.new(options), loader) assert_equal_context_and_jit IN_SEGMENT_VALUE, resolver, CONFIG_KEY, { user: { email: 'test@hotmail.com' } } assert_equal_context_and_jit NOT_IN_SEGMENT_VALUE, resolver, CONFIG_KEY, { user: { email: 'test@something-else.com' } } @@ -352,11 +352,11 @@ def test_jit_context_merges_with_existing_context loader = MockConfigLoader.new loader.stub :calc_config, { CONFIG_KEY => { config: config } } do - options = Prefab::Options.new - resolver = Prefab::ConfigResolver.new(MockBaseClient.new(options), loader) + options = Reforge::Options.new + resolver = Reforge::ConfigResolver.new(MockBaseClient.new(options), loader) resolver.project_env_id = TEST_ENV_ID - Prefab::Context.with_context({ user: { email: 'test@example.com' } }) do + Reforge::Context.with_context({ user: { email: 'test@example.com' } }) do assert_equal DEFAULT_VALUE, resolver.get(CONFIG_KEY).unwrapped_value assert_equal DEFAULT_VALUE, resolver.get(CONFIG_KEY, { team: { plan: 'freebie' } }).unwrapped_value assert_equal DESIRED_VALUE, resolver.get(CONFIG_KEY, { team: { plan: 'pro' } }).unwrapped_value @@ -396,11 +396,11 @@ def test_jit_can_clobber_existing_context loader = MockConfigLoader.new loader.stub :calc_config, { CONFIG_KEY => { config: config } } do - options = Prefab::Options.new - resolver = Prefab::ConfigResolver.new(MockBaseClient.new(options), loader) + options = Reforge::Options.new + resolver = Reforge::ConfigResolver.new(MockBaseClient.new(options), loader) resolver.project_env_id = TEST_ENV_ID - Prefab::Context.with_context({ user: { email: 'test@hotmail.com' }, team: { plan: 'pro' } }) do + Reforge::Context.with_context({ user: { email: 'test@hotmail.com' }, team: { plan: 'pro' } }) do assert_equal DEFAULT_VALUE, resolver.get(CONFIG_KEY).unwrapped_value assert_equal DESIRED_VALUE, resolver.get(CONFIG_KEY, { user: { email: 'test@example.com' } }).unwrapped_value assert_equal DEFAULT_VALUE, resolver.get(CONFIG_KEY, { team: { plan: 'freebie' } }).unwrapped_value @@ -419,7 +419,7 @@ def test_context_lookup client = new_client(global_context: global_context, config: [config]) # we fake getting the default context from the API - Prefab::Context.default_context = default_context + Reforge::Context.default_context = default_context resolver = client.resolver @@ -459,7 +459,7 @@ def test_context_lookup_with_no_local_context client = new_client(global_context: global_context, config: [config]) # we fake getting the default context from the API - Prefab::Context.default_context = default_context + Reforge::Context.default_context = default_context resolver = client.resolver @@ -483,10 +483,10 @@ def test_context_lookup_with_no_local_context private def resolver_for_namespace(namespace, loader, project_env_id: TEST_ENV_ID) - options = Prefab::Options.new( + options = Reforge::Options.new( namespace: namespace ) - resolver = Prefab::ConfigResolver.new(MockBaseClient.new(options), loader) + resolver = Reforge::ConfigResolver.new(MockBaseClient.new(options), loader) resolver.project_env_id = project_env_id resolver.update resolver @@ -495,7 +495,7 @@ def resolver_for_namespace(namespace, loader, project_env_id: TEST_ENV_ID) def assert_equal_context_and_jit(expected_value, resolver, key, properties) assert_equal expected_value, resolver.get(key, properties).unwrapped_value - Prefab::Context.with_context(properties) do + Reforge::Context.with_context(properties) do assert_equal expected_value, resolver.get(key).unwrapped_value end end diff --git a/test/test_config_value_unwrapper.rb b/test/test_config_value_unwrapper.rb index b15110d..82ebd54 100644 --- a/test/test_config_value_unwrapper.rb +++ b/test/test_config_value_unwrapper.rb @@ -6,9 +6,9 @@ class TestConfigValueUnwrapper < Minitest::Test CONFIG = PrefabProto::Config.new( key: 'config_key' ) - EMPTY_CONTEXT = Prefab::Context.new() + EMPTY_CONTEXT = Reforge::Context.new() DECRYPTION_KEY_NAME = "decryption.key" - DECRYPTION_KEY_VALUE = Prefab::Encryption.generate_new_hex_key + DECRYPTION_KEY_VALUE = Reforge::Encryption.generate_new_hex_key def setup super @@ -150,38 +150,38 @@ def test_unwrapping_provided_values_when_value_type_mismatch ) config_value = PrefabProto::ConfigValue.new(provided: value) - assert_raises Prefab::Errors::EnvVarParseError do + assert_raises Reforge::Errors::EnvVarParseError do unwrap(config_value, config_of(PrefabProto::Config::ValueType::INT), EMPTY_CONTEXT) end end end def test_coerce - assert_equal "string", Prefab::ConfigValueUnwrapper.coerce_into_type("string", CONFIG, "ENV") - assert_equal 42, Prefab::ConfigValueUnwrapper.coerce_into_type("42", CONFIG, "ENV") - assert_equal false, Prefab::ConfigValueUnwrapper.coerce_into_type("false", CONFIG, "ENV") - assert_equal 42.42, Prefab::ConfigValueUnwrapper.coerce_into_type("42.42", CONFIG, "ENV") - assert_equal ["a","b"], Prefab::ConfigValueUnwrapper.coerce_into_type("['a','b']", CONFIG, "ENV") - - assert_equal "string", Prefab::ConfigValueUnwrapper.coerce_into_type("string", config_of(PrefabProto::Config::ValueType::STRING),"ENV") - assert_equal "42", Prefab::ConfigValueUnwrapper.coerce_into_type("42", config_of(PrefabProto::Config::ValueType::STRING),"ENV") - assert_equal "42.42", Prefab::ConfigValueUnwrapper.coerce_into_type("42.42", config_of(PrefabProto::Config::ValueType::STRING),"ENV") - assert_equal 42, Prefab::ConfigValueUnwrapper.coerce_into_type("42", config_of(PrefabProto::Config::ValueType::INT),"ENV") - assert_equal false, Prefab::ConfigValueUnwrapper.coerce_into_type("false", config_of(PrefabProto::Config::ValueType::BOOL),"ENV") - assert_equal 42.42, Prefab::ConfigValueUnwrapper.coerce_into_type("42.42", config_of(PrefabProto::Config::ValueType::DOUBLE),"ENV") - assert_equal ["a","b"], Prefab::ConfigValueUnwrapper.coerce_into_type("['a','b']", config_of(PrefabProto::Config::ValueType::STRING_LIST),"ENV") - - assert_raises Prefab::Errors::EnvVarParseError do - Prefab::ConfigValueUnwrapper.coerce_into_type("not an int", config_of(PrefabProto::Config::ValueType::INT), "ENV") + assert_equal "string", Reforge::ConfigValueUnwrapper.coerce_into_type("string", CONFIG, "ENV") + assert_equal 42, Reforge::ConfigValueUnwrapper.coerce_into_type("42", CONFIG, "ENV") + assert_equal false, Reforge::ConfigValueUnwrapper.coerce_into_type("false", CONFIG, "ENV") + assert_equal 42.42, Reforge::ConfigValueUnwrapper.coerce_into_type("42.42", CONFIG, "ENV") + assert_equal ["a","b"], Reforge::ConfigValueUnwrapper.coerce_into_type("['a','b']", CONFIG, "ENV") + + assert_equal "string", Reforge::ConfigValueUnwrapper.coerce_into_type("string", config_of(PrefabProto::Config::ValueType::STRING),"ENV") + assert_equal "42", Reforge::ConfigValueUnwrapper.coerce_into_type("42", config_of(PrefabProto::Config::ValueType::STRING),"ENV") + assert_equal "42.42", Reforge::ConfigValueUnwrapper.coerce_into_type("42.42", config_of(PrefabProto::Config::ValueType::STRING),"ENV") + assert_equal 42, Reforge::ConfigValueUnwrapper.coerce_into_type("42", config_of(PrefabProto::Config::ValueType::INT),"ENV") + assert_equal false, Reforge::ConfigValueUnwrapper.coerce_into_type("false", config_of(PrefabProto::Config::ValueType::BOOL),"ENV") + assert_equal 42.42, Reforge::ConfigValueUnwrapper.coerce_into_type("42.42", config_of(PrefabProto::Config::ValueType::DOUBLE),"ENV") + assert_equal ["a","b"], Reforge::ConfigValueUnwrapper.coerce_into_type("['a','b']", config_of(PrefabProto::Config::ValueType::STRING_LIST),"ENV") + + assert_raises Reforge::Errors::EnvVarParseError do + Reforge::ConfigValueUnwrapper.coerce_into_type("not an int", config_of(PrefabProto::Config::ValueType::INT), "ENV") end - assert_raises Prefab::Errors::EnvVarParseError do - Prefab::ConfigValueUnwrapper.coerce_into_type("not bool", config_of(PrefabProto::Config::ValueType::BOOL), "ENV") + assert_raises Reforge::Errors::EnvVarParseError do + Reforge::ConfigValueUnwrapper.coerce_into_type("not bool", config_of(PrefabProto::Config::ValueType::BOOL), "ENV") end - assert_raises Prefab::Errors::EnvVarParseError do - Prefab::ConfigValueUnwrapper.coerce_into_type("not a double", config_of(PrefabProto::Config::ValueType::DOUBLE), "ENV") + assert_raises Reforge::Errors::EnvVarParseError do + Reforge::ConfigValueUnwrapper.coerce_into_type("not a double", config_of(PrefabProto::Config::ValueType::DOUBLE), "ENV") end - assert_raises Prefab::Errors::EnvVarParseError do - Prefab::ConfigValueUnwrapper.coerce_into_type("not a list", config_of(PrefabProto::Config::ValueType::STRING_LIST), "ENV") + assert_raises Reforge::Errors::EnvVarParseError do + Reforge::ConfigValueUnwrapper.coerce_into_type("not a list", config_of(PrefabProto::Config::ValueType::STRING_LIST), "ENV") end end @@ -191,22 +191,22 @@ def test_unwrapping_provided_values_with_missing_env_var lookup: "NON_EXISTENT_ENV_VAR_NAME" ) config_value = PrefabProto::ConfigValue.new(provided: value) - assert_raises(Prefab::Errors::MissingEnvVarError) do + assert_raises(Reforge::Errors::MissingEnvVarError) do unwrap(config_value, CONFIG, EMPTY_CONTEXT) end end def test_unwrapping_encrypted_values_decrypts clear_text = "very secret stuff" - encrypted = Prefab::Encryption.new(DECRYPTION_KEY_VALUE).encrypt(clear_text) + encrypted = Reforge::Encryption.new(DECRYPTION_KEY_VALUE).encrypt(clear_text) config_value = PrefabProto::ConfigValue.new(string: encrypted, decrypt_with: "decryption.key") assert_equal clear_text, unwrap(config_value, CONFIG, EMPTY_CONTEXT) - assert reportable_value(config_value, CONFIG, EMPTY_CONTEXT).start_with? Prefab::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX + assert reportable_value(config_value, CONFIG, EMPTY_CONTEXT).start_with? Reforge::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX end def test_confidential config_value = PrefabProto::ConfigValue.new(confidential: true, string: "something confidential") - assert reportable_value(config_value, CONFIG, EMPTY_CONTEXT).start_with? Prefab::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX + assert reportable_value(config_value, CONFIG, EMPTY_CONTEXT).start_with? Reforge::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX end def test_unwrap_confiential_provided @@ -217,7 +217,7 @@ def test_unwrap_confiential_provided ) config_value = PrefabProto::ConfigValue.new(provided: value, confidential: true) assert_equal "the password", unwrap(config_value, CONFIG, EMPTY_CONTEXT) - assert reportable_value(config_value, CONFIG, EMPTY_CONTEXT).start_with? Prefab::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX + assert reportable_value(config_value, CONFIG, EMPTY_CONTEXT).start_with? Reforge::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX end end @@ -231,15 +231,15 @@ def config_of(value_type) end def context_with_key(key) - Prefab::Context.new(user: { key: key }) + Reforge::Context.new(user: { key: key }) end def unwrap(config_value, config_key, context) - Prefab::ConfigValueUnwrapper.deepest_value(config_value, config_key, context, @mock_resolver).unwrap + Reforge::ConfigValueUnwrapper.deepest_value(config_value, config_key, context, @mock_resolver).unwrap end def reportable_value(config_value, config_key, context) - Prefab::ConfigValueUnwrapper.deepest_value(config_value, config_key, context, @mock_resolver).reportable_value + Reforge::ConfigValueUnwrapper.deepest_value(config_value, config_key, context, @mock_resolver).reportable_value end class MockResolver @@ -254,11 +254,11 @@ def symbolize_json_names? def get(key) if DECRYPTION_KEY_NAME == key - Prefab::Evaluation.new(config: PrefabProto::Config.new(key: key), + Reforge::Evaluation.new(config: PrefabProto::Config.new(key: key), value: PrefabProto::ConfigValue.new(string: DECRYPTION_KEY_VALUE), value_index: 0, config_row_index: 0, - context: Prefab::Context.new, + context: Reforge::Context.new, resolver: self ) diff --git a/test/test_config_value_wrapper.rb b/test/test_config_value_wrapper.rb index 36dd663..f996a3a 100644 --- a/test/test_config_value_wrapper.rb +++ b/test/test_config_value_wrapper.rb @@ -4,38 +4,38 @@ class TestConfigValueWrapper < Minitest::Test def test_wrap_integer - result = Prefab::ConfigValueWrapper.wrap(42) + result = Reforge::ConfigValueWrapper.wrap(42) assert_instance_of PrefabProto::ConfigValue, result assert_equal 42, result.int end def test_wrap_float - result = Prefab::ConfigValueWrapper.wrap(3.14) + result = Reforge::ConfigValueWrapper.wrap(3.14) assert_instance_of PrefabProto::ConfigValue, result assert_equal 3.14, result.double end def test_wrap_boolean_true - result = Prefab::ConfigValueWrapper.wrap(true) + result = Reforge::ConfigValueWrapper.wrap(true) assert_instance_of PrefabProto::ConfigValue, result assert_equal true, result.bool end def test_wrap_boolean_false - result = Prefab::ConfigValueWrapper.wrap(false) + result = Reforge::ConfigValueWrapper.wrap(false) assert_instance_of PrefabProto::ConfigValue, result assert_equal false, result.bool end def test_wrap_array - result = Prefab::ConfigValueWrapper.wrap(['one', 'two', 'three']) + result = Reforge::ConfigValueWrapper.wrap(['one', 'two', 'three']) assert_instance_of PrefabProto::ConfigValue, result assert_instance_of PrefabProto::StringList, result.string_list assert_equal ['one', 'two', 'three'], result.string_list.values end def test_wrap_string - result = Prefab::ConfigValueWrapper.wrap('hello') + result = Reforge::ConfigValueWrapper.wrap('hello') assert_instance_of PrefabProto::ConfigValue, result assert_equal 'hello', result.string end diff --git a/test/test_context.rb b/test/test_context.rb index 9a1da38..eec9da8 100644 --- a/test/test_context.rb +++ b/test/test_context.rb @@ -7,68 +7,68 @@ class TestContext < Minitest::Test def setup super - Prefab::Context.current = nil + Reforge::Context.current = nil end def test_initialize_with_empty_context - context = Prefab::Context.new({}) + context = Reforge::Context.new({}) assert_empty context.contexts end def test_initialize_with_hash - context = Prefab::Context.new(test: { foo: 'bar' }) + context = Reforge::Context.new(test: { foo: 'bar' }) assert_equal 1, context.contexts.size assert_equal 'bar', context.get("test.foo") end def test_initialize_with_multiple_hashes - context = Prefab::Context.new(test: { foo: 'bar' }, other: { foo: 'baz' }) + context = Reforge::Context.new(test: { foo: 'bar' }, other: { foo: 'baz' }) assert_equal 2, context.contexts.size assert_equal 'bar', context.get("test.foo") assert_equal 'baz', context.get("other.foo") end def test_initialize_with_invalid_argument - assert_raises(ArgumentError) { Prefab::Context.new([]) } + assert_raises(ArgumentError) { Reforge::Context.new([]) } end def test_current - context = Prefab::Context.current - assert_instance_of Prefab::Context, context + context = Reforge::Context.current + assert_instance_of Reforge::Context, context assert_empty context.to_h end def test_current_set - context = Prefab::Context.new(EXAMPLE_PROPERTIES) - Prefab::Context.current = context.to_h - assert_instance_of Prefab::Context, context + context = Reforge::Context.new(EXAMPLE_PROPERTIES) + Reforge::Context.current = context.to_h + assert_instance_of Reforge::Context, context assert_equal stringify(EXAMPLE_PROPERTIES), context.to_h end def test_with_context - Prefab::Context.with_context(EXAMPLE_PROPERTIES) do - context = Prefab::Context.current + Reforge::Context.with_context(EXAMPLE_PROPERTIES) do + context = Reforge::Context.current assert_equal(stringify(EXAMPLE_PROPERTIES), context.to_h) assert_equal('some-user-key', context.get('user.key')) end end def test_with_context_nesting - Prefab::Context.with_context(EXAMPLE_PROPERTIES) do - Prefab::Context.with_context({ user: { key: 'abc', other: 'different' } }) do - context = Prefab::Context.current + Reforge::Context.with_context(EXAMPLE_PROPERTIES) do + Reforge::Context.with_context({ user: { key: 'abc', other: 'different' } }) do + context = Reforge::Context.current assert_equal({ 'user' => { 'key' => 'abc', 'other' => 'different' } }, context.to_h) end - context = Prefab::Context.current + context = Reforge::Context.current assert_equal(stringify(EXAMPLE_PROPERTIES), context.to_h) end end def test_with_context_merge_nesting - Prefab::Context.with_context(EXAMPLE_PROPERTIES) do - Prefab::Context.with_merged_context({ user: { key: 'hij', other: 'different' } }) do - context = Prefab::Context.current + Reforge::Context.with_context(EXAMPLE_PROPERTIES) do + Reforge::Context.with_merged_context({ user: { key: 'hij', other: 'different' } }) do + context = Reforge::Context.current assert_nil context.get('user.name') assert_equal context.get('user.key'), 'hij' assert_equal context.get('user.other'), 'different' @@ -77,36 +77,36 @@ def test_with_context_merge_nesting assert_equal context.get('team.plan'), 'pro' end - context = Prefab::Context.current + context = Reforge::Context.current assert_equal(stringify(EXAMPLE_PROPERTIES), context.to_h) end end def test_setting - context = Prefab::Context.new({}) + context = Reforge::Context.new({}) context.set('user', { key: 'value' }) context.set(:other, { key: 'different', something: 'other' }) assert_equal(stringify({ user: { key: 'value' }, other: { key: 'different', something: 'other' } }), context.to_h) end def test_getting - context = Prefab::Context.new(EXAMPLE_PROPERTIES) + context = Reforge::Context.new(EXAMPLE_PROPERTIES) assert_equal('some-user-key', context.get('user.key')) assert_equal('pro', context.get('team.plan')) end def test_dot_notation_getting - context = Prefab::Context.new({ 'user' => { 'key' => 'value' } }) + context = Reforge::Context.new({ 'user' => { 'key' => 'value' } }) assert_equal('value', context.get('user.key')) end def test_dot_notation_getting_with_symbols - context = Prefab::Context.new({ user: { key: 'value' } }) + context = Reforge::Context.new({ user: { key: 'value' } }) assert_equal('value', context.get('user.key')) end def test_clear - context = Prefab::Context.new(EXAMPLE_PROPERTIES) + context = Reforge::Context.new(EXAMPLE_PROPERTIES) context.clear assert_empty context.to_h @@ -115,7 +115,7 @@ def test_clear def test_to_proto namespace = "my.namespace" - contexts = Prefab::Context.new({ + contexts = Reforge::Context.new({ user: { id: 1, email: 'user-email' @@ -150,16 +150,16 @@ def test_to_proto_with_parent global_context = { cpu: { count: 4, speed: '2.4GHz' }, clock: { timezone: 'UTC' }, magic: { key: "global-key" } } default_context = { 'prefab-api-key' => { 'user-id' => 123 } } - Prefab::Context.global_context = global_context - Prefab::Context.default_context = default_context + Reforge::Context.global_context = global_context + Reforge::Context.default_context = default_context - Prefab::Context.current = { + Reforge::Context.current = { user: { id: 2, email: 'parent-email' }, magic: { key: 'parent-key', rabbits: 3 }, clock: { timezone: 'PST' } } - contexts = Prefab::Context.join(hash: { + contexts = Reforge::Context.join(hash: { user: { id: 1, email: 'user-email' @@ -168,7 +168,7 @@ def test_to_proto_with_parent id: 2, name: 'team-name' } - }, id: :jit, parent: Prefab::Context.current) + }, id: :jit, parent: Reforge::Context.current) expected = PrefabProto::ContextSet.new( contexts: [ @@ -232,11 +232,11 @@ def test_parent_lookup local_context = { clock: { timezone: 'PST' }, user: { name: 'Ted', email: 'ted@example.com' } } jit_context = { user: { name: 'Frank' } } - Prefab::Context.global_context = global_context - Prefab::Context.default_context = default_context - Prefab::Context.current = local_context + Reforge::Context.global_context = global_context + Reforge::Context.default_context = default_context + Reforge::Context.current = local_context - context = Prefab::Context.join(parent: Prefab::Context.current, hash: jit_context, id: :jit) + context = Reforge::Context.join(parent: Reforge::Context.current, hash: jit_context, id: :jit) # This digs all the way to the global context assert_equal 4, context.get('cpu.count') diff --git a/test/test_context_shape.rb b/test/test_context_shape.rb index bcd14a7..650d67e 100644 --- a/test/test_context_shape.rb +++ b/test/test_context_shape.rb @@ -27,7 +27,7 @@ def test_field_type_number [Email.new, 2], ].each do |value, expected| - actual = Prefab::ContextShape.field_type_number(value) + actual = Reforge::ContextShape.field_type_number(value) refute_nil actual, "Expected a value for input: #{value}" assert_equal expected, actual, "Expected #{expected} for #{value}" @@ -41,7 +41,7 @@ def test_mapping_is_exhaustive supported = type_fields.entries.reject do |entry| unsupported.include?(entry.name.to_sym) end.map(&:number) - mapped = Prefab::ContextShape::MAPPING.values.uniq + mapped = Reforge::ContextShape::MAPPING.values.uniq unless mapped == supported raise "ContextShape MAPPING needs update: #{mapped} != #{supported}" diff --git a/test/test_context_shape_aggregator.rb b/test/test_context_shape_aggregator.rb index 7dc7708..871e4f2 100644 --- a/test/test_context_shape_aggregator.rb +++ b/test/test_context_shape_aggregator.rb @@ -6,7 +6,7 @@ class TestContextShapeAggregator < Minitest::Test DOB = Date.new - CONTEXT_1 = Prefab::Context.new({ + CONTEXT_1 = Reforge::Context.new({ 'user' => { 'name' => 'user-name', 'email' => 'user.email', @@ -18,7 +18,7 @@ class TestContextShapeAggregator < Minitest::Test } }).freeze - CONTEXT_2 = Prefab::Context.new({ + CONTEXT_2 = Reforge::Context.new({ 'user' => { 'name' => 'other-user-name', 'dob' => DOB @@ -30,7 +30,7 @@ class TestContextShapeAggregator < Minitest::Test } }).freeze - CONTEXT_3 = Prefab::Context.new({ + CONTEXT_3 = Reforge::Context.new({ 'subscription' => { 'plan' => 'pro', 'trial' => true @@ -136,15 +136,15 @@ def test_sync def new_client(overrides = {}) super(**{ - prefab_datasources: Prefab::Options::DATASOURCES::ALL, + prefab_datasources: Reforge::Options::DATASOURCES::ALL, initialization_timeout_sec: 0, - on_init_failure: Prefab::Options::ON_INITIALIZATION_FAILURE::RETURN, + on_init_failure: Reforge::Options::ON_INITIALIZATION_FAILURE::RETURN, api_key: '123-development-yourapikey-SDK', context_upload_mode: :shape_only }.merge(overrides)) end def new_aggregator(max_shapes: 1000) - Prefab::ContextShapeAggregator.new(client: new_client, sync_interval: 1000, max_shapes: max_shapes) + Reforge::ContextShapeAggregator.new(client: new_client, sync_interval: 1000, max_shapes: max_shapes) end end diff --git a/test/test_criteria_evaluator.rb b/test/test_criteria_evaluator.rb index 73c18cc..7015c98 100644 --- a/test/test_criteria_evaluator.rb +++ b/test/test_criteria_evaluator.rb @@ -47,7 +47,7 @@ def test_always_true ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value end @@ -75,7 +75,7 @@ def test_nested_props_in ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -106,7 +106,7 @@ def test_nested_props_not_in ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -137,7 +137,7 @@ def test_prop_is_one_of ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -168,7 +168,7 @@ def test_prop_is_not_one_of ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -199,7 +199,7 @@ def test_prop_ends_with_one_of ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -230,7 +230,7 @@ def test_prop_does_not_end_with_one_of ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -261,7 +261,7 @@ def test_prop_starts_with_one_of ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -292,7 +292,7 @@ def test_prop_does_not_start_with_one_of ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -324,7 +324,7 @@ def test_prop_contains_one_of ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -355,7 +355,7 @@ def test_prop_does_not_contain_one_of ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -410,7 +410,7 @@ def test_in_seg ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, base_client: @base_client, namespace: nil, resolver: resolver_fake({ segment_key => segment_config })) @@ -465,7 +465,7 @@ def test_not_in_seg ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, base_client: @base_client, namespace: nil, resolver: resolver_fake({ segment_key => segment_config })) @@ -532,7 +532,7 @@ def test_multiple_conditions_in_one_value ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, base_client: @base_client, namespace: nil, resolver: resolver_fake({ segment_key => segment_config })) @@ -609,7 +609,7 @@ def test_multiple_conditions_in_multiple_values ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, base_client: @base_client, namespace: nil, resolver: resolver_fake({ segment_key => segment_config })) @@ -648,7 +648,7 @@ def test_stringifying_property_values_and_names ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, namespace: nil, base_client: @base_client) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -688,7 +688,7 @@ def test_in_int_range ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, namespace: nil, base_client: @base_client) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -729,7 +729,7 @@ def test_in_int_range_for_time ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, namespace: nil, base_client: @base_client) Timecop.freeze(now) do @@ -770,7 +770,7 @@ def test_evaluating_a_log_level ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal :DEBUG, evaluator.evaluate(context({})).unwrapped_value end @@ -793,7 +793,7 @@ def test_evaluating_a_weighted_value ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) 2.times do assert_equal 'abc', evaluator.evaluate(context('user' => { 'key' => '1' })).unwrapped_value @@ -831,7 +831,7 @@ def test_prop_regex_matches ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -862,7 +862,7 @@ def test_prop_regex_does_not_match ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -893,7 +893,7 @@ def test_prop_regex_does_not_match_returns_false_bad_regex ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value assert_equal DEFAULT_VALUE, evaluator.evaluate(context(user: { testProperty: 'abc' })).unwrapped_value @@ -925,7 +925,7 @@ def test_prop_regex_match_returns_false_bad_regex ] ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value @@ -936,7 +936,7 @@ def test_prop_regex_match_returns_false_bad_regex def test_less_than_works config = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_LESS_THAN, property_name: 'user.age', value_to_match: 10) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value assert_equal DEFAULT_VALUE, evaluator.evaluate(context(user: {age: 10})).unwrapped_value @@ -950,7 +950,7 @@ def test_less_than_works def test_less_or_equal_to_works config = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_LESS_THAN_OR_EQUAL, property_name: 'user.age', value_to_match: 10) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value assert_equal DESIRED_VALUE, evaluator.evaluate(context(user: {age: 10})).unwrapped_value @@ -964,7 +964,7 @@ def test_less_or_equal_to_works def test_greater_than_works config = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_GREATER_THAN, property_name: 'user.age', value_to_match: 10) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value assert_equal DEFAULT_VALUE, evaluator.evaluate(context(user: {age: 10})).unwrapped_value @@ -978,7 +978,7 @@ def test_greater_than_works def test_greater_than_or_equal_to_works config = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_GREATER_THAN_OR_EQUAL, property_name: 'user.age', value_to_match: 10) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value assert_equal DESIRED_VALUE, evaluator.evaluate(context(user: {age: 10})).unwrapped_value @@ -995,10 +995,10 @@ def test_date_before_works date = "2024-12-01T00:00:00Z" millis = Time.iso8601(date).utc.to_i * 1000 config_with_string = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_BEFORE, property_name: 'user.joinDate', value_to_match: date) - evaluator_with_string_config = Prefab::CriteriaEvaluator.new(config_with_string, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator_with_string_config = Reforge::CriteriaEvaluator.new(config_with_string, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) config_with_millis = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_BEFORE, property_name: 'user.joinDate', value_to_match: millis) - evaluator_with_millis_config = Prefab::CriteriaEvaluator.new(config_with_millis, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator_with_millis_config = Reforge::CriteriaEvaluator.new(config_with_millis, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator_with_millis_config.evaluate(context({})).unwrapped_value assert_equal DESIRED_VALUE, evaluator_with_millis_config.evaluate(context(user: {joinDate: millis-10000})).unwrapped_value @@ -1017,10 +1017,10 @@ def test_date_after_works date = "2024-12-01T00:00:00Z" millis = Time.iso8601(date).utc.to_i * 1000 config_with_string = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_AFTER, property_name: 'user.joinDate', value_to_match: date) - evaluator_with_string_config = Prefab::CriteriaEvaluator.new(config_with_string, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator_with_string_config = Reforge::CriteriaEvaluator.new(config_with_string, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) config_with_millis = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_AFTER, property_name: 'user.joinDate', value_to_match: millis) - evaluator_with_millis_config = Prefab::CriteriaEvaluator.new(config_with_millis, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, + evaluator_with_millis_config = Reforge::CriteriaEvaluator.new(config_with_millis, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator_with_millis_config.evaluate(context({})).unwrapped_value assert_equal DEFAULT_VALUE, evaluator_with_millis_config.evaluate(context(user: {joinDate: millis-10000})).unwrapped_value @@ -1037,7 +1037,7 @@ def test_date_after_works def test_semver_less_than config = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_SEMVER_LESS_THAN, property_name: 'user.version', value_to_match: "2.0.0") - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value assert_equal DEFAULT_VALUE, evaluator.evaluate(context(user:{version: "nonsense"})).unwrapped_value @@ -1048,7 +1048,7 @@ def test_semver_less_than def test_semver_equal_to config = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_SEMVER_EQUAL, property_name: 'user.version', value_to_match: "2.0.0") - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value assert_equal DEFAULT_VALUE, evaluator.evaluate(context(user:{version: "nonsense"})).unwrapped_value @@ -1059,7 +1059,7 @@ def test_semver_equal_to def test_semver_greater_than config = create_prefab_config(operator: PrefabProto::Criterion::CriterionOperator::PROP_SEMVER_GREATER_THAN, property_name: 'user.version', value_to_match: "2.0.0") - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DEFAULT_VALUE, evaluator.evaluate(context({})).unwrapped_value assert_equal DEFAULT_VALUE, evaluator.evaluate(context(user:{version: "nonsense"})).unwrapped_value @@ -1075,7 +1075,7 @@ def test_date_before_with_current_time property_name: 'prefab.current-time', value_to_match: future_time.iso8601 ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value end @@ -1086,7 +1086,7 @@ def test_date_after_with_current_time property_name: 'prefab.current-time', value_to_match: past_time.iso8601 ) - evaluator = Prefab::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) + evaluator = Reforge::CriteriaEvaluator.new(config, project_env_id: PROJECT_ENV_ID, resolver: nil, base_client: @base_client, namespace: nil) assert_equal DESIRED_VALUE, evaluator.evaluate(context({})).unwrapped_value end @@ -1108,7 +1108,7 @@ def raw(key) def get(key, properties = {}) # This only gets called for segments, so we don't need to pass in a resolver - Prefab::CriteriaEvaluator.new(@config[key], project_env_id: nil, resolver: nil, + Reforge::CriteriaEvaluator.new(@config[key], project_env_id: nil, resolver: nil, namespace: nil, base_client: @base_client).evaluate(properties) end end @@ -1119,7 +1119,7 @@ def resolver_fake(config) class FakeBaseClient def evaluation_summary_aggregator - @evaluation_summary_aggregator ||= Prefab::EvaluationSummaryAggregator.new(client: self, max_keys: 9999, sync_interval: 9999) + @evaluation_summary_aggregator ||= Reforge::EvaluationSummaryAggregator.new(client: self, max_keys: 9999, sync_interval: 9999) end def instance_hash diff --git a/test/test_duration.rb b/test/test_duration.rb index b6756d9..ee572c5 100644 --- a/test/test_duration.rb +++ b/test/test_duration.rb @@ -31,7 +31,7 @@ class DurationTest < Minitest::Test def test_parsing TESTS.each do |test| - assert_equal test[1], Prefab::Duration.parse(test[0]), "Failed parsing #{test[0]}" + assert_equal test[1], Reforge::Duration.parse(test[0]), "Failed parsing #{test[0]}" end end end diff --git a/test/test_encryption.rb b/test/test_encryption.rb index 8dd1a4d..04e8a18 100644 --- a/test/test_encryption.rb +++ b/test/test_encryption.rb @@ -4,9 +4,9 @@ class TestEncryption < Minitest::Test def test_encryption - secret = Prefab::Encryption.generate_new_hex_key + secret = Reforge::Encryption.generate_new_hex_key - enc = Prefab::Encryption.new(secret) + enc = Reforge::Encryption.new(secret) clear_text = "hello world" encrypted = enc.encrypt(clear_text) diff --git a/test/test_evaluation_summary_aggregator.rb b/test/test_evaluation_summary_aggregator.rb index fa569a5..6a73557 100644 --- a/test/test_evaluation_summary_aggregator.rb +++ b/test/test_evaluation_summary_aggregator.rb @@ -19,7 +19,7 @@ class TestEvaluationSummaryAggregator < Minitest::Test }.freeze def test_increments_counts - aggregator = Prefab::EvaluationSummaryAggregator.new(client: MockBaseClient.new, max_keys: 10, + aggregator = Reforge::EvaluationSummaryAggregator.new(client: MockBaseClient.new, max_keys: 10, sync_interval: EFFECTIVELY_NEVER) aggregator.record(config_key: 'foo', config_type: 'bar', counter: EXAMPLE_COUNTER) @@ -37,7 +37,7 @@ def test_increments_counts end def test_prepare_data - aggregator = Prefab::EvaluationSummaryAggregator.new(client: MockBaseClient.new, max_keys: 10, + aggregator = Reforge::EvaluationSummaryAggregator.new(client: MockBaseClient.new, max_keys: 10, sync_interval: EFFECTIVELY_NEVER) expected = { @@ -69,7 +69,7 @@ def test_sync Timecop.freeze(awhile_ago) do # start the aggregator in the past - aggregator = Prefab::EvaluationSummaryAggregator.new(client: client, max_keys: 10, + aggregator = Reforge::EvaluationSummaryAggregator.new(client: client, max_keys: 10, sync_interval: EFFECTIVELY_NEVER) end diff --git a/test/test_example_contexts_aggregator.rb b/test/test_example_contexts_aggregator.rb index 3c0f6cb..b1afbf9 100644 --- a/test/test_example_contexts_aggregator.rb +++ b/test/test_example_contexts_aggregator.rb @@ -5,10 +5,10 @@ class TestExampleContextsAggregator < Minitest::Test def test_record - aggregator = Prefab::ExampleContextsAggregator.new(client: MockBaseClient.new, max_contexts: 2, + aggregator = Reforge::ExampleContextsAggregator.new(client: MockBaseClient.new, max_contexts: 2, sync_interval: EFFECTIVELY_NEVER) - context = Prefab::Context.new(user: { key: 'abc' }, device: { key: 'def', mobile: true }) + context = Reforge::Context.new(user: { key: 'abc' }, device: { key: 'def', mobile: true }) aggregator.record(context) assert_equal [context], aggregator.data @@ -17,7 +17,7 @@ def test_record aggregator.record(context) assert_equal [context], aggregator.data - new_context = Prefab::Context.new( + new_context = Reforge::Context.new( user: { key: 'ghi', admin: true }, team: { key: '999' } ) @@ -26,15 +26,15 @@ def test_record assert_equal [context, new_context], aggregator.data # this doesn't get recorded because we're at max_contexts - aggregator.record(Prefab::Context.new(user: { key: 'new' })) + aggregator.record(Reforge::Context.new(user: { key: 'new' })) assert_equal [context, new_context], aggregator.data end def test_prepare_data - aggregator = Prefab::ExampleContextsAggregator.new(client: MockBaseClient.new, max_contexts: 10, + aggregator = Reforge::ExampleContextsAggregator.new(client: MockBaseClient.new, max_contexts: 10, sync_interval: EFFECTIVELY_NEVER) - context = Prefab::Context.new( + context = Reforge::Context.new( user: { key: 'abc' }, device: { key: 'def', mobile: true } ) @@ -46,10 +46,10 @@ def test_prepare_data end def test_record_with_expiry - aggregator = Prefab::ExampleContextsAggregator.new(client: MockBaseClient.new, max_contexts: 10, + aggregator = Reforge::ExampleContextsAggregator.new(client: MockBaseClient.new, max_contexts: 10, sync_interval: EFFECTIVELY_NEVER) - context = Prefab::Context.new( + context = Reforge::Context.new( user: { key: 'abc' }, device: { key: 'def', mobile: true } ) @@ -78,10 +78,10 @@ def test_sync client = MockBaseClient.new - aggregator = Prefab::ExampleContextsAggregator.new(client: client, max_contexts: 10, + aggregator = Reforge::ExampleContextsAggregator.new(client: client, max_contexts: 10, sync_interval: EFFECTIVELY_NEVER) - context = Prefab::Context.new( + context = Reforge::Context.new( user: { key: 'abc' }, device: { key: 'def', mobile: true } ) @@ -91,13 +91,13 @@ def test_sync aggregator.record(context) aggregator.record( - Prefab::Context.new( + Reforge::Context.new( user: { key: 'ghi' }, device: { key: 'jkl', mobile: false } ) ) - aggregator.record(Prefab::Context.new(user: { key: 'kev', name: 'kevin', age: 48.5 })) + aggregator.record(Reforge::Context.new(user: { key: 'kev', name: 'kevin', age: 48.5 })) assert_equal 3, aggregator.cache.data.size @@ -187,7 +187,7 @@ def test_sync # a sync past the expiry should clear the cache Timecop.freeze(now + (60 * 60) + 1) do # we need a new piece of data for the sync to happen - aggregator.record(Prefab::Context.new(user: { key: 'bozo', name: 'Bozo', age: 99 })) + aggregator.record(Reforge::Context.new(user: { key: 'bozo', name: 'Bozo', age: 99 })) requests = wait_for_post_requests(client) do aggregator.sync diff --git a/test/test_exponential_backoff.rb b/test/test_exponential_backoff.rb index 8ca0d38..9b3c088 100644 --- a/test/test_exponential_backoff.rb +++ b/test/test_exponential_backoff.rb @@ -4,7 +4,7 @@ class TestExponentialBackoff < Minitest::Test def test_backoff - backoff = Prefab::ExponentialBackoff.new(max_delay: 120) + backoff = Reforge::ExponentialBackoff.new(max_delay: 120) assert_equal 2, backoff.call assert_equal 4, backoff.call diff --git a/test/test_fixed_size_hash.rb b/test/test_fixed_size_hash.rb index a253030..7fb980e 100644 --- a/test/test_fixed_size_hash.rb +++ b/test/test_fixed_size_hash.rb @@ -3,7 +3,7 @@ require 'minitest/autorun' require 'test_helper' -module Prefab +module Reforge class FixedSizeHashTest < Minitest::Test def setup @max_size = 3 diff --git a/test/test_helper.rb b/test/test_helper.rb index 3d5c00c..d6d38a3 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -5,7 +5,7 @@ require 'minitest/reporters' Minitest::Reporters.use! unless ENV['RM_INFO'] -require 'prefab-cloud-ruby' +require 'reforge-sdk' Dir.glob(File.join(File.dirname(__FILE__), 'support', '**', '*.rb')).each do |file| require file diff --git a/test/test_integration.rb b/test/test_integration.rb index f35501a..bb039a6 100644 --- a/test/test_integration.rb +++ b/test/test_integration.rb @@ -62,7 +62,7 @@ class TestIntegration < Minitest::Test if test_case["name"].match(/doesn't raise on init timeout/) assert_logged [ - "Prefab::ConfigClient -- Couldn't Initialize In 0.01. Key any-key. Returning what we have" + "Reforge::ConfigClient -- Couldn't Initialize In 0.01. Key any-key. Returning what we have" ] end ensure diff --git a/test/test_internal_logger.rb b/test/test_internal_logger.rb index a535be9..b459acb 100644 --- a/test/test_internal_logger.rb +++ b/test/test_internal_logger.rb @@ -5,13 +5,13 @@ class TestInternalLogger < Minitest::Test def test_levels - logger_a = Prefab::InternalLogger.new(A) - logger_b = Prefab::InternalLogger.new(B) + logger_a = Reforge::InternalLogger.new(A) + logger_b = Reforge::InternalLogger.new(B) assert_equal :warn, logger_a.level assert_equal :warn, logger_b.level - Prefab::InternalLogger.using_prefab_log_filter! + Reforge::InternalLogger.using_reforge_log_filter! assert_equal :trace, logger_a.level assert_equal :trace, logger_b.level end diff --git a/test/test_javascript_stub.rb b/test/test_javascript_stub.rb index 99dbed0..f154cae 100644 --- a/test/test_javascript_stub.rb +++ b/test/test_javascript_stub.rb @@ -111,7 +111,7 @@ def setup end def test_bootstrap - result = Prefab::JavaScriptStub.new(@client).bootstrap({}) + result = Reforge::JavaScriptStub.new(@client).bootstrap({}) File.open('/tmp/prefab_config.json', 'w') do |f| @@ -124,7 +124,7 @@ def test_bootstrap } ).strip, result.strip - result = Prefab::JavaScriptStub.new(@client).bootstrap({ user: { email: 'gmail.com' } }) + result = Reforge::JavaScriptStub.new(@client).bootstrap({ user: { email: 'gmail.com' } }) File.open('/tmp/prefab_config.json', 'w') do |f| f.write(result) @@ -140,7 +140,7 @@ def test_bootstrap end def test_generate_stub - result = Prefab::JavaScriptStub.new(@client).generate_stub({}) + result = Reforge::JavaScriptStub.new(@client).generate_stub({}) assert_equal %( window.prefab = window.prefab || {}; @@ -157,7 +157,7 @@ def test_generate_stub }; ).strip, result.strip - result = Prefab::JavaScriptStub.new(@client).generate_stub({ user: { email: 'gmail.com' } }, 'myEvalCallback') + result = Reforge::JavaScriptStub.new(@client).generate_stub({ user: { email: 'gmail.com' } }, 'myEvalCallback') assert_equal %( window.prefab = window.prefab || {}; diff --git a/test/test_local_config_parser.rb b/test/test_local_config_parser.rb index 4caf256..5308802 100644 --- a/test/test_local_config_parser.rb +++ b/test/test_local_config_parser.rb @@ -13,7 +13,7 @@ def setup def test_parse_int_config key = :sample_int - parsed = Prefab::LocalConfigParser.parse(key, 123, {}, FILE_NAME)[key] + parsed = Reforge::LocalConfigParser.parse(key, 123, {}, FILE_NAME)[key] config = parsed[:config] assert_equal FILE_NAME, parsed[:source] @@ -28,7 +28,7 @@ def test_parse_int_config def test_flag_with_a_value key = :flag_with_a_value value = stringify_keys({ feature_flag: true, value: 'all-features' }) - parsed = Prefab::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] + parsed = Reforge::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] config = parsed[:config] assert_equal FILE_NAME, parsed[:source] @@ -39,14 +39,14 @@ def test_flag_with_a_value assert_equal 1, config.rows[0].values.size value_row = config.rows[0].values[0] - assert_equal 'all-features', Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, key, {}, @mock_resolver).unwrap + assert_equal 'all-features', Reforge::ConfigValueUnwrapper.deepest_value(value_row.value, key, {}, @mock_resolver).unwrap end def test_flag_in_user_key key = :flag_in_user_key value = stringify_keys({ 'feature_flag': 'true', value: true, criterion: { operator: 'PROP_IS_ONE_OF', property: 'user.key', values: %w[abc123 xyz987] } }) - parsed = Prefab::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] + parsed = Reforge::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] config = parsed[:config] assert_equal FILE_NAME, parsed[:source] @@ -58,7 +58,7 @@ def test_flag_in_user_key assert_equal 1, config.rows[0].values[0].criteria.size value_row = config.rows[0].values[0] - assert_equal true, Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, key, {}, @mock_resolver).unwrap + assert_equal true, Reforge::ConfigValueUnwrapper.deepest_value(value_row.value, key, {}, @mock_resolver).unwrap assert_equal 'user.key', value_row.criteria[0].property_name assert_equal :PROP_IS_ONE_OF, value_row.criteria[0].operator @@ -69,7 +69,7 @@ def test_provided_values with_env('LOOKUP_ENV', 'from env') do key = :test_provided value = stringify_keys({type: 'provided', source: 'ENV_VAR', lookup: 'LOOKUP_ENV'}) - parsed = Prefab::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] + parsed = Reforge::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] config = parsed[:config] assert_equal FILE_NAME, parsed[:source] @@ -83,8 +83,8 @@ def test_provided_values provided = value_row.value.provided assert_equal :ENV_VAR, provided.source assert_equal 'LOOKUP_ENV', provided.lookup - assert_equal 'from env', Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).unwrap - reportable_value = Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).reportable_value + assert_equal 'from env', Reforge::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).unwrap + reportable_value = Reforge::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).reportable_value assert_equal 'from env', reportable_value end end @@ -93,23 +93,23 @@ def test_confidential_provided_values with_env('LOOKUP_ENV', 'from env') do key = :test_provided value = stringify_keys({type: 'provided', source: 'ENV_VAR', lookup: 'LOOKUP_ENV', confidential: true}) - parsed = Prefab::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] + parsed = Reforge::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] config = parsed[:config] value_row = config.rows[0].values[0] provided = value_row.value.provided assert_equal :ENV_VAR, provided.source assert_equal 'LOOKUP_ENV', provided.lookup - assert_equal 'from env', Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).unwrap - reportable_value = Prefab::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).reportable_value - assert reportable_value.start_with? Prefab::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX + assert_equal 'from env', Reforge::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).unwrap + reportable_value = Reforge::ConfigValueUnwrapper.deepest_value(value_row.value, config, {}, @mock_resolver).reportable_value + assert reportable_value.start_with? Reforge::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX end end def test_confidential_values key = :test_confidential value = stringify_keys({value: 'a confidential string', confidential: true}) - parsed = Prefab::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] + parsed = Reforge::LocalConfigParser.parse(key, value, {}, FILE_NAME)[key] config = parsed[:config] assert_equal FILE_NAME, parsed[:source] @@ -120,9 +120,9 @@ def test_confidential_values value_row = config.rows[0].values[0] config_value = value_row.value - assert_equal 'a confidential string', Prefab::ConfigValueUnwrapper.deepest_value(config_value, key, {}, @mock_resolver).unwrap - reportable_value = Prefab::ConfigValueUnwrapper.deepest_value(config_value, key, {}, @mock_resolver).reportable_value - assert reportable_value.start_with? Prefab::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX + assert_equal 'a confidential string', Reforge::ConfigValueUnwrapper.deepest_value(config_value, key, {}, @mock_resolver).unwrap + reportable_value = Reforge::ConfigValueUnwrapper.deepest_value(config_value, key, {}, @mock_resolver).reportable_value + assert reportable_value.start_with? Reforge::ConfigValueUnwrapper::CONFIDENTIAL_PREFIX end private diff --git a/test/test_log_path_aggregator.rb b/test/test_log_path_aggregator.rb index a4bca45..dd65f76 100644 --- a/test/test_log_path_aggregator.rb +++ b/test/test_log_path_aggregator.rb @@ -8,8 +8,8 @@ class TestLogPathAggregator < Minitest::Test SLEEP_TIME = 0.01 def test_push - client = new_client(prefab_datasources: Prefab::Options::DATASOURCES::ALL,) - aggregator = Prefab::LogPathAggregator.new(client: client, max_paths: 2, sync_interval: 1000) + client = new_client(prefab_datasources: Reforge::Options::DATASOURCES::ALL,) + aggregator = Reforge::LogPathAggregator.new(client: client, max_paths: 2, sync_interval: 1000) aggregator.push('test.test_log_path_aggregator.test_push.1', ::Logger::INFO) aggregator.push('test.test_log_path_aggregator.test_push.2', ::Logger::DEBUG) @@ -47,8 +47,8 @@ def test_sync errors: 3 ) ], - start_at: Prefab::TimeHelpers.now_in_ms, - end_at: Prefab::TimeHelpers.now_in_ms,)) + start_at: Reforge::TimeHelpers.now_in_ms, + end_at: Reforge::TimeHelpers.now_in_ms,)) ] ) ] @@ -60,7 +60,7 @@ def test_sync def new_client(overrides = {}) super(**{ - prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY, + prefab_datasources: Reforge::Options::DATASOURCES::LOCAL_ONLY, api_key: '123-development-yourapikey-SDK', collect_max_paths: 1000, collect_sync_interval: 1000 # we'll trigger sync manually in our test diff --git a/test/test_logger.rb b/test/test_logger.rb index aa3de27..d9ccc46 100644 --- a/test/test_logger.rb +++ b/test/test_logger.rb @@ -20,16 +20,16 @@ class TestLogger < Minitest::Test def setup super - Prefab::LoggerClient.send(:public, :class_path_name) - Prefab::LoggerClient.send(:public, :level_of) + Reforge::LoggerClient.send(:public, :class_path_name) + Reforge::LoggerClient.send(:public, :level_of) @client = new_client @logger = @client.log end def test_bootstrap_log_level - assert !Prefab.bootstrap_log_level(SemanticLogger::Log.new("TestLogger",:info)) - with_env('PREFAB_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL', 'info') do - assert Prefab.bootstrap_log_level(SemanticLogger::Log.new("TestLogger",:info)) + assert !Reforge.bootstrap_log_level(SemanticLogger::Log.new("TestLogger",:info)) + with_env('REFORGE_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL', 'info') do + assert Reforge.bootstrap_log_level(SemanticLogger::Log.new("TestLogger",:info)) end end @@ -218,8 +218,8 @@ def test_logging_with_criteria_on_key_path def test_class_path_name assert_equal "minitest.test.test_logger", @logger.class_path_name("TestLogger") - assert_equal "prefab.logger_client", @logger.class_path_name("Prefab::LoggerClient") - assert_equal "semantic_logger.logger.prefab.internal_logger", @logger.class_path_name("Prefab::InternalLogger") + assert_equal "reforge.logger_client", @logger.class_path_name("Reforge::LoggerClient") + assert_equal "semantic_logger.logger.reforge.internal_logger", @logger.class_path_name("Reforge::InternalLogger") end end diff --git a/test/test_logger_initialization.rb b/test/test_logger_initialization.rb index 74df978..87d0309 100644 --- a/test/test_logger_initialization.rb +++ b/test/test_logger_initialization.rb @@ -6,7 +6,7 @@ class TestLoggerInitialization < Minitest::Test def test_init_out_of_order # assert nothing blows up - Prefab.log_filter + Reforge.log_filter end end diff --git a/test/test_options.rb b/test/test_options.rb index b08d2c2..107efd1 100644 --- a/test/test_options.rb +++ b/test/test_options.rb @@ -6,88 +6,88 @@ class TestOptions < Minitest::Test API_KEY = 'abcdefg' def test_api_override_env_var - assert_equal Prefab::Options::DEFAULT_SOURCES, Prefab::Options.new.sources + assert_equal Reforge::Options::DEFAULT_SOURCES, Reforge::Options.new.sources # blank doesn't take effect with_env('PREFAB_API_URL_OVERRIDE', '') do - assert_equal Prefab::Options::DEFAULT_SOURCES, Prefab::Options.new.sources + assert_equal Reforge::Options::DEFAULT_SOURCES, Reforge::Options.new.sources end # non-blank does take effect with_env('PREFAB_API_URL_OVERRIDE', 'https://override.example.com') do - assert_equal ["https://override.example.com"], Prefab::Options.new.sources + assert_equal ["https://override.example.com"], Reforge::Options.new.sources end end def test_overriding_sources - assert_equal Prefab::Options::DEFAULT_SOURCES, Prefab::Options.new.sources + assert_equal Reforge::Options::DEFAULT_SOURCES, Reforge::Options.new.sources # a plain string ends up wrapped in an array source = 'https://example.com' - assert_equal [source], Prefab::Options.new(sources: source).sources + assert_equal [source], Reforge::Options.new(sources: source).sources sources = ['https://example.com', 'https://example2.com'] - assert_equal sources, Prefab::Options.new(sources: sources).sources + assert_equal sources, Reforge::Options.new(sources: sources).sources end def test_works_with_named_arguments - assert_equal API_KEY, Prefab::Options.new(api_key: API_KEY).api_key + assert_equal API_KEY, Reforge::Options.new(api_key: API_KEY).api_key end def test_works_with_hash - assert_equal API_KEY, Prefab::Options.new({ api_key: API_KEY }).api_key + assert_equal API_KEY, Reforge::Options.new({ api_key: API_KEY }).api_key end def test_collect_max_paths - assert_equal 1000, Prefab::Options.new.collect_max_paths - assert_equal 100, Prefab::Options.new(collect_max_paths: 100).collect_max_paths + assert_equal 1000, Reforge::Options.new.collect_max_paths + assert_equal 100, Reforge::Options.new(collect_max_paths: 100).collect_max_paths end def test_collect_max_paths_with_local_only - options = Prefab::Options.new(collect_max_paths: 100, - prefab_datasources: Prefab::Options::DATASOURCES::LOCAL_ONLY) + options = Reforge::Options.new(collect_max_paths: 100, + prefab_datasources: Reforge::Options::DATASOURCES::LOCAL_ONLY) assert_equal 0, options.collect_max_paths end def test_collect_max_paths_with_collect_logger_counts_false - options = Prefab::Options.new(collect_max_paths: 100, + options = Reforge::Options.new(collect_max_paths: 100, collect_logger_counts: false) assert_equal 0, options.collect_max_paths end def test_collect_max_evaluation_summaries - assert_equal 100_000, Prefab::Options.new.collect_max_evaluation_summaries - assert_equal 0, Prefab::Options.new(collect_evaluation_summaries: false).collect_max_evaluation_summaries + assert_equal 100_000, Reforge::Options.new.collect_max_evaluation_summaries + assert_equal 0, Reforge::Options.new(collect_evaluation_summaries: false).collect_max_evaluation_summaries assert_equal 3, - Prefab::Options.new(collect_max_evaluation_summaries: 3).collect_max_evaluation_summaries + Reforge::Options.new(collect_max_evaluation_summaries: 3).collect_max_evaluation_summaries end def test_context_upload_mode_periodic - options = Prefab::Options.new(context_upload_mode: :periodic_example, context_max_size: 100) + options = Reforge::Options.new(context_upload_mode: :periodic_example, context_max_size: 100) assert_equal 100, options.collect_max_example_contexts - options = Prefab::Options.new(context_upload_mode: :none) + options = Reforge::Options.new(context_upload_mode: :none) assert_equal 0, options.collect_max_example_contexts end def test_context_upload_mode_shape_only - options = Prefab::Options.new(context_upload_mode: :shape_only, context_max_size: 100) + options = Reforge::Options.new(context_upload_mode: :shape_only, context_max_size: 100) assert_equal 100, options.collect_max_shapes - options = Prefab::Options.new(context_upload_mode: :none) + options = Reforge::Options.new(context_upload_mode: :none) assert_equal 0, options.collect_max_shapes end def test_context_upload_mode_none - options = Prefab::Options.new(context_upload_mode: :none) + options = Reforge::Options.new(context_upload_mode: :none) assert_equal 0, options.collect_max_example_contexts - options = Prefab::Options.new(context_upload_mode: :none) + options = Reforge::Options.new(context_upload_mode: :none) assert_equal 0, options.collect_max_shapes end def test_loading_a_datafile - options = Prefab::Options.new(datafile: "#{Dir.pwd}/test/fixtures/datafile.json") + options = Reforge::Options.new(datafile: "#{Dir.pwd}/test/fixtures/datafile.json") assert_equal "#{Dir.pwd}/test/fixtures/datafile.json", options.datafile end end diff --git a/test/test_prefab.rb b/test/test_prefab.rb index 831fe93..9d751e5 100644 --- a/test/test_prefab.rb +++ b/test/test_prefab.rb @@ -6,39 +6,39 @@ class TestPrefab < Minitest::Test def test_get init_once - assert_equal 'default', Prefab.get('does.not.exist', 'default') - assert_equal 'default', Prefab.get('does.not.exist', 'default', { some: { key: 'value' } }) - assert_equal 'test sample value', Prefab.get('sample') - assert_equal 123, Prefab.get('sample_int') + assert_equal 'default', Reforge.get('does.not.exist', 'default') + assert_equal 'default', Reforge.get('does.not.exist', 'default', { some: { key: 'value' } }) + assert_equal 'test sample value', Reforge.get('sample') + assert_equal 123, Reforge.get('sample_int') ctx = { user: { key: 'jimmy' } } - assert_equal 'default-goes-here', Prefab.get('user_key_match', 'default-goes-here', ctx) + assert_equal 'default-goes-here', Reforge.get('user_key_match', 'default-goes-here', ctx) ctx = { user: { key: 'abc123' } } - assert_equal true, Prefab.get('user_key_match', nil, ctx) + assert_equal true, Reforge.get('user_key_match', nil, ctx) end def test_defined init_once - refute Prefab.defined?('does_not_exist') - assert Prefab.defined?('sample_int') - assert Prefab.defined?('disabled_flag') + refute Reforge.defined?('does_not_exist') + assert Reforge.defined?('sample_int') + assert Reforge.defined?('disabled_flag') end def test_is_ff init_once - assert Prefab.is_ff?('flag_with_a_value') - refute Prefab.is_ff?('sample_int') - refute Prefab.is_ff?('does_not_exist') + assert Reforge.is_ff?('flag_with_a_value') + refute Reforge.is_ff?('sample_int') + refute Reforge.is_ff?('does_not_exist') end private def init_once - unless Prefab.instance_variable_get("@singleton") - Prefab.init(prefab_options) + unless Reforge.instance_variable_get("@singleton") + Reforge.init(prefab_options) end end end diff --git a/test/test_rate_limit_cache.rb b/test/test_rate_limit_cache.rb index c96e871..ee70ead 100644 --- a/test/test_rate_limit_cache.rb +++ b/test/test_rate_limit_cache.rb @@ -5,18 +5,18 @@ class RateLimitCacheTest < Minitest::Test def test_set_and_fresh - cache = Prefab::RateLimitCache.new(5) + cache = Reforge::RateLimitCache.new(5) cache.set('key') assert cache.fresh?('key') end def test_fresh_with_no_set - cache = Prefab::RateLimitCache.new(5) + cache = Reforge::RateLimitCache.new(5) refute cache.fresh?('key') end def test_get_after_expiration - cache = Prefab::RateLimitCache.new(5) + cache = Reforge::RateLimitCache.new(5) Timecop.freeze(Time.now - 6) do cache.set('key') @@ -30,7 +30,7 @@ def test_get_after_expiration end def test_prune - cache = Prefab::RateLimitCache.new(5) + cache = Reforge::RateLimitCache.new(5) Timecop.freeze(Time.now - 6) do cache.set('key') diff --git a/test/test_sse_config_client.rb b/test/test_sse_config_client.rb index 9a3c152..ca9bca6 100644 --- a/test/test_sse_config_client.rb +++ b/test/test_sse_config_client.rb @@ -10,13 +10,13 @@ def test_client 'https://belt.staging-prefab.cloud/' ] - options = Prefab::Options.new(sources: sources, api_key: ENV.fetch('PREFAB_INTEGRATION_TEST_API_KEY', nil)) + options = Reforge::Options.new(sources: sources, api_key: ENV.fetch('PREFAB_INTEGRATION_TEST_API_KEY', nil)) config_loader = OpenStruct.new(highwater_mark: 4) - client = Prefab::SSEConfigClient.new(options, config_loader) + client = Reforge::SSEConfigClient.new(options, config_loader) - assert_equal 4, client.headers['x-prefab-start-at-id'] + assert_equal 4, client.headers['Last-Event-ID'] assert_equal "https://stream.staging-prefab.cloud", client.source result = nil @@ -40,15 +40,15 @@ def test_failing_over 'https://api.staging-prefab.cloud/' ] - prefab_options = Prefab::Options.new(sources: sources, api_key: ENV.fetch('PREFAB_INTEGRATION_TEST_API_KEY', nil)) + prefab_options = Reforge::Options.new(sources: sources, api_key: ENV.fetch('PREFAB_INTEGRATION_TEST_API_KEY', nil)) config_loader = OpenStruct.new(highwater_mark: 4) - sse_options = Prefab::SSEConfigClient::Options.new(seconds_between_new_connection: 0.01, sleep_delay_for_new_connection_check: 0.01) + sse_options = Reforge::SSEConfigClient::Options.new(seconds_between_new_connection: 0.01, sleep_delay_for_new_connection_check: 0.01) - client = Prefab::SSEConfigClient.new(prefab_options, config_loader, sse_options) + client = Reforge::SSEConfigClient.new(prefab_options, config_loader, sse_options) - assert_equal 4, client.headers['x-prefab-start-at-id'] + assert_equal 4, client.headers['Last-Event-ID'] result = nil @@ -84,10 +84,10 @@ def test_recovering_from_disconnection server.start end - sse_options = Prefab::SSEConfigClient::Options.new( + sse_options = Reforge::SSEConfigClient::Options.new( sse_default_reconnect_time: 0.1 ) - client = Prefab::SSEConfigClient.new(prefab_options, config_loader, sse_options) + client = Reforge::SSEConfigClient.new(prefab_options, config_loader, sse_options) client.start do |_configs, event, _source| last_event_id = event.id.to_i @@ -120,13 +120,13 @@ def test_recovering_from_an_error server.start end - sse_options = Prefab::SSEConfigClient::Options.new( + sse_options = Reforge::SSEConfigClient::Options.new( sse_default_reconnect_time: 0.1, seconds_between_new_connection: 0.1, sleep_delay_for_new_connection_check: 0.1, errors_to_close_connection: [SSE::Errors::HTTPStatusError] ) - client = Prefab::SSEConfigClient.new(prefab_options, config_loader, sse_options, logger) + client = Reforge::SSEConfigClient.new(prefab_options, config_loader, sse_options, logger) client.start do |_configs, event, _source| last_event_id = event.id.to_i diff --git a/test/test_weighted_value_resolver.rb b/test/test_weighted_value_resolver.rb index 1bd756a..36e3569 100644 --- a/test/test_weighted_value_resolver.rb +++ b/test/test_weighted_value_resolver.rb @@ -7,7 +7,7 @@ class TestWeightedValueResolver < Minitest::Test def test_resolving_single_value values = weighted_values([['abc', 1]]) - resolver = Prefab::WeightedValueResolver.new(values, KEY, nil) + resolver = Reforge::WeightedValueResolver.new(values, KEY, nil) assert_equal 'abc', resolver.resolve[0].value.string assert_equal 0, resolver.resolve[1] end @@ -15,11 +15,11 @@ def test_resolving_single_value def test_resolving_multiple_values_evenly_distributed values = weighted_values([['abc', 1], ['def', 1]]) - resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:001') + resolver = Reforge::WeightedValueResolver.new(values, KEY, 'user:001') assert_equal 'abc', resolver.resolve[0].value.string assert_equal 0, resolver.resolve[1] - resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:456') + resolver = Reforge::WeightedValueResolver.new(values, KEY, 'user:456') assert_equal 'def', resolver.resolve[0].value.string assert_equal 1, resolver.resolve[1] end @@ -27,15 +27,15 @@ def test_resolving_multiple_values_evenly_distributed def test_resolving_multiple_values_unevenly_distributed values = weighted_values([['abc', 1], ['def', 98], ['ghi', 1]]) - resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:456') + resolver = Reforge::WeightedValueResolver.new(values, KEY, 'user:456') assert_equal 'def', resolver.resolve[0].value.string assert_equal 1, resolver.resolve[1] - resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:103') + resolver = Reforge::WeightedValueResolver.new(values, KEY, 'user:103') assert_equal 'ghi', resolver.resolve[0].value.string assert_equal 2, resolver.resolve[1] - resolver = Prefab::WeightedValueResolver.new(values, KEY, 'user:119') + resolver = Reforge::WeightedValueResolver.new(values, KEY, 'user:119') assert_equal 'abc', resolver.resolve[0].value.string assert_equal 0, resolver.resolve[1] end @@ -45,7 +45,7 @@ def test_resolving_multiple_values_with_simulation results = {} 10_000.times do |i| - result = Prefab::WeightedValueResolver.new(values, KEY, "user:#{i}").resolve[0].value.string + result = Reforge::WeightedValueResolver.new(values, KEY, "user:#{i}").resolve[0].value.string results[result] ||= 0 results[result] += 1 end From bed346f32cbfd309179feb2ee4ee85f058851eb9 Mon Sep 17 00:00:00 2001 From: James Kebinger Date: Thu, 18 Sep 2025 17:46:20 -0500 Subject: [PATCH 2/4] Rename apiKey to sdkKey, including env var loading --- .github/workflows/ruby.yml | 6 +++--- README.md | 2 +- lib/reforge-sdk.rb | 2 +- lib/reforge/client.rb | 8 ++++---- lib/reforge/config_client.rb | 6 +++--- lib/reforge/config_client_presenter.rb | 6 +++--- .../errors/initialization_timeout_error.rb | 3 +-- ...api_key_error.rb => invalid_sdk_key_error.rb} | 6 +++--- lib/reforge/http_connection.rb | 10 +++++----- lib/reforge/options.rb | 12 ++++++------ lib/reforge/sse_config_client.rb | 4 ++-- test/integration_test.rb | 2 +- test/test_caching_http_connection.rb | 16 ++++++++-------- test/test_client.rb | 6 +++--- test/test_config_client.rb | 14 +++++++------- test/test_context_shape_aggregator.rb | 2 +- test/test_log_path_aggregator.rb | 2 +- test/test_options.rb | 4 ++-- test/test_sse_config_client.rb | 8 ++++---- 19 files changed, 59 insertions(+), 60 deletions(-) rename lib/reforge/errors/{invalid_api_key_error.rb => invalid_sdk_key_error.rb} (58%) diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index 0eb8cf0..94f6d24 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -22,7 +22,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - ruby-version: ['3.0','3.1','3.2','3.3'] + ruby-version: ['3.1','3.2','3.3','3.4'] steps: - uses: actions/checkout@v4 @@ -42,7 +42,7 @@ jobs: - name: Run tests run: bundle exec rake --trace env: - PREFAB_INTEGRATION_TEST_API_KEY: ${{ secrets.PREFAB_INTEGRATION_TEST_API_KEY }} - PREFAB_INTEGRATION_TEST_ENCRYPTION_KEY: ${{ secrets.PREFAB_INTEGRATION_TEST_ENCRYPTION_KEY }} + REFORGE_INTEGRATION_TEST_API_KEY: ${{ secrets.REFORGE_INTEGRATION_TEST_API_KEY }} + PREFAB_INTEGRATION_TEST_ENCRYPTION_KEY: c87ba22d8662282abe8a0e4651327b579cb64a454ab0f4c170b45b15f049a221 NOT_A_NUMBER: "abcd" IS_A_NUMBER: "1234" diff --git a/README.md b/README.md index 85527c6..8216bd5 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Many ruby web servers fork. When the process is forked, the current realtime upd ```ruby #config/application.rb -Prefab.init # reads PREFAB_API_KEY env var by default +Prefab.init # reads REFORGE_SDK_KEY env var by default ``` ```ruby diff --git a/lib/reforge-sdk.rb b/lib/reforge-sdk.rb index 7ff0439..99f8f34 100644 --- a/lib/reforge-sdk.rb +++ b/lib/reforge-sdk.rb @@ -20,7 +20,7 @@ module Reforge require 'reforge/encryption' require 'reforge/exponential_backoff' require 'reforge/errors/initialization_timeout_error' -require 'reforge/errors/invalid_api_key_error' +require 'reforge/errors/invalid_sdk_key_error' require 'reforge/errors/missing_default_error' require 'reforge/errors/env_var_parse_error' require 'reforge/errors/missing_env_var_error' diff --git a/lib/reforge/client.rb b/lib/reforge/client.rb index 407a2cb..f05b0fa 100644 --- a/lib/reforge/client.rb +++ b/lib/reforge/client.rb @@ -8,7 +8,7 @@ class Client MAX_SLEEP_SEC = 10 BASE_SLEEP_SEC = 0.5 - attr_reader :namespace, :interceptor, :api_key, :options, :instance_hash + attr_reader :namespace, :interceptor, :sdk_key, :options, :instance_hash def initialize(options = Reforge::Options.new) @options = options.is_a?(Reforge::Options) ? options : Reforge::Options.new(options) @@ -21,8 +21,8 @@ def initialize(options = Reforge::Options.new) elsif @options.datafile? LOG.debug 'Prefab Running in DataFile Mode' else - @api_key = @options.api_key - raise Reforge::Errors::InvalidApiKeyError, @api_key if @api_key.nil? || @api_key.empty? || api_key.count('-') < 1 + @sdk_key = @options.sdk_key + raise Reforge::Errors::InvalidSdkKeyError, @sdk_key if @sdk_key.nil? || @sdk_key.empty? || sdk_key.count('-') < 1 end context.clear @@ -112,7 +112,7 @@ def get(key, default = NO_DEFAULT_PROVIDED, jit_context = NO_DEFAULT_PROVIDED) end def post(path, body) - Reforge::HttpConnection.new(@options.telemetry_destination, @api_key).post(path, body) + Reforge::HttpConnection.new(@options.telemetry_destination, @sdk_key).post(path, body) end def inspect diff --git a/lib/reforge/config_client.rb b/lib/reforge/config_client.rb index c8cb7f3..acc4717 100644 --- a/lib/reforge/config_client.rb +++ b/lib/reforge/config_client.rb @@ -129,7 +129,7 @@ def load_checkpoint def load_source_checkpoint(start_at_id: 0) @options.config_sources.each do |source| - conn = Reforge::CachingHttpConnection.new("#{source}/api/v1/configs/#{start_at_id}", @base_client.api_key) + conn = Reforge::CachingHttpConnection.new("#{source}/api/v1/configs/#{start_at_id}", @base_client.sdk_key) result = load_url(conn, :remote_api) return true if result end @@ -198,7 +198,7 @@ def cache_path end def calc_cache_path - file_name = "prefab.cache.#{@base_client.options.api_key_id}.json" + file_name = "prefab.cache.#{@base_client.options.sdk_key_id}.json" dir = ENV.fetch('XDG_CACHE_HOME', File.join(Dir.home, '.cache')) File.join(dir, file_name) end @@ -266,7 +266,7 @@ def finish_init!(source, project_id) source: source, project_id: project_id, project_env_id: @config_resolver.project_env_id, - api_key_id: @base_client.options.api_key_id + sdk_key_id: @base_client.options.sdk_key_id ) LOG.info presenter.to_s LOG.debug to_s diff --git a/lib/reforge/config_client_presenter.rb b/lib/reforge/config_client_presenter.rb index 5b61d58..e042a5a 100644 --- a/lib/reforge/config_client_presenter.rb +++ b/lib/reforge/config_client_presenter.rb @@ -2,16 +2,16 @@ module Reforge class ConfigClientPresenter - def initialize(size:, source:, project_id:, project_env_id:, api_key_id:) + def initialize(size:, source:, project_id:, project_env_id:, sdk_key_id:) @size = size @source = source @project_id = project_id @project_env_id = project_env_id - @api_key_id = api_key_id + @sdk_key_id = sdk_key_id end def to_s - "Configuration Loaded count=#{@size} source=#{@source} project=#{@project_id} project-env=#{@project_env_id} prefab.api-key-id=#{@api_key_id}" + "Configuration Loaded count=#{@size} source=#{@source} project=#{@project_id} project-env=#{@project_env_id} prefab.sdk-key-id=#{@sdk_key_id}" end end end diff --git a/lib/reforge/errors/initialization_timeout_error.rb b/lib/reforge/errors/initialization_timeout_error.rb index da2ed31..c336504 100644 --- a/lib/reforge/errors/initialization_timeout_error.rb +++ b/lib/reforge/errors/initialization_timeout_error.rb @@ -4,8 +4,7 @@ module Reforge module Errors class InitializationTimeoutError < Reforge::Error def initialize(timeout_sec, key) - message = "Reforge couldn't initialize in #{timeout_sec} second timeout. Trying to fetch key `#{key}`." - + message = "Reforge SDK couldn't initialize in #{timeout_sec} second timeout. Trying to fetch key `#{key}`." super(message) end end diff --git a/lib/reforge/errors/invalid_api_key_error.rb b/lib/reforge/errors/invalid_sdk_key_error.rb similarity index 58% rename from lib/reforge/errors/invalid_api_key_error.rb rename to lib/reforge/errors/invalid_sdk_key_error.rb index 290dc10..f12ef98 100644 --- a/lib/reforge/errors/invalid_api_key_error.rb +++ b/lib/reforge/errors/invalid_sdk_key_error.rb @@ -2,14 +2,14 @@ module Reforge module Errors - class InvalidApiKeyError < Reforge::Error + class InvalidSdkKeyError < Reforge::Error def initialize(key) if key.nil? || key.empty? - message = 'No API key. Set PREFAB_API_KEY env var or use PREFAB_DATASOURCES=LOCAL_ONLY' + message = 'No SDK key. Set REFORGE_SDK_KEY env var or use PREFAB_DATASOURCES=LOCAL_ONLY' super(message) else - message = "Your API key format is invalid. Expecting something like 123-development-yourapikey-SDK. You provided `#{key}`" + message = "Your SDK key format is invalid. Expecting something like 123-development-yourapikey-SDK. You provided `#{key}`" super(message) end diff --git a/lib/reforge/http_connection.rb b/lib/reforge/http_connection.rb index c1bad20..24bc77e 100644 --- a/lib/reforge/http_connection.rb +++ b/lib/reforge/http_connection.rb @@ -6,12 +6,12 @@ class HttpConnection PROTO_HEADERS = { 'Content-Type' => 'application/x-protobuf', 'Accept' => 'application/x-protobuf', - 'X-ReforgeCloud-Client-Version' => "reforge-cloud-ruby-#{Reforge::VERSION}" + 'X-Reforge-SDK-Version' => "sdk-ruby-#{Reforge::VERSION}" }.freeze - def initialize(uri, api_key) + def initialize(uri, sdk_key) @uri = uri - @api_key = api_key + @sdk_key = sdk_key end def uri @@ -29,13 +29,13 @@ def post(path, body) def connection(headers = {}) if Faraday::VERSION[0].to_i >= 2 Faraday.new(@uri) do |conn| - conn.request :authorization, :basic, AUTH_USER, @api_key + conn.request :authorization, :basic, AUTH_USER, @sdk_key conn.headers.merge!(headers) end else Faraday.new(@uri) do |conn| - conn.request :basic_auth, AUTH_USER, @api_key + conn.request :basic_auth, AUTH_USER, @sdk_key conn.headers.merge!(headers) end diff --git a/lib/reforge/options.rb b/lib/reforge/options.rb index edb7d79..92934c6 100644 --- a/lib/reforge/options.rb +++ b/lib/reforge/options.rb @@ -3,7 +3,7 @@ module Reforge # This class contains all the options that can be passed to the Prefab client. class Options - attr_reader :api_key + attr_reader :sdk_key attr_reader :namespace attr_reader :sources attr_reader :sse_sources @@ -49,13 +49,13 @@ module DATASOURCES private def init( sources: nil, - api_key: ENV['PREFAB_API_KEY'], + sdk_key: ENV['SDK_API_KEY'] || ENV['PREFAB_API_KEY'], namespace: '', prefab_api_url: nil, on_no_default: ON_NO_DEFAULT::RAISE, # options :raise, :warn_and_return_nil, initialization_timeout_sec: 10, # how long to wait before on_init_failure on_init_failure: ON_INITIALIZATION_FAILURE::RAISE, - prefab_datasources: ENV['PREFAB_DATASOURCES'] == 'LOCAL_ONLY' ? DATASOURCES::LOCAL_ONLY : DATASOURCES::ALL, + prefab_datasources: (ENV['REFORGE_DATASOURCES'] || ENV['PREFAB_DATASOURCES']) == 'LOCAL_ONLY' ? DATASOURCES::LOCAL_ONLY : DATASOURCES::ALL, prefab_config_override_dir: Dir.home, prefab_config_classpath_dir: '.', # where to load local overrides prefab_envs: ENV['PREFAB_ENVS'].nil? ? [] : ENV['PREFAB_ENVS'].split(','), @@ -73,7 +73,7 @@ module DATASOURCES symbolize_json_names: false, global_context: {} ) - @api_key = api_key + @sdk_key = sdk_key @namespace = namespace @on_no_default = on_no_default @initialization_timeout_sec = initialization_timeout_sec @@ -177,8 +177,8 @@ def collect_max_evaluation_summaries @collect_max_evaluation_summaries end - def api_key_id - @api_key&.split("-")&.first + def sdk_key_id + @sdk_key&.split("-")&.first end def for_fork diff --git a/lib/reforge/sse_config_client.rb b/lib/reforge/sse_config_client.rb index e0bf2e0..b667e31 100644 --- a/lib/reforge/sse_config_client.rb +++ b/lib/reforge/sse_config_client.rb @@ -89,13 +89,13 @@ def connect(&load_configs) end def headers - auth = "#{AUTH_USER}:#{@prefab_options.api_key}" + auth = "#{AUTH_USER}:#{@prefab_options.sdk_key}" auth_string = Base64.strict_encode64(auth) return { 'Last-Event-ID' => @config_loader.highwater_mark, 'Authorization' => "Basic #{auth_string}", 'Accept' => 'text/event-stream', - 'X-ReforgeCloud-Client-Version' => "reforge-cloud-ruby-#{Reforge::VERSION}" + 'X-Reforge-SDK-Version' => "sdk-ruby-#{Reforge::VERSION}" } end diff --git a/test/integration_test.rb b/test/integration_test.rb index b0103c3..47d28dc 100644 --- a/test/integration_test.rb +++ b/test/integration_test.rb @@ -134,7 +134,7 @@ def base_client_options prefab_config_classpath_dir: 'test', prefab_envs: ['unit_tests'], prefab_datasources: Reforge::Options::DATASOURCES::ALL, - api_key: ENV['PREFAB_INTEGRATION_TEST_API_KEY'], + sdk_key: ENV['REFORGE_INTEGRATION_TEST_API_KEY'], sources: [ 'https://belt.staging-prefab.cloud', 'https://suspenders.staging-prefab.cloud', diff --git a/test/test_caching_http_connection.rb b/test/test_caching_http_connection.rb index 205dab1..131c948 100644 --- a/test/test_caching_http_connection.rb +++ b/test/test_caching_http_connection.rb @@ -6,7 +6,7 @@ module Reforge class CachingHttpConnectionTest < Minitest::Test def setup @uri = 'https://api.example.com' - @api_key = 'test-key' + @sdk_key = 'test-key' @path = '/some/path' # Reset the cache before each test @@ -18,7 +18,7 @@ def setup # Stub the HttpConnection constructor HttpConnection.stub :new, @http_connection do - @subject = CachingHttpConnection.new(@uri, @api_key) + @subject = CachingHttpConnection.new(@uri, @sdk_key) end end @@ -73,7 +73,7 @@ def mock.uri mock.expect(:get, response, [@path, { 'If-None-Match' => 'abc123' }]) Timecop.freeze do - subject = CachingHttpConnection.new(@uri, @api_key) + subject = CachingHttpConnection.new(@uri, @sdk_key) subject.instance_variable_set('@connection', mock) # Initial request @@ -116,7 +116,7 @@ def mock.uri # Second request with both path and headers mock.expect(:get, not_modified_response, [@path, { 'If-None-Match' => 'abc123' }]) - subject = CachingHttpConnection.new(@uri, @api_key) + subject = CachingHttpConnection.new(@uri, @sdk_key) subject.instance_variable_set('@connection', mock) # Initial request to populate cache @@ -148,7 +148,7 @@ def mock.uri mock.expect(:get, response, [@path]) mock.expect(:get, response, [@path]) - subject = CachingHttpConnection.new(@uri, @api_key) + subject = CachingHttpConnection.new(@uri, @sdk_key) subject.instance_variable_set('@connection', mock) 2.times do @@ -160,8 +160,8 @@ def mock.uri end def test_cache_is_shared_across_instances HttpConnection.stub :new, @http_connection do - instance1 = CachingHttpConnection.new(@uri, @api_key) - instance2 = CachingHttpConnection.new(@uri, @api_key) + instance1 = CachingHttpConnection.new(@uri, @sdk_key) + instance2 = CachingHttpConnection.new(@uri, @sdk_key) assert_same instance1.class.cache, instance2.class.cache end @@ -199,7 +199,7 @@ def mock.uri # Second request should have If-None-Match header mock.expect(:get, not_modified_response, [@path, { 'If-None-Match' => 'abc123' }]) - subject = CachingHttpConnection.new(@uri, @api_key) + subject = CachingHttpConnection.new(@uri, @sdk_key) subject.instance_variable_set('@connection', mock) # Initial request to populate cache diff --git a/test/test_client.rb b/test/test_client.rb index df7f391..0ae89a6 100644 --- a/test/test_client.rb +++ b/test/test_client.rb @@ -167,20 +167,20 @@ def test_evaluation_summary_aggregator fake_api_key = '123-development-yourapikey-SDK' # it is nil by default - assert_nil new_client(api_key: fake_api_key).evaluation_summary_aggregator + assert_nil new_client(sdk_key: fake_api_key).evaluation_summary_aggregator # it is nil when local_only even if collect_max_evaluation_summaries is true assert_nil new_client(prefab_datasources: LOCAL_ONLY, collect_evaluation_summaries: true, ).evaluation_summary_aggregator # it is nil when collect_max_evaluation_summaries is false - assert_nil new_client(api_key: fake_api_key, + assert_nil new_client(sdk_key: fake_api_key, prefab_datasources: :all, collect_evaluation_summaries: false).evaluation_summary_aggregator # it is not nil when collect_max_evaluation_summaries is true and the datasource is not local_only assert_equal Reforge::EvaluationSummaryAggregator, - new_client(api_key: fake_api_key, + new_client(sdk_key: fake_api_key, prefab_datasources: :all, collect_evaluation_summaries: true).evaluation_summary_aggregator.class diff --git a/test/test_config_client.rb b/test/test_config_client.rb index 3362d1e..9355b6e 100644 --- a/test/test_config_client.rb +++ b/test/test_config_client.rb @@ -26,7 +26,7 @@ def test_load def test_initialization_timeout_error options = Reforge::Options.new( - api_key: '123-ENV-KEY-SDK', + sdk_key: '123-ENV-KEY-SDK', initialization_timeout_sec: 0.01 ) @@ -54,20 +54,20 @@ def test_prefab_envs_env_var def test_invalid_api_key_error options = Reforge::Options.new( - api_key: '' + sdk_key: '' ) - err = assert_raises(Reforge::Errors::InvalidApiKeyError) do + err = assert_raises(Reforge::Errors::InvalidSdkKeyError) do Reforge::Client.new(options).config_client.get('anything') end - assert_match(/No API key/, err.message) + assert_match(/No SDK key/, err.message) options = Reforge::Options.new( - api_key: 'invalid' + sdk_key: 'invalid' ) - err = assert_raises(Reforge::Errors::InvalidApiKeyError) do + err = assert_raises(Reforge::Errors::InvalidSdkKeyError) do Reforge::Client.new(options).config_client.get('anything') end @@ -94,7 +94,7 @@ def test_cache_path_respects_xdg options = Reforge::Options.new( prefab_datasources: Reforge::Options::DATASOURCES::LOCAL_ONLY, x_use_local_cache: true, - api_key: "123-ENV-KEY-SDK",) + sdk_key: "123-ENV-KEY-SDK",) config_client = Reforge::ConfigClient.new(MockBaseClient.new(options), 10) assert_equal "#{Dir.home}/.cache/prefab.cache.123.json", config_client.send(:cache_path) diff --git a/test/test_context_shape_aggregator.rb b/test/test_context_shape_aggregator.rb index 871e4f2..6ed9643 100644 --- a/test/test_context_shape_aggregator.rb +++ b/test/test_context_shape_aggregator.rb @@ -139,7 +139,7 @@ def new_client(overrides = {}) prefab_datasources: Reforge::Options::DATASOURCES::ALL, initialization_timeout_sec: 0, on_init_failure: Reforge::Options::ON_INITIALIZATION_FAILURE::RETURN, - api_key: '123-development-yourapikey-SDK', + sdk_key: '123-development-yourapikey-SDK', context_upload_mode: :shape_only }.merge(overrides)) end diff --git a/test/test_log_path_aggregator.rb b/test/test_log_path_aggregator.rb index dd65f76..3252b11 100644 --- a/test/test_log_path_aggregator.rb +++ b/test/test_log_path_aggregator.rb @@ -61,7 +61,7 @@ def test_sync def new_client(overrides = {}) super(**{ prefab_datasources: Reforge::Options::DATASOURCES::LOCAL_ONLY, - api_key: '123-development-yourapikey-SDK', + sdk_key: '123-development-yourapikey-SDK', collect_max_paths: 1000, collect_sync_interval: 1000 # we'll trigger sync manually in our test }.merge(overrides)) diff --git a/test/test_options.rb b/test/test_options.rb index 107efd1..bb2db18 100644 --- a/test/test_options.rb +++ b/test/test_options.rb @@ -31,11 +31,11 @@ def test_overriding_sources end def test_works_with_named_arguments - assert_equal API_KEY, Reforge::Options.new(api_key: API_KEY).api_key + assert_equal API_KEY, Reforge::Options.new(sdk_key: API_KEY).sdk_key end def test_works_with_hash - assert_equal API_KEY, Reforge::Options.new({ api_key: API_KEY }).api_key + assert_equal API_KEY, Reforge::Options.new({ sdk_key: API_KEY }).sdk_key end def test_collect_max_paths diff --git a/test/test_sse_config_client.rb b/test/test_sse_config_client.rb index ca9bca6..51bd6a3 100644 --- a/test/test_sse_config_client.rb +++ b/test/test_sse_config_client.rb @@ -10,7 +10,7 @@ def test_client 'https://belt.staging-prefab.cloud/' ] - options = Reforge::Options.new(sources: sources, api_key: ENV.fetch('PREFAB_INTEGRATION_TEST_API_KEY', nil)) + options = Reforge::Options.new(sources: sources, sdk_key: ENV.fetch('REFORGE_INTEGRATION_TEST_API_KEY', nil)) config_loader = OpenStruct.new(highwater_mark: 4) @@ -40,7 +40,7 @@ def test_failing_over 'https://api.staging-prefab.cloud/' ] - prefab_options = Reforge::Options.new(sources: sources, api_key: ENV.fetch('PREFAB_INTEGRATION_TEST_API_KEY', nil)) + prefab_options = Reforge::Options.new(sources: sources, sdk_key: ENV.fetch('REFORGE_INTEGRATION_TEST_API_KEY', nil)) config_loader = OpenStruct.new(highwater_mark: 4) @@ -75,7 +75,7 @@ def test_recovering_from_disconnection config_loader = OpenStruct.new(highwater_mark: 4) - prefab_options = OpenStruct.new(sse_sources: ['http://localhost:4567'], api_key: 'test') + prefab_options = OpenStruct.new(sse_sources: ['http://localhost:4567'], sdk_key: 'test') last_event_id = nil client = nil @@ -111,7 +111,7 @@ def test_recovering_from_an_error config_loader = OpenStruct.new(highwater_mark: 4) - prefab_options = OpenStruct.new(sse_sources: ['http://localhost:4568'], api_key: 'test') + prefab_options = OpenStruct.new(sse_sources: ['http://localhost:4568'], sdk_key: 'test') last_event_id = nil client = nil From 1eadb8cbbf3b5e2640c3077dc2f145e853d5b301 Mon Sep 17 00:00:00 2001 From: James Kebinger Date: Thu, 18 Sep 2025 17:54:53 -0500 Subject: [PATCH 3/4] Use the new integration test data, add support for reforge-sdk.current-time --- .gitmodules | 6 +++--- lib/reforge/criteria_evaluator.rb | 2 +- test/integration_test_helpers.rb | 2 +- test/prefab-cloud-integration-test-data | 1 - test/shared-integration-test-data | 1 + 5 files changed, 6 insertions(+), 6 deletions(-) delete mode 160000 test/prefab-cloud-integration-test-data create mode 160000 test/shared-integration-test-data diff --git a/.gitmodules b/.gitmodules index 1bb9aee..8b219b2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ -[submodule "test/prefab-cloud-integration-test-data"] - path = test/prefab-cloud-integration-test-data - url = git@github.com:prefab-cloud/prefab-cloud-integration-test-data +[submodule "test/shared-integration-test-data"] + path = test/shared-integration-test-data + url = git@github.com:ReforgeHQ/sdk-integration-test-data.git diff --git a/lib/reforge/criteria_evaluator.rb b/lib/reforge/criteria_evaluator.rb index 38836bb..bb97502 100644 --- a/lib/reforge/criteria_evaluator.rb +++ b/lib/reforge/criteria_evaluator.rb @@ -148,7 +148,7 @@ def value_from_properties(criterion, properties) case criterion.property_name when NAMESPACE_KEY @namespace - when 'prefab.current-time' + when 'prefab.current-time','reforge-sdk.current-time' Time.now.utc.to_i * 1000 else properties.get(criterion.property_name) diff --git a/test/integration_test_helpers.rb b/test/integration_test_helpers.rb index 70099d0..bd375df 100644 --- a/test/integration_test_helpers.rb +++ b/test/integration_test_helpers.rb @@ -1,7 +1,7 @@ # frozen_string_literal: true module IntegrationTestHelpers - SUBMODULE_PATH = 'test/prefab-cloud-integration-test-data' + SUBMODULE_PATH = 'test/shared-integration-test-data' def self.find_integration_tests files = find_test_files diff --git a/test/prefab-cloud-integration-test-data b/test/prefab-cloud-integration-test-data deleted file mode 160000 index f6003c8..0000000 --- a/test/prefab-cloud-integration-test-data +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f6003c87360f58064143011dfb02c2b00fd33f14 diff --git a/test/shared-integration-test-data b/test/shared-integration-test-data new file mode 160000 index 0000000..9c6c558 --- /dev/null +++ b/test/shared-integration-test-data @@ -0,0 +1 @@ +Subproject commit 9c6c5589646be4cd43cca09142805d9075ca1c30 From 779f67d4372418197472dbb1c9fb6bda695c0bc1 Mon Sep 17 00:00:00 2001 From: James Kebinger Date: Thu, 18 Sep 2025 18:06:34 -0500 Subject: [PATCH 4/4] Removes logger functionality --- README.md | 63 +------- lib/reforge-sdk.rb | 2 - lib/reforge/client.rb | 15 +- lib/reforge/local_config_parser.rb | 2 +- lib/reforge/log_path_aggregator.rb | 69 --------- lib/reforge/logger_client.rb | 79 ---------- lib/reforge/prefab.rb | 6 +- test/integration_test_helpers.rb | 21 --- test/test_log_path_aggregator.rb | 69 --------- test/test_logger.rb | 225 ----------------------------- 10 files changed, 8 insertions(+), 543 deletions(-) delete mode 100644 lib/reforge/log_path_aggregator.rb delete mode 100644 lib/reforge/logger_client.rb delete mode 100644 test/test_log_path_aggregator.rb delete mode 100644 test/test_logger.rb diff --git a/README.md b/README.md index 8216bd5..71bc9b9 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ # prefab-cloud-ruby -Ruby Client for Prefab Feature Flags, Dynamic log levels, and Config as a Service: https://www.prefab.cloud +Ruby Client for Reforge Feature Flags, Dynamic log levels, and Config as a Service: https://launch.reforge.com ```ruby -client = Prefab::Client.new +client = Reforge::Client.new context = { user: { @@ -24,7 +24,6 @@ See full documentation https://docs.prefab.cloud/docs/sdks/ruby ## Supports - Feature Flags -- Dynamic log levels - Live Config - WebUI for tweaking config, log levels, and feature flags @@ -40,72 +39,18 @@ Prefab.init # reads REFORGE_SDK_KEY env var by default ```ruby #puma.rb on_worker_boot do - Prefab.fork + Reforge.fork end ``` ```ruby # unicorn.rb after_fork do |server, worker| - Prefab.fork + Reforge.fork end ``` -## Logging & Debugging -To use dynamic logging, we recommend [semantic logger]. Add semantic_logger to your Gemfile and then we'll configure our app to use it. - -### Plain ol' Ruby - -```ruby -# Gemfile -gem "semantic_logger" -``` - -```ruby -require "semantic_logger" -require "prefab" - -Prefab.init - -SemanticLogger.sync! -SemanticLogger.default_level = :trace # Prefab will take over the filtering -SemanticLogger.add_appender( - io: $stdout, - formatter: :json, - filter: Prefab.log_filter, -) -``` - -### With Rails - -```ruby -# Gemfile -gem "amazing_print" -gem "rails_semantic_logger" -``` - -```ruby -# config/application.rb -Prefab.init - -# config/initializers/logging.rb -SemanticLogger.sync! -SemanticLogger.default_level = :trace # Prefab will take over the filtering -SemanticLogger.add_appender( - io: $stdout, - formatter: Rails.env.development? ? :color : :json, - filter: Prefab.log_filter, -) -``` - -```ruby -#puma.rb -on_worker_boot do - SemanticLogger.reopen - Prefab.fork -end -``` ## Contributing to prefab-cloud-ruby diff --git a/lib/reforge-sdk.rb b/lib/reforge-sdk.rb index 99f8f34..4d5376c 100644 --- a/lib/reforge-sdk.rb +++ b/lib/reforge-sdk.rb @@ -30,7 +30,6 @@ module Reforge require 'reforge/context_shape_aggregator' require 'reforge/example_contexts_aggregator' require 'reforge/evaluation_summary_aggregator' -require 'reforge/log_path_aggregator' require 'reforge/weighted_value_resolver' require 'reforge/config_value_wrapper' require 'reforge/config_value_unwrapper' @@ -43,7 +42,6 @@ module Reforge require 'reforge/config_resolver' require 'reforge/http_connection' require 'reforge/context' -require 'reforge/logger_client' require 'active_support/deprecation' require 'active_support' require 'reforge/sse_config_client' diff --git a/lib/reforge/client.rb b/lib/reforge/client.rb index f05b0fa..58e5c00 100644 --- a/lib/reforge/client.rb +++ b/lib/reforge/client.rb @@ -17,9 +17,9 @@ def initialize(options = Reforge::Options.new) @instance_hash = ::UUID.new.generate if @options.local_only? - LOG.debug 'Prefab Running in Local Mode' + LOG.debug 'Reforge SDK Running in Local Mode' elsif @options.datafile? - LOG.debug 'Prefab Running in DataFile Mode' + LOG.debug 'Reforge SDK Running in DataFile Mode' else @sdk_key = @options.sdk_key raise Reforge::Errors::InvalidSdkKeyError, @sdk_key if @sdk_key.nil? || @sdk_key.empty? || sdk_key.count('-') < 1 @@ -53,17 +53,6 @@ def feature_flag_client @feature_flag_client ||= Reforge::FeatureFlagClient.new(self) end - def log_path_aggregator - return nil if @options.collect_max_paths <= 0 - - @log_path_aggregator ||= LogPathAggregator.new(client: self, max_paths: @options.collect_max_paths, - sync_interval: @options.collect_sync_interval) - end - - def log - @log ||= Reforge::LoggerClient.new(client: self, log_path_aggregator: log_path_aggregator) - end - def context_shape_aggregator return nil if @options.collect_max_shapes <= 0 diff --git a/lib/reforge/local_config_parser.rb b/lib/reforge/local_config_parser.rb index 5c680e1..c7f85a2 100644 --- a/lib/reforge/local_config_parser.rb +++ b/lib/reforge/local_config_parser.rb @@ -40,7 +40,7 @@ def parse(key, value, config, file) def value_from(key, raw) case raw when String - if key.to_s.start_with? Reforge::LoggerClient::BASE_KEY + if key.to_s.start_with? 'log-level' prefab_log_level_resolve = PrefabProto::LogLevel.resolve(raw.upcase.to_sym) || PrefabProto::LogLevel::NOT_SET_LOG_LEVEL { log_level: prefab_log_level_resolve } else diff --git a/lib/reforge/log_path_aggregator.rb b/lib/reforge/log_path_aggregator.rb deleted file mode 100644 index 0ef9f7c..0000000 --- a/lib/reforge/log_path_aggregator.rb +++ /dev/null @@ -1,69 +0,0 @@ -# frozen_string_literal: true - -require_relative 'periodic_sync' - -module Reforge - class LogPathAggregator - LOG = Reforge::InternalLogger.new(self) - include Reforge::PeriodicSync - - INCREMENT = ->(count) { (count || 0) + 1 } - - SEVERITY_KEY = { - ::Logger::DEBUG => 'debugs', - ::Logger::INFO => 'infos', - ::Logger::WARN => 'warns', - ::Logger::ERROR => 'errors', - ::Logger::FATAL => 'fatals' - }.freeze - - attr_reader :data - - def initialize(client:, max_paths:, sync_interval:) - @max_paths = max_paths - @client = client - @name = 'log_path_aggregator' - - @data = Concurrent::Map.new - - @last_data_sent = nil - @last_request = nil - - start_periodic_sync(sync_interval) - end - - def push(path, severity) - return if @data.size >= @max_paths - - @data.compute([path, severity], &INCREMENT) - end - - private - - def flush(to_ship, start_at_was) - pool.post do - LOG.debug "Uploading stats for #{to_ship.size} paths" - - aggregate = Hash.new { |h, k| h[k] = PrefabProto::Logger.new } - - to_ship.each do |(path, severity), count| - aggregate[path][SEVERITY_KEY[severity]] = count - aggregate[path]['logger_name'] = path - end - - loggers = PrefabProto::LoggersTelemetryEvent.new(loggers: aggregate.values, - start_at: start_at_was, - end_at: Reforge::TimeHelpers.now_in_ms) - - events = PrefabProto::TelemetryEvents.new( - instance_hash: instance_hash, - events: [PrefabProto::TelemetryEvent.new(loggers: loggers)] - ) - - result = post('/api/v1/telemetry', events) - - LOG.debug "Uploaded #{to_ship.size} paths: #{result.status}" - end - end - end -end diff --git a/lib/reforge/logger_client.rb b/lib/reforge/logger_client.rb deleted file mode 100644 index 019b719..0000000 --- a/lib/reforge/logger_client.rb +++ /dev/null @@ -1,79 +0,0 @@ -# frozen_string_literal: true - -module Reforge - class LoggerClient - SEP = '.' - BASE_KEY = 'log-level' - NO_DEFAULT = nil - - LOG_LEVEL_LOOKUPS = { - PrefabProto::LogLevel::NOT_SET_LOG_LEVEL => :trace, - PrefabProto::LogLevel::TRACE => :trace, - PrefabProto::LogLevel::DEBUG => :debug, - PrefabProto::LogLevel::INFO => :info, - PrefabProto::LogLevel::WARN => :warn, - PrefabProto::LogLevel::ERROR => :error, - PrefabProto::LogLevel::FATAL => :fatal - }.freeze - - def initialize(client: ,log_path_aggregator: ) - @config_client = client - @log_path_aggregator = log_path_aggregator - end - - def should_log?(severity, path) - @log_path_aggregator&.push(path, severity) - severity >= level_of(path) - end - - def semantic_filter(log) - class_path = class_path_name(log.name) - level = SemanticLogger::Levels.index(log.level) - log.named_tags.merge!({ path: class_path }) - should_log? level, class_path - end - - def config_client=(config_client) - @config_client = config_client - end - - private - - def class_path_name(class_name) - log_class = Logger.const_get(class_name) - if log_class.respond_to?(:superclass) && log_class.superclass != Object - underscore("#{log_class.superclass.name}.#{log_class.name}") - else - underscore("#{log_class.name}") - end.gsub(/[^a-z_]/i, '.') - end - - # Find the closest match to 'log_level.path' in config - def level_of(path) - closest_log_level_match = nil - - path.split(SEP).each_with_object([BASE_KEY]) do |n, memo| - memo << n - val = @config_client.get(memo.join(SEP), NO_DEFAULT) - closest_log_level_match = val unless val.nil? - end - - if closest_log_level_match.nil? - # get the top-level setting or default to WARN - closest_log_level_match = @config_client.get(BASE_KEY, :WARN) - end - - closest_log_level_match_int = PrefabProto::LogLevel.resolve(closest_log_level_match) - internal_convert = LOG_LEVEL_LOOKUPS[closest_log_level_match_int] - return SemanticLogger::Levels.index(internal_convert) - end - - def underscore(string) - string.gsub(/::/, '/'). - gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2'). - gsub(/([a-z\d])([A-Z])/,'\1_\2'). - tr("-", "_"). - downcase - end - end -end diff --git a/lib/reforge/prefab.rb b/lib/reforge/prefab.rb index 19d17b6..57d5717 100644 --- a/lib/reforge/prefab.rb +++ b/lib/reforge/prefab.rb @@ -51,11 +51,7 @@ def self.instance def self.log_filter InternalLogger.using_reforge_log_filter! return Proc.new do |log| - if defined?(@singleton) && !@singleton.nil? && @singleton.config_client.initialized? - @singleton.log.semantic_filter(log) - else - bootstrap_log_level(log) - end + bootstrap_log_level(log) end end diff --git a/test/integration_test_helpers.rb b/test/integration_test_helpers.rb index bd375df..baab75f 100644 --- a/test/integration_test_helpers.rb +++ b/test/integration_test_helpers.rb @@ -18,29 +18,8 @@ def self.find_test_files .select { |file| file =~ /\.ya?ml$/ } end - SEVERITY_LOOKUP = Reforge::LogPathAggregator::SEVERITY_KEY.invert - def self.prepare_post_data(it) case it.aggregator - when "log_path" - aggregator = it.test_client.log_path_aggregator - - it.data.each do |data| - data['counts'].each_pair do |severity, count| - count.times { aggregator.push(data['logger_name'], SEVERITY_LOOKUP[severity]) } - end - end - - expected_loggers = Hash.new { |h, k| h[k] = PrefabProto::Logger.new } - - it.expected_data.each do |data| - data["counts"].each do |(severity, count)| - expected_loggers[data["logger_name"]][severity] = count - expected_loggers[data["logger_name"]]["logger_name"] = data["logger_name"] - end - end - - [aggregator, ->(data) { data.events[0].loggers.loggers }, expected_loggers.values] when "context_shape" aggregator = it.test_client.context_shape_aggregator diff --git a/test/test_log_path_aggregator.rb b/test/test_log_path_aggregator.rb deleted file mode 100644 index 3252b11..0000000 --- a/test/test_log_path_aggregator.rb +++ /dev/null @@ -1,69 +0,0 @@ -# frozen_string_literal: true - -require 'test_helper' -require 'timecop' - -class TestLogPathAggregator < Minitest::Test - MAX_WAIT = 2 - SLEEP_TIME = 0.01 - - def test_push - client = new_client(prefab_datasources: Reforge::Options::DATASOURCES::ALL,) - aggregator = Reforge::LogPathAggregator.new(client: client, max_paths: 2, sync_interval: 1000) - - aggregator.push('test.test_log_path_aggregator.test_push.1', ::Logger::INFO) - aggregator.push('test.test_log_path_aggregator.test_push.2', ::Logger::DEBUG) - - assert_equal 2, aggregator.data.size - - # we've reached the limit, so no more - aggregator.push('test.test_log_path_aggregator.test_push.3', ::Logger::INFO) - assert_equal 2, aggregator.data.size - end - - def test_sync - Timecop.freeze do - client = new_client(namespace: 'this.is.a.namespace', allow_telemetry_in_local_mode: true) - - 2.times { client.log.should_log? 1, "test.test_log_path_aggregator.test_sync" } - 3.times { client.log.should_log? 3, "test.test_log_path_aggregator.test_sync" } - - requests = wait_for_post_requests(client) do - client.log_path_aggregator.send(:sync) - end - - assert_equal [ - [ - '/api/v1/telemetry', - PrefabProto::TelemetryEvents.new( - instance_hash: client.instance_hash, - events: [ - PrefabProto::TelemetryEvent.new(loggers: - - PrefabProto::LoggersTelemetryEvent.new(loggers: [ - PrefabProto::Logger.new( - logger_name: 'test.test_log_path_aggregator.test_sync', - infos: 2, - errors: 3 - ) - ], - start_at: Reforge::TimeHelpers.now_in_ms, - end_at: Reforge::TimeHelpers.now_in_ms,)) - ] - ) - ] - ], requests - end - end - - private - - def new_client(overrides = {}) - super(**{ - prefab_datasources: Reforge::Options::DATASOURCES::LOCAL_ONLY, - sdk_key: '123-development-yourapikey-SDK', - collect_max_paths: 1000, - collect_sync_interval: 1000 # we'll trigger sync manually in our test - }.merge(overrides)) - end -end diff --git a/test/test_logger.rb b/test/test_logger.rb deleted file mode 100644 index d9ccc46..0000000 --- a/test/test_logger.rb +++ /dev/null @@ -1,225 +0,0 @@ -# frozen_string_literal: true - -require 'test_helper' - -class TestLogger < Minitest::Test - TEST_ENV_ID = 2 - DEFAULT_VALUE = 'FATAL' - DEFAULT_ENV_VALUE = 'INFO' - DESIRED_VALUE = 'DEBUG' - WRONG_ENV_VALUE = 'ERROR' - PROJECT_ENV_ID = 1 - - DEFAULT_ROW = PrefabProto::ConfigRow.new( - values: [ - PrefabProto::ConditionalValue.new( - value: PrefabProto::ConfigValue.new(log_level: DEFAULT_VALUE) - ) - ] - ) - - def setup - super - Reforge::LoggerClient.send(:public, :class_path_name) - Reforge::LoggerClient.send(:public, :level_of) - @client = new_client - @logger = @client.log - end - - def test_bootstrap_log_level - assert !Reforge.bootstrap_log_level(SemanticLogger::Log.new("TestLogger",:info)) - with_env('REFORGE_LOG_CLIENT_BOOTSTRAP_LOG_LEVEL', 'info') do - assert Reforge.bootstrap_log_level(SemanticLogger::Log.new("TestLogger",:info)) - end - end - - def test_level_of - @logger.config_client = MockConfigClient.new({}) - assert_equal SemanticLogger::Levels.index(:warn), - @logger.level_of('app.models.user'), 'default is warn' - - @logger.config_client = MockConfigClient.new('log-level.app' => :INFO) - assert_equal SemanticLogger::Levels.index(:info), - @logger.level_of('app.models.user') - - @logger.config_client = MockConfigClient.new('log-level.app' => :DEBUG) - assert_equal SemanticLogger::Levels.index(:debug), - @logger.level_of('app.models.user') - - @logger.config_client = MockConfigClient.new('log-level.app' => :DEBUG, - 'log-level.app.models' => :ERROR) - assert_equal SemanticLogger::Levels.index(:error), - @logger.level_of('app.models.user'), 'test leveling' - - end - - - def test_logging_with_criteria_on_top_level_key - - config = PrefabProto::Config.new( - key: 'log-level', - rows: [ - DEFAULT_ROW, - - # wrong env - PrefabProto::ConfigRow.new( - project_env_id: TEST_ENV_ID, - values: [ - PrefabProto::ConditionalValue.new( - criteria: [ - PrefabProto::Criterion.new( - operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF, - value_to_match: string_list(['hotmail.com', 'gmail.com']), - property_name: 'user.email_suffix' - ) - ], - value: PrefabProto::ConfigValue.new(log_level: WRONG_ENV_VALUE) - ) - ] - ), - - # correct env - PrefabProto::ConfigRow.new( - project_env_id: PROJECT_ENV_ID, - values: [ - PrefabProto::ConditionalValue.new( - criteria: [ - PrefabProto::Criterion.new( - operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF, - value_to_match: string_list(['hotmail.com', 'gmail.com']), - property_name: 'user.email_suffix' - ) - ], - value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE) - ), - PrefabProto::ConditionalValue.new( - value: PrefabProto::ConfigValue.new(log_level: DEFAULT_ENV_VALUE) - ) - ] - ) - ] - ) - - inject_config(@client, config) - inject_project_env_id(@client, PROJECT_ENV_ID) - - # without any context, the level should be the default for the env (info) - @client.with_context({}) do - refute @logger.should_log?(SemanticLogger::Levels.index(:debug), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:info), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:error), "test.test_logger" ) - end - - - # with the wrong context, the level should be the default for the env (info) - @client.with_context(user: { email_suffix: 'yahoo.com' }) do - refute @logger.should_log?(SemanticLogger::Levels.index(:debug), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:info), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:error), "test.test_logger" ) - end - - # with the correct context, the level should be the desired value (debug) - @client.with_context(user: { email_suffix: 'hotmail.com' }) do - assert @logger.should_log?(SemanticLogger::Levels.index(:debug), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:info), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:error), "test.test_logger" ) - end - end - - def test_logging_with_criteria_on_key_path - - config = PrefabProto::Config.new( - key: 'log-level.test.test_logger', - rows: [ - DEFAULT_ROW, - - # wrong env - PrefabProto::ConfigRow.new( - project_env_id: TEST_ENV_ID, - values: [ - PrefabProto::ConditionalValue.new( - criteria: [ - PrefabProto::Criterion.new( - operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF, - value_to_match: string_list(['hotmail.com', 'gmail.com']), - property_name: 'email_suffix' - ) - ], - value: PrefabProto::ConfigValue.new(log_level: WRONG_ENV_VALUE) - ) - ] - ), - - # correct env - PrefabProto::ConfigRow.new( - project_env_id: PROJECT_ENV_ID, - values: [ - PrefabProto::ConditionalValue.new( - criteria: [ - PrefabProto::Criterion.new( - operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF, - value_to_match: string_list(['hotmail.com', 'gmail.com']), - property_name: 'user.email_suffix' - ) - ], - value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE) - ), - - PrefabProto::ConditionalValue.new( - criteria: [ - PrefabProto::Criterion.new( - operator: PrefabProto::Criterion::CriterionOperator::PROP_IS_ONE_OF, - value_to_match: string_list(%w[user:4567]), - property_name: 'user.tracking_id' - ) - ], - value: PrefabProto::ConfigValue.new(log_level: DESIRED_VALUE) - ), - - PrefabProto::ConditionalValue.new( - value: PrefabProto::ConfigValue.new(log_level: DEFAULT_ENV_VALUE) - ) - ] - ) - ] - ) - inject_config(@client, config) - inject_project_env_id(@client, PROJECT_ENV_ID) - - - # without any context, the level should be the default for the env (info) - @client.with_context({ }) do - refute @logger.should_log?(SemanticLogger::Levels.index(:debug), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:info), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:error), "test.test_logger" ) - end - - # with the wrong context, the level should be the default for the env (info) - @client.with_context(user: { email_suffix: 'yahoo.com' }) do - refute @logger.should_log?(SemanticLogger::Levels.index(:debug), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:info), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:error), "test.test_logger" ) - end - - # with the correct context, the level should be the desired value (debug) - @client.with_context(user: { email_suffix: 'hotmail.com' }) do - assert @logger.should_log?(SemanticLogger::Levels.index(:debug), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:info), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:error), "test.test_logger" ) - end - - # with the correct lookup key - @client.with_context(user: { tracking_id: 'user:4567' }) do - assert @logger.should_log?(SemanticLogger::Levels.index(:debug), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:info), "test.test_logger" ) - assert @logger.should_log?(SemanticLogger::Levels.index(:info), "test.test_logger" ) - end - end - - def test_class_path_name - assert_equal "minitest.test.test_logger", @logger.class_path_name("TestLogger") - assert_equal "reforge.logger_client", @logger.class_path_name("Reforge::LoggerClient") - assert_equal "semantic_logger.logger.reforge.internal_logger", @logger.class_path_name("Reforge::InternalLogger") - end - -end