Class: Tengine::Job::Template::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/tengine/job/template/generator.rb

Constant Summary collapse

CLASS_MAP =
%w[RootJobnet Jobnet Start End Fork Join SshJob].each_with_object({}){|t, d|
  c = "Tengine::Job::Template::#{t}"
  d[c] = c.sub(/Template/, 'Runtime')
}.update({"Tengine::Job::Template::Expansion" => "Tengine::Job::Runtime::Jobnet"})
BASE_IGNORED_FIELD_NAMES =
["_type", "_id"].freeze
EXPANSION_IGNORED_FIELD_NAMES =
(BASE_IGNORED_FIELD_NAMES +
%w[dsl_version jobnet_type_cd version updated_at created_at children edges]).freeze

Instance Method Summary collapse

Instance Method Details

#execute(template, options = {}) ⇒ Object



6
7
8
9
# File 'lib/tengine/job/template/generator.rb', line 6

def execute(template, options = {})
  @inherited_attrs = {}
  process(template, options)
end

#expansion?Boolean



20
21
22
# File 'lib/tengine/job/template/generator.rb', line 20

def expansion?
  @current.is_a?(Tengine::Job::Template::Expansion)
end

#expansion_rootObject



24
25
26
27
# File 'lib/tengine/job/template/generator.rb', line 24

def expansion_root
  cond = {:dsl_version => @current.root.dsl_version, :name => @current.name}
  Tengine::Job::Template::RootJobnet.where(cond).first
end

#generate(options) {|result| ... } ⇒ Object

Yields:

  • (result)


88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/tengine/job/template/generator.rb', line 88

def generate(options)
  attrs = generating_attrs.update(child_index: options[:child_index], parent: options[:parent])
  @inherited_attrs.each{|key, value| attrs[key] ||= value }
  klass_name = CLASS_MAP[@current.class.name]
  result = klass_name.constantize.new(attrs)
  result.save!
  src_to_generated = {}
  generating_children.each.with_index do |child, index|
    generated = process(child, child_index: index + 1, parent: result)
    src_to_generated[child.id] = generated.id
    result.children << generated
  end
  generating_edges.each do |edge|
    generated = Tengine::Job::Runtime::Edge.new
    generated.origin_id = src_to_generated[edge.origin_id]
    generated.destination_id = src_to_generated[edge.destination_id]
    result.edges << generated
  end
  yield(result) if block_given? # 派生クラスでsave!の前に処理を入れるためのyield
  result.save!
  result
end

#generating_attrsObject



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/tengine/job/template/generator.rb', line 34

def generating_attrs
  field_names = @current.class.fields.keys - ignored_fields
  attrs = field_names.each_with_object({}){|name, d| d[name] = @current.send(name) }
  if expansion?
    attrs[:was_expansion] = true
    if (t = expansion_root)
      attrs[:template_id] = t.id
    end
  else
    if @current.is_a?(Tengine::Job::Template::Jobnet)
      attrs[:template_id] = @current.id
    end
  end
  attrs
end

#generating_childrenObject



50
51
52
53
# File 'lib/tengine/job/template/generator.rb', line 50

def generating_children
  expansion? ?
    expansion_root.children : @current.children
end

#generating_edgesObject



55
56
57
58
59
# File 'lib/tengine/job/template/generator.rb', line 55

def generating_edges
  expansion? ?
    expansion_root.edges :
    @current.respond_to?(:edges) ? @current.edges : []
end

#ignored_fieldsObject



29
30
31
32
# File 'lib/tengine/job/template/generator.rb', line 29

def ignored_fields
  expansion? ?
    EXPANSION_IGNORED_FIELD_NAMES : BASE_IGNORED_FIELD_NAMES
end

#merge_inherited_attrsObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/tengine/job/template/generator.rb', line 72

def merge_inherited_attrs
  source = @current.nil? ? nil : expansion? ? expansion_root : @current
  return {} if source.nil?
  result = @inherited_attrs.dup
  {
    server_name: source.actual_server_name,
    credential_name: source.actual_credential_name,
    killing_signals: source.actual_killing_signals,
    killing_signal_interval: source.actual_killing_signal_interval,
  }.each do |key, value|
    next if value.blank?
    result[key] = value # sourceからの値が有効なら上書きする
  end
  result
end

#process(template, options) ⇒ Object



61
62
63
64
65
66
67
68
69
70
# File 'lib/tengine/job/template/generator.rb', line 61

def process(template, options)
  @inherited_attrs, inherited_attrs_backup = merge_inherited_attrs, @inherited_attrs
  @current, current_backup = template, @current
  begin
    generate(options)
  ensure
    @current = current_backup
    @inherited_attrs = inherited_attrs_backup
  end
end