infield 0.1.4 → 0.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d5a5b72da6bbb6200602ff8afba391199669ca5cd265c7b134cc461756b800f1
4
- data.tar.gz: 73f0b79b8d207468d166787b0af21461e17d875cc3423744c037046939df602f
3
+ metadata.gz: 8e38ea40e467d3cbeb1bdffa874079e8e239b5848a0b29c92950af25e29be7cc
4
+ data.tar.gz: fe0209155165140aa4b0b00c42522fa17140e9b16c0b11a5934efd88e174a0e5
5
5
  SHA512:
6
- metadata.gz: 834d0d67edfc17821d11782a91672a217533ac6069e86c4b471c873fdf037d2f075c4387ebcc754b2142f6069d5c84ed340057c58b558ea1dfb7dd5d59972067
7
- data.tar.gz: 6150e0e43b01658417b237184ee81cfd7f2b7a6eaf78737ff844dfa4b77ac57f93b99f2b18f75aba5ee746303404a4320dcaddd74ebbb2072cb576fbfe21e391
6
+ metadata.gz: 851bfaa811aa0420cb11e538849e96799f2ea806620c918ee4b883d708a95343ebc4f94845d008d163d788a925037a98c4577bbaa79fd2a5c737b5740979c455
7
+ data.tar.gz: 883a1530b0d8b9924d2c11d9103e6ac8b0aebcd93586f5a5fd40bbff4451b6f79658c0229d448190acf9795ea3e3c81fbd2ed23a8a8836b51b8daa7df3c9bcdc
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 3.2.3
1
+ 3.2.3
@@ -1,35 +1,53 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'concurrent/array'
4
- require 'concurrent/atomic/event'
3
+ require 'thread'
4
+ require 'json'
5
5
  require 'net/http'
6
6
 
7
7
  module Infield
8
+ # Takes in new deprecation warnings and sends them to the Infield API
9
+ # in batches
8
10
  module DeprecationWarning
9
11
  Task = Struct.new(:message, :callstack)
10
12
 
13
+ # Handles spinning up a thread to process work
11
14
  module Runner
12
15
  class << self
13
- def event
14
- @event ||= Concurrent::Event.new
15
- end
16
+ attr_reader :queue
16
17
 
17
- def tasks
18
- @tasks ||= Concurrent::Array.new
18
+ def enqueue(message)
19
+ return if @queue.size >= @queue_limit
20
+ @queue << message
19
21
  end
20
22
 
21
- def run
23
+ def run(sleep_interval: 5, batch_size: 10, queue_limit: 30)
24
+ @queue ||= Queue.new
25
+ @sleep_interval = sleep_interval
26
+ # Queue cannot be larger than this. If more than this number of messages come in
27
+ # before the next wake interval any extra are dropped
28
+ @queue_limit = queue_limit
29
+ @batch_size = batch_size # send up to 20 messages to API at once
30
+
22
31
  Thread.new do
23
32
  loop do
24
- event.wait
25
- deliver
26
- event.reset
33
+ sleep(@sleep_interval)
34
+ next if @queue.empty?
35
+
36
+ process_queue
27
37
  end
28
38
  end
29
39
  end
30
40
 
31
41
  private
32
42
 
43
+ def process_queue
44
+ messages = []
45
+ messages << @queue.pop until @queue.empty?
46
+ messages.each_slice(@batch_size) do |batch|
47
+ post_deprecation_warnings(batch)
48
+ end
49
+ end
50
+
33
51
  def default_api_params
34
52
  { repo_environment_id: Infield.repo_environment_id,
35
53
  environment: Infield.environment }
@@ -39,34 +57,27 @@ module Infield
39
57
  URI.parse(Infield.infield_api_url)
40
58
  end
41
59
 
42
- def upload_message(task)
60
+ def post_deprecation_warnings(tasks)
61
+ messages = tasks.map { |w| { message: w.message } }
43
62
  uri = infield_api_uri
44
63
  Net::HTTP.start(uri.host, uri.port, use_ssl: (uri.scheme == 'https')) do |http|
45
64
  http.post('/api/raw_deprecation_warnings',
46
- default_api_params.merge(message: task.message).to_json,
65
+ default_api_params.merge(messages: messages).to_json,
47
66
  { 'Content-Type' => 'application/json', 'Authorization' => "bearer #{Infield.api_key}" })
48
67
  end
49
68
  end
50
-
51
- def deliver
52
- while (task = tasks.shift)
53
- upload_message(task)
54
- end
55
- end
56
69
  end
57
70
  end
58
71
 
59
72
  class << self
60
73
  def log(*messages, callstack: nil, validated: false)
61
74
  messages = messages.select(&method(:valid_message)) unless validated
62
- messages.each { |message| tasks << Task.new(message, callstack) }
63
- Runner.event.set
75
+ messages.each { |message| Runner.enqueue(Task.new(message, callstack)) }
76
+ true
64
77
  end
65
78
 
66
79
  private
67
80
 
68
- delegate :tasks, to: 'Infield::DeprecationWarning::Runner'
69
-
70
81
  def valid_message(message)
71
82
  message =~ /(?:^|\W)deprecated(?:$|\W)/i
72
83
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Infield
4
- VERSION = '0.1.4'
4
+ VERSION = '0.1.6'
5
5
  end
data/lib/infield.rb CHANGED
@@ -13,7 +13,7 @@ module Infield
13
13
  class << self
14
14
  attr_accessor :api_key, :repo_environment_id, :environment, :infield_api_url
15
15
 
16
- def run(api_key: nil, repo_environment_id: nil, environment: nil)
16
+ def run(api_key: nil, repo_environment_id: nil, environment: nil, sleep_interval: 5, batch_size: 10, queue_limit: 30)
17
17
  @api_key = api_key || ENV['INFIELD_API_KEY']
18
18
  @repo_environment_id = repo_environment_id
19
19
  @infield_api_url = ENV['INFIELD_API_URL'] || 'https://app.infield.ai'
@@ -21,7 +21,7 @@ module Infield
21
21
  raise 'repo_environment_id is required' unless @repo_environment_id
22
22
 
23
23
  @environment = environment || defined?(Rails) ? Rails.env : nil
24
- DeprecationWarning::Runner.run
24
+ DeprecationWarning::Runner.run(sleep_interval: sleep_interval, batch_size: batch_size, queue_limit: queue_limit)
25
25
  end
26
26
  end
27
27
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: infield
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Infield
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-09-13 00:00:00.000000000 Z
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: '1.0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - "~>"
25
- - !ruby/object:Gem::Version
26
- version: '1.0'
11
+ date: 2024-09-16 00:00:00.000000000 Z
12
+ dependencies: []
27
13
  description:
28
14
  email:
29
15
  - support@infield.ai