belated 0.2.0 → 0.3.3

Sign up to get free protection for your applications and to get access to all the features.
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