cloudtasker 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +11 -1
- data/cloudtasker.gemspec +4 -2
- data/lib/cloudtasker.rb +2 -0
- data/lib/cloudtasker/batch/job.rb +4 -1
- data/lib/cloudtasker/batch/middleware.rb +0 -1
- data/lib/cloudtasker/cron/job.rb +4 -1
- data/lib/cloudtasker/cron/middleware.rb +0 -1
- data/lib/cloudtasker/cron/schedule.rb +49 -3
- data/lib/cloudtasker/redis_client.rb +22 -0
- data/lib/cloudtasker/unique_job/job.rb +4 -1
- data/lib/cloudtasker/unique_job/middleware.rb +0 -1
- data/lib/cloudtasker/version.rb +1 -1
- metadata +32 -7
- data/lib/cloudtasker/batch/config.rb +0 -11
- data/lib/cloudtasker/cron/config.rb +0 -11
- data/lib/cloudtasker/unique_job/config.rb +0 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18e57cdddeab550d4ec1bacf9be3fedb298bc54b115a6d47675e9989a68062a0
|
4
|
+
data.tar.gz: 37dbae4384a908554ad9b20de3265a360b5389227a3384b3e9557b8ed5434961
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9dfc4bef540a4e9a2c9c508295ba70acf18b4b08ada13d991d6f0327511d6f8af9e572c6e46bd68126755e3b756ae6f7fe8ad46caf6cd51248583c482fdc2083
|
7
|
+
data.tar.gz: fafbb8f13932eefc1e56e26fd820276f9003d9654ed4092b0286a1e66f5e903076557a7e3999e322a8fe4deab1af76bc73e1a75f8cc97a20e865ff04fecb9841
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
cloudtasker (0.
|
4
|
+
cloudtasker (0.2.0)
|
5
|
+
activesupport
|
5
6
|
fugit
|
6
7
|
google-cloud-tasks
|
7
8
|
jwt
|
@@ -70,6 +71,8 @@ GEM
|
|
70
71
|
ast (2.4.0)
|
71
72
|
builder (3.2.3)
|
72
73
|
concurrent-ruby (1.1.5)
|
74
|
+
crack (0.4.3)
|
75
|
+
safe_yaml (~> 1.0.0)
|
73
76
|
crass (1.0.5)
|
74
77
|
diff-lcs (1.3)
|
75
78
|
erubi (1.9.0)
|
@@ -112,6 +115,7 @@ GEM
|
|
112
115
|
grpc-google-iam-v1 (0.6.9)
|
113
116
|
googleapis-common-protos (>= 1.3.1, < 2.0)
|
114
117
|
grpc (~> 1.0)
|
118
|
+
hashdiff (1.0.0)
|
115
119
|
i18n (1.7.0)
|
116
120
|
concurrent-ruby (~> 1.0)
|
117
121
|
jaro_winkler (1.5.4)
|
@@ -204,6 +208,7 @@ GEM
|
|
204
208
|
rubocop-rspec (1.36.0)
|
205
209
|
rubocop (>= 0.68.1)
|
206
210
|
ruby-progressbar (1.10.1)
|
211
|
+
safe_yaml (1.0.5)
|
207
212
|
signet (0.12.0)
|
208
213
|
addressable (~> 2.3)
|
209
214
|
faraday (~> 0.9)
|
@@ -223,6 +228,10 @@ GEM
|
|
223
228
|
tzinfo (1.2.5)
|
224
229
|
thread_safe (~> 0.1)
|
225
230
|
unicode-display_width (1.6.0)
|
231
|
+
webmock (3.7.6)
|
232
|
+
addressable (>= 2.3.6)
|
233
|
+
crack (>= 0.3.2)
|
234
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
226
235
|
websocket-driver (0.7.1)
|
227
236
|
websocket-extensions (>= 0.1.0)
|
228
237
|
websocket-extensions (0.1.4)
|
@@ -242,6 +251,7 @@ DEPENDENCIES
|
|
242
251
|
rubocop-rspec
|
243
252
|
sqlite3
|
244
253
|
timecop
|
254
|
+
webmock
|
245
255
|
|
246
256
|
BUNDLED WITH
|
247
257
|
2.0.2
|
data/cloudtasker.gemspec
CHANGED
@@ -10,8 +10,8 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.authors = ['Arnaud Lachaume']
|
11
11
|
spec.email = ['arnaud.lachaume@keypup.io']
|
12
12
|
|
13
|
-
spec.summary = 'Manage GCP Cloud Tasks in your app.'
|
14
|
-
spec.description = 'Manage GCP Cloud Tasks in your app.'
|
13
|
+
spec.summary = 'Manage GCP Cloud Tasks in your app. (under development)'
|
14
|
+
spec.description = 'Manage GCP Cloud Tasks in your app. (under development)'
|
15
15
|
spec.homepage = 'https://github.com/keypup-io/cloudtasker'
|
16
16
|
spec.license = 'MIT'
|
17
17
|
|
@@ -30,6 +30,7 @@ Gem::Specification.new do |spec|
|
|
30
30
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
31
31
|
spec.require_paths = ['lib']
|
32
32
|
|
33
|
+
spec.add_dependency 'activesupport'
|
33
34
|
spec.add_dependency 'fugit'
|
34
35
|
spec.add_dependency 'google-cloud-tasks'
|
35
36
|
spec.add_dependency 'jwt'
|
@@ -41,6 +42,7 @@ Gem::Specification.new do |spec|
|
|
41
42
|
spec.add_development_dependency 'rubocop', '0.76.0'
|
42
43
|
spec.add_development_dependency 'rubocop-rspec'
|
43
44
|
spec.add_development_dependency 'timecop'
|
45
|
+
spec.add_development_dependency 'webmock'
|
44
46
|
|
45
47
|
spec.add_development_dependency 'rails'
|
46
48
|
spec.add_development_dependency 'rspec-rails'
|
data/lib/cloudtasker.rb
CHANGED
@@ -6,6 +6,9 @@ module Cloudtasker
|
|
6
6
|
class Job
|
7
7
|
attr_reader :worker
|
8
8
|
|
9
|
+
# Key Namespace used for object saved under this class
|
10
|
+
SUB_NAMESPACE = 'job'
|
11
|
+
|
9
12
|
#
|
10
13
|
# Return the cloudtasker redis client
|
11
14
|
#
|
@@ -44,7 +47,7 @@ module Cloudtasker
|
|
44
47
|
def self.key(val)
|
45
48
|
return nil if val.nil?
|
46
49
|
|
47
|
-
[
|
50
|
+
[to_s.underscore, val.to_s].join('/')
|
48
51
|
end
|
49
52
|
|
50
53
|
#
|
data/lib/cloudtasker/cron/job.rb
CHANGED
@@ -10,6 +10,9 @@ module Cloudtasker
|
|
10
10
|
class Job
|
11
11
|
attr_reader :worker
|
12
12
|
|
13
|
+
# Key Namespace used for object saved under this class
|
14
|
+
SUB_NAMESPACE = 'job'
|
15
|
+
|
13
16
|
#
|
14
17
|
# Build a new instance of the class
|
15
18
|
#
|
@@ -29,7 +32,7 @@ module Cloudtasker
|
|
29
32
|
def key(val)
|
30
33
|
return nil if val.nil?
|
31
34
|
|
32
|
-
[
|
35
|
+
[self.class.to_s.underscore, val.to_s].join('/')
|
33
36
|
end
|
34
37
|
|
35
38
|
#
|
@@ -8,6 +8,9 @@ module Cloudtasker
|
|
8
8
|
class Schedule
|
9
9
|
attr_accessor :id, :cron, :worker, :task_id, :job_id
|
10
10
|
|
11
|
+
# Key Namespace used for object saved under this class
|
12
|
+
SUB_NAMESPACE = 'schedule'
|
13
|
+
|
11
14
|
#
|
12
15
|
# Return the redis client.
|
13
16
|
#
|
@@ -17,6 +20,50 @@ module Cloudtasker
|
|
17
20
|
RedisClient
|
18
21
|
end
|
19
22
|
|
23
|
+
#
|
24
|
+
# Return a namespaced key.
|
25
|
+
#
|
26
|
+
# @param [String, Symbol] val The key to namespace
|
27
|
+
#
|
28
|
+
# @return [String] The namespaced key.
|
29
|
+
#
|
30
|
+
def self.key(val)
|
31
|
+
return nil if val.nil?
|
32
|
+
|
33
|
+
[to_s.underscore, val.to_s].join('/')
|
34
|
+
end
|
35
|
+
|
36
|
+
#
|
37
|
+
# Return all schedules
|
38
|
+
#
|
39
|
+
# @return [Array<Cloudtasker::Batch::Schedule>] The list of stored schedules.
|
40
|
+
#
|
41
|
+
def self.all
|
42
|
+
redis.search(key('*')).map do |gid|
|
43
|
+
find(gid.sub(key(''), ''))
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Synchronize list of cron schedules from a Hash. Schedules
|
49
|
+
# not listed in this hash will be removed.
|
50
|
+
#
|
51
|
+
# @example
|
52
|
+
# Cloudtasker::Cron::Schedule.load_from_hash!(
|
53
|
+
# my_job: { cron: '0 0 * * *', worker: 'MyWorker' }
|
54
|
+
# my_other_job: { cron: '0 10 * * *', worker: 'MyOtherWorker' }
|
55
|
+
# )
|
56
|
+
#
|
57
|
+
def self.load_from_hash!(hash)
|
58
|
+
schedules = hash.map do |id, config|
|
59
|
+
schedule_config = JSON.parse(config.to_json, symbolize_names: true).merge(id: id)
|
60
|
+
create(schedule_config)
|
61
|
+
end
|
62
|
+
|
63
|
+
# Remove existing schedules which are not part of the list
|
64
|
+
all.reject { |e| schedules.include?(e) }.each { |e| delete(e.id) }
|
65
|
+
end
|
66
|
+
|
20
67
|
#
|
21
68
|
# Create a new cron schedule (or update an existing one).
|
22
69
|
#
|
@@ -37,8 +84,7 @@ module Cloudtasker
|
|
37
84
|
# @return [Cloudtasker::Cron::Schedule] The schedule instance.
|
38
85
|
#
|
39
86
|
def self.find(id)
|
40
|
-
|
41
|
-
return nil unless (schedule_config = redis.fetch(gid))
|
87
|
+
return nil unless (schedule_config = redis.fetch(key(id)))
|
42
88
|
|
43
89
|
new(schedule_config)
|
44
90
|
end
|
@@ -89,7 +135,7 @@ module Cloudtasker
|
|
89
135
|
# @return [String] The namespaced schedule id.
|
90
136
|
#
|
91
137
|
def gid
|
92
|
-
|
138
|
+
self.class.key(id)
|
93
139
|
end
|
94
140
|
|
95
141
|
#
|
@@ -83,6 +83,28 @@ module Cloudtasker
|
|
83
83
|
del(*all_keys)
|
84
84
|
end
|
85
85
|
|
86
|
+
#
|
87
|
+
# Return all keys matching the provided patterns.
|
88
|
+
#
|
89
|
+
# @param [String] pattern A redis compatible pattern.
|
90
|
+
#
|
91
|
+
# @return [Array<String>] The list of matching keys
|
92
|
+
#
|
93
|
+
def search(pattern)
|
94
|
+
# Initialize loop variables
|
95
|
+
cursor = nil
|
96
|
+
list = []
|
97
|
+
|
98
|
+
# Scan and capture matching keys
|
99
|
+
while cursor != 0
|
100
|
+
scan = client.scan(cursor || 0, match: pattern)
|
101
|
+
list += scan[1]
|
102
|
+
cursor = scan[0].to_i
|
103
|
+
end
|
104
|
+
|
105
|
+
list
|
106
|
+
end
|
107
|
+
|
86
108
|
#
|
87
109
|
# Delegate all methods to the redis client.
|
88
110
|
#
|
@@ -10,6 +10,9 @@ module Cloudtasker
|
|
10
10
|
# The default lock strategy to use. Defaults to "no lock".
|
11
11
|
DEFAULT_LOCK = UniqueJob::Lock::NoOp
|
12
12
|
|
13
|
+
# Key Namespace used for object saved under this class
|
14
|
+
SUB_NAMESPACE = 'job'
|
15
|
+
|
13
16
|
#
|
14
17
|
# Build a new instance of the class.
|
15
18
|
#
|
@@ -91,7 +94,7 @@ module Cloudtasker
|
|
91
94
|
# @return [String] The global ID of the job
|
92
95
|
#
|
93
96
|
def unique_gid
|
94
|
-
[
|
97
|
+
[self.class.to_s.underscore, unique_id].join('/')
|
95
98
|
end
|
96
99
|
|
97
100
|
#
|
data/lib/cloudtasker/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cloudtasker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Arnaud Lachaume
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-11-
|
11
|
+
date: 2019-11-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activesupport
|
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: fugit
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -150,6 +164,20 @@ dependencies:
|
|
150
164
|
- - ">="
|
151
165
|
- !ruby/object:Gem::Version
|
152
166
|
version: '0'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: webmock
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - ">="
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
type: :development
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - ">="
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: '0'
|
153
181
|
- !ruby/object:Gem::Dependency
|
154
182
|
name: rails
|
155
183
|
requirement: !ruby/object:Gem::Requirement
|
@@ -192,7 +220,7 @@ dependencies:
|
|
192
220
|
- - ">="
|
193
221
|
- !ruby/object:Gem::Version
|
194
222
|
version: '0'
|
195
|
-
description: Manage GCP Cloud Tasks in your app.
|
223
|
+
description: Manage GCP Cloud Tasks in your app. (under development)
|
196
224
|
email:
|
197
225
|
- arnaud.lachaume@keypup.io
|
198
226
|
executables: []
|
@@ -220,14 +248,12 @@ files:
|
|
220
248
|
- lib/cloudtasker/authenticator.rb
|
221
249
|
- lib/cloudtasker/batch.rb
|
222
250
|
- lib/cloudtasker/batch/batch_progress.rb
|
223
|
-
- lib/cloudtasker/batch/config.rb
|
224
251
|
- lib/cloudtasker/batch/extension/worker.rb
|
225
252
|
- lib/cloudtasker/batch/job.rb
|
226
253
|
- lib/cloudtasker/batch/middleware.rb
|
227
254
|
- lib/cloudtasker/batch/middleware/server.rb
|
228
255
|
- lib/cloudtasker/config.rb
|
229
256
|
- lib/cloudtasker/cron.rb
|
230
|
-
- lib/cloudtasker/cron/config.rb
|
231
257
|
- lib/cloudtasker/cron/job.rb
|
232
258
|
- lib/cloudtasker/cron/middleware.rb
|
233
259
|
- lib/cloudtasker/cron/middleware/server.rb
|
@@ -239,7 +265,6 @@ files:
|
|
239
265
|
- lib/cloudtasker/redis_client.rb
|
240
266
|
- lib/cloudtasker/task.rb
|
241
267
|
- lib/cloudtasker/unique_job.rb
|
242
|
-
- lib/cloudtasker/unique_job/config.rb
|
243
268
|
- lib/cloudtasker/unique_job/conflict_strategy/base_strategy.rb
|
244
269
|
- lib/cloudtasker/unique_job/conflict_strategy/raise.rb
|
245
270
|
- lib/cloudtasker/unique_job/conflict_strategy/reject.rb
|
@@ -282,5 +307,5 @@ rubyforge_project:
|
|
282
307
|
rubygems_version: 2.7.9
|
283
308
|
signing_key:
|
284
309
|
specification_version: 4
|
285
|
-
summary: Manage GCP Cloud Tasks in your app.
|
310
|
+
summary: Manage GCP Cloud Tasks in your app. (under development)
|
286
311
|
test_files: []
|