cloudtasker 0.1.0 → 0.2.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/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: []
|