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.
- checksums.yaml +4 -4
- data/lib/robodash/version.rb +1 -1
- data/lib/robodash.rb +102 -26
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ddd20a1df16bb150163a7c2d2681ca0cd63b4cbe2100801087eba5f4536bbe8d
|
4
|
+
data.tar.gz: a2c185bc91ee8f1e5759ed8bbbad4254e5ab7c9ca03e41b99cce37446c3cae26
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49c2472b56fa3983f4c3628a399b0be585189a7260f9e4947874905f257e3fc9a8f32dd4c5832466d17310facd2a93dd60d9630ac1f0528f9f645bc2d7bb125e
|
7
|
+
data.tar.gz: ea6b47792eb289f1942d3199e7f4808f9215a3d25ac22034fd66fa19e4c56309214817cf58ff8f29667db3e65c021dcb53419123cb0ce84bf6aa1af1322b7a0f
|
data/lib/robodash/version.rb
CHANGED
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
|
-
|
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
|
12
|
-
|
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
|
-
|
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
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
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.
|
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:
|
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.
|
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.
|