Class: Chop::Diff
- Inherits:
-
Struct
show all
- Defined in:
- lib/chop/diff.rb
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(selector = nil, table = nil, session = Capybara.current_session, block = nil, &other_block) ⇒ Diff
Returns a new instance of Diff.
26
27
28
29
30
31
32
33
|
# File 'lib/chop/diff.rb', line 26
def initialize selector = nil, table = nil, session = Capybara.current_session, block = nil, &other_block
super
self.selector ||= default_selector
self. = []
self.transformations = []
instance_eval &block if block.respond_to?(:call)
instance_eval &other_block if block_given?
end
|
Instance Attribute Details
#block ⇒ Object
Returns the value of attribute block
7
8
9
|
# File 'lib/chop/diff.rb', line 7
def block
@block
end
|
Returns the value of attribute header_transformations.
24
25
26
|
# File 'lib/chop/diff.rb', line 24
def
@header_transformations
end
|
#selector ⇒ Object
Returns the value of attribute selector
7
8
9
|
# File 'lib/chop/diff.rb', line 7
def selector
@selector
end
|
#session ⇒ Object
Returns the value of attribute session
7
8
9
|
# File 'lib/chop/diff.rb', line 7
def session
@session
end
|
#table ⇒ Object
Returns the value of attribute table
7
8
9
|
# File 'lib/chop/diff.rb', line 7
def table
@table
end
|
Returns the value of attribute transformations.
24
25
26
|
# File 'lib/chop/diff.rb', line 24
def transformations
@transformations
end
|
Class Method Details
.diff!(selector, table, session: Capybara.current_session, &block) ⇒ Object
8
9
10
|
# File 'lib/chop/diff.rb', line 8
def self.diff! selector, table, session: Capybara.current_session, &block
new(selector, table, session, block).diff!
end
|
Instance Method Details
#allow_not_found ⇒ Object
109
110
111
|
# File 'lib/chop/diff.rb', line 109
def allow_not_found
@allow_not_found = true
end
|
#cell_to_image_filename(cell) ⇒ Object
12
13
14
15
16
|
# File 'lib/chop/diff.rb', line 12
def cell_to_image_filename cell
cell.all("img").map do |img|
File.basename(img[:src] || "").split("?")[0].sub(/-[0-9a-f]{64}/, '')
end.first
end
|
#cells(&block) ⇒ Object
101
102
103
|
# File 'lib/chop/diff.rb', line 101
def cells &block
self.cells_finder = block
end
|
#diff!(cucumber_table = table) ⇒ Object
138
139
140
141
142
143
144
145
146
|
# File 'lib/chop/diff.rb', line 138
def diff! cucumber_table = table
actual = to_a
if !cucumber_table.raw.flatten.empty? && !actual.flatten.empty?
cucumber_table.diff! actual
elsif cucumber_table.raw.flatten != actual.flatten
raise Cucumber::MultilineArgument::DataTable::Different.new(cucumber_table)
end
end
|
#field(key) ⇒ Object
81
82
83
84
85
86
87
|
# File 'lib/chop/diff.rb', line 81
def field key
hash_transformation do |hashes|
hashes.map! do |row|
row.merge key => yield(row[key])
end
end
end
|
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/chop/diff.rb', line 65
def hash_transformation &block
transformation do |rows|
= rows[0]
keys = .to_a.map.with_index do |cell, index|
key = cell.text.parameterize.underscore
next key if key.present?
next cell.text if cell.text.present?
index + 1
end
body = rows[1..-1]
hashes = body.map { |row| HashWithIndifferentAccess[keys.zip(row)] }
yield hashes
[] + hashes.map(&:values)
end
end
|
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
# File 'lib/chop/diff.rb', line 39
def index=nil, &block
if index
do |row|
if index.is_a?(Symbol)
index = row.index do |cell|
text_finder.call(cell).parameterize.underscore.to_sym == index
end
end
row[index] = yield(row[index])
row
end
else
if block.arity.zero?
@new_header = yield
else
do |row|
yield(row)
end
end
end
end
|
35
36
37
|
# File 'lib/chop/diff.rb', line 35
def &block
<< block
end
|
#image(*keys) ⇒ Object
89
90
91
92
93
94
95
|
# File 'lib/chop/diff.rb', line 89
def image *keys
keys.each do |key|
field(key) do |cell|
cell_to_image_filename(cell)
end
end
end
|
#rows(&block) ⇒ Object
97
98
99
|
# File 'lib/chop/diff.rb', line 97
def rows &block
self.rows_finder = block
end
|
#text(&block) ⇒ Object
105
106
107
|
# File 'lib/chop/diff.rb', line 105
def text &block
self.text_finder = block
end
|
#to_a ⇒ Object
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
|
# File 'lib/chop/diff.rb', line 113
def to_a
rows = rows_finder.call(root).map { |row| cells_finder.call(row).to_a }
rows = normalize(rows)
= @new_header ? normalize([@new_header]).first : rows.shift || []
= .reduce() do |, transformation|
= transformation.call()
normalize([]).first
end
if
rows = [] + rows
rows = normalize(rows)
end
rows = transformations.reduce(rows) do |rows, transformation|
rows = transformation.call(rows)
normalize(rows)
end
rows.map do |row|
row.map { |cell| text_finder.call(cell) }
end
end
|
61
62
63
|
# File 'lib/chop/diff.rb', line 61
def transformation &block
transformations << block
end
|