Module: Agent::SessionContext::Renderers::Serializer
- Defined in:
- lib/agent/session_context/renderers/serializer.rb
Class Method Summary collapse
- .data_object?(value) ⇒ Boolean
- .detect_duplicate_keys!(entries) ⇒ Object
- .normalized_hash_entries(value) ⇒ Object
- .normalized_key(key) ⇒ Object
- .safe_dump(value) ⇒ Object
- .scrub_string(value) ⇒ Object
- .serialize(value) ⇒ Object
- .serialize_data(value) ⇒ Object
- .serialize_float(value) ⇒ Object
- .serialize_hash(value) ⇒ Object
- .serialize_member(member, value) ⇒ Object
- .serialize_timestamp(value) ⇒ Object
- .unsupported_value_label(value) ⇒ Object
Class Method Details
.data_object?(value) ⇒ Boolean
36 37 38 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 36 def data_object?(value) defined?(Data) && value.is_a?(Data) end |
.detect_duplicate_keys!(entries) ⇒ Object
60 61 62 63 64 65 66 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 60 def detect_duplicate_keys!(entries) entries.group_by(&:first).sort_by(&:first).each do |key, grouped_entries| next unless grouped_entries.length > 1 raise ArgumentError, "duplicate serialized key: #{safe_dump(key)}" end end |
.normalized_hash_entries(value) ⇒ Object
52 53 54 55 56 57 58 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 52 def normalized_hash_entries(value) entries = value.each_with_object([]) do |(key, nested_value), collected| collected << [normalized_key(key), nested_value] end detect_duplicate_keys!(entries) entries.sort_by(&:first) end |
.normalized_key(key) ⇒ Object
93 94 95 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 93 def normalized_key(key) scrub_string(key.to_s) end |
.safe_dump(value) ⇒ Object
97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 97 def safe_dump(value) case value when String scrub_string(value).dump when Symbol scrub_string(value.to_s).dump when Float return "NaN" if value.nan? return "Infinity" if value.infinite? == 1 return "-Infinity" if value.infinite? == -1 value.to_s else scrub_string(value.inspect) end end |
.scrub_string(value) ⇒ Object
32 33 34 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 32 def scrub_string(value) value.encode("UTF-8", invalid: :replace, undef: :replace) end |
.serialize(value) ⇒ Object
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 9 def serialize(value) case value when nil, true, false, Integer value when Float serialize_float(value) when String scrub_string(value) when Symbol scrub_string(value.to_s) when Time value.iso8601 when Array value.map { |entry| serialize(entry) } when Hash serialize_hash(value) else return serialize_data(value) if data_object?(value) scrub_string(value.to_s) end end |
.serialize_data(value) ⇒ Object
40 41 42 43 44 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 40 def serialize_data(value) value.members.to_h do |member| [member.to_s, serialize_member(member, value.public_send(member))] end end |
.serialize_float(value) ⇒ Object
87 88 89 90 91 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 87 def serialize_float(value) raise ArgumentError, "unsupported numeric value: #{unsupported_value_label(value)}" unless value.finite? value end |
.serialize_hash(value) ⇒ Object
46 47 48 49 50 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 46 def serialize_hash(value) normalized_hash_entries(value).each_with_object({}) do |(key, nested_value), serialized| serialized[key] = serialize(nested_value) end end |
.serialize_member(member, value) ⇒ Object
68 69 70 71 72 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 68 def serialize_member(member, value) return (value) if %i[at captured_at].include?(member.to_sym) serialize(value) end |
.serialize_timestamp(value) ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 74 def (value) case value when nil nil when Time value.iso8601 when String scrub_string(value) else raise ArgumentError, "unsupported timestamp value: #{unsupported_value_label(value)}" end end |
.unsupported_value_label(value) ⇒ Object
114 115 116 117 118 119 120 |
# File 'lib/agent/session_context/renderers/serializer.rb', line 114 def unsupported_value_label(value) klass = value.class name = klass.name return "(anonymous class)" if name.nil? || name.empty? scrub_string(name) end |