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.
-
#diff(other, options = {:sort=>true,:ignore_headers=>false}) ⇒ 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
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 |
# File 'lib/workbook/modules/diff_sort.rb', line 127 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
151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'lib/workbook/modules/diff_sort.rb', line 151 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 |
#diff(other, options = {:sort=>true,:ignore_headers=>false}) ⇒ 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)
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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/workbook/modules/diff_sort.rb', line 55 def diff other, ={:sort=>true,:ignore_headers=>false} 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] 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] 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 row[ci]=dcell 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.
107 108 109 110 111 112 |
# File 'lib/workbook/modules/diff_sort.rb', line 107 def diff_template return @diff_template if @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.
119 120 121 |
# File 'lib/workbook/modules/diff_sort.rb', line 119 def diff_template= table @diff_template= table end |
#insert_placeholder?(sother, sself, row_index) ⇒ Boolean
171 172 173 174 |
# File 'lib/workbook/modules/diff_sort.rb', line 171 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
177 178 179 180 181 182 183 184 185 |
# File 'lib/workbook/modules/diff_sort.rb', line 177 def placeholder_row if @placeholder_row != nil return @placeholder_row else @placeholder_row = Workbook::Row.new [nil] placeholder_row.placeholder = true return @placeholder_row end end |