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
- .convert_to_datetime(value) ⇒ Object
- .date_in_iso8601(date) ⇒ Object
- .datetime_in_iso8601(datetime) ⇒ Object
- .formatted_offset(time, colon = true, alternate_utc_string = nil) ⇒ Object
-
.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 ||).
-
.is_valid_regex(regex) ⇒ Object
TODO: Rename to ‘valid_regex?` in future version.
-
.isoify_dates(hash) ⇒ Object
public: Returns a new hash with all the date values in the into iso8601 strings.
-
.isoify_dates!(hash) ⇒ Object
public: Converts all the date values in the into iso8601 strings in place.
- .seconds_to_utc_offset(seconds, colon = true) ⇒ Object
-
.stringify_keys(hash) ⇒ Object
public: Return a new hash with keys as strings.
-
.symbolize_keys(hash) ⇒ Object
public: Return a new hash with keys converted from strings to symbols.
-
.symbolize_keys!(hash) ⇒ Object
public: Convert hash keys from strings to symbols in place.
- .time_in_iso8601(time, fraction_digits = 3) ⇒ Object
-
.uid ⇒ Object
public: Returns a uid string.
Class Method Details
.convert_to_datetime(value) ⇒ Object
89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/posthog/utils.rb', line 89 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
75 76 77 |
# File 'lib/posthog/utils.rb', line 75 def date_in_iso8601(date) date.strftime('%F') end |
.datetime_in_iso8601(datetime) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/posthog/utils.rb', line 55 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 |
.formatted_offset(time, colon = true, alternate_utc_string = nil) ⇒ Object
79 80 81 82 |
# File 'lib/posthog/utils.rb', line 79 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
122 123 124 125 126 127 128 129 130 131 |
# File 'lib/posthog/utils.rb', line 122 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
108 109 110 111 112 113 |
# File 'lib/posthog/utils.rb', line 108 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
33 34 35 36 37 |
# File 'lib/posthog/utils.rb', line 33 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
41 42 43 |
# File 'lib/posthog/utils.rb', line 41 def isoify_dates!(hash) hash.replace isoify_dates hash end |
.seconds_to_utc_offset(seconds, colon = true) ⇒ Object
84 85 86 87 |
# File 'lib/posthog/utils.rb', line 84 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
68 69 70 71 72 73 |
# File 'lib/posthog/utils.rb', line 68 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 |
.uid ⇒ Object
public: Returns a uid string
47 48 49 50 51 52 53 |
# File 'lib/posthog/utils.rb', line 47 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 |