crono 0.5.1 → 0.5.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 +4 -4
- data/Changes.md +5 -0
- data/README.md +10 -4
- data/examples/cronotab.rb +15 -0
- data/lib/crono.rb +1 -0
- data/lib/crono/cli.rb +8 -15
- data/lib/crono/job.rb +21 -0
- data/lib/crono/performer_proxy.rb +2 -1
- data/lib/crono/period.rb +3 -2
- data/lib/crono/schedule.rb +8 -6
- data/lib/crono/version.rb +1 -1
- data/spec/cli_spec.rb +0 -7
- data/spec/job_spec.rb +22 -0
- data/spec/performer_proxy_spec.rb +2 -2
- data/spec/period_spec.rb +5 -0
- data/spec/schedule_spec.rb +14 -7
- metadata +4 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d44592e0e575b43cbfbc08ae70a3ba2b48fe4c56
|
4
|
+
data.tar.gz: f7155bff1058414b3772e008a497e5932e1117f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cc7a404b38391f25500e7ac662e06426d7bd9129c8911bc909a82262f4d231a824852b33a30f4a52ae58503c7e6ec7eacddd27a3379d1292de0bc61ab5cb5dd9
|
7
|
+
data.tar.gz: 6c101c91fc475b626baacd442725cdd7bd55b86b6e77c5d3cf3bbfa312062fa0931215ba683cb593c7ec9371972657d0968144f37e9a355f89c95f4a4adbbe40
|
data/Changes.md
CHANGED
data/README.md
CHANGED
@@ -26,7 +26,7 @@ Add the following line to your application's Gemfile:
|
|
26
26
|
|
27
27
|
gem 'crono'
|
28
28
|
|
29
|
-
Run the bundle command to install it.
|
29
|
+
Run the `bundle` command to install it.
|
30
30
|
After you install Crono, you can run the generator:
|
31
31
|
|
32
32
|
rails generate crono:install
|
@@ -42,8 +42,8 @@ Now you are ready to move forward to create a job and schedule it.
|
|
42
42
|
Crono can use Active Job jobs from `app/jobs/`. The only requirements is that the `perform` method should take no arguments.
|
43
43
|
|
44
44
|
Here's an example of a test job:
|
45
|
-
app/jobs/test_job.rb
|
46
45
|
|
46
|
+
# app/jobs/test_job.rb
|
47
47
|
class TestJob < ActiveJob::Base
|
48
48
|
def perform
|
49
49
|
# put you scheduled code here
|
@@ -65,6 +65,7 @@ The ActiveJob jobs is convenient because you can use one job in both periodic an
|
|
65
65
|
|
66
66
|
The schedule described in the configuration file `config/cronotab.rb`, that created using `crono:install` or manually. The semantic is pretty straightforward:
|
67
67
|
|
68
|
+
# config/cronotab.rb
|
68
69
|
Crono.perform(TestJob).every 2.days, at: "15:30"
|
69
70
|
|
70
71
|
You can schedule one job a few times, if you want a job to be performed a few times a day:
|
@@ -94,10 +95,15 @@ Usage: crono [options]
|
|
94
95
|
```
|
95
96
|
|
96
97
|
## Capistrano
|
98
|
+
|
97
99
|
Use the `capistrano-crono` gem ([github](https://github.com/plashchynski/capistrano-crono/)).
|
98
100
|
|
101
|
+
|
102
|
+
## Support
|
103
|
+
|
104
|
+
Feel free to create [issues](https://github.com/plashchynski/crono/issues)
|
105
|
+
|
106
|
+
|
99
107
|
## License
|
100
108
|
|
101
|
-
Copyright 2015 Dzmitry Plashchynski <plashchynski@gmail.com>
|
102
|
-
Licensed under the Apache License, Version 2.0
|
103
109
|
Please see [LICENSE](https://github.com/plashchynski/crono/blob/master/LICENSE) for licensing details.
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# cronotab.rb — Crono configuration example file
|
2
|
+
#
|
3
|
+
# Here you can specify periodic jobs and their schedule.
|
4
|
+
# You can specify a periodic job as a ActiveJob class in `app/jobs/`
|
5
|
+
# Actually you can use any class. The only requirement is that
|
6
|
+
# the class should implement a method `perform` without arguments.
|
7
|
+
#
|
8
|
+
|
9
|
+
class TestJob
|
10
|
+
def perform
|
11
|
+
puts "Test!"
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
Crono.perform(TestJob).every 5.second
|
data/lib/crono.rb
CHANGED
data/lib/crono/cli.rb
CHANGED
@@ -3,17 +3,15 @@ require 'optparse'
|
|
3
3
|
|
4
4
|
module Crono
|
5
5
|
mattr_accessor :schedule
|
6
|
+
mattr_accessor :logger
|
6
7
|
|
7
8
|
class CLI
|
8
9
|
include Singleton
|
9
10
|
attr_accessor :config
|
10
|
-
attr_accessor :schedule
|
11
|
-
attr_accessor :logger
|
12
11
|
|
13
12
|
def initialize
|
14
13
|
self.config = Config.new
|
15
|
-
|
16
|
-
Crono.schedule = schedule
|
14
|
+
Crono.schedule = Schedule.new
|
17
15
|
end
|
18
16
|
|
19
17
|
def run
|
@@ -44,12 +42,12 @@ module Crono
|
|
44
42
|
|
45
43
|
def init_logger
|
46
44
|
logfile = config.daemonize ? config.logfile : STDOUT
|
47
|
-
|
45
|
+
Crono.logger = Logger.new(logfile)
|
48
46
|
end
|
49
47
|
|
50
48
|
def print_banner
|
51
|
-
logger.info "Loading Crono #{Crono::VERSION}"
|
52
|
-
logger.info "Running in #{RUBY_DESCRIPTION}"
|
49
|
+
Crono.logger.info "Loading Crono #{Crono::VERSION}"
|
50
|
+
Crono.logger.info "Running in #{RUBY_DESCRIPTION}"
|
53
51
|
end
|
54
52
|
|
55
53
|
def load_rails
|
@@ -60,16 +58,11 @@ module Crono
|
|
60
58
|
require File.expand_path(config.cronotab)
|
61
59
|
end
|
62
60
|
|
63
|
-
def run_job(klass)
|
64
|
-
logger.info "Perform #{klass}"
|
65
|
-
Thread.new { klass.new.perform }
|
66
|
-
end
|
67
|
-
|
68
61
|
def start_working_loop
|
69
62
|
loop do
|
70
|
-
|
71
|
-
sleep(
|
72
|
-
|
63
|
+
job = Crono.schedule.next
|
64
|
+
sleep(job.next - Time.now)
|
65
|
+
job.perform
|
73
66
|
end
|
74
67
|
end
|
75
68
|
|
data/lib/crono/job.rb
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
module Crono
|
2
|
+
class Job
|
3
|
+
attr_accessor :performer
|
4
|
+
attr_accessor :period
|
5
|
+
attr_accessor :last_performed_at
|
6
|
+
|
7
|
+
def initialize(performer, period)
|
8
|
+
self.performer, self.period = performer, period
|
9
|
+
end
|
10
|
+
|
11
|
+
def next
|
12
|
+
period.next(since: last_performed_at)
|
13
|
+
end
|
14
|
+
|
15
|
+
def perform
|
16
|
+
Crono.logger.info "Perform #{performer}"
|
17
|
+
self.last_performed_at = Time.now
|
18
|
+
Thread.new { performer.new.perform }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/crono/period.rb
CHANGED
@@ -5,8 +5,9 @@ module Crono
|
|
5
5
|
@at_hour, @at_min = parse_at(at) if at
|
6
6
|
end
|
7
7
|
|
8
|
-
def next
|
9
|
-
|
8
|
+
def next(since: nil)
|
9
|
+
since ||= Time.now
|
10
|
+
@period.since(since).change({hour: @at_hour, min: @at_min}.compact)
|
10
11
|
end
|
11
12
|
|
12
13
|
def parse_at(at)
|
data/lib/crono/schedule.rb
CHANGED
@@ -1,20 +1,22 @@
|
|
1
1
|
module Crono
|
2
2
|
class Schedule
|
3
|
+
attr_accessor :schedule
|
4
|
+
|
3
5
|
def initialize
|
4
|
-
|
6
|
+
self.schedule = []
|
5
7
|
end
|
6
8
|
|
7
|
-
def add(
|
8
|
-
|
9
|
+
def add(job)
|
10
|
+
schedule << job
|
9
11
|
end
|
10
12
|
|
11
13
|
def next
|
12
|
-
|
14
|
+
queue.first
|
13
15
|
end
|
14
16
|
|
15
|
-
|
17
|
+
private
|
16
18
|
def queue
|
17
|
-
|
19
|
+
schedule.sort { |a,b| a.next <=> b.next }
|
18
20
|
end
|
19
21
|
end
|
20
22
|
end
|
data/lib/crono/version.rb
CHANGED
data/spec/cli_spec.rb
CHANGED
@@ -18,13 +18,6 @@ describe Crono::CLI do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
describe "#run_job" do
|
22
|
-
it "should run job in separate thread" do
|
23
|
-
thread = cli.send(:run_job, TestJob).join
|
24
|
-
expect(thread).to be_stop
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
21
|
describe "#start_working_loop" do
|
29
22
|
it "should start working loop"
|
30
23
|
end
|
data/spec/job_spec.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
class TestJob
|
4
|
+
def perform;end
|
5
|
+
end
|
6
|
+
|
7
|
+
describe Crono::Job do
|
8
|
+
let(:period) { Crono::Period.new(2.day) }
|
9
|
+
let(:job) { Crono::Job.new(TestJob, period) }
|
10
|
+
|
11
|
+
it "should contain performer and period" do
|
12
|
+
expect(job.performer).to be TestJob
|
13
|
+
expect(job.period).to be period
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "#perform" do
|
17
|
+
it "should run performer in separate thread" do
|
18
|
+
thread = job.perform.join
|
19
|
+
expect(thread).to be_stop
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -5,8 +5,8 @@ class TestJob
|
|
5
5
|
end
|
6
6
|
|
7
7
|
describe Crono::PerformerProxy do
|
8
|
-
it "should add job
|
9
|
-
expect(Crono.schedule).to receive(:add).with(
|
8
|
+
it "should add job to schedule" do
|
9
|
+
expect(Crono.schedule).to receive(:add).with(kind_of(Crono::Job))
|
10
10
|
Crono.perform(TestJob).every(2.days, at: "15:30")
|
11
11
|
end
|
12
12
|
end
|
data/spec/period_spec.rb
CHANGED
@@ -30,6 +30,11 @@ describe Crono::Period do
|
|
30
30
|
@period = Crono::Period.new(2.day, at: 1)
|
31
31
|
}.to raise_error("Unknown 'at' format")
|
32
32
|
end
|
33
|
+
|
34
|
+
it "should return time in relation to last time" do
|
35
|
+
@period = Crono::Period.new(2.day)
|
36
|
+
expect(@period.next(since: 1.day.ago)).to be_eql(1.day.from_now)
|
37
|
+
end
|
33
38
|
end
|
34
39
|
end
|
35
40
|
end
|
data/spec/schedule_spec.rb
CHANGED
@@ -5,16 +5,23 @@ class TestJob
|
|
5
5
|
end
|
6
6
|
|
7
7
|
describe Crono::Schedule do
|
8
|
+
before(:each) do
|
9
|
+
@schedule = Crono::Schedule.new
|
10
|
+
@jobs = [
|
11
|
+
Crono::Period.new(3.day, at: "18:55"),
|
12
|
+
Crono::Period.new(1.day, at: "15:30"),
|
13
|
+
Crono::Period.new(7.day, at: "06:05")
|
14
|
+
].map { |period| Crono::Job.new(TestJob, period) }
|
15
|
+
@schedule.schedule = @jobs
|
16
|
+
end
|
17
|
+
|
8
18
|
describe "#next" do
|
9
19
|
it "should return next job in schedule" do
|
10
|
-
@schedule
|
11
|
-
|
12
|
-
Crono::Period.new(3.day, at: "18:55"),
|
13
|
-
Crono::Period.new(1.day, at: "15:30"),
|
14
|
-
Crono::Period.new(7.day, at: "06:05")
|
15
|
-
].each { |period| @schedule.add(TestJob, period) }
|
20
|
+
expect(@schedule.next).to be @jobs[1]
|
21
|
+
end
|
16
22
|
|
17
|
-
|
23
|
+
it "should return next based on last" do
|
24
|
+
expect(@schedule.next)
|
18
25
|
end
|
19
26
|
end
|
20
27
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: crono
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Dzmitry Plashchynski
|
@@ -114,10 +114,12 @@ files:
|
|
114
114
|
- Rakefile
|
115
115
|
- bin/crono
|
116
116
|
- crono.gemspec
|
117
|
+
- examples/cronotab.rb
|
117
118
|
- examples/monitrc.conf
|
118
119
|
- lib/crono.rb
|
119
120
|
- lib/crono/cli.rb
|
120
121
|
- lib/crono/config.rb
|
122
|
+
- lib/crono/job.rb
|
121
123
|
- lib/crono/performer_proxy.rb
|
122
124
|
- lib/crono/period.rb
|
123
125
|
- lib/crono/schedule.rb
|
@@ -126,6 +128,7 @@ files:
|
|
126
128
|
- lib/generators/crono/install/templates/cronotab.rb.erb
|
127
129
|
- spec/cli_spec.rb
|
128
130
|
- spec/config_spec.rb
|
131
|
+
- spec/job_spec.rb
|
129
132
|
- spec/performer_proxy_spec.rb
|
130
133
|
- spec/period_spec.rb
|
131
134
|
- spec/schedule_spec.rb
|