when-cron 1.0.0 → 1.0.1
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/README.md +19 -5
- data/lib/when-cron/cron/cron.rb +10 -8
- data/lib/when-cron/cron/cron_part.rb +17 -9
- data/spec/lib/when/cron/cron_part_spec.rb +6 -0
- data/spec/lib/when/cron/cron_spec.rb +10 -0
- data/when-cron.gemspec +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7be791179d6810b1a235984131c4c440b13c945f
|
4
|
+
data.tar.gz: 56b1bf74f137172458f068778a8ec123fa43f38a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c2cf26e262f12206f73ed74be0c4c8cf5a0179ea74f28a82b116c19e5cdb95983b2735396aab3cc5dd989719ea6eef69794be9e28d393f6908cbb733a9121c3e
|
7
|
+
data.tar.gz: 616f6a08f514dfd476880bce095335bcc4362ae6edfc82c6cf33aaa1b76c23a0a685f71709cbb15fcae15e3ba2c6fc1a80f0cca72ac239315062e1f15cb7abcf
|
data/README.md
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
# When
|
1
|
+
# When-Cron
|
2
2
|
|
3
|
-
|
3
|
+
A basic cron implementation in Ruby.
|
4
4
|
|
5
5
|
## Installation
|
6
6
|
|
7
7
|
Add this line to your application's Gemfile:
|
8
8
|
|
9
|
-
gem 'when'
|
9
|
+
gem 'when-cron'
|
10
10
|
|
11
11
|
And then execute:
|
12
12
|
|
@@ -14,11 +14,25 @@ And then execute:
|
|
14
14
|
|
15
15
|
Or install it yourself as:
|
16
16
|
|
17
|
-
$ gem install when
|
17
|
+
$ gem install when-cron
|
18
18
|
|
19
19
|
## Usage
|
20
20
|
|
21
|
-
|
21
|
+
Compare to anything that has an interface like Ruby's Time class with ==.
|
22
|
+
|
23
|
+
```When::Cron.new('* * * * *') == Time.now # => true```
|
24
|
+
|
25
|
+
Only numbers or * are supported for values, only - , / are supported as operators.
|
26
|
+
|
27
|
+
```When::Cron.valid?('a b c d e') # => false```
|
28
|
+
|
29
|
+
When::Cron will allow nonsensical values (exa. 100 in the minute spot), but because the minute will never match, == will always return false.
|
30
|
+
|
31
|
+
```When::Cron.new('100 * * * *') == Time.now # => false```
|
32
|
+
|
33
|
+
When::Cron will raise an error for extremely nonsensical cron strings.
|
34
|
+
|
35
|
+
```When::Cron.new('this is getting ridiculous') # => raises When::Cron::InvalidString```
|
22
36
|
|
23
37
|
## Contributing
|
24
38
|
|
data/lib/when-cron/cron/cron.rb
CHANGED
@@ -1,11 +1,19 @@
|
|
1
1
|
module When
|
2
2
|
class Cron
|
3
|
+
def self.valid?(cron)
|
4
|
+
begin
|
5
|
+
new(cron)
|
6
|
+
rescue When::CronPart::InvalidString
|
7
|
+
return false
|
8
|
+
end
|
9
|
+
true
|
10
|
+
end
|
11
|
+
|
3
12
|
def initialize(cron)
|
4
|
-
|
13
|
+
parse(cron)
|
5
14
|
end
|
6
15
|
|
7
16
|
def ==(time)
|
8
|
-
parsed?
|
9
17
|
matches = []
|
10
18
|
matches << (@minute == time.min)
|
11
19
|
matches << (@hour == time.hour)
|
@@ -15,12 +23,6 @@ module When
|
|
15
23
|
matches.all?
|
16
24
|
end
|
17
25
|
|
18
|
-
private
|
19
|
-
|
20
|
-
def parsed?
|
21
|
-
@parsed ||= parse(@cron)
|
22
|
-
end
|
23
|
-
|
24
26
|
def parse(string)
|
25
27
|
strings = string.split(' ')
|
26
28
|
@minute = CronPart.new(strings[0])
|
@@ -1,31 +1,39 @@
|
|
1
1
|
module When
|
2
2
|
class CronPart
|
3
|
+
class InvalidString < StandardError; end
|
4
|
+
|
3
5
|
def initialize(cron_part)
|
4
|
-
@
|
6
|
+
@part = parse(cron_part)
|
5
7
|
end
|
6
8
|
|
7
9
|
def ==(int)
|
8
|
-
part == int
|
10
|
+
@part == int
|
9
11
|
end
|
10
12
|
|
11
13
|
private
|
12
14
|
|
13
|
-
def part
|
14
|
-
@part ||= parse(@cron_part)
|
15
|
-
end
|
16
|
-
|
17
15
|
def parse(cron_part)
|
18
16
|
if cron_part =~ /,/
|
19
17
|
CronArray.new(cron_part.split(',').map { |s| parse(s) })
|
20
|
-
elsif cron_part =~
|
18
|
+
elsif cron_part =~ /\//
|
21
19
|
CronInterval.new(*cron_part.split('/').map { |s| parse(s) })
|
22
|
-
elsif cron_part =~
|
20
|
+
elsif cron_part =~ /-/
|
23
21
|
CronRange.new(*cron_part.split('-').map { |s| parse(s) })
|
24
22
|
elsif cron_part == '*'
|
25
23
|
Wildcard.new
|
26
24
|
else
|
27
|
-
cron_part
|
25
|
+
to_valid_int(cron_part)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def to_valid_int(cron_part)
|
30
|
+
int = cron_part.to_i
|
31
|
+
if int.to_s == cron_part
|
32
|
+
int
|
33
|
+
else
|
34
|
+
raise When::CronPart::InvalidString, "found #{cron_part.inspect}: only * or integer values and / , - operators are supported"
|
28
35
|
end
|
29
36
|
end
|
30
37
|
end
|
38
|
+
|
31
39
|
end
|
@@ -4,6 +4,16 @@ include When
|
|
4
4
|
describe Cron do
|
5
5
|
let(:now) { Time.new(2013, 6, 15, 12, 30, 30) }
|
6
6
|
|
7
|
+
describe '.valid?' do
|
8
|
+
it 'returns false for strings it cannot interpret' do
|
9
|
+
expect(Cron.valid?('* * * * a,b')).to be false
|
10
|
+
end
|
11
|
+
|
12
|
+
it 'returns true for cron string it can interpret' do
|
13
|
+
expect(Cron.valid?('* * * * 1')).to be true
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
7
17
|
describe '#==' do
|
8
18
|
context 'simple cron' do
|
9
19
|
let(:cron) { Cron.new('30 12 15 6 6') }
|
data/when-cron.gemspec
CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
4
4
|
|
5
5
|
Gem::Specification.new do |spec|
|
6
6
|
spec.name = "when-cron"
|
7
|
-
spec.version = '1.0.
|
7
|
+
spec.version = '1.0.1'
|
8
8
|
spec.authors = ["TH"]
|
9
9
|
spec.email = ["tylerhartland7@gmail.com"]
|
10
10
|
spec.description = %q{A basic cron implementation.}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: when-cron
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- TH
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
11
|
+
date: 2014-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|