sidekiq_lockable_job 0.1.1 → 0.1.2

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: f55d67805fbdfb7c7dab6270ed0b74620e59ba5ac3022a1c5cb97e5ebc2dad20
4
- data.tar.gz: c47ff60f8342d3d4432a8afddcb4b4bae330e08e43ef3573a3d6e175c9c9bad8
3
+ metadata.gz: 5ce3896784973f4d6fab5917fc1dc383e12d8cb9bff157bcb5d91f3f2eaa755f
4
+ data.tar.gz: 5d44e4d73e36875421feaa8140e5deb888a23a4de95964f7638c0c23df93cc1c
5
5
  SHA512:
6
- metadata.gz: abeb924fe55362a5cfc2ee4f2e4b904d8c8f18f07f9bea6ad02b09b5d946bf4f34eb0355917ac2ab0fb593ba969323820840284186b3630b738da07ebb44db4d
7
- data.tar.gz: 4a7855f124c9b2b5e4a6cb4a8ade26aac03d00527d300f8b764ee97487d9f82019de823f5f2f1a3874d9e4edb9604ac404a7493f453eec01a05db55c6c23426b
6
+ metadata.gz: 26f1401accb8cd4b0b592472e2f99edd78db38079884034ce2acac0823d27af14b86fe8daa997f58a09d9e573a356946497628001d0256cd66284ce5aa70019f
7
+ data.tar.gz: ec29d4842da09003a7951367b80c03bf5e694e5601103375bed90f67308bcc691f651a812a31fefa90b336848d8fad529c6758888f41c1ec476cc706cf66ae1c
data/.gitignore CHANGED
@@ -9,3 +9,4 @@
9
9
 
10
10
  # rspec failure tracking
11
11
  .rspec_status
12
+ demo.txt
@@ -1,20 +1,25 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- sidekiq_lockable_job (0.1.1)
4
+ sidekiq_lockable_job (0.1.2)
5
5
  redis (= 4.0.1)
6
6
  sidekiq (= 5.0.5)
7
7
 
8
8
  GEM
9
9
  remote: https://rubygems.org/
10
10
  specs:
11
- concurrent-ruby (1.1.5)
11
+ concurrent-ruby (1.1.6)
12
12
  connection_pool (2.2.2)
13
13
  diff-lcs (1.3)
14
+ equatable (0.6.1)
14
15
  fakeredis (0.7.0)
15
16
  redis (>= 3.2, < 5.0)
16
- rack (2.0.8)
17
- rack-protection (2.0.5)
17
+ necromancer (0.5.1)
18
+ pastel (0.7.3)
19
+ equatable (~> 0.6)
20
+ tty-color (~> 0.5)
21
+ rack (2.2.2)
22
+ rack-protection (2.0.8.1)
18
23
  rack
19
24
  rake (12.3.3)
20
25
  redis (4.0.1)
@@ -36,6 +41,18 @@ GEM
36
41
  connection_pool (~> 2.2, >= 2.2.0)
37
42
  rack-protection (>= 1.5.0)
38
43
  redis (>= 3.3.4, < 5)
44
+ tty-color (0.5.1)
45
+ tty-cursor (0.7.1)
46
+ tty-prompt (0.19.0)
47
+ necromancer (~> 0.5.0)
48
+ pastel (~> 0.7.0)
49
+ tty-reader (~> 0.6.0)
50
+ tty-reader (0.6.0)
51
+ tty-cursor (~> 0.7)
52
+ tty-screen (~> 0.7)
53
+ wisper (~> 2.0.0)
54
+ tty-screen (0.7.1)
55
+ wisper (2.0.1)
39
56
 
40
57
  PLATFORMS
41
58
  ruby
@@ -46,6 +63,7 @@ DEPENDENCIES
46
63
  rake (~> 12.3.3)
47
64
  rspec (~> 3.0)
48
65
  sidekiq_lockable_job!
66
+ tty-prompt (= 0.19.0)
49
67
 
50
68
  BUNDLED WITH
51
69
  2.0.2
data/README.md CHANGED
@@ -38,6 +38,15 @@ Or install it yourself as:
38
38
 
39
39
  $ gem install sidekiq_lockable_job
40
40
 
41
+
42
+ ## Demo
43
+
44
+ Thanks to [Asciinema](https://asciinema.org)!
45
+
46
+ $ rake demo
47
+
48
+ [![asciicast](https://asciinema.org/a/324095.svg)](https://asciinema.org/a/324095)
49
+
41
50
  ## Usage
42
51
 
43
52
  The gem is compose of four parts:
@@ -219,7 +228,9 @@ end
219
228
  ## Specs
220
229
 
221
230
  ```
222
- Sidekiq::LockableJob
231
+ Sidekiq::LockableJob::LockService
232
+ REDIS_PREFIX_KEY
233
+ has a prefix
223
234
  .lock
224
235
  lock
225
236
  .unlock
@@ -230,9 +241,9 @@ Sidekiq::LockableJob
230
241
  .handle_locked_by
231
242
  raise if locked by any key
232
243
  raise if locked by single key
233
- DOT NOT raise if not locked by
234
- .included
235
- include middlewares
244
+ when not locked
245
+ DOT NOT raise if not locked by
246
+ return false
236
247
 
237
248
  Sidekiq::LockableJob::Middleware::Client::SetLocks
238
249
  LockableJob
@@ -261,6 +272,8 @@ Sidekiq::LockableJob::Middleware::Server::HandleLockedBy
261
272
  with a non lock key
262
273
  behaves like perform the job
263
274
  example at ./spec/sidekiq/lockable_job/middleware/server/shared.rb:13
275
+ behaves like it yield
276
+ is expected to eq true
264
277
  with single lock key
265
278
  behaves like raise an error
266
279
  is expected to raise Sidekiq::LockableJob::LockedJobError
@@ -299,8 +312,43 @@ Sidekiq::LockableJob::Middleware::Server::UnsetLocks
299
312
  for another job
300
313
  DOES NOT remove the lock
301
314
 
315
+ Sidekiq::LockableJob::MultiLockService
316
+ REDIS_PREFIX_KEY
317
+ has a prefix
318
+ .lock
319
+ lock
320
+ .unlock
321
+ unlock
322
+ with multiple lock
323
+ don't unlock at first
324
+ unlock
325
+ .locked?
326
+ true if locked
327
+ false if NOT locked
328
+ .handle_locked_by
329
+ raise if locked by any key
330
+ raise if locked by single key
331
+ when not locked
332
+ DOT NOT raise if not locked by
333
+ return false
334
+
335
+ Sidekiq::LockableJob
336
+ .current_lockable_job_lock_service
337
+ has lock_service by default
338
+ .lockable_job_lock_service
339
+ set a custom lock service
340
+ .included
341
+ include client middleware
342
+ include server middleware (PENDING: Temporarily skipped with xit)
343
+
302
344
  SidekiqLockableJob
303
345
  has a version number
346
+
347
+ Pending: (Failures listed here are expected and do not affect your suite's status)
348
+
349
+ 1) Sidekiq::LockableJob.included include server middleware
350
+ # Temporarily skipped with xit
351
+ # ./spec/sidekiq/lockable_job_spec.rb:37
304
352
  ```
305
353
 
306
354
  ## Development
data/Rakefile CHANGED
@@ -1,6 +1,24 @@
1
1
  require "bundler/gem_tasks"
2
2
  require "rspec/core/rake_task"
3
+ require 'tty-prompt'
3
4
 
4
5
  RSpec::Core::RakeTask.new(:spec)
5
6
 
6
7
  task :default => :spec
8
+
9
+
10
+ desc "Play a demo of contextualized_logs"
11
+ task :demo do
12
+ prompt = TTY::Prompt.new
13
+ if `which asciinema`.empty?
14
+ if `which brew`.empty
15
+ return unless prompt.yes?('Install brew')
16
+ `/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"`
17
+
18
+ return unless prompt.yes?('Install asciinema using brew?')
19
+ `brew install asciinema`
20
+ end
21
+ end
22
+ prompt.warn('press [space] continuesly to play demo line by line, or just press [space] to play')
23
+ exec('asciinema play -i 1 -s 1 demo.cast')
24
+ end
@@ -0,0 +1,101 @@
1
+ {"version": 2, "width": 237, "height": 44, "timestamp": 1587897100, "idle_time_limit": 1.0, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}}
2
+ [0.037941, "o", "\u001b(B\u001b[m"]
3
+ [1.429049, "o", "\u001b[?1034h\u001b]0;~/Developer/sidekiq_lockable_job/demo\u0007\u001b[1m\r\r\n\u001b[38;5;166mhugues\u001b[97m at \u001b[38;5;136mme\u001b[97m in \u001b[38;5;64m~/Developer/sidekiq_lockable_job/demo\u001b[97m on \u001b[38;5;61mmaster\u001b[38;5;33m [?]\r\r\n\u001b[97m$ \u001b(B\u001b[m"]
4
+ [2.693711, "o", "b"]
5
+ [2.861477, "o", "i"]
6
+ [2.909667, "o", "n"]
7
+ [3.15756, "o", "/"]
8
+ [4.181652, "o", "r"]
9
+ [4.229672, "o", "a"]
10
+ [4.373526, "o", "i"]
11
+ [4.581437, "o", "l"]
12
+ [4.669993, "o", "s"]
13
+ [4.765497, "o", " "]
14
+ [4.869453, "o", "c"]
15
+ [4.982059, "o", "o"]
16
+ [5.133435, "o", "n"]
17
+ [5.277517, "o", "s"]
18
+ [5.373362, "o", "o"]
19
+ [5.549523, "o", "l"]
20
+ [5.661744, "o", "e"]
21
+ [6.144158, "o", "\r\n"]
22
+ [6.372237, "o", "Running via Spring preloader in process 79961\r\n"]
23
+ [6.462458, "o", "Loading development environment (Rails 5.2.4.2)\r\n"]
24
+ [6.534371, "o", "2.5.1 :001 > "]
25
+ [10.866142, "o", "require 'sidekiq/api'"]
26
+ [11.197897, "o", "\r\n"]
27
+ [11.213634, "o", " => true \r\n"]
28
+ [11.214044, "o", "2.5.1 :002 > "]
29
+ [13.522775, "o", "# enqueuing a worker (which will lock"]
30
+ [13.710313, "o", " key 123)"]
31
+ [13.933963, "o", "\r\n"]
32
+ [13.934892, "o", " => nil \r\n"]
33
+ [13.935192, "o", "2.5.1 :003 > "]
34
+ [16.434577, "o", "LockingWorker.perform_async(order: {i"]
35
+ [16.622436, "o", "d: 123, some_data: {}})"]
36
+ [16.710056, "o", "\r\n"]
37
+ [16.721799, "o", " => \"1acd47fe45dd661540527a34\" \r\n"]
38
+ [16.722121, "o", "2.5.1 :004 > "]
39
+ [19.818816, "o", "# enqueuing a worker (locked by key 1"]
40
+ [20.007121, "o", "23)"]
41
+ [20.040845, "o", "\r\n"]
42
+ [20.041415, "o", " => nil \r\n"]
43
+ [20.04179, "o", "2.5.1 :005 > "]
44
+ [22.538638, "o", "LockedWorker.perform_async(order: {id"]
45
+ [22.726702, "o", ": 123, some_data: {}})"]
46
+ [22.845971, "o", "\r\n"]
47
+ [22.853816, "o", " => \"a06584cb5b431210acb01115\" \r\n"]
48
+ [22.854692, "o", "2.5.1 :006 > "]
49
+ [25.546689, "o", "# Job failed and is in retry queue"]
50
+ [25.766154, "o", "\r\n"]
51
+ [25.767462, "o", " => nil \r\n"]
52
+ [25.767944, "o", "2.5.1 :007 > "]
53
+ [27.954316, "o", "Sidekiq::RetrySet.new.size"]
54
+ [28.188546, "o", "\r\n"]
55
+ [28.190567, "o", " => 1 \r\n"]
56
+ [28.190903, "o", "2.5.1 :008 > "]
57
+ [30.571693, "o", "Sidekiq::RetrySet.new.map { |job| JSO"]
58
+ [30.75931, "o", "N.parse(job.value) }"]
59
+ [32.053652, "o", "\r\n"]
60
+ [32.058581, "o", " => [{\"class\"=>\"LockedWorker\", \"args\"=>[{\"order\"=>{\"id\"=>123, \"some_data\"=>{}}}], \"retry\"=>true, \"queue\"=>\"default\", \"jid\"=>\"a06584cb5b431210acb01115\", \"created_at\"=>1587897123.6782131, \"enqueued_at\"=>1587897123.6784651, \"error_message\"=>\"Locked by prefix:123\", \"error_class\"=>\"Sidekiq::LockableJob::LockedJobError\", \"failed_at\"=>1587897123.68101, \"retry_count\"=>0}] \r\n"]
61
+ [32.058966, "o", "2.5.1 :009 > "]
62
+ [37.106931, "o", "# enqueuing a worker (which will unlo"]
63
+ [37.294755, "o", "ck key 123)"]
64
+ [37.405951, "o", "\r\n"]
65
+ [37.406885, "o", " => nil \r\n"]
66
+ [37.40748, "o", "2.5.1 :010 > "]
67
+ [40.314847, "o", "UnlockingWorker.perform_async(order: "]
68
+ [40.502682, "o", "{id: 123, some_data: {}})"]
69
+ [40.645814, "o", "\r\n"]
70
+ [40.661027, "o", " => \"5ec6b9561a009212ee4e5dd5\" \r\n"]
71
+ [40.661627, "o", "2.5.1 :011 > "]
72
+ [43.184041, "o", "# will retry after x, but retrying no"]
73
+ [43.372291, "o", "w"]
74
+ [43.397571, "o", "\r\n"]
75
+ [43.398466, "o", " => nil \r\n"]
76
+ [43.399082, "o", "2.5.1 :012 > "]
77
+ [45.463978, "o", "Sidekiq::RetrySet.new.each { |job| jo"]
78
+ [45.652289, "o", "b.retry }"]
79
+ [45.790045, "o", "\r\n"]
80
+ [45.796951, "o", " => nil \r\n"]
81
+ [45.797289, "o", "2.5.1 :013 > "]
82
+ [48.43503, "o", "# Job succeed (retry queue empty)"]
83
+ [48.653806, "o", "\r\n"]
84
+ [48.655128, "o", " => nil \r\n"]
85
+ [48.655888, "o", "2.5.1 :014 > "]
86
+ [51.330909, "o", "Sidekiq::RetrySet.new.size"]
87
+ [51.670463, "o", "\r\n"]
88
+ [51.674847, "o", " => 0 \r\n"]
89
+ [51.675462, "o", "2.5.1 :015 > "]
90
+ [52.878169, "o", "e"]
91
+ [53.09376, "o", "x"]
92
+ [53.317689, "o", "i"]
93
+ [53.469703, "o", "t"]
94
+ [53.694002, "o", "\r\n"]
95
+ [53.806103, "o", "\u001b]0;~/Developer/sidekiq_lockable_job/demo\u0007\u001b[1m\r\r\n\u001b[38;5;166mhugues\u001b[97m at \u001b[38;5;136mme\u001b[97m in \u001b[38;5;64m~/Developer/sidekiq_lockable_job/demo\u001b[97m on \u001b[38;5;61mmaster\u001b[38;5;33m [?]\r\r\n\u001b[97m$ \u001b(B\u001b[m"]
96
+ [54.237871, "o", "e"]
97
+ [54.453613, "o", "x"]
98
+ [54.589842, "o", "i"]
99
+ [54.701678, "o", "t"]
100
+ [54.895101, "o", "\r\n"]
101
+ [54.895568, "o", "exit\r\n"]
@@ -25,8 +25,8 @@ module Sidekiq
25
25
  # chain is invoked so we're all good.
26
26
  #
27
27
  Sidekiq.configure_server do |config|
28
- unless config.client_middleware.exists? Sidekiq::LockableJob::Middleware::Server::SetLocks
29
- config.client_middleware.add Sidekiq::LockableJob::Middleware::Server::SetLocks
28
+ unless config.server_middleware.exists? Sidekiq::LockableJob::Middleware::Server::SetLocks
29
+ config.server_middleware.add Sidekiq::LockableJob::Middleware::Server::SetLocks
30
30
  end
31
31
  unless config.server_middleware.exists? Sidekiq::LockableJob::Middleware::Server::HandleLockedBy
32
32
  config.server_middleware.add Sidekiq::LockableJob::Middleware::Server::HandleLockedBy
@@ -1,3 +1,3 @@
1
1
  module SidekiqLockableJob
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  end
@@ -38,4 +38,5 @@ Gem::Specification.new do |spec|
38
38
  spec.add_development_dependency "rake", "~> 12.3.3"
39
39
  spec.add_development_dependency "rspec", "~> 3.0"
40
40
  spec.add_development_dependency "fakeredis", '0.7.0'
41
+ spec.add_development_dependency 'tty-prompt', '0.19.0'
41
42
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sidekiq_lockable_job
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hugues Bernet-Rollande
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-04-20 00:00:00.000000000 Z
11
+ date: 2020-04-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sidekiq
@@ -94,6 +94,20 @@ dependencies:
94
94
  - - '='
95
95
  - !ruby/object:Gem::Version
96
96
  version: 0.7.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: tty-prompt
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - '='
102
+ - !ruby/object:Gem::Version
103
+ version: 0.19.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - '='
109
+ - !ruby/object:Gem::Version
110
+ version: 0.19.0
97
111
  description: |
98
112
  Sidekiq includes a jobs dependencies mechanism to prevent a job from running before another one when enqueued.
99
113
 
@@ -118,6 +132,7 @@ files:
118
132
  - bin/console
119
133
  - bin/rspec
120
134
  - bin/setup
135
+ - demo.cast
121
136
  - lib/sidekiq/lockable_job.rb
122
137
  - lib/sidekiq/lockable_job/lock_service.rb
123
138
  - lib/sidekiq/lockable_job/middleware/client/set_locks.rb