sidekiq_lockable_job 0.1.1 → 0.1.2

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