perform_every 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +12 -12
- data/lib/generators/perform_every/active_record_generator.rb +1 -14
- data/lib/generators/perform_every/templates/migration.rb +1 -1
- data/lib/perform_every.rb +1 -1
- data/lib/perform_every/activejob.rb +3 -4
- data/lib/perform_every/job.rb +6 -7
- data/lib/perform_every/reflection.rb +1 -3
- data/lib/perform_every/scheduler.rb +14 -15
- data/lib/perform_every/version.rb +1 -1
- data/lib/tasks/perform_every_tasks.rake +1 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28665fe63baa450a89f68d9f6c800c32c0961bb5d3aa248ea39ed0e0363596ae
|
4
|
+
data.tar.gz: 3b570be0905adab69c73d8424a55f4a65bdd6be1cdd9ab918c8e4585157cc7d7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1540d9335238bfdf3c18330b15263c309e85a504fb025f9e53b9cdeead34c315ca637ff313e2523baf05e7dfc31f19fd28efae8db7aa1f1ff7c0785771e86c31
|
7
|
+
data.tar.gz: b427ada8c301c57ed33ba71ebc369f859467d7ebb0a8fa6e465f9d45bb486ad1f0e9a87d1b784a858bec1004cd39d2934a0d3107b277409c6caee38788ae9ebb
|
data/Rakefile
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
begin
|
2
|
-
require
|
2
|
+
require "bundler/setup"
|
3
3
|
rescue LoadError
|
4
|
-
puts
|
4
|
+
puts "You must `gem install bundler` and `bundle install` to run rake tasks"
|
5
5
|
end
|
6
6
|
|
7
|
-
require
|
7
|
+
require "rdoc/task"
|
8
8
|
|
9
9
|
RDoc::Task.new(:rdoc) do |rdoc|
|
10
|
-
rdoc.rdoc_dir =
|
11
|
-
rdoc.title
|
12
|
-
rdoc.options <<
|
13
|
-
rdoc.rdoc_files.include(
|
14
|
-
rdoc.rdoc_files.include(
|
10
|
+
rdoc.rdoc_dir = "rdoc"
|
11
|
+
rdoc.title = "PerformEvery"
|
12
|
+
rdoc.options << "--line-numbers"
|
13
|
+
rdoc.rdoc_files.include("README.md")
|
14
|
+
rdoc.rdoc_files.include("lib/**/*.rb")
|
15
15
|
end
|
16
16
|
|
17
|
-
require
|
17
|
+
require "bundler/gem_tasks"
|
18
18
|
|
19
|
-
require
|
19
|
+
require "rake/testtask"
|
20
20
|
|
21
21
|
Rake::TestTask.new(:test) do |t|
|
22
|
-
t.libs <<
|
23
|
-
t.pattern =
|
22
|
+
t.libs << "test"
|
23
|
+
t.pattern = "test/**/*_test.rb"
|
24
24
|
t.verbose = false
|
25
25
|
end
|
26
26
|
|
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
module PerformEvery
|
3
2
|
class ActiveRecordGenerator < Rails::Generators::Base
|
4
3
|
include Rails::Generators::Migration
|
@@ -8,24 +7,12 @@ module PerformEvery
|
|
8
7
|
migration_template "migration.rb", "db/migrate/create_perform_every.rb"
|
9
8
|
end
|
10
9
|
|
11
|
-
|
12
|
-
#invoke "active_record:model", ["PerformEvery"], migration: false unless model_exists? && behavior == :invoke
|
13
|
-
#end
|
14
|
-
|
15
|
-
private
|
10
|
+
private
|
16
11
|
|
17
12
|
# see https://stackoverflow.com/questions/11079617/next-migration-number-notimplementederror-notimplementederror-using-wysihat
|
18
13
|
def self.next_migration_number(dirname)
|
19
14
|
next_migration_number = current_migration_number(dirname) + 1
|
20
15
|
ActiveRecord::Migration.next_migration_number(next_migration_number)
|
21
16
|
end
|
22
|
-
|
23
|
-
#def model_exists?
|
24
|
-
#File.exist?(File.join(destination_root, model_path))
|
25
|
-
#end
|
26
|
-
|
27
|
-
#def model_path
|
28
|
-
#@model_path ||= File.join("app", "models", "perform_every.rb")
|
29
|
-
#end
|
30
17
|
end
|
31
18
|
end
|
data/lib/perform_every.rb
CHANGED
@@ -7,7 +7,7 @@ module PerformEvery
|
|
7
7
|
# and https://github.com/rails/rails/blob/master/activerecord/lib/active_record/associations.rb
|
8
8
|
|
9
9
|
class_methods do
|
10
|
-
def perform_every(interval, opts={})
|
10
|
+
def perform_every(interval, opts = {})
|
11
11
|
j = Job.new
|
12
12
|
j.job_name = self.name
|
13
13
|
j.typ = "interval"
|
@@ -17,14 +17,14 @@ module PerformEvery
|
|
17
17
|
if j.value.blank?
|
18
18
|
raise "#{self.name}#perform_every needs interval"
|
19
19
|
end
|
20
|
-
|
20
|
+
|
21
21
|
# TODO raise if perform method has parameters
|
22
22
|
# Object.const_get(self.name).instance_method(:perform).parameters.flatten.count
|
23
23
|
|
24
24
|
PerformEvery::Reflection.insert(j)
|
25
25
|
end
|
26
26
|
|
27
|
-
def perform_at(timestamp, opts={})
|
27
|
+
def perform_at(timestamp, opts = {})
|
28
28
|
j = Job.new
|
29
29
|
j.job_name = self.name
|
30
30
|
j.typ = "timestamp"
|
@@ -43,4 +43,3 @@ module PerformEvery
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
data/lib/perform_every/job.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "action_view"
|
2
2
|
|
3
3
|
module PerformEvery
|
4
4
|
class Job < ActiveRecord::Base
|
@@ -15,7 +15,7 @@ module PerformEvery
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def from_reflection_store(attr)
|
18
|
-
s = PerformEvery::Reflection.find(self)
|
18
|
+
s = PerformEvery::Reflection.find(self)
|
19
19
|
return nil if s.nil?
|
20
20
|
s.send(attr.to_sym)
|
21
21
|
end
|
@@ -122,7 +122,7 @@ module PerformEvery
|
|
122
122
|
def add_history(t = Time.now.utc)
|
123
123
|
self.history ||= []
|
124
124
|
self.history << t.to_s
|
125
|
-
self.history.shift(self.history.count - MAX_HISTORY) if self.history.count > MAX_HISTORY
|
125
|
+
self.history.shift(self.history.count - MAX_HISTORY) if self.history.count > MAX_HISTORY
|
126
126
|
end
|
127
127
|
|
128
128
|
def perform_next_at
|
@@ -138,7 +138,7 @@ module PerformEvery
|
|
138
138
|
def parse_interval_value
|
139
139
|
raise "must be interval" if self.value.blank?
|
140
140
|
interval = ::Fugit::Nat.parse("every " + self.value, multi: :fail)
|
141
|
-
raise "must be interval" if interval.blank? || !interval.is_a?(::Fugit::Cron)
|
141
|
+
raise "must be interval" if interval.blank? || !interval.is_a?(::Fugit::Cron)
|
142
142
|
return interval
|
143
143
|
end
|
144
144
|
|
@@ -149,8 +149,8 @@ module PerformEvery
|
|
149
149
|
return timestamp
|
150
150
|
end
|
151
151
|
|
152
|
-
def ==
|
153
|
-
self.job_name == j.job_name && self.typ == j.typ && self.value == j.value
|
152
|
+
def ==(j)
|
153
|
+
self.job_name == j.job_name && self.typ == j.typ && self.value == j.value
|
154
154
|
end
|
155
155
|
|
156
156
|
def perform_once?
|
@@ -165,6 +165,5 @@ module PerformEvery
|
|
165
165
|
self.deprecated = true
|
166
166
|
self.save!
|
167
167
|
end
|
168
|
-
|
169
168
|
end
|
170
169
|
end
|
@@ -1,17 +1,16 @@
|
|
1
|
-
require
|
1
|
+
require "with_advisory_lock"
|
2
2
|
|
3
3
|
module PerformEvery
|
4
4
|
class Scheduler
|
5
|
-
|
6
5
|
def run_forever
|
7
6
|
Zeitwerk::Loader.eager_load_all # make sure all jobs are loaded
|
8
7
|
|
9
8
|
# trap SIGINT and SIGTERM signals for clean shutdown
|
10
9
|
kill = false
|
11
|
-
Signal.trap("INT") {|s| kill = true }
|
12
|
-
Signal.trap("TERM") {|s| kill = true }
|
10
|
+
Signal.trap("INT") { |s| kill = true }
|
11
|
+
Signal.trap("TERM") { |s| kill = true }
|
13
12
|
|
14
|
-
# try to continuously acquire advisory lock so that only one worker
|
13
|
+
# try to continuously acquire advisory lock so that only one worker
|
15
14
|
# at a time will schedule jobs. wait 5 seconds for lock, then try again after 30 seconds.
|
16
15
|
loop do
|
17
16
|
Rails.logger.info "Leader election: waiting to become master ..."
|
@@ -26,7 +25,7 @@ module PerformEvery
|
|
26
25
|
|
27
26
|
at_exit do
|
28
27
|
Rails.logger.info "#{metrics}" unless metrics.blank?
|
29
|
-
Rails.logger.info "Bye"
|
28
|
+
Rails.logger.info "Bye"
|
30
29
|
end
|
31
30
|
|
32
31
|
# start endless loop
|
@@ -37,9 +36,8 @@ module PerformEvery
|
|
37
36
|
jobs = Job.where(:deprecated => false)
|
38
37
|
jobs.each do |job|
|
39
38
|
|
40
|
-
|
41
39
|
# check if job is still present in local job files
|
42
|
-
if Reflection.store.include?(job)
|
40
|
+
if Reflection.store.include?(job)
|
43
41
|
op = job.perform!
|
44
42
|
metrics[op] ||= 0
|
45
43
|
metrics[op] += 1
|
@@ -72,7 +70,6 @@ module PerformEvery
|
|
72
70
|
return if kill
|
73
71
|
sleep 2
|
74
72
|
end
|
75
|
-
|
76
73
|
end # /loop around with_advisory_lock
|
77
74
|
end
|
78
75
|
|
@@ -81,11 +78,14 @@ module PerformEvery
|
|
81
78
|
# insert new jobs to database
|
82
79
|
def self.persist_jobs
|
83
80
|
return 0 if Reflection.store.blank?
|
84
|
-
Job.insert_all(Reflection.store.map{|j|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
81
|
+
Job.insert_all(Reflection.store.map { |j|
|
82
|
+
{
|
83
|
+
job_name: j.job_name,
|
84
|
+
typ: j.typ,
|
85
|
+
value: j.value,
|
86
|
+
perform_at: j.perform_next_at,
|
87
|
+
}
|
88
|
+
})
|
89
89
|
Reflection.store.count
|
90
90
|
end
|
91
91
|
|
@@ -96,6 +96,5 @@ module PerformEvery
|
|
96
96
|
def self.reset_jobs
|
97
97
|
Job.connection.truncate(Job.table_name)
|
98
98
|
end
|
99
|
-
|
100
99
|
end
|
101
100
|
end
|
@@ -1,8 +1,7 @@
|
|
1
1
|
namespace :perform_every do
|
2
|
-
|
3
2
|
desc "Run scheduler"
|
4
3
|
task run: :environment do
|
5
|
-
s = PerformEvery::Scheduler.new
|
4
|
+
s = PerformEvery::Scheduler.new
|
6
5
|
s.run_forever
|
7
6
|
end
|
8
7
|
|
@@ -15,5 +14,4 @@ namespace :perform_every do
|
|
15
14
|
task reset: :environment do
|
16
15
|
PerformEvery::Scheduler.reset_jobs
|
17
16
|
end
|
18
|
-
|
19
17
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perform_every
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Matthias Kadenbach
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-02
|
11
|
+
date: 2020-07-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|