patriot-workflow-scheduler 0.6.2 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- OWI3MzFlYjlmYmEzYjBlNTdhNmEzZWJiMDQxMDFkN2FkMjQ3MzFlMA==
4
+ MjBkMGRiMGQ3ZGU1MTk0OThiN2VkNjBhYmU3YjA1YjVjMmQ4OGU1Mg==
5
5
  data.tar.gz: !binary |-
6
- NWI0ZDM4ZDVlNzg3OWM5MmI1ZWVhYjkzMWE4MDE0ZDBmNzRhMTkwOQ==
6
+ ODMwYTA4NWZhNzQ0MWY1M2ZkZDg0NjI4ZmIwYTA3ZTkzOGRlZTQyZg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NTRmYWYyOWMzNzJkZGRjOWY0N2VjYzhiNzEyYTkzNjMzYTBmMTA4OWEzNjM5
10
- Y2ZiNGI3MTQ3NDcyNTdmNjEwN2VmOGE1Mzk5NWQ3NjM1ZDEyYTJkNmYzNzU3
11
- NzMzNjc4ZjkyOTJjNzU1YjY0NTJhMGZjOTg2MDYyNDA5ZDE1M2Y=
9
+ YzRkMTVjOThmYTYzYTIxODEwMmNhODNjZGQ1YTBmYzBjYzVjNDhjODg0OTdj
10
+ NDBkZDZhOTkwNDFhYjM0ZjZlYjlkNzQ4ZWUzMDc1NmU4MWJjMWNkYzc5ZGE1
11
+ ZWIxNjU1MDJhYTE0MWI1YmQ2YTE3NjE4OTQ0NGFhNzNkZjk4MGU=
12
12
  data.tar.gz: !binary |-
13
- MDBjZjM1YzZlYmQ4NmJjNWM4NDg1ZWFlMTE4ZjQxNDNmOWQ0OGEyNGJjODQ0
14
- NzNiMWYwZDU2NTE3Njc3NzU1ZjE3Y2YzY2IzMTkxZTlhODIyNjA1YWQ3Mzk3
15
- NWVlMjk5YjM3MzRmZTVjNTMwNWFlNjY1MzRmOTQyZGQzNDM0ZDY=
13
+ ODdkZTM5YjliNWI5MDI3YmNkNzVlM2FkNzNkNzg4MDI5YTM0ZDYzNzJkZTc3
14
+ ODlkMDljNGE1YzA0MWVhNWM4MzAyOTExNDMzNGY1YWEyOGU5YzdhM2M1YTc1
15
+ M2UxYzMzMzM0NDM1ZjdjNWZkZGM4MmRkYzAxNTc0NTRkMmJlYTg=
@@ -19,8 +19,8 @@ module Patriot
19
19
  EXEC_HOST_ATTR = "exec_host"
20
20
  # attribute name for start time constraint
21
21
  START_DATETIME_ATTR = "start_datetime"
22
- # attribute name for the skip on fail marker
23
- SKIP_ON_FAIL_ATTR = "skip_on_fail"
22
+ # attribute name for retry configration
23
+ POST_PROCESSORS_ATTR = "post_processors"
24
24
 
25
25
  # a list of comman attributes
26
26
  COMMON_ATTRIBUTES = [
@@ -31,7 +31,7 @@ module Patriot
31
31
  EXEC_NODE_ATTR,
32
32
  EXEC_HOST_ATTR,
33
33
  START_DATETIME_ATTR,
34
- SKIP_ON_FAIL_ATTR
34
+ POST_PROCESSORS_ATTR
35
35
  ]
36
36
 
37
37
  # exit code of a command
@@ -40,8 +40,6 @@ module Patriot
40
40
  SUCCEEDED = 0
41
41
  # failed
42
42
  FAILED = 1
43
- # failed but skipped (marked skip_on_fail)
44
- FAILURE_SKIPPED = 2
45
43
  # skip (e.g., updated elsewhere)
46
44
  SKIPPED = -1
47
45
 
@@ -50,19 +48,30 @@ module Patriot
50
48
  def name_of(exit_code)
51
49
  exit_code = exit_code.to_i
52
50
  return case exit_code
53
- when 0 then "SUCCEEDED"
54
- when 1 then "FAILED"
55
- when 2 then "FAILURE_SKIPPED"
56
- when 4 then "FAILED" # for backward compatibility
57
- else raise "unknown exit_code #{exit_code}"
51
+ when SUCCEEDED then "SUCCEEDED"
52
+ when FAILED then "FAILED"
53
+ else exit_code.to_s # not nil for backward compatibility
58
54
  end
59
55
  end
60
56
  module_function :name_of
57
+
58
+ # @param code_name [Patriot::Command::ExitCode]
59
+ # @return [Fixnum] exit code of the code name
60
+ def value_of(code_name)
61
+ return code_name if code_name.is_a?(Fixnum)
62
+ return case code_name
63
+ when /SUCCEEDED/i then SUCCEEDED
64
+ when /FAILED/i then FAILED
65
+ else raise "unknown exit code name: #{code_name}"
66
+ end
67
+ end
68
+ module_function :value_of
61
69
  end
62
70
 
63
71
  require 'patriot/command/parser'
64
72
  require 'patriot/command/command_macro'
65
73
  require 'patriot/command/base'
74
+ require 'patriot/command/post_processor'
66
75
  require 'patriot/command/command_group'
67
76
  require 'patriot/command/composite'
68
77
  require 'patriot/command/sh_command'
@@ -13,10 +13,17 @@ module Patriot
13
13
  include Patriot::Command::CommandMacro
14
14
  end
15
15
 
16
- attr_accessor :parser, :test_mode, :target_datetime
16
+ attr_accessor :config, :parser, :test_mode, :target_datetime, :post_processors
17
+ attr_writer :start_datetime
17
18
 
18
19
  # comman attributes handled distinctively (only effective in top level commands)
19
- volatile_attr :requisites, :products, :priority, :start_after, :exec_date, :exec_node, :exec_host, :skip_on_fail
20
+ volatile_attr :requisites,
21
+ :products,
22
+ :priority,
23
+ :start_after,
24
+ :exec_date,
25
+ :exec_node,
26
+ :exec_host
20
27
 
21
28
  # @param config [Patriot::Util::Config::Base] configuration for this command
22
29
  def initialize(config)
@@ -82,11 +89,6 @@ module Patriot
82
89
  param 'state' => Patriot::JobStore::JobState::SUSPEND
83
90
  end
84
91
 
85
- # mark this job to skip in case of failures
86
- def skip_on_fail?
87
- return @skip_on_fail == 'true' || @skip_on_fail == true
88
- end
89
-
90
92
  # @return [String] the target month in '%Y-%m'
91
93
  def _month_
92
94
  return @target_datetime.strftime("%Y-%m")
@@ -109,14 +111,14 @@ module Patriot
109
111
 
110
112
  # start datetime of this command.
111
113
  # This command should be executed after the return value of this method
112
- # @return [DateTime]
114
+ # @return [Time]
113
115
  def start_date_time
114
116
  return nil if @exec_date.nil? && @start_after.nil?
115
117
  # set tomorrow as default
116
118
  date = (@exec_date || date_add(_date_, 1)).split("-").map(&:to_i)
117
119
  # set midnight as default
118
120
  time = (@start_after || "00:00:00").split(":").map(&:to_i)
119
- return DateTime.new(date[0], date[1], date[2], time[0], time[1], time[2])
121
+ return Time.new(date[0], date[1], date[2], time[0], time[1], time[2])
120
122
  end
121
123
 
122
124
  # update parameters with a given hash.
@@ -187,6 +189,13 @@ module Patriot
187
189
  raise "sub command is not supported"
188
190
  end
189
191
 
192
+ # add a post processor
193
+ # @param [Patriot::Command::PostProcessor::Base] a post processor for this job
194
+ def add_post_processor(post_processor)
195
+ @post_processors ||= []
196
+ @post_processors << post_processor
197
+ end
198
+
190
199
  # @return description of this command
191
200
  def description
192
201
  self.job_id
@@ -26,6 +26,7 @@ module Patriot
26
26
  return @subcommands.map{|cmd|
27
27
  cmd.require @requisites
28
28
  cmd.produce @products
29
+ cmd.post_processors = @post_processors + (cmd.post_processors || []) unless @post_processors.nil?
29
30
  cmd.build(@param)
30
31
  }.flatten
31
32
  end
@@ -18,7 +18,7 @@ module Patriot
18
18
  end
19
19
 
20
20
  # parse DSL by processing the DSL description as block
21
- # @param datetime [DateTime] the datetime for which the job works
21
+ # @param datetime [Time] the datetime for which the job works
22
22
  # @return a list of command defined in the DSL description
23
23
  def parse(datetime, blk)
24
24
  self.target_datetime = datetime
@@ -0,0 +1,14 @@
1
+ # the root name space for this scheduler
2
+ module Patriot
3
+ # a name space for commands
4
+ module Command
5
+ module PostProcessor
6
+ POST_PROCESSOR_CLASS_KEY = "POST_PROCESSOR_CLASS"
7
+ require 'patriot/command/post_processor/base'
8
+ require 'patriot/command/post_processor/skip_on_fail'
9
+ require 'patriot/command/post_processor/retrial'
10
+ require 'patriot/command/post_processor/mail_notification'
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,50 @@
1
+ module Patriot
2
+ module Command
3
+ module PostProcessor
4
+
5
+ # The base class of every post processor
6
+ class Base
7
+
8
+ # declare DSL method name for adding a post processor
9
+ # @param mth_name [String] the DSL method name
10
+ # @param parent_cls [Class<Patriot::Command::Base>] parent command in which the post porcessor is available
11
+ # @param processor_cls [Class<Patriot::Command::PostProcessor::Base] the class of the post processor
12
+ def self.declare_post_processor_name(mth_name, parent_cls=Patriot::Command::Base, processor_cls=self)
13
+ parent_cls.class_eval do
14
+ define_method(mth_name) do |processor_props = {}|
15
+ pp = processor_cls.new(processor_props)
16
+ add_post_processor(pp)
17
+ end
18
+ end
19
+ end
20
+
21
+ attr_accessor :props
22
+
23
+ # @param props [Hash] properties of this post processor
24
+ def initialize(props = {})
25
+ validate_props(props)
26
+ @props = props
27
+ end
28
+
29
+ def validate_props(props)
30
+ end
31
+
32
+ def process(cmd, worker, job_ticket)
33
+ case job_ticket.exit_code
34
+ when Patriot::Command::ExitCode::SUCCEEDED then process_success(cmd, worker, job_ticket)
35
+ when Patriot::Command::ExitCode::FAILED then process_failure(cmd, worker, job_ticket)
36
+ end
37
+ end
38
+
39
+ def process_success(cmd, worker, job_ticket)
40
+ end
41
+
42
+ def process_failure(cmd, worker, job_ticket)
43
+ end
44
+
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+
@@ -0,0 +1,59 @@
1
+ require 'mail'
2
+ module Patriot
3
+ module Command
4
+ module PostProcessor
5
+ class MailNotification < Patriot::Command::PostProcessor::Base
6
+
7
+ TO_PROP_KEY = 'to'
8
+ ON_PROP_KEY = 'on'
9
+
10
+ declare_post_processor_name :mail_notification
11
+
12
+ def validate_props(props)
13
+ raise "#{TO_PROP_KEY} is not specified" unless props.has_key?(TO_PROP_KEY)
14
+ raise "#{ON_PROP_KEY} is not specified" unless props.has_key?(ON_PROP_KEY)
15
+ end
16
+
17
+ def process(cmd, worker, job_ticket)
18
+ on = @props[ON_PROP_KEY]
19
+ on = [on] unless on.is_a?(Array)
20
+ on = on.map{|o| Patriot::Command::ExitCode.value_of(o)}
21
+ exit_code = job_ticket.exit_code
22
+ return unless on.include?(exit_code)
23
+ case exit_code
24
+ when Patriot::Command::ExitCode::SUCCEEDED then process_success(cmd, worker, job_ticket)
25
+ when Patriot::Command::ExitCode::FAILED then process_failure(cmd, worker, job_ticket)
26
+ end
27
+ end
28
+
29
+ def process_success(cmd, worker, job_ticket)
30
+ from = worker.config.get(Patriot::Util::Config::ADMIN_USER_KEY)
31
+ to = @props[TO_PROP_KEY]
32
+ subject = "#{job_ticket.job_id} has been successfully finished"
33
+ body = "#{job_ticket.job_id} has been successfully finished \n\n --- \n #{job_ticket.description}"
34
+ deliver(from, to, subject, body)
35
+ end
36
+
37
+ def process_failure(cmd, worker, job_ticket)
38
+ from = worker.config.get(Patriot::Util::Config::ADMIN_USER_KEY)
39
+ to = @props[TO_PROP_KEY]
40
+ subject = "#{job_ticket.job_id} has been failed"
41
+ body = "#{job_ticket.job_id} has been failed \n\n --- \n #{job_ticket.description}"
42
+ deliver(from, to, subject, body)
43
+ end
44
+
45
+ def deliver(from_addr, to_addr, msg_subj, msg_body)
46
+ Mail.deliver do
47
+ from from_addr
48
+ to to_addr
49
+ subject msg_subj
50
+ body msg_body
51
+ end
52
+ end
53
+
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+
@@ -0,0 +1,37 @@
1
+ module Patriot
2
+ module Command
3
+ module PostProcessor
4
+ class Retrial < Patriot::Command::PostProcessor::Base
5
+
6
+ COUNT_PROP_KEY = 'count'
7
+ INTERVAL_PROP_KEY = 'interval'
8
+
9
+ declare_post_processor_name :retrial
10
+
11
+ def validate_props(props)
12
+ raise "#{COUNT_PROP_KEY} is not specified" unless props.has_key?(COUNT_PROP_KEY)
13
+ raise "#{INTERVAL_PROP_KEY} is not specified" unless props.has_key?(INTERVAL_PROP_KEY)
14
+ end
15
+
16
+ def process_failure(cmd, worker, job_ticket)
17
+ found = false
18
+ cmd.post_processors.each do |pp|
19
+ next unless pp.is_a?(Patriot::Command::PostProcessor::Retrial)
20
+ raise "multiple retry processors in #{cmd.job_id}" if found
21
+ found = true
22
+ # count first attempt in
23
+ pp.props[COUNT_PROP_KEY] = pp.props[COUNT_PROP_KEY] - 1
24
+ return if pp.props[COUNT_PROP_KEY] == 0
25
+ cmd.start_datetime = Time.now + pp.props[INTERVAL_PROP_KEY]
26
+ end
27
+ job = cmd.to_job
28
+ job[Patriot::Command::STATE_ATTR] = Patriot::JobStore::JobState::WAIT
29
+ worker.job_store.register(Time.now.to_i, [job])
30
+ end
31
+
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+
@@ -0,0 +1,18 @@
1
+ module Patriot
2
+ module Command
3
+ module PostProcessor
4
+
5
+ class SkipOnFail < Patriot::Command::PostProcessor::Base
6
+
7
+ declare_post_processor_name :skip_on_fail
8
+
9
+ def process_failure(cmd, worker, job_ticket)
10
+ worker.job_store.set_state(Time.now.to_i, [cmd.job_id], Patriot::JobStore::JobState::SUCCEEDED)
11
+ end
12
+
13
+ end
14
+ end
15
+ end
16
+ end
17
+
18
+
@@ -10,7 +10,7 @@ module Patriot
10
10
  command_attr :commands do |cmd, a, v|
11
11
  cmd.commands = v.is_a?(Array)? v : [v]
12
12
  end
13
- volatile_attr :name, :name_suffix
13
+ command_attr :name, :name_suffix
14
14
  validate_existence :name
15
15
 
16
16
  # @see Patriot::Command::Base#job_id
@@ -40,9 +40,8 @@ module Patriot
40
40
  # mapping from exit code to job state
41
41
  # @see Patriot::Command::ExitCode
42
42
  EXIT_CODE_TO_STATE = {
43
- Patriot::Command::ExitCode::SUCCEEDED => Patriot::JobStore::JobState::SUCCEEDED,
44
- Patriot::Command::ExitCode::FAILURE_SKIPPED => Patriot::JobStore::JobState::SUCCEEDED,
45
- Patriot::Command::ExitCode::FAILED => Patriot::JobStore::JobState::FAILED
43
+ Patriot::Command::ExitCode::SUCCEEDED => Patriot::JobStore::JobState::SUCCEEDED,
44
+ Patriot::Command::ExitCode::FAILED => Patriot::JobStore::JobState::FAILED
46
45
  }
47
46
 
48
47
  # a prefix for configuration key
@@ -43,7 +43,7 @@ module Patriot
43
43
  def read_command(command)
44
44
  Patriot::Command::COMMON_ATTRIBUTES.each do |attr|
45
45
  value = command.instance_variable_get("@#{attr}".to_sym)
46
- self[attr] = value unless value.nil?
46
+ self[attr] = _to_stdobj(value) unless value.nil?
47
47
  end
48
48
  _to_stdobj(command).each{|k,v| self[k] = v}
49
49
  end
@@ -60,6 +60,13 @@ module Patriot
60
60
  hash[attr.to_s] = _to_stdobj(value) unless value.nil?
61
61
  end
62
62
  return hash
63
+ elsif obj.is_a?(Patriot::Command::PostProcessor::Base)
64
+ hash = {}
65
+ hash[Patriot::Command::PostProcessor::POST_PROCESSOR_CLASS_KEY] = obj.class.to_s.gsub(/::/, '.')
66
+ obj.props.each do |k,v|
67
+ hash[k.to_s] = _to_stdobj(v) unless v.nil?
68
+ end
69
+ return hash
63
70
  elsif obj.is_a?(Hash)
64
71
  hash = {}
65
72
  obj.each{|k,v| hash[k.to_s] = _to_stdobj(v)}
@@ -94,6 +101,10 @@ module Patriot
94
101
  cmd.instance_variable_set("@#{k}".to_sym, _from_stdobj(v, config))
95
102
  end
96
103
  return cmd
104
+ elsif obj.has_key?(Patriot::Command::PostProcessor::POST_PROCESSOR_CLASS_KEY)
105
+ cmd_cls = obj.delete(Patriot::Command::PostProcessor::POST_PROCESSOR_CLASS_KEY)
106
+ cmd_cls = cmd_cls.split('.').inject(Object){|c,name| c.const_get(name)}
107
+ return cmd_cls.new(obj)
97
108
  else
98
109
  hash = {}
99
110
  obj.each{|k,v| hash[k] = _from_stdobj(v, config)}
@@ -48,7 +48,9 @@ module Patriot
48
48
  # @return an array of commands
49
49
  def parse(date, files, options = {}, &blk)
50
50
  return if files.empty?
51
- datetime = DateTime.parse(date)
51
+ ds = date.split('-')
52
+ raise "illegal format of date #{date}" unless ds.size == 3
53
+ datetime = Time.new(ds[0], ds[1], ds[2])
52
54
  # for backward compatibility to be removed
53
55
  $dt = date
54
56
  $month = date.split('-').values_at(0,1).join('-')
@@ -17,6 +17,8 @@ module Patriot
17
17
  PLUGIN_LIB_DIR = 'lib'
18
18
  # plugin initiation script
19
19
  PLUGIN_INIT_SCRIPT = 'init.rb'
20
+ # admin user mail address
21
+ ADMIN_USER_KEY = 'admin_user'
20
22
 
21
23
  # load configuration file
22
24
  # @param option [Hash]
@@ -21,14 +21,16 @@ module Patriot
21
21
  # the list of minutes
22
22
  MINUTES = 0.upto(59).to_a
23
23
 
24
+ DAY_IN_SECOND = 60 * 60 * 24
25
+
24
26
  # expand a given date to the array of time which should be executed in case of a given cron field
25
- # @param date [DateTime] target datetime
27
+ # @param date [Time] target datetime
26
28
  # @param cron_field [String] interval in cron format
27
- # @return [Array<DateTime>] a list of datetime which match the cron format
29
+ # @return [Array<Time>] a list of datetime which match the cron format
28
30
  def expand_on_date(date, cron_field = nil)
29
31
  cron_field = DEFAULT_CRON_FIELD if cron_field.nil? || cron_field.empty?
30
32
  if cron_field == END_OF_EVERY_MONTH
31
- return date.next.day == 1 ? [date] : []
33
+ return (date + DAY_IN_SECOND).day == 1 ? [date] : []
32
34
  end
33
35
  field_splits = cron_field.split
34
36
  raise "illegal cron field format #{cron_field}" unless field_splits.size == 5
@@ -36,13 +38,13 @@ module Patriot
36
38
  return [] unless is_target_day?(date, day, month, week)
37
39
  return target_hours(hour).map do |h|
38
40
  target_minutes(minute).map do |m|
39
- DateTime.new(date.year, date.month, date.day, h, m, 0)
41
+ Time.new(date.year, date.month, date.day, h, m, 0)
40
42
  end
41
43
  end.flatten
42
44
  end
43
45
 
44
46
  # check a given date is a target or not
45
- # @param date [DateTime] a datetime to be checked
47
+ # @param date [Time] a datetime to be checked
46
48
  # @param day [String] day field in cron format
47
49
  # @param month [String] month field in cron format
48
50
  # @param week [String] week field in cron format
@@ -35,7 +35,7 @@ module Patriot
35
35
  min = min%60
36
36
  hour = hour%24
37
37
 
38
- new_dt = DateTime.new(year, month, day, hour, min,sec)
38
+ new_dt = DateTime.new(year, month, day, hour, min, sec)
39
39
  new_dt = new_dt >> diff[:month]
40
40
  new_dt = new_dt + diff[:day]
41
41
  return new_dt.strftime(fmt)
@@ -12,7 +12,7 @@ module Patriot
12
12
  include Patriot::Util::Retry
13
13
  include Patriot::JobStore::Factory
14
14
 
15
- attr_accessor :host, :status, :cycle, :job_store
15
+ attr_accessor :host, :status, :cycle, :job_store, :config
16
16
 
17
17
  # @param config [Patriot::Util::Config::Base]
18
18
  def initialize(config)
@@ -47,7 +47,7 @@ module Patriot
47
47
  @logger.info " executing job: #{job_ticket.job_id}"
48
48
  command = response[:command]
49
49
  job_ticket.execution_id = response[:execution_id]
50
- job_ticket.exit_code = command.skip_on_fail? ? Patriot::Command::ExitCode::FAILURE_SKIPPED : Patriot::Command::ExitCode::FAILED
50
+ job_ticket.exit_code = Patriot::Command::ExitCode::FAILED
51
51
  begin
52
52
  command.execute
53
53
  job_ticket.exit_code = Patriot::Command::ExitCode::SUCCEEDED
@@ -62,6 +62,17 @@ module Patriot
62
62
  rescue Exception => job_store_error
63
63
  @logger.error job_store_error
64
64
  end
65
+ unless command.post_processors.nil?
66
+ command.post_processors.each do |pp|
67
+ begin
68
+ @logger.info "executing post process by #{pp}"
69
+ pp.process(command, self, job_ticket)
70
+ rescue Exception => post_process_error
71
+ @logger.error "post process by #{pp} failed"
72
+ @logger.error post_process_error
73
+ end
74
+ end
75
+ end
65
76
  end
66
77
  return job_ticket.exit_code
67
78
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: patriot-workflow-scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.2
4
+ version: 0.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Teruyoshi Zenmyo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-07-31 00:00:00.000000000 Z
11
+ date: 2015-08-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -122,6 +122,20 @@ dependencies:
122
122
  - - ~>
123
123
  - !ruby/object:Gem::Version
124
124
  version: '1.4'
125
+ - !ruby/object:Gem::Dependency
126
+ name: mail
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ~>
130
+ - !ruby/object:Gem::Version
131
+ version: '2.6'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ~>
137
+ - !ruby/object:Gem::Version
138
+ version: '2.6'
125
139
  - !ruby/object:Gem::Dependency
126
140
  name: tilt
127
141
  requirement: !ruby/object:Gem::Requirement
@@ -153,6 +167,11 @@ files:
153
167
  - lib/patriot/command/command_macro.rb
154
168
  - lib/patriot/command/composite.rb
155
169
  - lib/patriot/command/parser.rb
170
+ - lib/patriot/command/post_processor.rb
171
+ - lib/patriot/command/post_processor/base.rb
172
+ - lib/patriot/command/post_processor/mail_notification.rb
173
+ - lib/patriot/command/post_processor/retrial.rb
174
+ - lib/patriot/command/post_processor/skip_on_fail.rb
156
175
  - lib/patriot/command/sh_command.rb
157
176
  - lib/patriot/controller.rb
158
177
  - lib/patriot/controller/package_controller.rb