belated 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +4 -1
  3. data/.rubocop.yml +3 -0
  4. data/CHANGELOG.md +17 -0
  5. data/Gemfile +3 -0
  6. data/Gemfile.lock +17 -1
  7. data/README.md +21 -9
  8. data/belated.gemspec +1 -1
  9. data/lib/belated.rb +39 -14
  10. data/lib/belated/client.rb +15 -2
  11. data/lib/belated/job.rb +1 -0
  12. data/lib/belated/queue.rb +37 -0
  13. data/lib/belated/version.rb +1 -1
  14. data/lib/belated/worker.rb +8 -5
  15. metadata +4 -69
  16. data/dummy/Rakefile +0 -8
  17. data/dummy/app/assets/config/manifest.js +0 -3
  18. data/dummy/app/assets/images/.keep +0 -0
  19. data/dummy/app/assets/stylesheets/application.css +0 -15
  20. data/dummy/app/channels/application_cable/channel.rb +0 -6
  21. data/dummy/app/channels/application_cable/connection.rb +0 -6
  22. data/dummy/app/controllers/application_controller.rb +0 -5
  23. data/dummy/app/controllers/concerns/.keep +0 -0
  24. data/dummy/app/helpers/application_helper.rb +0 -4
  25. data/dummy/app/javascript/packs/application.js +0 -15
  26. data/dummy/app/jobs/application_job.rb +0 -9
  27. data/dummy/app/mailers/application_mailer.rb +0 -6
  28. data/dummy/app/models/application_record.rb +0 -5
  29. data/dummy/app/models/concerns/.keep +0 -0
  30. data/dummy/app/models/user.rb +0 -2
  31. data/dummy/app/views/application/index.html.erb +0 -4
  32. data/dummy/app/views/layouts/application.html.erb +0 -15
  33. data/dummy/app/views/layouts/mailer.html.erb +0 -13
  34. data/dummy/app/views/layouts/mailer.text.erb +0 -1
  35. data/dummy/bin/rails +0 -6
  36. data/dummy/bin/rake +0 -6
  37. data/dummy/bin/setup +0 -35
  38. data/dummy/config.ru +0 -8
  39. data/dummy/config/application.rb +0 -23
  40. data/dummy/config/boot.rb +0 -7
  41. data/dummy/config/cable.yml +0 -10
  42. data/dummy/config/credentials.yml.enc +0 -1
  43. data/dummy/config/database.yml +0 -25
  44. data/dummy/config/environment.rb +0 -7
  45. data/dummy/config/environments/development.rb +0 -78
  46. data/dummy/config/environments/production.rb +0 -122
  47. data/dummy/config/environments/test.rb +0 -51
  48. data/dummy/config/initializers/application_controller_renderer.rb +0 -9
  49. data/dummy/config/initializers/backtrace_silencers.rb +0 -10
  50. data/dummy/config/initializers/content_security_policy.rb +0 -29
  51. data/dummy/config/initializers/cookies_serializer.rb +0 -7
  52. data/dummy/config/initializers/filter_parameter_logging.rb +0 -8
  53. data/dummy/config/initializers/inflections.rb +0 -17
  54. data/dummy/config/initializers/mime_types.rb +0 -5
  55. data/dummy/config/initializers/permissions_policy.rb +0 -12
  56. data/dummy/config/initializers/wrap_parameters.rb +0 -16
  57. data/dummy/config/locales/en.yml +0 -33
  58. data/dummy/config/master.key +0 -1
  59. data/dummy/config/puma.rb +0 -45
  60. data/dummy/config/routes.rb +0 -5
  61. data/dummy/config/storage.yml +0 -34
  62. data/dummy/db/migrate/20210613015406_create_users.rb +0 -10
  63. data/dummy/db/production.sqlite3 +0 -0
  64. data/dummy/db/schema.rb +0 -20
  65. data/dummy/db/test.sqlite3 +0 -0
  66. data/dummy/lib/assets/.keep +0 -0
  67. data/dummy/log/.keep +0 -0
  68. data/dummy/log/development.log +0 -0
  69. data/dummy/log/production.log +0 -3
  70. data/dummy/log/test.log +0 -2110
  71. data/dummy/public/404.html +0 -67
  72. data/dummy/public/422.html +0 -67
  73. data/dummy/public/500.html +0 -66
  74. data/dummy/public/apple-touch-icon-precomposed.png +0 -0
  75. data/dummy/public/apple-touch-icon.png +0 -0
  76. data/dummy/public/favicon.ico +0 -0
  77. data/dummy/storage/.keep +0 -0
  78. data/dummy/tmp/.keep +0 -0
  79. data/dummy/tmp/development_secret.txt +0 -1
  80. data/dummy/tmp/pids/.keep +0 -0
  81. data/dummy/tmp/storage/.keep +0 -0
  82. data/hard_worker_dump +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c0967c77874d3cfccf82411af59b4f1555c32edbbaf346dda078b710b4ed2232
4
- data.tar.gz: 6336d152b4beb80c037d28ac6335a6018270f65d563195d74022c167e0cbeac8
3
+ metadata.gz: 3264ca317aa687386cf4f87b45a358b25197e0a8442d79c28116abbdf373cd5c
4
+ data.tar.gz: fc520d4de51b80b7ec87622f7ef66fd17a60423800a72a402fde7f7361e52a2e
5
5
  SHA512:
6
- metadata.gz: 84b35ef9e1b317c9250960f90c377e5d8e45261cb8de8f71ed431418dd90ebdfd72625e9c85959b3b30db68131fd5f8ba0ebc10790a1651d334437f38610ef7e
7
- data.tar.gz: 29c835bf366eb3f9d6304e12a85cef12e3fa13574c0502ba71aee5322bc9e0426f6ae2b8179dd26f8e7d544a4649cb30c0840633a257e62e030aef50fe2bcbfc
6
+ metadata.gz: 5512108388bf979973d471f9107b8f11f1af79320029324053ca748eeac3940635efdbff744410305e185e781de6732fa003ca7251d5d26be1c706e59818f960
7
+ data.tar.gz: 25045c09fbd423b0169cc4eda7a01a4cbf1e93c6a3ee13d0b574f24fabfd3fae9a58768eb6bef962b8613536c3585fb542e02151950eda82d6867c34a0d6e85f
data/.gitignore CHANGED
@@ -11,4 +11,7 @@
11
11
  .rspec_status
12
12
  .byebug_history
13
13
  /dummy/tmp/cache/
14
- belated_dump
14
+ /dummy/log/
15
+ /dummy/log/test.log
16
+ belated_dump
17
+ stackprof*
data/.rubocop.yml CHANGED
@@ -41,5 +41,8 @@ Metrics/BlockLength:
41
41
  Metrics/ClassLength:
42
42
  Max: 200
43
43
 
44
+ Metrics/MethodLength:
45
+ Max: 15
46
+
44
47
  Security/YAMLLoad:
45
48
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.4.0] - 2021-08-03
4
+
5
+ - Now you can enqueue jobs to be done at a later time. Just pass an `at:` keyword param to the client.
6
+ - Does not save the jobs when you quit.
7
+
8
+ ## [0.3.3] - 2021-08-01
9
+
10
+ - Shutdown trapped signal thread, make sure :shutdown is not recorded as a job.
11
+
12
+ ## [0.3.2] - 2021-07-31
13
+
14
+ - Trap INT and TERM, so now the shutdown is a little bit more graceful.
15
+
16
+ ## [0.3.1] - 2021-07-29
17
+
18
+ - Remove dummy app from gem... size should go down quite a bit.
19
+
3
20
  ## [0.3.0] - 2021-07-29
4
21
 
5
22
  - Now there is logging! By default logs to stdout, but you can configure the logger by setting a different one through `Belated.config.logger`.
data/Gemfile CHANGED
@@ -11,5 +11,8 @@ gem 'rspec', '~> 3.0'
11
11
 
12
12
  gem 'rubocop', '~> 1.7'
13
13
 
14
+ gem 'database_cleaner-active_record'
14
15
  gem 'rails', '>= 6.1.3'
16
+ gem 'rspec-rails'
15
17
  gem 'sqlite3'
18
+ gem 'stackprof'
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- belated (0.3.0)
4
+ belated (0.4.0)
5
5
  drb
6
6
  dry-configurable
7
7
 
@@ -72,6 +72,10 @@ GEM
72
72
  byebug (11.1.3)
73
73
  concurrent-ruby (1.1.9)
74
74
  crass (1.0.6)
75
+ database_cleaner-active_record (2.0.1)
76
+ activerecord (>= 5.a)
77
+ database_cleaner-core (~> 2.0.0)
78
+ database_cleaner-core (2.0.1)
75
79
  diff-lcs (1.4.4)
76
80
  drb (2.0.4)
77
81
  dry-configurable (0.12.1)
@@ -145,6 +149,14 @@ GEM
145
149
  rspec-mocks (3.10.2)
146
150
  diff-lcs (>= 1.2.0, < 2.0)
147
151
  rspec-support (~> 3.10.0)
152
+ rspec-rails (5.0.1)
153
+ actionpack (>= 5.2)
154
+ activesupport (>= 5.2)
155
+ railties (>= 5.2)
156
+ rspec-core (~> 3.10)
157
+ rspec-expectations (~> 3.10)
158
+ rspec-mocks (~> 3.10)
159
+ rspec-support (~> 3.10)
148
160
  rspec-support (3.10.2)
149
161
  rubocop (1.18.3)
150
162
  parallel (~> 1.10)
@@ -166,6 +178,7 @@ GEM
166
178
  activesupport (>= 4.0)
167
179
  sprockets (>= 3.0.0)
168
180
  sqlite3 (1.4.2)
181
+ stackprof (0.2.16)
169
182
  thor (1.1.0)
170
183
  tzinfo (2.0.4)
171
184
  concurrent-ruby (~> 1.0)
@@ -181,11 +194,14 @@ PLATFORMS
181
194
  DEPENDENCIES
182
195
  belated!
183
196
  byebug
197
+ database_cleaner-active_record
184
198
  rails (>= 6.1.3)
185
199
  rake (~> 13.0)
186
200
  rspec (~> 3.0)
201
+ rspec-rails
187
202
  rubocop (~> 1.7)
188
203
  sqlite3
204
+ stackprof
189
205
 
190
206
  BUNDLED WITH
191
207
  2.2.17
data/README.md CHANGED
@@ -10,19 +10,25 @@ It uses dRuby to do the communication! Which is absolute great. No need for Redi
10
10
 
11
11
  TODO LIST:
12
12
 
13
- - ~~Marshal the job queue into a file so you don't lose all progress~~
14
- (Ended up using YAML)
15
13
  - Catch SIGTERM and friends
16
- - ~~Support Rails~~ (Supported!)
17
- - ~~Parse options from command line, eg. `--workers 10`~~(Done!)
14
+ - Now supports it, partly.
18
15
  - Don't crash on errors (Partially done)
19
- - ~~Add a logger~~
20
- - Make it possible to schedule jobs
16
+ - Save jobs enqueued at a future date too when quitting (now it only saves the jobs in the queue)
17
+ - Have multiple queues?
21
18
  - Maybe support ActiveJob?
22
19
  - Have a web UI
23
20
  - Do some performance testing
24
21
  - Add a section telling people to use Sidekiq if they can
25
22
 
23
+ DONE
24
+
25
+ - ~~Make it possible to schedule jobs~~
26
+ - ~~Marshal the job queue into a file so you don't lose all progress~~
27
+ (Ended up using YAML)
28
+ - ~~Add a logger~~
29
+ - ~~Support Rails~~ (Supported!)
30
+ - ~~Parse options from command line, eg. `--workers 10`~~(Done!)
31
+
26
32
  ## Installation
27
33
 
28
34
  Add this line to your application's Gemfile:
@@ -94,6 +100,12 @@ client.perform_belated(job)
94
100
 
95
101
  If you want to pass a job to Belated.
96
102
 
103
+ If you don't want the job to run right away, you can also pass it a keyword param `at:` like so:
104
+
105
+ ```ruby
106
+ client.perform_belated(job, Time.now + 1.month)
107
+ ```
108
+
97
109
  # Settings
98
110
 
99
111
  Configuring Belated:
@@ -109,15 +121,15 @@ end
109
121
 
110
122
  From command line:
111
123
 
112
- $ bundle exec belated --rails=true
124
+ $ bundle exec belated --rails=true
113
125
 
114
126
  Use Rails or not.
115
127
 
116
- $ bundle exec belated --rails_path=/my_rails_project
128
+ $ bundle exec belated --rails_path=/my_rails_project
117
129
 
118
130
  Path to Rails project.
119
131
 
120
- $ bundle exec belated --workers=10
132
+ $ bundle exec belated --workers=10
121
133
 
122
134
  Number of workers.
123
135
 
data/belated.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  # Specify which files should be added to the gem when it is released.
25
25
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
26
26
  spec.files = Dir.chdir(File.expand_path(__dir__)) do
27
- `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
27
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|dummy|spec|features)/}) }
28
28
  end
29
29
  spec.bindir = 'bin'
30
30
  spec.executables = ['belated']
data/lib/belated.rb CHANGED
@@ -9,6 +9,7 @@ require 'singleton'
9
9
  require 'dry-configurable'
10
10
  require 'belated/client'
11
11
  require 'logger'
12
+ require 'belated/queue'
12
13
 
13
14
  # Belated is a pure Ruby job backend.
14
15
  # It has limited functionality, as it only accepts
@@ -22,7 +23,7 @@ class Belated
22
23
  include Singleton unless $TESTING
23
24
  URI = 'druby://localhost:8788'
24
25
  FILE_NAME = 'belated_dump'
25
- @@queue = Queue.new
26
+ @@queue = Belated::Queue.new
26
27
 
27
28
  setting :rails, true
28
29
  setting :rails_path, '.'
@@ -36,17 +37,17 @@ class Belated
36
37
  # Aliased for testing purposes.
37
38
  # This is only run from the bin file.
38
39
  def start
39
- boot_app
40
- load_jobs
40
+ boot_app && load_jobs
41
41
  @worker_list = []
42
- Belated.config.workers.times do |_i|
43
- @worker_list << Thread.new { Worker.new }
42
+ Belated.config.workers.times do |i|
43
+ @worker_list << Thread.new { Worker.new(number: i.next) }
44
44
  end
45
45
  return unless Belated.config.connect
46
46
 
47
47
  connect!
48
48
  banner_and_info
49
- DRb.thread.join
49
+ trap_signals
50
+ enqueue_future_jobs
50
51
  end
51
52
  alias initialize start
52
53
 
@@ -55,10 +56,19 @@ class Belated
55
56
  DRb.start_service(URI, @@queue, verbose: true)
56
57
  rescue DRb::DRbConnError, Errno::EADDRINUSE
57
58
  Belated.logger.error 'Could not connect to DRb server.'
58
- uri = "druby://localhost:#{Array.new(4) { rand(10) }.join}"
59
- self.class.send(:remove_const, 'URI')
60
- self.class.const_set('URI', uri)
61
- retry
59
+ end
60
+
61
+ def trap_signals
62
+ %w[INT TERM].each do |signal|
63
+ Signal.trap(signal) do
64
+ @worker_list.length.times do
65
+ @@queue.push(:shutdown)
66
+ end
67
+ Thread.new { stop_workers }
68
+ sleep 0.1 until @@queue.empty? || $TESTING
69
+ exit
70
+ end
71
+ end
62
72
  end
63
73
 
64
74
  def boot_app
@@ -74,6 +84,19 @@ class Belated
74
84
  Belated.config.rails
75
85
  end
76
86
 
87
+ def enqueue_future_jobs
88
+ log 'starting future jobs thread'
89
+ loop do
90
+ @@queue.future_jobs.each_with_index do |job, i|
91
+ if job[:at] <= Time.now.utc
92
+ log @@queue.future_jobs.delete_at(i)
93
+ @@queue.push(job[:klass])
94
+ end
95
+ end
96
+ sleep 0.01
97
+ end
98
+ end
99
+
77
100
  def load_jobs
78
101
  log "reloading... if file exists #{File.exist?(Belated::FILE_NAME)}"
79
102
  return unless File.exist?(Belated::FILE_NAME)
@@ -92,15 +115,17 @@ class Belated
92
115
 
93
116
  def stop_workers
94
117
  @worker_list&.each do |worker|
118
+ sleep 0.1 if worker.alive?
95
119
  Thread.kill(worker)
96
120
  end
97
121
  class_array = []
98
- @@queue.size.times do |_i|
99
- next if (klass = @@queue.pop).instance_of?(Proc)
100
-
101
- class_array << klass
122
+ @@queue.length.times do |_i|
123
+ unless (klass = @@queue.pop).instance_of?(Proc) || klass == :shutdown
124
+ class_array << klass
125
+ end
102
126
  end
103
127
  pp File.open(FILE_NAME, 'wb') { |f| f.write(YAML.dump(class_array)) }
128
+ exit unless $TESTING
104
129
  end
105
130
 
106
131
  def banner
@@ -1,7 +1,16 @@
1
1
  class Belated
2
+ # The client class is responsible for managing the connection to the
3
+ # DRb server.
4
+ # You can enqueue jobs to be processed by the server.
5
+ # Example:
6
+ # client = Belated::Client.new
7
+ # client.enqueue(JubJub.new, at: Time.now + 5.seconds)
2
8
  class Client
3
9
  attr_accessor :queue
4
10
 
11
+ # Starts up the client.
12
+ # Connects to the queue through DRb.
13
+ # @return [void]
5
14
  def initialize
6
15
  server_uri = Belated::URI
7
16
  # @bank =
@@ -9,8 +18,12 @@ class Belated
9
18
  self.queue = DRbObject.new_with_uri(server_uri)
10
19
  end
11
20
 
12
- def perform(job)
13
- queue.push(job)
21
+ # The method that pushes the jobs to the queue.
22
+ # @param job [Object] - The the job to be pushed.
23
+ # @param at [Date] - The time at which the job should be executed.
24
+ # @return [Object] - The job that was pushed.
25
+ def perform(job, at: nil)
26
+ queue.push(job, at: at)
14
27
  end
15
28
  alias perform_belated perform
16
29
  alias perform_later perform
@@ -0,0 +1 @@
1
+ Job = Struct.new(:klass, :at)
@@ -0,0 +1,37 @@
1
+ require 'belated/job'
2
+
3
+ class Belated
4
+ class Queue
5
+ attr_accessor :future_jobs
6
+
7
+ def initialize(queue: Thread::Queue.new, future_jobs: [])
8
+ @queue = queue
9
+ self.future_jobs = future_jobs
10
+ end
11
+
12
+ def push(job, at: nil)
13
+ if at.nil?
14
+ @queue.push(job)
15
+ else
16
+ @future_jobs << Job.new(job, at)
17
+ end
18
+ end
19
+
20
+ def pop
21
+ @queue.pop
22
+ end
23
+
24
+ def clear
25
+ @queue.clear
26
+ self.future_jobs = []
27
+ end
28
+
29
+ def empty?
30
+ @queue.empty?
31
+ end
32
+
33
+ def length
34
+ @queue.length
35
+ end
36
+ end
37
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Belated
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
@@ -1,21 +1,24 @@
1
1
  require_relative 'logging'
2
2
  class Belated
3
3
  # The worker class that actually gets the jobs from the queue
4
- # and calls them. Expects the jobs to be procs.
4
+ # and calls them. Expects the jobs to be procs or
5
+ # classes that have a perform method.
5
6
  class Worker
6
7
  include Logging
7
8
 
8
- def initialize
9
+ def initialize(number: 1)
10
+ @number = number
9
11
  start_working
10
12
  end
11
13
 
12
14
  def start_working
13
15
  loop do
14
- job = Belated.fetch_job
15
- next unless job
16
+ log "Worker #{@number} fetching jobs!"
17
+ next unless (job = Belated.fetch_job)
18
+
19
+ break if job == :shutdown
16
20
 
17
21
  log call_job(job)
18
- log 'fetching jobs...'
19
22
  end
20
23
  end
21
24
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: belated
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sampo Kuokkanen
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-29 00:00:00.000000000 Z
11
+ date: 2021-08-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: drb
@@ -78,76 +78,11 @@ files:
78
78
  - bin/bundle
79
79
  - bin/console
80
80
  - bin/setup
81
- - dummy/Rakefile
82
- - dummy/app/assets/config/manifest.js
83
- - dummy/app/assets/images/.keep
84
- - dummy/app/assets/stylesheets/application.css
85
- - dummy/app/channels/application_cable/channel.rb
86
- - dummy/app/channels/application_cable/connection.rb
87
- - dummy/app/controllers/application_controller.rb
88
- - dummy/app/controllers/concerns/.keep
89
- - dummy/app/helpers/application_helper.rb
90
- - dummy/app/javascript/packs/application.js
91
- - dummy/app/jobs/application_job.rb
92
- - dummy/app/mailers/application_mailer.rb
93
- - dummy/app/models/application_record.rb
94
- - dummy/app/models/concerns/.keep
95
- - dummy/app/models/user.rb
96
- - dummy/app/views/application/index.html.erb
97
- - dummy/app/views/layouts/application.html.erb
98
- - dummy/app/views/layouts/mailer.html.erb
99
- - dummy/app/views/layouts/mailer.text.erb
100
- - dummy/bin/rails
101
- - dummy/bin/rake
102
- - dummy/bin/setup
103
- - dummy/config.ru
104
- - dummy/config/application.rb
105
- - dummy/config/boot.rb
106
- - dummy/config/cable.yml
107
- - dummy/config/credentials.yml.enc
108
- - dummy/config/database.yml
109
- - dummy/config/environment.rb
110
- - dummy/config/environments/development.rb
111
- - dummy/config/environments/production.rb
112
- - dummy/config/environments/test.rb
113
- - dummy/config/initializers/application_controller_renderer.rb
114
- - dummy/config/initializers/backtrace_silencers.rb
115
- - dummy/config/initializers/content_security_policy.rb
116
- - dummy/config/initializers/cookies_serializer.rb
117
- - dummy/config/initializers/filter_parameter_logging.rb
118
- - dummy/config/initializers/inflections.rb
119
- - dummy/config/initializers/mime_types.rb
120
- - dummy/config/initializers/permissions_policy.rb
121
- - dummy/config/initializers/wrap_parameters.rb
122
- - dummy/config/locales/en.yml
123
- - dummy/config/master.key
124
- - dummy/config/puma.rb
125
- - dummy/config/routes.rb
126
- - dummy/config/storage.yml
127
- - dummy/db/migrate/20210613015406_create_users.rb
128
- - dummy/db/production.sqlite3
129
- - dummy/db/schema.rb
130
- - dummy/db/test.sqlite3
131
- - dummy/lib/assets/.keep
132
- - dummy/log/.keep
133
- - dummy/log/development.log
134
- - dummy/log/production.log
135
- - dummy/log/test.log
136
- - dummy/public/404.html
137
- - dummy/public/422.html
138
- - dummy/public/500.html
139
- - dummy/public/apple-touch-icon-precomposed.png
140
- - dummy/public/apple-touch-icon.png
141
- - dummy/public/favicon.ico
142
- - dummy/storage/.keep
143
- - dummy/tmp/.keep
144
- - dummy/tmp/development_secret.txt
145
- - dummy/tmp/pids/.keep
146
- - dummy/tmp/storage/.keep
147
- - hard_worker_dump
148
81
  - lib/belated.rb
149
82
  - lib/belated/client.rb
83
+ - lib/belated/job.rb
150
84
  - lib/belated/logging.rb
85
+ - lib/belated/queue.rb
151
86
  - lib/belated/rails.rb
152
87
  - lib/belated/version.rb
153
88
  - lib/belated/worker.rb