Module: Workbook::Modules::TableDiffSort
- Included in:
- Table
- Defined in:
- lib/workbook/modules/table_diff_sort.rb
Overview
Adds diffing and sorting functions
Instance Method Summary (collapse)
-
- (Object) align(other, options = {:sort=>true,:ignore_headers=>false})
aligns itself with another table, used by diff.
-
- (Object) align_row(sself, sother, row_index)
for use in the align 'while' loop.
-
- (Workbook::Book) diff(other, options = {:sort=>true,:ignore_headers=>false})
create an overview of the differences between itself with another 'previous' table, returns a book with a single sheet and table (containing the diffs).
- - (Object) diff_template
- - (Boolean) insert_placeholder?(sother, sself, row_index)
-
- (Object) placeholder_row
returns a placeholder row, for internal use only.
Instance Method Details
- (Object) align(other, options = {:sort=>true,:ignore_headers=>false})
aligns itself with another table, used by diff
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
# File 'lib/workbook/modules/table_diff_sort.rb', line 79 def align other, ={:sort=>true,:ignore_headers=>false} = {:sort=>true,:ignore_headers=>false}.merge() iteration_cols = nil 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 iteration_rows = [sother.count,sself.count].max.times.collect 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 |
- (Object) align_row(sself, sother, row_index)
for use in the align 'while' loop
106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 |
# File 'lib/workbook/modules/table_diff_sort.rb', line 106 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 |
- (Workbook::Book) diff(other, options = {:sort=>true,:ignore_headers=>false})
create an overview of the differences between itself with another 'previous' table, returns a book with a single sheet and table (containing the diffs)
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 |
# File 'lib/workbook/modules/table_diff_sort.rb', line 9 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 |
- (Object) diff_template
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
# File 'lib/workbook/modules/table_diff_sort.rb', line 59 def diff_template return @diff_template if @diff_template diffbook = Workbook::Book.new difftable = diffbook.sheet.table template = diffbook.template f = template.create_or_find_format_by 'destroyed' f[:background_color]=:red f = template.create_or_find_format_by 'updated' f[:background_color]=:yellow f = template.create_or_find_format_by 'created' f[:background_color]=:lime f = template.create_or_find_format_by 'header' f[:rotation] = 72 f[:font_weight] = :bold f[:height] = 80 @diff_template = diffbook return difftable end |
- (Boolean) insert_placeholder?(sother, sself, row_index)
126 127 128 129 |
# File 'lib/workbook/modules/table_diff_sort.rb', line 126 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 |
- (Object) placeholder_row
returns a placeholder row, for internal use only
132 133 134 135 136 137 138 139 140 |
# File 'lib/workbook/modules/table_diff_sort.rb', line 132 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 |