class Rox::Core::ConfigurationParser
Public Class Methods
new(signature_verifier, error_reporter, configuration_fetched_invoker)
click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 13 def initialize(signature_verifier, error_reporter, configuration_fetched_invoker) @signature_verifier = signature_verifier @error_reporter = error_reporter @configuration_fetched_invoker = configuration_fetched_invoker end
Public Instance Methods
parse(fetch_result, sdk_settings)
click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 19 def parse(fetch_result, sdk_settings) if fetch_result.nil? || fetch_result.data.nil? || fetch_result.data.empty? @configuration_fetched_invoker.invoke_error(FetcherError::EMPTY_JSON) @error_reporter.report('Failed to parse JSON configuration - Null Or Empty', ArgumentError.new('data')) return nil end begin json_obj = JSON.parse(fetch_result.data) rescue StandardError => e @configuration_fetched_invoker.invoke_error(FetcherError::CORRUPTED_JSON) @error_reporter.report('Failed to parse JSON configuration', e) return nil end if fetch_result.source != ConfigurationSource::ROXY && !@signature_verifier.verify(json_obj['data'], json_obj['signature_v0']) @configuration_fetched_invoker.invoke_error(FetcherError::SIGNATURE_VERIFICATION_ERROR) @error_reporter.report('Failed to validate signature', StandardError.new("Data : #{json_obj['data']} Signature : #{json_obj['signature_v0']}")) return nil end signature_date = DateTime.rfc3339(json_obj['signed_date']).to_time internal_data_string = json_obj['data'] internal_data_object = JSON.parse(internal_data_string) if fetch_result.source != ConfigurationSource::ROXY && internal_data_object['application'] != sdk_settings.api_key @configuration_fetched_invoker.invoke_error(FetcherError::MISMATCH_APP_KEY) @error_reporter.report('Failed to parse JSON configuration - ', StandardError.new("Internal Data: #{internal_data_object['application']} SdkSettings: #{sdk_settings.api_key}")) return nil end experiments = parse_experiments(internal_data_object) target_groups = parse_target_groups(internal_data_object) Configuration.new(experiments, target_groups, signature_date) rescue StandardError => e Logging.logger.error('Failed to parse configurations', e) @configuration_fetched_invoker.invoke_error(FetcherError::UNKNOWN) nil end
parse_experiment(data)
click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 67 def parse_experiment(data) condition = data['deploymentConfiguration']['condition'] is_archived = data['archived'] name = data['name'] id = data['_id'] labels = data['labels'] || [] flags = data['featureFlags'].map { |f| f['name'] } ExperimentModel.new(id, name, condition, is_archived, flags, labels) end
parse_experiments(data)
click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 63 def parse_experiments(data) data['experiments'].map { |e| parse_experiment(e) } end
parse_target_group(data)
click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 81 def parse_target_group(data) TargetGroupModel.new(data['_id'], data['condition']) end
parse_target_groups(data)
click to toggle source
# File lib/rox/core/configuration/configuration_parser.rb, line 77 def parse_target_groups(data) data['targetGroups'].map { |g| parse_target_group(g) } end