schked 1.2.0 → 1.3.1
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/README.md +1 -1
- data/lib/schked/config.rb +18 -3
- data/lib/schked/redis_client_factory.rb +34 -0
- data/lib/schked/redis_locker.rb +10 -2
- data/lib/schked/version.rb +1 -1
- data/lib/schked/worker.rb +4 -1
- data/lib/schked.rb +2 -0
- metadata +33 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9a25d59affde0ab7338589e83d6152d1fec95d85a0887c3a3425e46e5dc23b4e
|
4
|
+
data.tar.gz: ccded47a6b93dfecd745b1bfe92a5e9114d7bbc903421ceee5460f3a258ab8a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e73d0584c60b7f334a0b5172005be410864f93e7e875290cd253b1d5d89149b1ed60c528a89894304a58bf64b1e88fa78172c47610183efae0ed6fd79344c31d
|
7
|
+
data.tar.gz: cd09afb0e06c3d0e0c5c70cb76e114863e5faf93fcefdf6d1926acd296e57bb57ca868fc7a33f68aaf583bb43c492f0cec78ea6bc0d1a919843e938e1d861b29
|
data/README.md
CHANGED
@@ -79,7 +79,7 @@ When you deploy your schedule to production, you want to start new instance befo
|
|
79
79
|
You can configure Redis client as the following:
|
80
80
|
|
81
81
|
```ruby
|
82
|
-
Schked.config.
|
82
|
+
Schked.config.redis = {url: ENV.fetch("REDIS_URL") }
|
83
83
|
```
|
84
84
|
|
85
85
|
### Callbacks
|
data/lib/schked/config.rb
CHANGED
@@ -6,7 +6,7 @@ module Schked
|
|
6
6
|
class Config
|
7
7
|
attr_writer :logger,
|
8
8
|
:do_not_load_root_schedule,
|
9
|
-
:
|
9
|
+
:redis,
|
10
10
|
:standalone
|
11
11
|
|
12
12
|
def paths
|
@@ -48,8 +48,23 @@ module Schked
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
def
|
52
|
-
@
|
51
|
+
def redis
|
52
|
+
@redis ||= {url: ENV.fetch("REDIS_URL", "redis://127.0.0.1:6379")}
|
53
|
+
end
|
54
|
+
|
55
|
+
def redis_servers=(val)
|
56
|
+
val = val.first
|
57
|
+
|
58
|
+
if val.is_a?(String)
|
59
|
+
self.redis = {url: val}
|
60
|
+
elsif val.respond_to?(:_client)
|
61
|
+
conf = val._client.config
|
62
|
+
self.redis = {url: conf.server_url, username: conf.username, password: conf.password}
|
63
|
+
else
|
64
|
+
raise ArgumentError, "Schked `redis_servers=` config option is deprecated. Please use `redis=` with a Hash"
|
65
|
+
end
|
66
|
+
|
67
|
+
warn "🔥 Schked `redis_servers=` config option is deprecated. Please use `redis=` with a Hash. Called from #{caller(1..1).first}"
|
53
68
|
end
|
54
69
|
|
55
70
|
def standalone?
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "redis-client"
|
4
|
+
|
5
|
+
module Schked
|
6
|
+
module RedisClientFactory
|
7
|
+
def self.build(options)
|
8
|
+
unless options.key?(:reconnect_attempts)
|
9
|
+
options[:reconnect_attempts] = 3
|
10
|
+
end
|
11
|
+
|
12
|
+
if options.key?(:sentinels)
|
13
|
+
if (url = options.delete(:url))
|
14
|
+
uri = URI.parse(url)
|
15
|
+
if !options.key?(:name) && uri.host
|
16
|
+
options[:name] = uri.host
|
17
|
+
end
|
18
|
+
|
19
|
+
if !options.key?(:password) && uri.password && !uri.password.empty?
|
20
|
+
options[:password] = uri.password
|
21
|
+
end
|
22
|
+
|
23
|
+
if !options.key?(:username) && uri.user && !uri.user.empty?
|
24
|
+
options[:username] = uri.user
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
RedisClient.sentinel(**options).new_client
|
29
|
+
else
|
30
|
+
RedisClient.config(**options).new_client
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/schked/redis_locker.rb
CHANGED
@@ -10,8 +10,8 @@ module Schked
|
|
10
10
|
LOCK_KEY = "schked:redis_locker"
|
11
11
|
LOCK_TTL = 60_000 # ms
|
12
12
|
|
13
|
-
def initialize(
|
14
|
-
@lock_manager = Redlock::Client.new(
|
13
|
+
def initialize(redis_conf, lock_ttl: LOCK_TTL, logger: Logger.new($stdout))
|
14
|
+
@lock_manager = Redlock::Client.new([redis_client(redis_conf)], retry_count: 0)
|
15
15
|
@lock_ttl = lock_ttl
|
16
16
|
@logger = logger
|
17
17
|
end
|
@@ -49,6 +49,14 @@ module Schked
|
|
49
49
|
|
50
50
|
private
|
51
51
|
|
52
|
+
def redis_client(redis_conf)
|
53
|
+
if Gem::Version.new(Redlock::VERSION) >= Gem::Version.new("2.0.0")
|
54
|
+
ConnectionPool::Wrapper.new { RedisClientFactory.build(redis_conf) }
|
55
|
+
else
|
56
|
+
ConnectionPool::Wrapper.new { Redis.new(**redis_conf) }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
52
60
|
def try_lock
|
53
61
|
@lock_id = lock_manager.lock(LOCK_KEY, lock_ttl)
|
54
62
|
end
|
data/lib/schked/version.rb
CHANGED
data/lib/schked/worker.rb
CHANGED
@@ -7,7 +7,8 @@ module Schked
|
|
7
7
|
def initialize(config:)
|
8
8
|
@config = config
|
9
9
|
|
10
|
-
@locker = RedisLocker.new(config.
|
10
|
+
@locker = RedisLocker.new(config.redis, lock_ttl: 40_000, logger: config.logger) unless config.standalone?
|
11
|
+
|
11
12
|
@scheduler = Rufus::Scheduler.new(trigger_lock: locker)
|
12
13
|
|
13
14
|
watch_signals
|
@@ -35,6 +36,8 @@ module Schked
|
|
35
36
|
def schedule
|
36
37
|
config
|
37
38
|
.paths
|
39
|
+
.map { |path| File.expand_path(path) }
|
40
|
+
.uniq
|
38
41
|
.map { |path| File.read(path) }
|
39
42
|
.join("\n")
|
40
43
|
end
|
data/lib/schked.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "connection_pool"
|
3
4
|
require "redlock"
|
4
5
|
|
5
6
|
require "schked/version"
|
6
7
|
require "schked/config"
|
7
8
|
require "schked/worker"
|
8
9
|
require "schked/redis_locker"
|
10
|
+
require "schked/redis_client_factory"
|
9
11
|
require "schked/railtie" if defined?(Rails)
|
10
12
|
|
11
13
|
module Schked
|
metadata
CHANGED
@@ -1,29 +1,49 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: schked
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Misha Merkushin
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2025-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: connection_pool
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '2.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '2.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: redlock
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
|
-
- - "
|
31
|
+
- - ">"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0'
|
33
|
+
version: '1.0'
|
34
|
+
- - "<"
|
35
|
+
- !ruby/object:Gem::Version
|
36
|
+
version: '3.0'
|
20
37
|
type: :runtime
|
21
38
|
prerelease: false
|
22
39
|
version_requirements: !ruby/object:Gem::Requirement
|
23
40
|
requirements:
|
24
|
-
- - "
|
41
|
+
- - ">"
|
25
42
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0'
|
43
|
+
version: '1.0'
|
44
|
+
- - "<"
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: '3.0'
|
27
47
|
- !ruby/object:Gem::Dependency
|
28
48
|
name: rufus-scheduler
|
29
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,20 +114,6 @@ dependencies:
|
|
94
114
|
- - "~>"
|
95
115
|
- !ruby/object:Gem::Version
|
96
116
|
version: '1.3'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: pry-byebug
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - "~>"
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '3.9'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - "~>"
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '3.9'
|
111
117
|
- !ruby/object:Gem::Dependency
|
112
118
|
name: rake
|
113
119
|
requirement: !ruby/object:Gem::Requirement
|
@@ -123,19 +129,19 @@ dependencies:
|
|
123
129
|
- !ruby/object:Gem::Version
|
124
130
|
version: '13.0'
|
125
131
|
- !ruby/object:Gem::Dependency
|
126
|
-
name: redis
|
132
|
+
name: redis-client
|
127
133
|
requirement: !ruby/object:Gem::Requirement
|
128
134
|
requirements:
|
129
135
|
- - "~>"
|
130
136
|
- !ruby/object:Gem::Version
|
131
|
-
version: '
|
137
|
+
version: '0.10'
|
132
138
|
type: :development
|
133
139
|
prerelease: false
|
134
140
|
version_requirements: !ruby/object:Gem::Requirement
|
135
141
|
requirements:
|
136
142
|
- - "~>"
|
137
143
|
- !ruby/object:Gem::Version
|
138
|
-
version: '
|
144
|
+
version: '0.10'
|
139
145
|
- !ruby/object:Gem::Dependency
|
140
146
|
name: rspec
|
141
147
|
requirement: !ruby/object:Gem::Requirement
|
@@ -179,6 +185,7 @@ files:
|
|
179
185
|
- lib/schked/cli.rb
|
180
186
|
- lib/schked/config.rb
|
181
187
|
- lib/schked/railtie.rb
|
188
|
+
- lib/schked/redis_client_factory.rb
|
182
189
|
- lib/schked/redis_locker.rb
|
183
190
|
- lib/schked/version.rb
|
184
191
|
- lib/schked/worker.rb
|
@@ -193,16 +200,16 @@ require_paths:
|
|
193
200
|
- lib
|
194
201
|
required_ruby_version: !ruby/object:Gem::Requirement
|
195
202
|
requirements:
|
196
|
-
- - "
|
203
|
+
- - ">="
|
197
204
|
- !ruby/object:Gem::Version
|
198
|
-
version: '2.
|
205
|
+
version: '2.7'
|
199
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
200
207
|
requirements:
|
201
208
|
- - ">="
|
202
209
|
- !ruby/object:Gem::Version
|
203
210
|
version: '0'
|
204
211
|
requirements: []
|
205
|
-
rubygems_version: 3.
|
212
|
+
rubygems_version: 3.5.21
|
206
213
|
signing_key:
|
207
214
|
specification_version: 4
|
208
215
|
summary: Ruby Scheduler
|