Module: PostHog::Utils

Included in:
Client, FeatureFlagsPoller, FieldParser, SendWorker, Transport
Defined in:
lib/posthog/utils.rb

Defined Under Namespace

Classes: SizeLimitedHash

Constant Summary collapse

UTC_OFFSET_WITH_COLON =
'%s%02d:%02d'
UTC_OFFSET_WITHOUT_COLON =
UTC_OFFSET_WITH_COLON.sub(':', '')

Class Method Summary collapse

Class Method Details

.convert_to_datetime(value) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/posthog/utils.rb', line 104

def convert_to_datetime(value)
  if value.respond_to?(:strftime)
    value

  elsif value.respond_to?(:to_str)
    begin
      DateTime.parse(value)
    rescue ArgumentError
      raise InconclusiveMatchError, "#{value} is not in a valid date format"
    end
  else
    raise InconclusiveMatchError, 'The date provided must be a string or date object'
  end
end

.date_in_iso8601(date) ⇒ Object



90
91
92
# File 'lib/posthog/utils.rb', line 90

def date_in_iso8601(date)
  date.strftime('%F')
end

.datetime_in_iso8601(datetime) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/posthog/utils.rb', line 70

def datetime_in_iso8601(datetime)
  case datetime
  when Time
    time_in_iso8601 datetime
  when DateTime
    time_in_iso8601 datetime.to_time
  when Date
    date_in_iso8601 datetime
  else
    datetime
  end
end

.deep_symbolize_keys(obj) ⇒ Object

public: Recursively convert all keys to symbols in a Hash/Array tree



32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/posthog/utils.rb', line 32

def deep_symbolize_keys(obj)
  case obj
  when Hash
    obj.each_with_object({}) do |(key, value), result|
      result[key.to_sym] = deep_symbolize_keys(value)
    end
  when Array
    obj.map { |item| deep_symbolize_keys(item) }
  else
    obj
  end
end

.formatted_offset(time, colon = true, alternate_utc_string = nil) ⇒ Object



94
95
96
97
# File 'lib/posthog/utils.rb', line 94

def formatted_offset(time, colon = true, alternate_utc_string = nil)
  (time.utc? && alternate_utc_string) ||
    seconds_to_utc_offset(time.utc_offset, colon)
end

.get_by_symbol_or_string_key(hash, key) ⇒ Object

public: Get value from hash by symbol key first, then string key

Handles falsy values correctly (unlike ||)

hash - Hash to lookup value in key - Symbol or String key to lookup

Returns the value if found, nil otherwise



137
138
139
140
141
142
143
144
145
146
# File 'lib/posthog/utils.rb', line 137

def get_by_symbol_or_string_key(hash, key)
  symbol_key = key.to_sym
  string_key = key.to_s

  if hash.key?(symbol_key)
    hash[symbol_key]
  else
    hash[string_key]
  end
end

.is_valid_regex(regex) ⇒ Object

TODO: Rename to valid_regex? in future version



123
124
125
126
127
128
# File 'lib/posthog/utils.rb', line 123

def is_valid_regex(regex) # rubocop:disable Naming/PredicateName
  Regexp.new(regex)
  true
rescue RegexpError
  false
end

.isoify_dates(hash) ⇒ Object

public: Returns a new hash with all the date values in the into iso8601

strings


48
49
50
51
52
# File 'lib/posthog/utils.rb', line 48

def isoify_dates(hash)
  hash.transform_values do |v|
    datetime_in_iso8601(v)
  end
end

.isoify_dates!(hash) ⇒ Object

public: Converts all the date values in the into iso8601 strings in place



56
57
58
# File 'lib/posthog/utils.rb', line 56

def isoify_dates!(hash)
  hash.replace isoify_dates hash
end

.seconds_to_utc_offset(seconds, colon = true) ⇒ Object



99
100
101
102
# File 'lib/posthog/utils.rb', line 99

def seconds_to_utc_offset(seconds, colon = true)
  format((colon ? UTC_OFFSET_WITH_COLON : UTC_OFFSET_WITHOUT_COLON), (seconds.negative? ? '-' : '+'),
         seconds.abs / 3600, (seconds.abs % 3600) / 60)
end

.stringify_keys(hash) ⇒ Object

public: Return a new hash with keys as strings



26
27
28
# File 'lib/posthog/utils.rb', line 26

def stringify_keys(hash)
  hash.transform_keys(&:to_s)
end

.symbolize_keys(hash) ⇒ Object

public: Return a new hash with keys converted from strings to symbols



14
15
16
# File 'lib/posthog/utils.rb', line 14

def symbolize_keys(hash)
  hash.transform_keys(&:to_sym)
end

.symbolize_keys!(hash) ⇒ Object

public: Convert hash keys from strings to symbols in place



20
21
22
# File 'lib/posthog/utils.rb', line 20

def symbolize_keys!(hash)
  hash.replace symbolize_keys hash
end

.time_in_iso8601(time, fraction_digits = 3) ⇒ Object



83
84
85
86
87
88
# File 'lib/posthog/utils.rb', line 83

def time_in_iso8601(time, fraction_digits = 3)
  fraction =
    (('.%06i' % time.usec)[0, fraction_digits + 1] if fraction_digits.positive?) # rubocop:disable Style/FormatString

  "#{time.strftime('%Y-%m-%dT%H:%M:%S')}#{fraction}#{formatted_offset(time, true, 'Z')}"
end

.uidObject

public: Returns a uid string



62
63
64
65
66
67
68
# File 'lib/posthog/utils.rb', line 62

def uid
  arr = SecureRandom.random_bytes(16).unpack('NnnnnN')
  arr[2] = (arr[2] & 0x0fff) | 0x4000
  arr[3] = (arr[3] & 0x3fff) | 0x8000

  '%08x-%04x-%04x-%04x-%04x%08x' % arr # rubocop:disable Style/FormatStringToken, Style/FormatString
end