Class: DeployPin::Task

Inherits:
Object
  • Object
show all
Extended by:
ParallelWrapper
Includes:
ParallelWrapper
Defined in:
lib/deploy_pin/task.rb

Constant Summary

Constants included from ParallelWrapper

ParallelWrapper::PARALLEL_PREFIX

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from ParallelWrapper

method_missing, respond_to_missing?

Constructor Details

#initialize(file) ⇒ Task

Returns a new instance of Task.



20
21
22
23
24
25
26
27
28
29
# File 'lib/deploy_pin/task.rb', line 20

def initialize(file)
  @file = file
  @identifier = nil
  @group = nil
  @title = ''
  @affected_areas = ''
  @script = ''
  @explicit_timeout = false
  @parallel = false
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class DeployPin::ParallelWrapper

Instance Attribute Details

#affected_areasObject (readonly)

Returns the value of attribute affected_areas.



9
10
11
# File 'lib/deploy_pin/task.rb', line 9

def affected_areas
  @affected_areas
end

#explicit_timeoutObject (readonly)

Returns the value of attribute explicit_timeout.



9
10
11
# File 'lib/deploy_pin/task.rb', line 9

def explicit_timeout
  @explicit_timeout
end

#fileObject (readonly)

Returns the value of attribute file.



9
10
11
# File 'lib/deploy_pin/task.rb', line 9

def file
  @file
end

#groupObject (readonly)

Returns the value of attribute group.



9
10
11
# File 'lib/deploy_pin/task.rb', line 9

def group
  @group
end

#identifierObject (readonly)

Returns the value of attribute identifier.



9
10
11
# File 'lib/deploy_pin/task.rb', line 9

def identifier
  @identifier
end

#recurringObject (readonly)

Returns the value of attribute recurring.



9
10
11
# File 'lib/deploy_pin/task.rb', line 9

def recurring
  @recurring
end

#scriptObject (readonly)

Returns the value of attribute script.



9
10
11
# File 'lib/deploy_pin/task.rb', line 9

def script
  @script
end

#titleObject (readonly)

Returns the value of attribute title.



9
10
11
# File 'lib/deploy_pin/task.rb', line 9

def title
  @title
end

Instance Method Details

#<=>(other) ⇒ Object

for sorting



131
132
133
# File 'lib/deploy_pin/task.rb', line 131

def <=>(other)
  sorting_key <=> other.sorting_key
end

#detailsObject



104
105
106
107
108
109
110
111
# File 'lib/deploy_pin/task.rb', line 104

def details
  {
    identifier:,
    group:,
    title:,
    affected_areas:
  }
end

#done?Boolean

Returns:

  • (Boolean)


65
66
67
68
69
70
# File 'lib/deploy_pin/task.rb', line 65

def done?
  return if recurring
  return unless record

  record.completed_at.present?
end

#each_line(&block) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/deploy_pin/task.rb', line 96

def each_line(&block)
  if file.starts_with?('# no_file_task')
    file.each_line(&block)
  else
    File.foreach(file, &block)
  end
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


113
114
115
116
# File 'lib/deploy_pin/task.rb', line 113

def eql?(other)
  # same script & different identifier
  script == other.script && identifier != other.identifier
end

#increment_progress!(incrementor) ⇒ Object

Raises:

  • (NotImplementedError)


53
54
55
56
57
# File 'lib/deploy_pin/task.rb', line 53

def increment_progress!(incrementor)
  raise NotImplementedError, 'Recurring tasks do not support progress yet.' if recurring

  record.increment!(:progress, incrementor)
end

#markObject



46
47
48
49
50
51
# File 'lib/deploy_pin/task.rb', line 46

def mark
  return if recurring

  # store record in the DB
  record.update(completed_at: Time.current)
end

#parseObject



76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/deploy_pin/task.rb', line 76

def parse
  each_line do |line|
    case line.strip
    when /\A# (-?\d+):(\w+):?(recurring)?/
      @identifier = Regexp.last_match(1).to_i
      @group = Regexp.last_match(2)
      @recurring = Regexp.last_match(3)
    when /\A# task_title:(.+)/
      @title = Regexp.last_match(1).strip
    when /\A# affected_areas:(.+)/
      @affected_areas = Regexp.last_match(1).strip
    when /\A[^#].*/
      @script += line

      @explicit_timeout = true if line =~ /Database.execute_with_timeout.*/
      @parallel = true if line =~ /[Pp]arallel.*/
    end
  end
end

#prepareObject



40
41
42
43
44
# File 'lib/deploy_pin/task.rb', line 40

def prepare
  return if recurring

  DeployPin::Record.create(uuid: identifier) unless record
end

#recordObject



36
37
38
# File 'lib/deploy_pin/task.rb', line 36

def record
  DeployPin::Record.find_by(uuid: identifier)
end

#runObject



31
32
33
34
# File 'lib/deploy_pin/task.rb', line 31

def run
  # eval script
  eval(script)
end

#save_progress!(value) ⇒ Object

Raises:

  • (NotImplementedError)


59
60
61
62
63
# File 'lib/deploy_pin/task.rb', line 59

def save_progress!(value)
  raise NotImplementedError, 'Recurring tasks do not support progress yet.' if recurring

  record.update(progress: value)
end

#sorting_keyObject



122
123
124
125
126
127
128
# File 'lib/deploy_pin/task.rb', line 122

def sorting_key
  if identifier.to_i.negative?
    [group_index, unreachable_future + identifier]
  else
    [group_index, identifier]
  end
end

#under_timeout?Boolean

Returns:

  • (Boolean)


72
73
74
# File 'lib/deploy_pin/task.rb', line 72

def under_timeout?
  !explicit_timeout? && !parallel?
end

#unreachable_futureObject



118
119
120
# File 'lib/deploy_pin/task.rb', line 118

def unreachable_future
  1.year.from_now.to_date.strftime('%Y%m%d%H%M%S').to_i
end