-
Notifications
You must be signed in to change notification settings - Fork 0
/
to_field_value.rb
86 lines (80 loc) · 2.81 KB
/
to_field_value.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# frozen_string_literal: true
# rubocop:todo Layout/LineLength
module Kiba
module Extend
module Transforms
module Prepend
# Adds the specified value to the specified field
#
# If target field value is blank, it is left blank
#
# @example Treated as single value (default)
# # Used in pipeline as:
# # transform Prepend::ToFieldValue, field: :name, value: 'aka: '
#
# xform = Prepend::ToFieldValue.new(field: :name, value: 'aka: ')
# input = [
# {name: 'Weddy'},
# {name: 'Kernel|Zipper'},
# {name: nil},
# {name: ''}
# ]
# result = input.map{ |row| xform.process(row) }
# expected = [
# {name: 'aka: Weddy'},
# {name: 'aka: Kernel|Zipper'},
# {name: nil},
# {name: ''}
# ]
# expect(result).to eq(expected)
#
# @example Treated as multivalue
# # Used in pipeline as:
# # transform Prepend::ToFieldValue, field: :name, value: 'aka: ', multival: true, delim: '|'
#
# xform = Prepend::ToFieldValue.new(field: :name, value: 'aka: ', multival: true, delim: '|')
# input = [
# {name: 'Weddy'},
# {name: 'Kernel|Zipper'},
# {name: nil},
# {name: ''}
# ]
# result = input.map{ |row| xform.process(row) }
# expected = [
# {name: 'aka: Weddy'},
# {name: 'aka: Kernel|aka: Zipper'},
# {name: nil},
# {name: ''}
# ]
# expect(result).to eq(expected)
class ToFieldValue
# @note `mvdelim` argument is deprecated and replaced by `multival` and `delim`
# @param field [Symbol] The field to prepend to
# @param value [String] The value to be prepended
# @param multival [Boolean] Whether prepend to multiple values
# @param delim [String] for splitting value if `multival`
def initialize(field:, value:, multival: false,
delim: Kiba::Extend.delim)
@field = field
@value = value
@multival = multival
@delim = delim
end
# @param row [Hash{ Symbol => String, nil }]
def process(row)
fieldval = row.fetch(field, nil)
return row if fieldval.blank?
fieldvals = multival ? fieldval.split(delim) : [fieldval]
row[field] = fieldvals.map do |fieldval|
"#{value}#{fieldval}"
end.join(delim)
row
end
private
attr_reader :field, :value, :multival, :delim
end
end
end
end
end
# rubocop:enable Layout/LineLength