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 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