belated 0.2.0 → 0.3.3

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.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/.rubocop.yml +6 -0
  4. data/CHANGELOG.md +15 -0
  5. data/Gemfile.lock +1 -1
  6. data/README.md +11 -6
  7. data/belated.gemspec +1 -1
  8. data/lib/belated.rb +50 -28
  9. data/lib/belated/client.rb +4 -2
  10. data/lib/belated/logging.rb +17 -0
  11. data/lib/belated/version.rb +1 -1
  12. data/lib/belated/worker.rb +11 -7
  13. metadata +3 -69
  14. data/dummy/Rakefile +0 -8
  15. data/dummy/app/assets/config/manifest.js +0 -3
  16. data/dummy/app/assets/images/.keep +0 -0
  17. data/dummy/app/assets/stylesheets/application.css +0 -15
  18. data/dummy/app/channels/application_cable/channel.rb +0 -6
  19. data/dummy/app/channels/application_cable/connection.rb +0 -6
  20. data/dummy/app/controllers/application_controller.rb +0 -5
  21. data/dummy/app/controllers/concerns/.keep +0 -0
  22. data/dummy/app/helpers/application_helper.rb +0 -4
  23. data/dummy/app/javascript/packs/application.js +0 -15
  24. data/dummy/app/jobs/application_job.rb +0 -9
  25. data/dummy/app/mailers/application_mailer.rb +0 -6
  26. data/dummy/app/models/application_record.rb +0 -5
  27. data/dummy/app/models/concerns/.keep +0 -0
  28. data/dummy/app/models/user.rb +0 -2
  29. data/dummy/app/views/application/index.html.erb +0 -4
  30. data/dummy/app/views/layouts/application.html.erb +0 -15
  31. data/dummy/app/views/layouts/mailer.html.erb +0 -13
  32. data/dummy/app/views/layouts/mailer.text.erb +0 -1
  33. data/dummy/bin/rails +0 -6
  34. data/dummy/bin/rake +0 -6
  35. data/dummy/bin/setup +0 -35
  36. data/dummy/config.ru +0 -8
  37. data/dummy/config/application.rb +0 -23
  38. data/dummy/config/boot.rb +0 -7
  39. data/dummy/config/cable.yml +0 -10
  40. data/dummy/config/credentials.yml.enc +0 -1
  41. data/dummy/config/database.yml +0 -25
  42. data/dummy/config/environment.rb +0 -7
  43. data/dummy/config/environments/development.rb +0 -78
  44. data/dummy/config/environments/production.rb +0 -122
  45. data/dummy/config/environments/test.rb +0 -51
  46. data/dummy/config/initializers/application_controller_renderer.rb +0 -9
  47. data/dummy/config/initializers/backtrace_silencers.rb +0 -10
  48. data/dummy/config/initializers/content_security_policy.rb +0 -29
  49. data/dummy/config/initializers/cookies_serializer.rb +0 -7
  50. data/dummy/config/initializers/filter_parameter_logging.rb +0 -8
  51. data/dummy/config/initializers/inflections.rb +0 -17
  52. data/dummy/config/initializers/mime_types.rb +0 -5
  53. data/dummy/config/initializers/permissions_policy.rb +0 -12
  54. data/dummy/config/initializers/wrap_parameters.rb +0 -16
  55. data/dummy/config/locales/en.yml +0 -33
  56. data/dummy/config/master.key +0 -1
  57. data/dummy/config/puma.rb +0 -45
  58. data/dummy/config/routes.rb +0 -5
  59. data/dummy/config/storage.yml +0 -34
  60. data/dummy/db/migrate/20210613015406_create_users.rb +0 -10
  61. data/dummy/db/production.sqlite3 +0 -0
  62. data/dummy/db/schema.rb +0 -20
  63. data/dummy/db/test.sqlite3 +0 -0
  64. data/dummy/lib/assets/.keep +0 -0
  65. data/dummy/log/.keep +0 -0
  66. data/dummy/log/development.log +0 -0
  67. data/dummy/log/production.log +0 -3
  68. data/dummy/log/test.log +0 -595
  69. data/dummy/public/404.html +0 -67
  70. data/dummy/public/422.html +0 -67
  71. data/dummy/public/500.html +0 -66
  72. data/dummy/public/apple-touch-icon-precomposed.png +0 -0
  73. data/dummy/public/apple-touch-icon.png +0 -0
  74. data/dummy/public/favicon.ico +0 -0
  75. data/dummy/storage/.keep +0 -0
  76. data/dummy/tmp/.keep +0 -0
  77. data/dummy/tmp/development_secret.txt +0 -1
  78. data/dummy/tmp/pids/.keep +0 -0
  79. data/dummy/tmp/storage/.keep +0 -0
  80. data/hard_worker_dump +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6b95920fe6206f0b3e71b6916e5509a734339273606a4caafc97ceef67fa3b15
4
- data.tar.gz: 774c8a40d06c925f15369a4273e5b6981d8b0a0f0f90afc74e6b064f1a381a55
3
+ metadata.gz: 639e202c5feb0ecb2af5bcd7f22815128f670f36c2aa793ce5bc0c107477a92f
4
+ data.tar.gz: 65864414d040a9b1cd3e92897a97b5f596683c42cb6941c5cdbaee731502a622
5
5
  SHA512:
6
- metadata.gz: fea65e9066049c19b6f5b9acc338613a142c837f74bedbb86e6f696f312871a5804b551a022d570d343979f632929a4e6e3ca9a53da308ce4d125f6b69e7026d
7
- data.tar.gz: 18527ddca7ec452049e4a3c6bfddf4031d9659edd8a1b6f0950ec45033ade4da4984877afc19c031aaa9b5ae3cf7aa66646cf40634bf49d7f1d3d0524efb1ef8
6
+ metadata.gz: bda697be3405328560b19afbf9a90cc8cac0a8487e627ba0d6ee02ef2bbd6bf933cf3235fa312a1f817224ade6837da390d6794742a5110b255ca6052cafb838
7
+ data.tar.gz: da4c2c0b49901ca28aed07eff2d279293c28a3121031500cc4846627d01619fbd24c52b0c382c8c4091d46238df53d827449c7092a85286072a1b74600402313
data/.gitignore CHANGED
@@ -11,4 +11,6 @@
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
data/.rubocop.yml CHANGED
@@ -31,6 +31,9 @@ Style/GlobalVars:
31
31
  Style/BlockDelimiters:
32
32
  EnforcedStyle: braces_for_chaining
33
33
 
34
+ Style/ModuleFunction:
35
+ EnforcedStyle: extend_self
36
+
34
37
  Metrics/BlockLength:
35
38
  Exclude:
36
39
  - 'spec/**/*.rb'
@@ -38,5 +41,8 @@ Metrics/BlockLength:
38
41
  Metrics/ClassLength:
39
42
  Max: 200
40
43
 
44
+ Metrics/MethodLength:
45
+ Max: 15
46
+
41
47
  Security/YAMLLoad:
42
48
  Enabled: false
data/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  ## [Unreleased]
2
2
 
3
+ ## [0.3.3] - 2021-08-01
4
+
5
+ - Shutdown trapped signal thread, make sure :shutdown is not recorded as a job.
6
+
7
+ ## [0.3.2] - 2021-07-31
8
+
9
+ - Trap INT and TERM, so now the shutdown is a little bit more graceful.
10
+
11
+ ## [0.3.1] - 2021-07-29
12
+
13
+ - Remove dummy app from gem... size should go down quite a bit.
14
+
15
+ ## [0.3.0] - 2021-07-29
16
+
17
+ - Now there is logging! By default logs to stdout, but you can configure the logger by setting a different one through `Belated.config.logger`.
3
18
  ## [0.2.0] - 2021-07-25
4
19
 
5
20
  - Workers now rescue StandardError and keep on working!
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- belated (0.2.0)
4
+ belated (0.3.3)
5
5
  drb
6
6
  dry-configurable
7
7
 
data/README.md CHANGED
@@ -10,18 +10,23 @@ 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
- - ~~Support Rails~~ (Supported!)
16
- - ~~Parse options from command line, eg. `--workers 10`~~(Done!)
17
- - Don't crash on errors
18
- - Add a logger
13
+ - Catch SIGTERM and friends
14
+ - Now supports it, partly.
15
+ - Don't crash on errors (Partially done)
19
16
  - Make it possible to schedule jobs
20
17
  - Maybe support ActiveJob?
21
18
  - Have a web UI
22
19
  - Do some performance testing
23
20
  - Add a section telling people to use Sidekiq if they can
24
21
 
22
+ DONE
23
+
24
+ - ~~Marshal the job queue into a file so you don't lose all progress~~
25
+ (Ended up using YAML)
26
+ - ~~Add a logger~~
27
+ - ~~Support Rails~~ (Supported!)
28
+ - ~~Parse options from command line, eg. `--workers 10`~~(Done!)
29
+
25
30
  ## Installation
26
31
 
27
32
  Add this line to your application's Gemfile:
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
@@ -2,11 +2,13 @@
2
2
 
3
3
  require_relative 'belated/version'
4
4
  require_relative 'belated/worker'
5
+ require_relative 'belated/logging'
5
6
  require 'drb'
6
7
  require 'yaml'
7
8
  require 'singleton'
8
9
  require 'dry-configurable'
9
10
  require 'belated/client'
11
+ require 'logger'
10
12
 
11
13
  # Belated is a pure Ruby job backend.
12
14
  # It has limited functionality, as it only accepts
@@ -16,8 +18,9 @@ require 'belated/client'
16
18
  # and reloads them when started again.
17
19
  class Belated
18
20
  extend Dry::Configurable
21
+ include Logging
19
22
  include Singleton unless $TESTING
20
- URI = "druby://localhost:#{$TESTING ? Array.new(4) { rand(10) }.join : "8788"}"
23
+ URI = 'druby://localhost:8788'
21
24
  FILE_NAME = 'belated_dump'
22
25
  @@queue = Queue.new
23
26
 
@@ -26,25 +29,48 @@ class Belated
26
29
  setting :workers, 1
27
30
  setting :connect, true
28
31
  setting :environment, 'development'
32
+ setting :logger, Logger.new($stdout), reader: true
33
+ setting :log_level, :info, reader: true
29
34
 
30
35
  # Since it's running as a singleton, we need something to start it up.
31
36
  # Aliased for testing purposes.
32
37
  # This is only run from the bin file.
33
38
  def start
34
- boot_app
35
- load_jobs
39
+ boot_app && load_jobs
36
40
  @worker_list = []
37
41
  Belated.config.workers.times do |_i|
38
42
  @worker_list << Thread.new { Worker.new }
39
43
  end
40
44
  return unless Belated.config.connect
41
45
 
42
- DRb.start_service(URI, @@queue, verbose: true)
43
- puts banner_and_info
46
+ connect!
47
+ banner_and_info
48
+ trap_signals
44
49
  DRb.thread.join
45
50
  end
46
51
  alias initialize start
47
52
 
53
+ # Handles connection to DRb server.
54
+ def connect!
55
+ DRb.start_service(URI, @@queue, verbose: true)
56
+ rescue DRb::DRbConnError, Errno::EADDRINUSE
57
+ Belated.logger.error 'Could not connect to DRb server.'
58
+ 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?
69
+ exit
70
+ end
71
+ end
72
+ end
73
+
48
74
  def boot_app
49
75
  return unless rails?
50
76
 
@@ -59,6 +85,7 @@ class Belated
59
85
  end
60
86
 
61
87
  def load_jobs
88
+ log "reloading... if file exists #{File.exist?(Belated::FILE_NAME)}"
62
89
  return unless File.exist?(Belated::FILE_NAME)
63
90
 
64
91
  jobs = YAML.load(File.binread(FILE_NAME))
@@ -69,40 +96,28 @@ class Belated
69
96
  end
70
97
 
71
98
  def reload
99
+ log 'reloading...'
72
100
  load_jobs
73
101
  end
74
102
 
75
103
  def stop_workers
76
- @worker_list.each do |worker|
77
- Thread.kill(worker)
78
- end
79
- return if @@queue.empty?
80
-
81
- class_array = []
82
-
83
- @@queue.size.times do |_i|
84
- next if (klass_or_proc = @@queue.pop).instance_of?(Proc)
85
-
86
- class_array << klass_or_proc
87
- end
88
- File.open(FILE_NAME, 'wb') { |f| f.write(YAML.dump(class_array)) }
89
- end
90
-
91
- def self.stop_workers
92
104
  @worker_list&.each do |worker|
105
+ sleep 0.1 if worker.alive?
93
106
  Thread.kill(worker)
94
107
  end
95
108
  class_array = []
96
109
  @@queue.size.times do |_i|
97
- next if (klass_or_proc = @@queue.pop).instance_of?(Proc)
98
-
99
- class_array << klass_or_proc
110
+ unless (klass = @@queue.pop).instance_of?(Proc) || klass == :shutdown
111
+ class_array << klass
112
+ end
100
113
  end
101
- File.open(FILE_NAME, 'wb') { |f| f.write(YAML.dump(class_array)) }
114
+ pp File.open(FILE_NAME, 'wb') { |f| f.write(YAML.dump(class_array)) }
115
+ exit unless $TESTING
102
116
  end
103
117
 
104
118
  def banner
105
119
  <<-'BANNER'
120
+
106
121
  .----------------. .----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
107
122
  | .--------------. | .--------------. | .--------------. | .--------------. | .--------------. | .--------------. | .--------------. |
108
123
  | | ______ | | | _________ | | | _____ | | | __ | | | _________ | | | _________ | | | ________ | |
@@ -118,9 +133,9 @@ class Belated
118
133
  end
119
134
 
120
135
  def banner_and_info
121
- puts banner
122
- puts "Currently running Belated version #{Belated::VERSION}"
123
- puts %(Belated running #{@worker_list&.length.to_i} workers on #{URI}...)
136
+ log banner
137
+ log "Currently running Belated version #{Belated::VERSION}"
138
+ log %(Belated running #{@worker_list&.length.to_i} workers on #{URI}...)
124
139
  end
125
140
 
126
141
  def stats
@@ -130,6 +145,13 @@ class Belated
130
145
  }
131
146
  end
132
147
 
148
+ def self.kill_and_clear_queue!
149
+ @worker_list&.each do |worker|
150
+ Thread.kill(worker)
151
+ end
152
+ clear_queue!
153
+ end
154
+
133
155
  def self.clear_queue!
134
156
  @@queue.clear
135
157
  end
@@ -4,13 +4,15 @@ class Belated
4
4
 
5
5
  def initialize
6
6
  server_uri = Belated::URI
7
+ # @bank =
7
8
  DRb.start_service
8
9
  self.queue = DRbObject.new_with_uri(server_uri)
9
10
  end
10
11
 
11
- def perform_belated(job)
12
+ def perform(job)
12
13
  queue.push(job)
13
14
  end
14
- alias perform_later perform_belated
15
+ alias perform_belated perform
16
+ alias perform_later perform
15
17
  end
16
18
  end
@@ -0,0 +1,17 @@
1
+ class Belated
2
+ module Logging
3
+ extend self
4
+
5
+ def logger
6
+ @logger ||= Belated.logger
7
+ end
8
+
9
+ def log(message)
10
+ logger.__send__(Belated.log_level, message)
11
+ end
12
+
13
+ def logger=(logger)
14
+ @logger = logger
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Belated
4
- VERSION = '0.2.0'
4
+ VERSION = '0.3.3'
5
5
  end
@@ -1,29 +1,33 @@
1
+ require_relative 'logging'
1
2
  class Belated
2
3
  # The worker class that actually gets the jobs from the queue
3
4
  # and calls them. Expects the jobs to be procs.
4
5
  class Worker
6
+ include Logging
7
+
5
8
  def initialize
6
9
  start_working
7
10
  end
8
11
 
9
12
  def start_working
10
13
  loop do
11
- job = Belated.fetch_job
12
- next unless job
14
+ next unless (job = Belated.fetch_job)
15
+
16
+ break if job == :shutdown
13
17
 
14
- call_job(job)
15
- puts 'fetching jobs...'
18
+ log call_job(job)
19
+ log 'fetching jobs...'
16
20
  end
17
21
  end
18
22
 
19
23
  def call_job(job)
20
24
  if job.respond_to?(:call)
21
- pp job.call
25
+ job.call
22
26
  else
23
- pp job&.perform
27
+ job.perform
24
28
  end
25
29
  rescue StandardError => e
26
- pp e.inspect
30
+ e.inspect
27
31
  end
28
32
  end
29
33
  end
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.2.0
4
+ version: 0.3.3
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-25 00:00:00.000000000 Z
11
+ date: 2021-08-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: drb
@@ -78,75 +78,9 @@ 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/logging.rb
150
84
  - lib/belated/rails.rb
151
85
  - lib/belated/version.rb
152
86
  - lib/belated/worker.rb