Class: Ticket::Replicator::RowTransformer

Inherits:
Object
  • Object
show all
Defined in:
lib/ticket/replicator/row_transformer.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(extracted_row, mappings) ⇒ RowTransformer



19
20
21
22
# File 'lib/ticket/replicator/row_transformer.rb', line 19

def initialize(extracted_row, mappings)
  @extracted_row = extracted_row
  @mappings = mappings.to_h
end

Instance Attribute Details

#extracted_rowObject (readonly)

Returns the value of attribute extracted_row.



17
18
19
# File 'lib/ticket/replicator/row_transformer.rb', line 17

def extracted_row
  @extracted_row
end

#mappingsObject (readonly)

Returns the value of attribute mappings.



17
18
19
# File 'lib/ticket/replicator/row_transformer.rb', line 17

def mappings
  @mappings
end

Class Method Details

.fields_to_remapObject



98
99
100
# File 'lib/ticket/replicator/row_transformer.rb', line 98

def self.fields_to_remap
  i[ID Status Resolution Priority Summary]
end

.fields_to_transformObject



94
95
96
# File 'lib/ticket/replicator/row_transformer.rb', line 94

def self.fields_to_transform
  fields_to_remap + ["Source Ticket URL"]
end

.run_on(extracted_row, mappings) ⇒ Object



11
12
13
# File 'lib/ticket/replicator/row_transformer.rb', line 11

def self.run_on(extracted_row, mappings)
  new(extracted_row, mappings).run
end

Instance Method Details

#extracted_field_mappingObject



139
140
141
# File 'lib/ticket/replicator/row_transformer.rb', line 139

def extracted_field_mapping
  @extracted_field_mapping ||= mapping_for :field
end

#extracted_field_mapping_for(field) ⇒ Object



127
128
129
130
131
132
133
# File 'lib/ticket/replicator/row_transformer.rb', line 127

def extracted_field_mapping_for(field)
  original_field = extracted_field_mapping.fetch(remapped_field_key(field)) do |key|
    raise "No mapping found for #{key.inspect} in #{extracted_field_mapping.inspect}"
  end

  remapped_field_key(original_field)
end

#fields_to_remapObject



90
91
92
# File 'lib/ticket/replicator/row_transformer.rb', line 90

def fields_to_remap
  self.class.fields_to_remap
end

#fields_to_transformObject



86
87
88
# File 'lib/ticket/replicator/row_transformer.rb', line 86

def fields_to_transform
  self.class.fields_to_transform
end

#mapped_value_for(field, extracted_value = remapped_field_extracted_value_for(field)) ⇒ Object



102
103
104
105
106
107
108
109
110
111
112
# File 'lib/ticket/replicator/row_transformer.rb', line 102

def mapped_value_for(field, extracted_value = remapped_field_extracted_value_for(field))
  mapping_for(field).fetch(extracted_value) do |key|
    case mapping_for(field)["defaults_to"]
    when "keep_original_value" then extracted_value
    when "unset_value" then nil
    when "blank_value" then ""
    else
      raise "No mapping found for #{field.inspect} = #{key.inspect} in #{mapping_for(field).inspect}"
    end
  end
end

#remapped_field_extracted_rowObject



120
121
122
123
124
125
# File 'lib/ticket/replicator/row_transformer.rb', line 120

def remapped_field_extracted_row
  @remapped_field_extracted_row ||= fields_to_remap.to_h do |field|
    mapped_field_key = remapped_field_key(field)
    [mapped_field_key, extracted_row_value_for(mapped_field_key)]
  end
end

#remapped_field_extracted_value_for(field) ⇒ Object



114
115
116
117
118
# File 'lib/ticket/replicator/row_transformer.rb', line 114

def remapped_field_extracted_value_for(field)
  remapped_field_extracted_row.fetch(remapped_field_key(field)) do |key|
    raise "No value found for #{key.inspect} in #{remapped_field_extracted_row.inspect}"
  end
end

#remapped_field_key(field) ⇒ Object



135
136
137
# File 'lib/ticket/replicator/row_transformer.rb', line 135

def remapped_field_key(field)
  field.to_s.downcase
end

#runObject



24
25
26
# File 'lib/ticket/replicator/row_transformer.rb', line 24

def run
  fields_to_transform.collect { |field| send("transformed_#{field.to_s.parameterize.underscore}") }
end

#source_ticket_url_builder(source_ticket_id) ⇒ Object



57
58
59
# File 'lib/ticket/replicator/row_transformer.rb', line 57

def source_ticket_url_builder(source_ticket_id)
  ERB.new(ticket_replicator_source_ticket_url).result(binding)
end

#ticket_replicator_source_ticket_urlObject



61
62
63
# File 'lib/ticket/replicator/row_transformer.rb', line 61

def ticket_replicator_source_ticket_url
  ENV.fetch("TICKET_REPLICATOR_SOURCE_TICKET_URL") { |name| raise "#{name}: not set in environment!" }
end

#transformed_idObject



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/ticket/replicator/row_transformer.rb', line 28

def transformed_id
  remapped_id = remapped_field_extracted_value_for :id

  return remapped_id unless id_extraction_regex

  match_data = id_extraction_regex.match(remapped_id)

  return match_data[:id] if match_data

  raise FileTransformer::TransformError,
        "No match found for :id in #{remapped_id.inspect} using #{id_extraction_regex.inspect}"
end

#transformed_priorityObject



73
74
75
# File 'lib/ticket/replicator/row_transformer.rb', line 73

def transformed_priority
  mapped_value_for :priority
end

#transformed_resolutionObject



69
70
71
# File 'lib/ticket/replicator/row_transformer.rb', line 69

def transformed_resolution
  mapped_value_for :resolution, remapped_field_extracted_value_for(:status)
end

#transformed_source_ticket_urlObject



53
54
55
# File 'lib/ticket/replicator/row_transformer.rb', line 53

def transformed_source_ticket_url
  source_ticket_url_builder(transformed_id)
end

#transformed_statusObject



65
66
67
# File 'lib/ticket/replicator/row_transformer.rb', line 65

def transformed_status
  mapped_value_for :status
end

#transformed_summaryObject



81
82
83
84
# File 'lib/ticket/replicator/row_transformer.rb', line 81

def transformed_summary
  ReplicatedSummary.build(transformed_id,
                          remapped_field_extracted_value_for(:summary)).to_s
end

#transformed_teamObject



77
78
79
# File 'lib/ticket/replicator/row_transformer.rb', line 77

def transformed_team
  mapped_value_for :team
end