robodash 0.1.0 → 0.3.0

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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/robodash/version.rb +1 -1
  3. data/lib/robodash.rb +102 -26
  4. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3481accdbedd74773f15df8a57825ca3561f817753e7949b2a37dc7e1762fa71
4
- data.tar.gz: d4afb9395e7ecb87f2ebe1f8fedd77804dde6596e330dd5b85f2ec7932a3604e
3
+ metadata.gz: ddd20a1df16bb150163a7c2d2681ca0cd63b4cbe2100801087eba5f4536bbe8d
4
+ data.tar.gz: a2c185bc91ee8f1e5759ed8bbbad4254e5ab7c9ca03e41b99cce37446c3cae26
5
5
  SHA512:
6
- metadata.gz: e015e544be54b83e31136cc0f1553d2c9160ddbebe998a315e075c7c28d69907906f3f8adc8b64298d6677fd42152ef04783866cd2fbf0389a65c50656952a1a
7
- data.tar.gz: 3efba1800bc1763eab900428fdda9d6279789e2cb98aee7dea515aa3de58ac786f52c9fb97b59b4039dcc541a32ebe35ab801b74075235c9d510c88e4029e9eb
6
+ metadata.gz: 49c2472b56fa3983f4c3628a399b0be585189a7260f9e4947874905f257e3fc9a8f32dd4c5832466d17310facd2a93dd60d9630ac1f0528f9f645bc2d7bb125e
7
+ data.tar.gz: ea6b47792eb289f1942d3199e7f4808f9215a3d25ac22034fd66fa19e4c56309214817cf58ff8f29667db3e65c021dcb53419123cb0ce84bf6aa1af1322b7a0f
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Robodash
4
- VERSION = "0.1.0"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/robodash.rb CHANGED
@@ -1,46 +1,122 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "robodash/version"
4
+ require "net/http"
5
+ require "uri"
6
+ require "json"
4
7
 
5
8
  module Robodash
6
- class Error < StandardError; end
9
+ # Defaults
10
+ DEFAULT_HOST = "https://robodash.app"
11
+ OPEN_TIMEOUT = 2
12
+ READ_TIMEOUT = 5
13
+
14
+ # Parse flexible format like "every 30 minutes", "3 days", "2 hours"
15
+ SCHEDULE_REGEX = /^(?:every\s+)?(\d+)\s*(minute|hour|day|week|month|year)s?$/
7
16
 
8
17
  class << self
9
- attr_accessor :api_token
18
+ attr_accessor :api_token, :host, :enabled
10
19
 
11
- def ping(name)
12
- send_request("ping", {name: name})
20
+ def enabled?
21
+ return true if @enabled.nil?
22
+ @enabled
23
+ end
24
+
25
+ # Possible schedules:
26
+ # - minutely
27
+ # - hourly
28
+ # - daily
29
+ # - weekly
30
+ # - monthly
31
+ # - yearly
32
+ #
33
+ # Examples:
34
+ # Robodash.ping("Some task", :daily, grace_period: 10.minutes)
35
+ # Robodash.ping("Some task", "every 10 minutes", grace_period: 10.minutes)
36
+ def ping(name, schedule = nil, grace_period: nil)
37
+ params = {name: name}
38
+ params.merge!({grace_period: grace_period.to_i}) if grace_period.present?
39
+ params.merge!(parse_schedule(schedule)) if schedule.present?
40
+
41
+ fire_and_forget("ping", params)
13
42
  end
14
43
 
15
44
  # Count should always be an integer
16
- def count(name, count)
17
- send_request("count", {name: name, count: count.to_i})
45
+ def count(name, count, range = nil)
46
+ fire_and_forget("count", {name: name, count: count.to_i})
18
47
  end
19
48
 
20
49
  private
50
+
51
+ def parse_schedule(schedule)
52
+ schedule = schedule.to_s.strip.downcase
53
+ return predefined_schedules[schedule] if predefined_schedules[schedule]
54
+
55
+ match = schedule.match(SCHEDULE_REGEX)
56
+ return {schedule_number: match[1].to_i, schedule_period: match[2]} if match
57
+
58
+ {}
59
+ end
60
+
61
+ def predefined_schedules
62
+ {
63
+ "minutely" => {schedule_period: "minute", schedule_number: 1},
64
+ "hourly" => {schedule_period: "hour", schedule_number: 1},
65
+ "daily" => {schedule_period: "day", schedule_number: 1},
66
+ "weekly" => {schedule_period: "week", schedule_number: 1},
67
+ "monthly" => {schedule_period: "month", schedule_number: 1},
68
+ "yearly" => {schedule_period: "year", schedule_number: 1}
69
+ }
70
+ end
21
71
 
22
- def send_request(endpoint, body)
23
- raise "API token is not set!" unless api_token
24
-
25
- begin
26
- Thread.new do
27
- uri = URI("https://beta.robodash.app/api/#{endpoint}.json")
28
- request = Net::HTTP::Post.new(uri)
29
- request["Authorization"] = "dashboard-token #{api_token}"
30
- request["Content-Type"] = "application/json"
31
- request.body = body.to_json
32
-
33
- Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
34
- http.open_timeout = 5
35
- http.read_timeout = 10
36
- http.request(request)
37
- end
72
+ def fire_and_forget(endpoint, body)
73
+ return false unless enabled?
74
+ return false unless api_token
75
+
76
+ Thread.new do
77
+ Thread.current.abort_on_exception = false
78
+
79
+ begin
80
+ send_api_request(endpoint, body)
81
+ rescue => e
82
+ warn_safely("Robodash request failed: #{e.class} - #{e.message}")
38
83
  end
39
- true
40
- rescue StandardError => e
41
- warn "Failed to ping Robodash: #{e.message}"
42
- false
43
84
  end
85
+
86
+ true
87
+ end
88
+
89
+ def send_api_request(endpoint, body)
90
+ uri = URI("#{host}/api/#{endpoint}.json")
91
+
92
+ request = Net::HTTP::Post.new(uri)
93
+ request["Authorization"] = "dashboard-token #{api_token}"
94
+ request["Content-Type"] = "application/json"
95
+ request.body = body.to_json
96
+
97
+ # Use aggressive timeouts for fire-and-forget
98
+ Net::HTTP.start(uri.hostname, uri.port,
99
+ use_ssl: uri.scheme == "https",
100
+ open_timeout: OPEN_TIMEOUT,
101
+ read_timeout: READ_TIMEOUT,
102
+ ssl_timeout: OPEN_TIMEOUT) do |http|
103
+ http.request(request)
104
+ end
105
+ end
106
+
107
+ # Only warn if we're in a context where it's safe to do so
108
+ def warn_safely(message)
109
+ if defined?(Rails) && Rails.logger
110
+ Rails.logger.warn("[Robodash] #{message}")
111
+ elsif $stderr && !$stderr.closed?
112
+ $stderr.puts("[Robodash] #{message}")
113
+ end
114
+ rescue
115
+ # If even logging fails, just silently continue
116
+ end
117
+
118
+ def host
119
+ @host || DEFAULT_HOST
44
120
  end
45
121
 
46
122
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: robodash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bram Jetten
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-12-21 00:00:00.000000000 Z
11
+ date: 2025-06-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Robodash is a lightweight Ruby gem for sending POST requests to Robodash's
14
14
  API. It is designed to be simple to use, with support for API tokens and background
@@ -44,7 +44,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
46
  requirements: []
47
- rubygems_version: 3.5.3
47
+ rubygems_version: 3.5.16
48
48
  signing_key:
49
49
  specification_version: 4
50
50
  summary: A simple gem to send asynchronous POST requests to Robodash.