lib/unleash/context.rb in unleash-5.1.1 vs lib/unleash/context.rb in unleash-6.0.0.pre

- old
+ new

@@ -5,26 +5,42 @@ attr_accessor(*[ATTRS, :properties].flatten) def initialize(params = {}) raise ArgumentError, "Unleash::Context must be initialized with a hash." unless params.is_a?(Hash) - self.app_name = value_for('appName', params, Unleash&.configuration&.app_name) - self.environment = value_for('environment', params, Unleash&.configuration&.environment || 'default') - self.user_id = value_for('userId', params)&.to_s - self.session_id = value_for('sessionId', params) - self.remote_address = value_for('remoteAddress', params) - self.current_time = value_for('currentTime', params, Time.now.utc.iso8601.to_s) + self.app_name = value_for("appName", params, Unleash&.configuration&.app_name) + self.environment = value_for("environment", params, Unleash&.configuration&.environment || "default") + self.user_id = value_for("userId", params)&.to_s + self.session_id = value_for("sessionId", params) + self.remote_address = value_for("remoteAddress", params) + self.current_time = value_for("currentTime", params, Time.now.utc.iso8601.to_s) - properties = value_for('properties', params) + properties = value_for("properties", params) self.properties = properties.is_a?(Hash) ? properties.transform_keys(&:to_sym) : {} end def to_s "<Context: user_id=#{@user_id},session_id=#{@session_id},remote_address=#{@remote_address},properties=#{@properties}" \ - ",app_name=#{@app_name},environment=#{@environment},current_time=#{@current_time}>" + ",app_name=#{@app_name},environment=#{@environment},current_time=#{@current_time}>" end + def as_json + { + appName: to_safe_value(self.app_name), + environment: to_safe_value(self.environment), + userId: to_safe_value(self.user_id), + sessionId: to_safe_value(self.session_id), + remoteAddress: to_safe_value(self.remote_address), + currentTime: to_safe_value(self.current_time), + properties: self.properties.transform_values{ |value| to_safe_value(value) } + } + end + + def to_json(*options) + as_json(*options).to_json(*options) + end + def to_h ATTRS.map{ |attr| [attr, self.send(attr)] }.to_h.merge(properties: @properties) end # returns the value found for the key in the context, or raises a KeyError exception if not found. @@ -48,9 +64,19 @@ private # Method to fetch values from hash for two types of keys: string in camelCase and symbol in snake_case def value_for(key, params, default_value = nil) params.values_at(key, key.to_sym, underscore(key), underscore(key).to_sym).compact.first || default_value + end + + def to_safe_value(value) + return nil if value.nil? + + if value.is_a?(Time) + value.utc.iso8601 + else + value.to_s + end end # converts CamelCase to snake_case def underscore(camel_cased_word) camel_cased_word.to_s.gsub(/(.)([A-Z])/, '\1_\2').downcase