posthog-ruby 1.1.0 → 1.2.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1a418b6727a9730ad159789d9b6fdb7b9df4b680fbb9e6d4a5e4ee3d05fa52e6
4
- data.tar.gz: 978744c42354807116a2a59e8dafe673cb939fea688d388f6090d877bb64ed31
3
+ metadata.gz: 3b90a7b41e6a5a6fbbf48f555b9948e05b1d4caec377ca715a07701e5d655123
4
+ data.tar.gz: cab835193f7c6ecba36d5121201ef5c216b9bdf31762124811a1fa43754c29e1
5
5
  SHA512:
6
- metadata.gz: 8a44e8cc2f0ce02e3a44f5cf61f5e6b291233a91e79dc89eb6eaa8e07fea4d42174802b694d5a52c76ec81c5825a12728fae7c4020470eb9faf271e7c0b9c4f9
7
- data.tar.gz: 8f5a14c51e7130bac3aa58ea644ae45d2ed44c5ff045413c574af15a5fcbbefee751a840c1b3fcdb61d0eef8af1ce689f6f5e019c18fbb3cea3107a08e3d6b20
6
+ metadata.gz: bdee6bf1dc34a46de738bfa5c73386d6054677080a25ab79ea37311c01992963b4731a432e2705d96e6fc10f66fed21f8a0438d4b8be3117c866fb4dd622f3b4
7
+ data.tar.gz: 91f6a9b65ebbcd9d95536f8542b96b777d2a47ece861912331d5764973101c77818f6104bc1b857f4f458883fe159ed46bd8029eb6076de541705b15f11c70a7
data/bin/posthog CHANGED
@@ -11,32 +11,39 @@ program :version, '1.0.0'
11
11
  program :description, 'PostHog API'
12
12
 
13
13
  def json_hash(str)
14
- if str
15
- return JSON.parse(str)
16
- end
14
+ return JSON.parse(str) if str
17
15
  end
18
16
 
19
17
  command :capture do |c|
20
18
  c.description = 'capture an event'
21
19
 
22
20
  c.option '--api-key=<string>', String, 'The PostHog API Key'
23
- c.option '--api-host=<url>', String, 'The PostHog API URL host part (scheme+domain)'
24
- c.option '--distinct-id=<distinct_id>', String, 'The distinct id to send the event as'
21
+ c.option '--api-host=<url>',
22
+ String,
23
+ 'The PostHog API URL host part (scheme+domain)'
24
+ c.option '--distinct-id=<distinct_id>',
25
+ String,
26
+ 'The distinct id to send the event as'
25
27
  c.option '--event=<event>', String, 'The event name to send with the event'
26
28
  c.option '--properties=<properties>', 'The properties to send (JSON-encoded)'
27
29
 
28
30
  c.action do |args, options|
29
- posthog = PostHog::Client.new({
30
- api_key: options.api_key,
31
- api_host: options.api_host,
32
- on_error: Proc.new { |status, msg| print msg }
33
- })
34
-
35
- posthog.capture({
36
- distinct_id: options.distinct_id,
37
- event: options.event,
38
- properties: json_hash(options.properties)
39
- })
31
+ posthog =
32
+ PostHog::Client.new(
33
+ {
34
+ api_key: options.api_key,
35
+ api_host: options.api_host,
36
+ on_error: Proc.new { |status, msg| print msg }
37
+ }
38
+ )
39
+
40
+ posthog.capture(
41
+ {
42
+ distinct_id: options.distinct_id,
43
+ event: options.event,
44
+ properties: json_hash(options.properties)
45
+ }
46
+ )
40
47
 
41
48
  posthog.flush
42
49
  end
@@ -46,21 +53,30 @@ command :identify do |c|
46
53
  c.description = 'identify the user'
47
54
 
48
55
  c.option '--api-key=<api_key>', String, 'The PostHog API Key'
49
- c.option '--api-host=<url>', String, 'The PostHog API URL host part (scheme+domain)'
50
- c.option '--distinct-id=<distinct_id>', String, 'The distinct id to send the event as'
56
+ c.option '--api-host=<url>',
57
+ String,
58
+ 'The PostHog API URL host part (scheme+domain)'
59
+ c.option '--distinct-id=<distinct_id>',
60
+ String,
61
+ 'The distinct id to send the event as'
51
62
  c.option '--properties=<properties>', 'The properties to send (JSON-encoded)'
52
63
 
53
64
  c.action do |args, options|
54
- posthog = PostHog::Client.new({
55
- api_key: options.api_key,
56
- api_host: options.api_host,
57
- on_error: Proc.new { |status, msg| print msg }
58
- })
59
-
60
- posthog.identify({
61
- distinct_id: options.distinct_id,
62
- properties: json_hash(options.properties)
63
- })
65
+ posthog =
66
+ PostHog::Client.new(
67
+ {
68
+ api_key: options.api_key,
69
+ api_host: options.api_host,
70
+ on_error: Proc.new { |status, msg| print msg }
71
+ }
72
+ )
73
+
74
+ posthog.identify(
75
+ {
76
+ distinct_id: options.distinct_id,
77
+ properties: json_hash(options.properties)
78
+ }
79
+ )
64
80
 
65
81
  posthog.flush
66
82
  end
@@ -70,21 +86,23 @@ command :alias do |c|
70
86
  c.description = 'set an alias for a distinct id'
71
87
 
72
88
  c.option '--api-key=<api_key>', String, 'The PostHog API Key'
73
- c.option '--api-host=<url>', String, 'The PostHog API URL host part (scheme+domain)'
89
+ c.option '--api-host=<url>',
90
+ String,
91
+ 'The PostHog API URL host part (scheme+domain)'
74
92
  c.option '--distinct-id=<distinct_id>', String, 'The distinct id'
75
93
  c.option '--alias=<alias>', 'The alias to give to the distinct id'
76
94
 
77
95
  c.action do |args, options|
78
- posthog = PostHog::Client.new({
79
- api_key: options.api_key,
80
- api_host: options.api_host,
81
- on_error: Proc.new { |status, msg| print msg }
82
- })
83
-
84
- posthog.alias({
85
- distinct_id: options.distinct_id,
86
- alias: options.alias,
87
- })
96
+ posthog =
97
+ PostHog::Client.new(
98
+ {
99
+ api_key: options.api_key,
100
+ api_host: options.api_host,
101
+ on_error: Proc.new { |status, msg| print msg }
102
+ }
103
+ )
104
+
105
+ posthog.alias({ distinct_id: options.distinct_id, alias: options.alias })
88
106
 
89
107
  posthog.flush
90
108
  end
@@ -15,7 +15,8 @@ class PostHog
15
15
  @min_timeout_ms = opts[:min_timeout_ms] || MIN_TIMEOUT_MS
16
16
  @max_timeout_ms = opts[:max_timeout_ms] || MAX_TIMEOUT_MS
17
17
  @multiplier = opts[:multiplier] || MULTIPLIER
18
- @randomization_factor = opts[:randomization_factor] || RANDOMIZATION_FACTOR
18
+ @randomization_factor =
19
+ opts[:randomization_factor] || RANDOMIZATION_FACTOR
19
20
 
20
21
  @attempts = 0
21
22
  end
@@ -37,11 +38,7 @@ class PostHog
37
38
  max_deviation = base * randomization_factor
38
39
  deviation = random_number * max_deviation
39
40
 
40
- if random_number < 0.5
41
- base - deviation
42
- else
43
- base + deviation
44
- end
41
+ random_number < 0.5 ? base - deviation : base + deviation
45
42
  end
46
43
  end
47
44
  end
@@ -5,6 +5,7 @@ require 'posthog/defaults'
5
5
  require 'posthog/logging'
6
6
  require 'posthog/utils'
7
7
  require 'posthog/worker'
8
+ require 'posthog/feature_flags'
8
9
 
9
10
  class PostHog
10
11
  class Client
@@ -25,9 +26,22 @@ class PostHog
25
26
  @worker_mutex = Mutex.new
26
27
  @worker = Worker.new(@queue, @api_key, opts)
27
28
  @worker_thread = nil
29
+ @feature_flags_poller = nil
30
+ @personal_api_key = nil
28
31
 
29
32
  check_api_key!
30
33
 
34
+ if opts[:personal_api_key]
35
+ @personal_api_key = opts[:personal_api_key]
36
+ @feature_flags_poller =
37
+ FeatureFlagsPoller.new(
38
+ opts[:feature_flags_polling_interval],
39
+ opts[:personal_api_key],
40
+ @api_key,
41
+ opts[:host]
42
+ )
43
+ end
44
+
31
45
  at_exit { @worker_thread && @worker_thread[:should_exit] = true }
32
46
  end
33
47
 
@@ -87,6 +101,47 @@ class PostHog
87
101
  @queue.length
88
102
  end
89
103
 
104
+ def is_feature_enabled(flag_key, distinct_id, default_value = false)
105
+ unless @personal_api_key
106
+ logger.error(
107
+ 'You need to specify a personal_api_key to use feature flags'
108
+ )
109
+ return
110
+ end
111
+ is_enabled =
112
+ @feature_flags_poller.is_feature_enabled(
113
+ flag_key,
114
+ distinct_id,
115
+ default_value
116
+ )
117
+ capture(
118
+ {
119
+ 'distinct_id': distinct_id,
120
+ 'event': '$feature_flag_called',
121
+ 'properties': {
122
+ '$feature_flag': flag_key,
123
+ '$feature_flag_response': is_enabled
124
+ }
125
+ }
126
+ )
127
+ return is_enabled
128
+ end
129
+
130
+ def reload_feature_flags
131
+ unless @personal_api_key
132
+ logger.error(
133
+ 'You need to specify a personal_api_key to use feature flags'
134
+ )
135
+ return
136
+ end
137
+ @feature_flags_poller.load_feature_flags(true)
138
+ end
139
+
140
+ def shutdown
141
+ @feature_flags_poller.shutdown_poller
142
+ flush
143
+ end
144
+
90
145
  private
91
146
 
92
147
  # private: Enqueues the action.
@@ -104,8 +159,8 @@ class PostHog
104
159
  else
105
160
  logger.warn(
106
161
  'Queue is full, dropping events. The :max_queue_size ' \
107
- 'configuration parameter can be increased to prevent this from ' \
108
- 'happening.'
162
+ 'configuration parameter can be increased to prevent this from ' \
163
+ 'happening.'
109
164
  )
110
165
  false
111
166
  end
@@ -120,9 +175,7 @@ class PostHog
120
175
  return if worker_running?
121
176
  @worker_mutex.synchronize do
122
177
  return if worker_running?
123
- @worker_thread = Thread.new do
124
- @worker.run
125
- end
178
+ @worker_thread = Thread.new { @worker.run }
126
179
  end
127
180
  end
128
181
 
@@ -131,4 +184,3 @@ class PostHog
131
184
  end
132
185
  end
133
186
  end
134
-
@@ -5,18 +5,20 @@ class PostHog
5
5
  PORT = 443
6
6
  PATH = '/batch/'
7
7
  SSL = true
8
- HEADERS = { 'Accept' => 'application/json',
9
- 'Content-Type' => 'application/json',
10
- 'User-Agent' => "posthog-ruby/#{PostHog::VERSION}" }
8
+ HEADERS = {
9
+ 'Accept' => 'application/json',
10
+ 'Content-Type' => 'application/json',
11
+ 'User-Agent' => "posthog-ruby/#{PostHog::VERSION}"
12
+ }
11
13
  RETRIES = 10
12
14
  end
13
15
 
14
16
  module Queue
15
- MAX_SIZE = 10000
17
+ MAX_SIZE = 10_000
16
18
  end
17
19
 
18
20
  module Message
19
- MAX_BYTES = 32768 # 32Kb
21
+ MAX_BYTES = 32_768 # 32Kb
20
22
  end
21
23
 
22
24
  module MessageBatch
@@ -26,7 +28,7 @@ class PostHog
26
28
 
27
29
  module BackoffPolicy
28
30
  MIN_TIMEOUT_MS = 100
29
- MAX_TIMEOUT_MS = 10000
31
+ MAX_TIMEOUT_MS = 10_000
30
32
  MULTIPLIER = 1.5
31
33
  RANDOMIZATION_FACTOR = 0.5
32
34
  end
@@ -0,0 +1,129 @@
1
+ require 'concurrent'
2
+ require 'net/http'
3
+ require 'json'
4
+ require 'posthog/version'
5
+ require 'posthog/logging'
6
+ require 'digest'
7
+ class PostHog
8
+ class FeatureFlagsPoller
9
+ include PostHog::Logging
10
+
11
+ def initialize(polling_interval, personal_api_key, project_api_key, host)
12
+ @polling_interval = polling_interval || 60 * 5
13
+ @personal_api_key = personal_api_key
14
+ @project_api_key = project_api_key
15
+ @host = host || 'app.posthog.com'
16
+ @feature_flags = Concurrent::Array.new
17
+ @loaded_flags_successfully_once = Concurrent::AtomicBoolean.new
18
+
19
+ @task =
20
+ Concurrent::TimerTask.new(
21
+ execution_interval: polling_interval,
22
+ timeout_interval: 15
23
+ ) { _load_feature_flags }
24
+
25
+ # load once before timer
26
+ load_feature_flags
27
+ @task.execute
28
+ end
29
+
30
+ def is_feature_enabled(key, distinct_id, default_result = false)
31
+ # make sure they're loaded on first run
32
+ load_feature_flags
33
+
34
+ return default_result unless @loaded_flags_successfully_once
35
+
36
+ feature_flag = nil
37
+
38
+
39
+ @feature_flags.each do |flag|
40
+ if key == flag['key']
41
+ feature_flag = flag
42
+ break
43
+ end
44
+ end
45
+
46
+ return default_result if !feature_flag
47
+
48
+ flag_rollout_pctg =
49
+ if feature_flag['rollout_percentage']
50
+ feature_flag['rollout_percentage']
51
+ else
52
+ 100
53
+ end
54
+ if feature_flag['is_simple_flag']
55
+ return is_simple_flag_enabled(key, distinct_id, flag_rollout_pctg)
56
+ else
57
+ data = { 'distinct_id' => distinct_id }
58
+ res = _request('POST', 'decide', false, data)
59
+ return res['featureFlags'].include? key
60
+ end
61
+
62
+ return false
63
+ end
64
+
65
+ def is_simple_flag_enabled(key, distinct_id, rollout_percentage)
66
+ hash = Digest::SHA1.hexdigest "#{key}.#{distinct_id}"
67
+ return(
68
+ (Integer(hash[0..14], 16).to_f / 0xfffffffffffffff) <=
69
+ (rollout_percentage / 100)
70
+ )
71
+ end
72
+
73
+ def load_feature_flags(force_reload = false)
74
+ if @loaded_flags_successfully_once.false? || force_reload
75
+ _load_feature_flags
76
+ end
77
+ end
78
+
79
+ def shutdown_poller()
80
+ @task.shutdown
81
+ end
82
+
83
+ private
84
+
85
+ def _load_feature_flags()
86
+ res = _request('GET', 'api/feature_flag', true)
87
+ @feature_flags.clear
88
+ @feature_flags = res['results'].filter { |flag| flag['active'] }
89
+ if @loaded_flags_successfully_once.false?
90
+ @loaded_flags_successfully_once.make_true
91
+ end
92
+ end
93
+
94
+ def _request(method, endpoint, use_personal_api_key = false, data = {})
95
+ uri = URI("https://#{@host}/#{endpoint}/?token=#{@project_api_key}")
96
+ req = nil
97
+ if use_personal_api_key
98
+ req = Net::HTTP::Get.new(uri)
99
+ req['Authorization'] = "Bearer #{@personal_api_key}"
100
+ else
101
+ req = Net::HTTP::Post.new(uri)
102
+ req['Content-Type'] = 'application/json'
103
+ data['token'] = @project_api_key
104
+ req.body = data.to_json
105
+ end
106
+
107
+ req['User-Agent'] = "posthog-ruby#{PostHog::VERSION}"
108
+
109
+ begin
110
+ res_body = nil
111
+ res =
112
+ Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
113
+ res = http.request(req)
114
+ res_body = JSON.parse(res.body)
115
+ return res_body
116
+ end
117
+ rescue Timeout::Error,
118
+ Errno::EINVAL,
119
+ Errno::ECONNRESET,
120
+ EOFError,
121
+ Net::HTTPBadResponse,
122
+ Net::HTTPHeaderSyntaxError,
123
+ Net::ProtocolError => e
124
+ logger.debug("Unable to complete request to #{uri}")
125
+ throw e
126
+ end
127
+ end
128
+ end
129
+ end
@@ -18,11 +18,13 @@ class PostHog
18
18
 
19
19
  isoify_dates! properties
20
20
 
21
- common.merge({
22
- :type => 'capture',
23
- :event => event.to_s,
24
- :properties => properties.merge(common[:properties] || {})
25
- })
21
+ common.merge(
22
+ {
23
+ type: 'capture',
24
+ event: event.to_s,
25
+ properties: properties.merge(common[:properties] || {})
26
+ }
27
+ )
26
28
  end
27
29
 
28
30
  # In addition to the common fields, identify accepts:
@@ -36,12 +38,14 @@ class PostHog
36
38
 
37
39
  isoify_dates! properties
38
40
 
39
- common.merge({
40
- :type => 'identify',
41
- :event => '$identify',
42
- :'$set' => properties,
43
- :properties => properties.merge(common[:properties] || {})
44
- })
41
+ common.merge(
42
+ {
43
+ type: 'identify',
44
+ event: '$identify',
45
+ '$set': properties,
46
+ properties: properties.merge(common[:properties] || {})
47
+ }
48
+ )
45
49
  end
46
50
 
47
51
  # In addition to the common fields, alias accepts:
@@ -55,15 +59,17 @@ class PostHog
55
59
  alias_field = fields[:alias]
56
60
  check_presence! alias_field, 'alias'
57
61
 
58
- common.merge({
59
- :type => 'alias',
60
- :event => '$create_alias',
61
- :distinct_id => nil,
62
- :properties => {
63
- :distinct_id => distinct_id,
64
- :alias => alias_field,
65
- }.merge(common[:properties] || {})
66
- })
62
+ common.merge(
63
+ {
64
+ type: 'alias',
65
+ event: '$create_alias',
66
+ distinct_id: nil,
67
+ properties:
68
+ { distinct_id: distinct_id, alias: alias_field }.merge(
69
+ common[:properties] || {}
70
+ )
71
+ }
72
+ )
67
73
  end
68
74
 
69
75
  private
@@ -82,21 +88,23 @@ class PostHog
82
88
  check_presence! distinct_id, 'distinct_id'
83
89
 
84
90
  parsed = {
85
- :timestamp => datetime_in_iso8601(timestamp),
86
- :library => 'posthog-ruby',
87
- :library_version => PostHog::VERSION.to_s,
88
- :messageId => message_id,
89
- :distinct_id => distinct_id,
90
- :properties => {
91
- "$lib" => 'posthog-ruby',
92
- "$lib_version" => PostHog::VERSION.to_s
91
+ timestamp: datetime_in_iso8601(timestamp),
92
+ library: 'posthog-ruby',
93
+ library_version: PostHog::VERSION.to_s,
94
+ messageId: message_id,
95
+ distinct_id: distinct_id,
96
+ properties: {
97
+ '$lib' => 'posthog-ruby',
98
+ '$lib_version' => PostHog::VERSION.to_s
93
99
  }
94
100
  }
95
101
  parsed
96
102
  end
97
103
 
98
104
  def check_timestamp!(timestamp)
99
- raise ArgumentError, 'Timestamp must be a Time' unless timestamp.is_a? Time
105
+ unless timestamp.is_a? Time
106
+ raise ArgumentError, 'Timestamp must be a Time'
107
+ end
100
108
  end
101
109
 
102
110
  # private: Ensures that a string is non-empty
@@ -30,13 +30,14 @@ class PostHog
30
30
  def logger
31
31
  return @logger if @logger
32
32
 
33
- base_logger = if defined?(Rails)
34
- Rails.logger
35
- else
36
- logger = Logger.new STDOUT
37
- logger.progname = 'PostHog'
38
- logger
39
- end
33
+ base_logger =
34
+ if defined?(Rails)
35
+ Rails.logger
36
+ else
37
+ logger = Logger.new STDOUT
38
+ logger.progname = 'PostHog'
39
+ logger
40
+ end
40
41
  @logger = PrefixedLogger.new(base_logger, '[posthog-ruby]')
41
42
  end
42
43
 
@@ -56,4 +57,3 @@ class PostHog
56
57
  end
57
58
  end
58
59
  end
59
-
@@ -4,7 +4,8 @@ require 'posthog/logging'
4
4
  class PostHog
5
5
  # A batch of `Message`s to be sent to the API
6
6
  class MessageBatch
7
- class JSONGenerationError < StandardError; end
7
+ class JSONGenerationError < StandardError
8
+ end
8
9
 
9
10
  extend Forwardable
10
11
  include PostHog::Logging
@@ -7,8 +7,7 @@ class PostHog
7
7
  #
8
8
  def initialize(status = 200, error = nil)
9
9
  @status = status
10
- @error = error
10
+ @error = error
11
11
  end
12
12
  end
13
13
  end
14
-
@@ -26,13 +26,15 @@ class PostHog
26
26
  @headers = options[:headers] || HEADERS
27
27
  @path = options[:path] || PATH
28
28
  @retries = options[:retries] || RETRIES
29
- @backoff_policy =
30
- options[:backoff_policy] || PostHog::BackoffPolicy.new
29
+ @backoff_policy = options[:backoff_policy] || PostHog::BackoffPolicy.new
31
30
 
32
31
  http = Net::HTTP.new(options[:host], options[:port])
33
32
  http.use_ssl = options[:ssl]
34
33
  http.read_timeout = 8
35
34
  http.open_timeout = 4
35
+ if options[:skip_ssl_verification]
36
+ http.verify_mode = OpenSSL::SSL::VERIFY_NONE
37
+ end
36
38
 
37
39
  @http = http
38
40
  end
@@ -43,15 +45,16 @@ class PostHog
43
45
  def send(api_key, batch)
44
46
  logger.debug("Sending request for #{batch.length} items")
45
47
 
46
- last_response, exception = retry_with_backoff(@retries) do
47
- status_code, body = send_request(api_key, batch)
48
- error = JSON.parse(body)['error']
49
- should_retry = should_retry_request?(status_code, body)
50
- logger.debug("Response status code: #{status_code}")
51
- logger.debug("Response error: #{error}") if error
48
+ last_response, exception =
49
+ retry_with_backoff(@retries) do
50
+ status_code, body = send_request(api_key, batch)
51
+ error = JSON.parse(body)['error']
52
+ should_retry = should_retry_request?(status_code, body)
53
+ logger.debug("Response status code: #{status_code}")
54
+ logger.debug("Response error: #{error}") if error
52
55
 
53
- [Response.new(status_code, error), should_retry]
54
- end
56
+ [Response.new(status_code, error), should_retry]
57
+ end
55
58
 
56
59
  if exception
57
60
  logger.error(exception.message)
@@ -95,7 +98,7 @@ class PostHog
95
98
 
96
99
  begin
97
100
  result, should_retry = yield
98
- return [result, nil] unless should_retry
101
+ return result, nil unless should_retry
99
102
  rescue StandardError => e
100
103
  should_retry = true
101
104
  caught_exception = e
@@ -112,16 +115,13 @@ class PostHog
112
115
 
113
116
  # Sends a request for the batch, returns [status_code, body]
114
117
  def send_request(api_key, batch)
115
- payload = JSON.generate(
116
- api_key: api_key,
117
- batch: batch
118
- )
118
+ payload = JSON.generate(api_key: api_key, batch: batch)
119
119
 
120
120
  request = Net::HTTP::Post.new(@path, @headers)
121
121
 
122
122
  if self.class.stub
123
123
  logger.debug "stubbed request to #{@path}: " \
124
- "api key = #{api_key}, batch = #{JSON.generate(batch)}"
124
+ "api key = #{api_key}, batch = #{JSON.generate(batch)}"
125
125
 
126
126
  [200, '{}']
127
127
  else
@@ -140,4 +140,3 @@ class PostHog
140
140
  end
141
141
  end
142
142
  end
143
-
data/lib/posthog/utils.rb CHANGED
@@ -7,9 +7,7 @@ class PostHog
7
7
  # public: Return a new hash with keys converted from strings to symbols
8
8
  #
9
9
  def symbolize_keys(hash)
10
- hash.each_with_object({}) do |(k, v), memo|
11
- memo[k.to_sym] = v
12
- end
10
+ hash.each_with_object({}) { |(k, v), memo| memo[k.to_sym] = v }
13
11
  end
14
12
 
15
13
  # public: Convert hash keys from strings to symbols in place
@@ -21,9 +19,7 @@ class PostHog
21
19
  # public: Return a new hash with keys as strings
22
20
  #
23
21
  def stringify_keys(hash)
24
- hash.each_with_object({}) do |(k, v), memo|
25
- memo[k.to_s] = v
26
- end
22
+ hash.each_with_object({}) { |(k, v), memo| memo[k.to_s] = v }
27
23
  end
28
24
 
29
25
  # public: Returns a new hash with all the date values in the into iso8601
@@ -64,9 +60,8 @@ class PostHog
64
60
  end
65
61
 
66
62
  def time_in_iso8601(time, fraction_digits = 3)
67
- fraction = if fraction_digits > 0
68
- ('.%06i' % time.usec)[0, fraction_digits + 1]
69
- end
63
+ fraction =
64
+ (('.%06i' % time.usec)[0, fraction_digits + 1] if fraction_digits > 0)
70
65
 
71
66
  "#{time.strftime('%Y-%m-%dT%H:%M:%S')}#{fraction}#{formatted_offset(time, true, 'Z')}"
72
67
  end
@@ -76,15 +71,19 @@ class PostHog
76
71
  end
77
72
 
78
73
  def formatted_offset(time, colon = true, alternate_utc_string = nil)
79
- time.utc? && alternate_utc_string || seconds_to_utc_offset(time.utc_offset, colon)
74
+ time.utc? && alternate_utc_string ||
75
+ seconds_to_utc_offset(time.utc_offset, colon)
80
76
  end
81
77
 
82
78
  def seconds_to_utc_offset(seconds, colon = true)
83
- (colon ? UTC_OFFSET_WITH_COLON : UTC_OFFSET_WITHOUT_COLON) % [(seconds < 0 ? '-' : '+'), (seconds.abs / 3600), ((seconds.abs % 3600) / 60)]
79
+ (colon ? UTC_OFFSET_WITH_COLON : UTC_OFFSET_WITHOUT_COLON) % [
80
+ (seconds < 0 ? '-' : '+'),
81
+ (seconds.abs / 3600),
82
+ ((seconds.abs % 3600) / 60)
83
+ ]
84
84
  end
85
85
 
86
86
  UTC_OFFSET_WITH_COLON = '%s%02d:%02d'
87
87
  UTC_OFFSET_WITHOUT_COLON = UTC_OFFSET_WITH_COLON.sub(':', '')
88
88
  end
89
89
  end
90
-
@@ -1,3 +1,3 @@
1
1
  class PostHog
2
- VERSION = '1.1.0'
2
+ VERSION = '1.2.3'
3
3
  end
@@ -28,7 +28,7 @@ class PostHog
28
28
  batch_size = options[:batch_size] || Defaults::MessageBatch::MAX_SIZE
29
29
  @batch = MessageBatch.new(batch_size)
30
30
  @lock = Mutex.new
31
- @transport = Transport.new api_host: options[:api_host]
31
+ @transport = Transport.new api_host: options[:api_host], skip_ssl_verification: options[:skip_ssl_verification]
32
32
  end
33
33
 
34
34
  # public: Continuously runs the loop to check for new events
@@ -65,4 +65,3 @@ class PostHog
65
65
  end
66
66
  end
67
67
  end
68
-
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: posthog-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - ''
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-15 00:00:00.000000000 Z
11
+ date: 2022-01-18 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: concurrent-ruby
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: commander
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -135,6 +149,7 @@ files:
135
149
  - lib/posthog/backoff_policy.rb
136
150
  - lib/posthog/client.rb
137
151
  - lib/posthog/defaults.rb
152
+ - lib/posthog/feature_flags.rb
138
153
  - lib/posthog/field_parser.rb
139
154
  - lib/posthog/logging.rb
140
155
  - lib/posthog/message_batch.rb
@@ -162,7 +177,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
162
177
  - !ruby/object:Gem::Version
163
178
  version: '0'
164
179
  requirements: []
165
- rubygems_version: 3.0.3
180
+ rubygems_version: 3.0.3.1
166
181
  signing_key:
167
182
  specification_version: 4
168
183
  summary: PostHog library