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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac6e1474db922e6509a54912fb42d5522c066c7926c0bb0c45e4eec80335c83c
4
- data.tar.gz: af4b423e1ed2d17fdd9c1228f34a965ac8d17078f96331d01b64bc3766f3fbef
3
+ metadata.gz: 18e57cdddeab550d4ec1bacf9be3fedb298bc54b115a6d47675e9989a68062a0
4
+ data.tar.gz: 37dbae4384a908554ad9b20de3265a360b5389227a3384b3e9557b8ed5434961
5
5
  SHA512:
6
- metadata.gz: 669d907248880e4de8f8a1d0ab83aad96540d93bf3b70dec804184b5a0507244a891e5d66f03593163d6e581a85ad1686e348ac3413b4c250512a5ec877c9209
7
- data.tar.gz: 2b6a09ff60f5105f167c818dcf284881afbbd96a4818a9e1fc432c8fd8ee19014127e6292bb5749c09f4a10458cbecd94c48b0f8486e4f8fed91dbf7d3f36772
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.1.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
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'active_support/core_ext/string/inflections'
4
+
3
5
  require 'cloudtasker/version'
4
6
  require 'cloudtasker/config'
5
7
 
@@ -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
- [Config::KEY_NAMESPACE, val.to_s].join('/')
50
+ [to_s.underscore, val.to_s].join('/')
48
51
  end
49
52
 
50
53
  #
@@ -3,7 +3,6 @@
3
3
  require 'cloudtasker/redis_client'
4
4
 
5
5
  require_relative 'extension/worker'
6
- require_relative 'config'
7
6
  require_relative 'batch_progress'
8
7
  require_relative 'job'
9
8
 
@@ -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
- [Config::KEY_NAMESPACE, val.to_s].join('/')
35
+ [self.class.to_s.underscore, val.to_s].join('/')
33
36
  end
34
37
 
35
38
  #
@@ -2,7 +2,6 @@
2
2
 
3
3
  require 'cloudtasker/redis_client'
4
4
 
5
- require_relative 'config'
6
5
  require_relative 'schedule'
7
6
  require_relative 'job'
8
7
  require_relative 'middleware/server'
@@ -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
- gid = [Config::KEY_NAMESPACE, id].join('/')
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
- [Config::KEY_NAMESPACE, id].join('/')
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
- [Config::KEY_NAMESPACE, unique_id].join('/')
97
+ [self.class.to_s.underscore, unique_id].join('/')
95
98
  end
96
99
 
97
100
  #
@@ -3,7 +3,6 @@
3
3
  require 'cloudtasker/redis_client'
4
4
 
5
5
  require_relative 'lock_error'
6
- require_relative 'config'
7
6
 
8
7
  require_relative 'conflict_strategy/base_strategy'
9
8
  require_relative 'conflict_strategy/raise'
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Cloudtasker
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
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.1.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-17 00:00:00.000000000 Z
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: []
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'fugit'
4
-
5
- module Cloudtasker
6
- module Batch
7
- class Config
8
- KEY_NAMESPACE = 'cloudtasker-batch'
9
- end
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'fugit'
4
-
5
- module Cloudtasker
6
- module Cron
7
- class Config
8
- KEY_NAMESPACE = 'cloudtasker-cron'
9
- end
10
- end
11
- end
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Cloudtasker
4
- module UniqueJob
5
- # Manage UniqueJob configuration
6
- class Config
7
- KEY_NAMESPACE = 'cloudtasker-unique_job'
8
- end
9
- end
10
- end