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

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, options={:sort=>true,:ignore_headers=>false}

  options = {:sort=>true,:ignore_headers=>false}.merge(options)

  sother = other.clone.remove_empty_lines!
  sself = self.clone.remove_empty_lines!

  if options[:ignore_headers]
    sother.header = false
    sself.header = false
  end

  sother = options[:sort] ? Workbook::Table.new(sother.sort) : sother
  sself = options[: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, options={:sort=>true,:ignore_headers=>false}

  aligned = align(other, options)
  aself = aligned[:self]
  aother = aligned[:other]
  iteration_cols = []
  if options[: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 !options[:ignore_headers]
    diff_table[0].format = diff_template.template.create_or_find_format_by 'header'
  end

  diff_table
end

#diff_templateWorkbook::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_rowObject

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