Module: Workbook::Modules::TableDiffSort
- Included in:
- Table
- Defined in:
- lib/workbook/modules/diff_sort.rb
Overview
Adds diffing and sorting functions
Instance Method Summary collapse
-
#align(other, options = {:sort=>true,:ignore_headers=>false}) ⇒ Object
aligns itself with another table, used by diff.
-
#align_row(sself, sother, row_index) ⇒ Object
for use in the align ‘while’ loop.
-
#create_diff_cell(scell, ocell) ⇒ Workbook::Cell
creates a new cell describing the difference between two cells.
-
#diff(other, options = {}) ⇒ Workbook::Table
create an overview of the differences between itself with another ‘previous’ table, returns a book with a single sheet and table (containing the diffs).
-
#diff_template ⇒ Workbook::Table
Return template table to write the diff result in; in case non exists a default is generated.
-
#diff_template=(table) ⇒ Workbook::Table
Set the template table to write the diff result in; in case non exists a default is generated.
- #insert_placeholder?(sother, sself, row_index) ⇒ Boolean
-
#placeholder_row ⇒ Object
returns a placeholder row, for internal use only.
Instance Method Details
#align(other, options = {:sort=>true,:ignore_headers=>false}) ⇒ Object
aligns itself with another table, used by diff
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
# File 'lib/workbook/modules/diff_sort.rb', line 141 def align other, ={:sort=>true,:ignore_headers=>false} = {:sort=>true,:ignore_headers=>false}.merge() sother = other.clone.remove_empty_lines! sself = self.clone.remove_empty_lines! if [:ignore_headers] sother.header = false sself.header = false end sother = [:sort] ? Workbook::Table.new(sother.sort) : sother sself = [:sort] ? Workbook::Table.new(sself.sort) : sself row_index = 0 while row_index < [sother.count,sself.count].max and row_index < other.count+self.count do row_index = align_row(sself, sother, row_index) end {:self=>sself, :other=>sother} end |
#align_row(sself, sother, row_index) ⇒ Object
for use in the align ‘while’ loop
165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 |
# File 'lib/workbook/modules/diff_sort.rb', line 165 def align_row sself, sother, row_index asd = 0 if sself[row_index] and sother[row_index] asd = sself[row_index].key <=> sother[row_index].key elsif sself[row_index] asd = -1 elsif sother[row_index] asd = 1 end if asd == -1 and insert_placeholder?(sother, sself, row_index) sother.insert row_index, placeholder_row row_index -=1 elsif asd == 1 and insert_placeholder?(sother, sself, row_index) sself.insert row_index, placeholder_row row_index -=1 end row_index += 1 end |
#create_diff_cell(scell, ocell) ⇒ Workbook::Cell
creates a new cell describing the difference between two cells
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'lib/workbook/modules/diff_sort.rb', line 96 def create_diff_cell(scell, ocell) dcell = scell.nil? ? Workbook::Cell.new(nil) : scell if (scell == ocell) dcell.format = scell.format if scell elsif scell.nil? dcell = Workbook::Cell.new "(was: #{ocell.to_s})" dcell.format = diff_template.template.create_or_find_format_by 'destroyed' elsif ocell.nil? dcell = scell.clone fmt = scell.nil? ? :default : scell.format[:number_format] f = diff_template.template.create_or_find_format_by 'created', fmt f[:number_format] = scell.format[:number_format] dcell.format = f elsif scell != ocell dcell = Workbook::Cell.new "#{scell.to_s} (was: #{ocell.to_s})" f = diff_template.template.create_or_find_format_by 'updated' dcell.format = f end dcell end |
#diff(other, options = {}) ⇒ Workbook::Table
create an overview of the differences between itself with another ‘previous’ table, returns a book with a single sheet and table (containing the diffs)
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 87 88 89 90 91 |
# File 'lib/workbook/modules/diff_sort.rb', line 58 def diff other, ={} = {:sort=>true,:ignore_headers=>false}.merge() aligned = align(other, ) aself = aligned[:self] aother = aligned[:other] iteration_cols = [] if [:ignore_headers] iteration_cols = [aother.first.count,aself.first.count].max.times.collect else iteration_cols = (aother.header.to_symbols+aother.header.to_symbols).uniq end diff_table = diff_template maxri = (aself.count-1) for ri in 0..maxri do row = diff_table[ri] = Workbook::Row.new(nil, diff_table) srow = aself[ri] orow = aother[ri] iteration_cols.each_with_index do |ch, ci| scell = srow[ch] ocell = orow[ch] row[ci] = create_diff_cell(scell, ocell) end end if ![:ignore_headers] diff_table[0].format = diff_template.template.create_or_find_format_by 'header' end diff_table end |
#diff_template ⇒ Workbook::Table
Return template table to write the diff result in; in case non exists a default is generated.
121 122 123 124 125 126 |
# File 'lib/workbook/modules/diff_sort.rb', line 121 def diff_template return @diff_template if defined?(@diff_template) diffbook = Workbook::Book.new_diff_template difftable = diffbook.sheet.table @diff_template ||= difftable end |
#diff_template=(table) ⇒ Workbook::Table
Set the template table to write the diff result in; in case non exists a default is generated. Make sure that the following formats exists: destroyed, updated, created and header.
133 134 135 |
# File 'lib/workbook/modules/diff_sort.rb', line 133 def diff_template= table @diff_template= table end |
#insert_placeholder?(sother, sself, row_index) ⇒ Boolean
185 186 187 188 |
# File 'lib/workbook/modules/diff_sort.rb', line 185 def insert_placeholder? sother, sself, row_index (sother[row_index].nil? or !sother[row_index].placeholder?) and (sself[row_index].nil? or !sself[row_index].placeholder?) end |
#placeholder_row ⇒ Object
returns a placeholder row, for internal use only
191 192 193 194 195 196 197 198 199 |
# File 'lib/workbook/modules/diff_sort.rb', line 191 def placeholder_row if defined?(@placeholder_row) and !@placeholder_row.nil? return @placeholder_row else @placeholder_row = Workbook::Row.new [nil] placeholder_row.placeholder = true return @placeholder_row end end |