taskloop 0.1.0
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 +7 -0
- data/.idea/.gitignore +8 -0
- data/.idea/misc.xml +4 -0
- data/.idea/modules.xml +8 -0
- data/.idea/taskloop.iml +51 -0
- data/.idea/vcs.xml +6 -0
- data/Gemfile +9 -0
- data/Gemfile.lock +36 -0
- data/README.md +31 -0
- data/Rakefile +4 -0
- data/exe/taskloop +16 -0
- data/lib/taskloop/command/deploy.rb +136 -0
- data/lib/taskloop/command/env.rb +134 -0
- data/lib/taskloop/command/init.rb +42 -0
- data/lib/taskloop/command/launch.rb +67 -0
- data/lib/taskloop/command/list.rb +59 -0
- data/lib/taskloop/command/log.rb +104 -0
- data/lib/taskloop/command/run.rb +106 -0
- data/lib/taskloop/command/shutdown.rb +49 -0
- data/lib/taskloop/command/undeploy.rb +46 -0
- data/lib/taskloop/command.rb +168 -0
- data/lib/taskloop/dsl/dsl.rb +63 -0
- data/lib/taskloop/extension/integer_extension.rb +25 -0
- data/lib/taskloop/extension/string_extension.rb +18 -0
- data/lib/taskloop/rules/after_scope_rule.rb +91 -0
- data/lib/taskloop/rules/before_scope_rule.rb +90 -0
- data/lib/taskloop/rules/between_scope_rule.rb +130 -0
- data/lib/taskloop/rules/date_list_rule.rb +47 -0
- data/lib/taskloop/rules/default_rule.rb +19 -0
- data/lib/taskloop/rules/interval_rule.rb +26 -0
- data/lib/taskloop/rules/loop_rule.rb +25 -0
- data/lib/taskloop/rules/rule.rb +34 -0
- data/lib/taskloop/rules/scope_rule.rb +22 -0
- data/lib/taskloop/rules/specific_rule.rb +64 -0
- data/lib/taskloop/rules/time_list_rule.rb +49 -0
- data/lib/taskloop/task/task.rb +244 -0
- data/lib/taskloop/task/task_data_file.rb +46 -0
- data/lib/taskloop/task/task_error.rb +17 -0
- data/lib/taskloop/task/task_property.rb +294 -0
- data/lib/taskloop/utils/proj_tasklist.rb +145 -0
- data/lib/taskloop/version.rb +5 -0
- data/lib/taskloop.rb +9 -0
- data/sig/taskloop.rbs +4 -0
- data/taskloop.gemspec +37 -0
- metadata +103 -0
@@ -0,0 +1,90 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
class BeforeScopeRule < ScopeRule
|
3
|
+
|
4
|
+
attr_accessor :right
|
5
|
+
|
6
|
+
def initialize(unit, scope, right)
|
7
|
+
super unit, scope
|
8
|
+
@right = right
|
9
|
+
end
|
10
|
+
|
11
|
+
def invalidate!
|
12
|
+
super
|
13
|
+
if @unit == :day
|
14
|
+
unless Task::WEEK.has_key?(@right) || Task::DAY.has_key?(@right)
|
15
|
+
raise ArgumentError, "#{@right} must be a Symbol defined in Task::WEEK or Task::DAY"
|
16
|
+
end
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
if @unit == :month
|
21
|
+
unless Task::MONTH.has_key?(@right)
|
22
|
+
raise ArgumentError, "#{@right} must be a Symbol defined in Task::MONTH"
|
23
|
+
end
|
24
|
+
return
|
25
|
+
end
|
26
|
+
|
27
|
+
unless @right.is_a?(Integer)
|
28
|
+
raise TypeError, "'right' need to be Symbol or Integer"
|
29
|
+
end
|
30
|
+
|
31
|
+
if @unit == :minute && (@right < 0 || @right > 59)
|
32
|
+
raise ArgumentError, "'right' for 'minute' must >= 0 and <= 59"
|
33
|
+
end
|
34
|
+
|
35
|
+
if @unit == :hour && (@right < 0 || @right > 23)
|
36
|
+
raise ArgumentError, "'right' for 'hour' must >= 0 and <= 23"
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def right_value
|
41
|
+
if (Task::DAY.has_key?(@right))
|
42
|
+
return Task::DAY[@right]
|
43
|
+
end
|
44
|
+
if (Task::WEEK.has_key?(@right))
|
45
|
+
return Task::WEEK[@right]
|
46
|
+
end
|
47
|
+
if (Task::MONTH.has_key?(@right))
|
48
|
+
return Task::MONTH[@right]
|
49
|
+
end
|
50
|
+
|
51
|
+
unless @right != nil && @right.is_a?(Integer)
|
52
|
+
return -1
|
53
|
+
end
|
54
|
+
|
55
|
+
return @right
|
56
|
+
end
|
57
|
+
|
58
|
+
def is_week_value?
|
59
|
+
if @unit == :day && Task::WEEK.has_key?(@right)
|
60
|
+
return true
|
61
|
+
end
|
62
|
+
return false
|
63
|
+
end
|
64
|
+
|
65
|
+
def is_conform_rule?(last_exec_time)
|
66
|
+
current = Time.now
|
67
|
+
value = right_value
|
68
|
+
result = false
|
69
|
+
case @unit
|
70
|
+
when :year then
|
71
|
+
result = current.year < value
|
72
|
+
when :month then
|
73
|
+
result = current.month < value
|
74
|
+
when :day then
|
75
|
+
if is_week_value?
|
76
|
+
result = current.wday < (value % TaskLoop::WEEK_BASE)
|
77
|
+
else
|
78
|
+
result = current.day < value
|
79
|
+
end
|
80
|
+
when :hour then
|
81
|
+
result = current.hour < value
|
82
|
+
end
|
83
|
+
return result
|
84
|
+
end
|
85
|
+
|
86
|
+
def desc
|
87
|
+
super + " #{right}"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,130 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
class BetweenScopeRule < ScopeRule
|
3
|
+
|
4
|
+
attr_accessor :left
|
5
|
+
|
6
|
+
attr_accessor :right
|
7
|
+
|
8
|
+
def initialize(unit, scope, left, right)
|
9
|
+
super unit, scope
|
10
|
+
@left = left
|
11
|
+
@right = right
|
12
|
+
end
|
13
|
+
|
14
|
+
def invalidate!
|
15
|
+
super
|
16
|
+
if @unit == :day
|
17
|
+
if Task::WEEK.has_key?(@left) && Task::WEEK.has_key?(@right)
|
18
|
+
unless Task::WEEK[@left] < Task::WEEK[@right]
|
19
|
+
raise ArgumentError, "'left' must less than 'right'"
|
20
|
+
end
|
21
|
+
return
|
22
|
+
end
|
23
|
+
if Task::DAY.has_key?(@left) && Task::DAY.has_key?(@right)
|
24
|
+
unless Task::WEEK[@left] < Task::WEEK[@right]
|
25
|
+
raise ArgumentError, "'left' must less than 'right'"
|
26
|
+
end
|
27
|
+
return
|
28
|
+
end
|
29
|
+
|
30
|
+
raise ArgumentError, "'left' and 'right' must be the same type."
|
31
|
+
end
|
32
|
+
|
33
|
+
if @unit == :month
|
34
|
+
unless Task::MONTH.has_key?(@left)
|
35
|
+
raise ArgumentError, "#{left} must be a Symbol defined in Task::MONTH"
|
36
|
+
end
|
37
|
+
return
|
38
|
+
end
|
39
|
+
|
40
|
+
unless @left.is_a?(Integer) && @right.is_a?(Integer)
|
41
|
+
raise TypeError, "both 'left' and 'right' need to be Symbol or Integer"
|
42
|
+
end
|
43
|
+
|
44
|
+
unless @left < @right
|
45
|
+
raise ArgumentError, "'left' must less than 'right'"
|
46
|
+
end
|
47
|
+
|
48
|
+
if @unit == :minute && (@left < 0 || @right > 59)
|
49
|
+
raise ArgumentError, "'left' and 'right' for 'minute' must >= 0 and <= 59"
|
50
|
+
end
|
51
|
+
|
52
|
+
if @unit == :hour && (@left < 0 || @right > 23)
|
53
|
+
raise ArgumentError, "'left', 'right' for 'hour' must >= 0 and <= 23"
|
54
|
+
end
|
55
|
+
|
56
|
+
if @unit == :year && @left < 0
|
57
|
+
raise ArgumentError, "'left' must greater than 0"
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def left_value
|
62
|
+
if (Task::DAY.has_key?(@left))
|
63
|
+
return Task::DAY[@left]
|
64
|
+
end
|
65
|
+
if (Task::WEEK.has_key?(@left))
|
66
|
+
return Task::WEEK[@left]
|
67
|
+
end
|
68
|
+
if (Task::MONTH.has_key?(@left))
|
69
|
+
return Task::MONTH[@left]
|
70
|
+
end
|
71
|
+
|
72
|
+
unless @left != nil && @left.is_a?(Integer)
|
73
|
+
return -1
|
74
|
+
end
|
75
|
+
|
76
|
+
return @left
|
77
|
+
end
|
78
|
+
|
79
|
+
def right_value
|
80
|
+
if (Task::DAY.has_key?(@right))
|
81
|
+
return Task::DAY[@right]
|
82
|
+
end
|
83
|
+
if (Task::WEEK.has_key?(@right))
|
84
|
+
return Task::WEEK[@right]
|
85
|
+
end
|
86
|
+
if (Task::MONTH.has_key?(@right))
|
87
|
+
return Task::MONTH[@right]
|
88
|
+
end
|
89
|
+
|
90
|
+
unless @right != nil && @right.is_a?(Integer)
|
91
|
+
return -1
|
92
|
+
end
|
93
|
+
|
94
|
+
return @right
|
95
|
+
end
|
96
|
+
|
97
|
+
def is_week_value?
|
98
|
+
if @unit == :day && Task::WEEK.has_key?(@left) && Task::WEEK.has_key?(@right)
|
99
|
+
return true
|
100
|
+
end
|
101
|
+
return false
|
102
|
+
end
|
103
|
+
|
104
|
+
def is_conform_rule?(last_exec_time)
|
105
|
+
current = Time.now
|
106
|
+
left = left_value
|
107
|
+
right = right_value
|
108
|
+
result = false
|
109
|
+
case @unit
|
110
|
+
when :year then
|
111
|
+
result = left <= current.year >= left && current.year <= right
|
112
|
+
when :month then
|
113
|
+
result = left <= current.month && current.month <= right
|
114
|
+
when :day then
|
115
|
+
if is_week_value?
|
116
|
+
result = (left % TaskLoop::WEEK_BASE) <= current.wday && current.wday <= (right % TaskLoop::WEEK_BASE)
|
117
|
+
else
|
118
|
+
result = left <= current.day && current.day <= right
|
119
|
+
end
|
120
|
+
when :hour then
|
121
|
+
result = left <= current.hour && current.hour <= right
|
122
|
+
end
|
123
|
+
return result
|
124
|
+
end
|
125
|
+
|
126
|
+
def desc
|
127
|
+
super + " #{left}, #{right}"
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
class DateListRule < Rule
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
attr_writer :dates
|
6
|
+
|
7
|
+
def dates
|
8
|
+
@dates ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def dates_values
|
12
|
+
values = []
|
13
|
+
dates.each do |date|
|
14
|
+
date_format = "%Y-%m-%d"
|
15
|
+
date_object = Time.strptime(date, date_format)
|
16
|
+
values.push(date_object)
|
17
|
+
end
|
18
|
+
return values
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(unit, dates)
|
22
|
+
super unit
|
23
|
+
unless dates != nil && dates.length > 0
|
24
|
+
raise ArgumentError, "dates arguments need at least one value."
|
25
|
+
end
|
26
|
+
@dates = dates
|
27
|
+
end
|
28
|
+
|
29
|
+
def is_week_value?
|
30
|
+
return false
|
31
|
+
end
|
32
|
+
|
33
|
+
def is_conform_rule?(last_exec_time)
|
34
|
+
current = Time.now
|
35
|
+
result = false
|
36
|
+
|
37
|
+
dates_values.each do |date|
|
38
|
+
result = result || (date.year == current.year && date.month == current.month && date.day == current.day)
|
39
|
+
end
|
40
|
+
return result
|
41
|
+
end
|
42
|
+
|
43
|
+
def desc
|
44
|
+
super + "; date_list: #{dates.join(', ')}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
class DefaultRule < Rule
|
3
|
+
def initialize(unit)
|
4
|
+
super unit
|
5
|
+
end
|
6
|
+
|
7
|
+
def is_week_value?
|
8
|
+
return false
|
9
|
+
end
|
10
|
+
|
11
|
+
def is_conform_rule?(last_exec_time)
|
12
|
+
return true
|
13
|
+
end
|
14
|
+
|
15
|
+
def desc
|
16
|
+
super + "; default rule"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
class IntervalRule < Rule
|
3
|
+
|
4
|
+
attr_accessor :interval
|
5
|
+
|
6
|
+
def initialize(unit, interval)
|
7
|
+
super unit
|
8
|
+
@interval = interval
|
9
|
+
end
|
10
|
+
|
11
|
+
def is_week_value?
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
|
15
|
+
def is_conform_rule?(last_exec_time)
|
16
|
+
# interval rule is different for other rules. It should be calculated by combining the interval times of all units.
|
17
|
+
# So here returns false
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
|
21
|
+
def desc
|
22
|
+
super + "; interval: #{interval}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
class LoopRule < Rule
|
3
|
+
|
4
|
+
attr_accessor :count
|
5
|
+
|
6
|
+
def initialize(unit, count)
|
7
|
+
super unit
|
8
|
+
@count = count
|
9
|
+
end
|
10
|
+
|
11
|
+
def is_week_value?
|
12
|
+
return false
|
13
|
+
end
|
14
|
+
|
15
|
+
def is_conform_rule?(last_exec_time)
|
16
|
+
# loop rule is different for other rules. It should based on task loop file.
|
17
|
+
# So here returns false
|
18
|
+
return false
|
19
|
+
end
|
20
|
+
|
21
|
+
def desc
|
22
|
+
super + "; loop: #{count}"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
class Rule
|
3
|
+
|
4
|
+
UNIT = {
|
5
|
+
:unknown => 0,
|
6
|
+
:minute => 1, # support interval/specific syntax
|
7
|
+
:hour => 2, # support interval/scope/specific syntax
|
8
|
+
:day => 3, # support interval/scope/specific syntax
|
9
|
+
:month => 4, # support interval/scope/specific syntax
|
10
|
+
:year => 5, # support interval/scope/specific syntax
|
11
|
+
:loop => 7, # only support loop syntax
|
12
|
+
:date => 8, # only support date list syntax
|
13
|
+
:time => 9, # only support time list syntax
|
14
|
+
}
|
15
|
+
|
16
|
+
attr_accessor :unit
|
17
|
+
|
18
|
+
def initialize(unit = :unknown)
|
19
|
+
@unit = unit
|
20
|
+
end
|
21
|
+
|
22
|
+
def is_week_value?
|
23
|
+
raise NotImplementedError, 'subclass need implement this method!'
|
24
|
+
end
|
25
|
+
|
26
|
+
def is_conform_rule?(last_exec_time)
|
27
|
+
raise NotImplementedError, 'subclass need implement this method!'
|
28
|
+
end
|
29
|
+
|
30
|
+
def desc
|
31
|
+
"unit: #{unit.to_s}"
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
|
3
|
+
class ScopeRule < Rule
|
4
|
+
|
5
|
+
SCOPE = {
|
6
|
+
:before => 0,
|
7
|
+
:between => 1,
|
8
|
+
:after => 2,
|
9
|
+
}
|
10
|
+
|
11
|
+
attr_accessor :scope
|
12
|
+
|
13
|
+
def initialize(unit, scope)
|
14
|
+
super unit
|
15
|
+
@scope = scope
|
16
|
+
end
|
17
|
+
|
18
|
+
def desc
|
19
|
+
super + "; scope: #{scope.to_s}"
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
|
3
|
+
class SpecificRule < Rule
|
4
|
+
|
5
|
+
attr_accessor :value
|
6
|
+
|
7
|
+
def initialize(unit, value)
|
8
|
+
super unit
|
9
|
+
@value = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def value_value
|
13
|
+
if (Task::DAY.has_key?(@value))
|
14
|
+
return Task::DAY[@value]
|
15
|
+
end
|
16
|
+
if (Task::WEEK.has_key?(@value))
|
17
|
+
return Task::WEEK[@value]
|
18
|
+
end
|
19
|
+
if (Task::MONTH.has_key?(@value))
|
20
|
+
return Task::MONTH[@value]
|
21
|
+
end
|
22
|
+
|
23
|
+
unless @value != nil && @value.is_a?(Integer)
|
24
|
+
return -1
|
25
|
+
end
|
26
|
+
|
27
|
+
return @value
|
28
|
+
end
|
29
|
+
|
30
|
+
def is_week_value?
|
31
|
+
if @unit == :day && Task::WEEK.has_key?(@value)
|
32
|
+
return true
|
33
|
+
end
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
|
37
|
+
def is_conform_rule?(last_exec_time)
|
38
|
+
current = Time.now
|
39
|
+
value = value_value
|
40
|
+
result = false
|
41
|
+
case @unit
|
42
|
+
when :year then
|
43
|
+
result = current.year == value
|
44
|
+
when :month then
|
45
|
+
result = current.month == value
|
46
|
+
when :day then
|
47
|
+
if is_week_value?
|
48
|
+
result = current.wday == (value % TaskLoop::WEEK_BASE)
|
49
|
+
else
|
50
|
+
result = current.day == value
|
51
|
+
end
|
52
|
+
when :hour then
|
53
|
+
result = current.hour == value
|
54
|
+
when :minute then
|
55
|
+
result = current.min == value
|
56
|
+
end
|
57
|
+
return result
|
58
|
+
end
|
59
|
+
|
60
|
+
def desc
|
61
|
+
super + "; specific: #{value}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
module TaskLoop
|
2
|
+
class TimeListRule < Rule
|
3
|
+
|
4
|
+
require 'time'
|
5
|
+
|
6
|
+
attr_writer :times
|
7
|
+
|
8
|
+
def times
|
9
|
+
@times ||= []
|
10
|
+
end
|
11
|
+
|
12
|
+
def times_values
|
13
|
+
values = []
|
14
|
+
times.each do |time|
|
15
|
+
time_format = "%H:%M:%S"
|
16
|
+
time_object = Time.strptime(time, time_format)
|
17
|
+
values.push(time_object)
|
18
|
+
end
|
19
|
+
return values
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize(unit, times)
|
23
|
+
super unit
|
24
|
+
unless times != nil && times.length > 0
|
25
|
+
raise ArgumentError, "times arguments need at least one value."
|
26
|
+
end
|
27
|
+
|
28
|
+
@times = times
|
29
|
+
end
|
30
|
+
|
31
|
+
def is_week_value?
|
32
|
+
return false
|
33
|
+
end
|
34
|
+
|
35
|
+
def is_conform_rule?(last_exec_time)
|
36
|
+
current = Time.now
|
37
|
+
result = false
|
38
|
+
|
39
|
+
times_values.each do |time|
|
40
|
+
result = result || (time.hour == current.hour && time.min == current.min)
|
41
|
+
end
|
42
|
+
return result
|
43
|
+
end
|
44
|
+
|
45
|
+
def desc
|
46
|
+
super + "; time_list: #{times.join(', ')}"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|