class FlashFlow::Release::PdfDiffGenerator

Constants

NUM_COLUMNS
SPACE_BETWEEN

Public Instance Methods

generate(compare_data, filename, threshold, verbose=true) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 11
def generate(compare_data, filename, threshold, verbose=true)
  info = collect_comparison_info(compare_data, threshold)
  @orientation = :portrait
  Prawn::Document.generate(filename, page_layout: @orientation, margin: [10, 10, 10, 10]) do |pdf|
    set_dimensions(*pdf.bounds.top_right)
    generate_title_page(pdf)
    info.each do |comparison|
      add_comparison_to_pdf(pdf, comparison)
    end
    pdf.number_pages('<page> of <total>', { start_count_at: 1, align: :right, size: 12 })
    @num_pages = pdf.page_count
  end
  puts "Wrote #{@num_pages} pages to: #{filename}" if verbose
  filename
end

Private Instance Methods

add_comparison_to_pdf(pdf, comparison) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 82
def add_comparison_to_pdf(pdf, comparison)
  scale_factor = compute_scale_and_orientation(max_width(comparison), max_height(comparison))
  options = { vposition: :top, scale: scale_factor }

  pdf.start_new_page(layout: @orientation)
  place_image(pdf, comparison.dig('base-screenshot', :url), options, 1)
  place_image(pdf, comparison.dig('head-screenshot', :url), options, 2)
  place_image(pdf, comparison.dig('base-screenshot', :url), options, 3)
  place_image(pdf, comparison.dig('diff-image', :url), options, 3)
end
collect_comparison_info(compare_info, threshold=0.0) click to toggle source
#

Methods to traverse Percy output #

#
# File lib/flash_flow/release/pdf_diff_generator.rb, line 111
def collect_comparison_info(compare_info, threshold=0.0)
  compare_info['data']
      .select { |record| record['type'] == 'comparisons' }
      .map { |record| get_comparison_info(record, compare_info) }
      .select { |record| record&.dig('diff-ratio').to_f > threshold }
      .sort { |a, b| b['diff-ratio'] <=> a['diff-ratio'] }
end
compute_column_width(page_width) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 42
def compute_column_width(page_width)
  (page_width / NUM_COLUMNS) - (SPACE_BETWEEN * (NUM_COLUMNS - 1))
end
compute_scale_and_orientation(width, height) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 56
def compute_scale_and_orientation(width, height)
  scale_portrait = compute_scale_factor(@column_portrait, [@page_width, @page_height].max, width, height)
  scale_landscape = compute_scale_factor(@column_landscape, [@page_width, @page_height].min, width, height)
  if scale_portrait > scale_landscape
    @orientation = :portrait
    @column_width = @column_portrait
    scale_portrait
  else
    @orientation = :landscape
    @column_width = @column_landscape
    scale_landscape
  end
end
compute_scale_factor(column_width, page_height, width, height) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 50
def compute_scale_factor(column_width, page_height, width, height)
  x_scale_factor = column_width / width
  y_scale_factor = page_height / height
  [x_scale_factor, y_scale_factor].min
end
generate_title_page(pdf) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 46
def generate_title_page(pdf)
  pdf.text("Compliance Diffs Generated At: #{Time.now.to_s}")
end
get_comparison_info(record, data) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 119
def get_comparison_info(record, data)
  { id: record['id'] }.tap do |h|
    %w(head-screenshot base-screenshot diff-image).each do |attr|
      info = record.dig('relationships', attr, 'data')
      unless info.nil?
        attr_record = lookup_record(info['id'], info['type'], 'included', data)
        h[attr] = lookup_image_url(lookup_image_id(attr_record, attr), data)
        h['diff-ratio'] = record.dig('attributes', 'diff-ratio') if attr == 'diff-image'
      end
    end
  end
end
get_url_once(url) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 100
def get_url_once(url)
  @already_gotten_urls ||= {}
  @already_gotten_urls[url] ||= open(url)
end
lookup_comparison(id, data) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 149
def lookup_comparison(id, data)
  lookup_record(id, 'comparisons', 'data', data)
end
lookup_image(id, data) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 153
def lookup_image(id, data)
  lookup_record(id, 'images', 'included', data)
end
lookup_image_id(record, attr) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 132
def lookup_image_id(record, attr)
  if attr == 'diff-image'
    record['id']
  else
    record.dig('relationships', 'image', 'data', 'id')
  end
end
lookup_image_url(id, data) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 140
def lookup_image_url(id, data)
  record = lookup_image(id, data)
  unless record.nil?
    { url: record.dig('attributes', 'url'),
      width: record.dig('attributes', 'width'),
      height: record.dig('attributes', 'height') }
  end
end
lookup_record(id, kind, where, data) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 165
def lookup_record(id, kind, where, data)
  data[where].detect { |item| item['type'] == kind && item['id'] == id }
end
lookup_screenshot(id, data) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 157
def lookup_screenshot(id, data)
  lookup_record(id, 'screenshots', 'data', data)
end
lookup_snapshot(id, data) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 161
def lookup_snapshot(id, data)
  lookup_record(id, 'snapshots', 'data', data)
end
max_by(comparison, key) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 78
def max_by(comparison, key)
  [comparison['head-screenshot'][key], comparison['base-screenshot'][key], comparison['diff-image'][key]].max
end
max_height(comparison) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 74
def max_height(comparison)
  max_by(comparison, :height)
end
max_width(comparison) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 70
def max_width(comparison)
  max_by(comparison, :width)
end
place_image(pdf, url, options, column) click to toggle source
# File lib/flash_flow/release/pdf_diff_generator.rb, line 93
def place_image(pdf, url, options, column)
  pdf.float do
    options[:position] = (column - 1) * (@column_width + SPACE_BETWEEN)
    pdf.image(get_url_once(url), options)
  end
end
set_dimensions(width, height) click to toggle source
#

PDF Generation methods #

#
# File lib/flash_flow/release/pdf_diff_generator.rb, line 35
def set_dimensions(width, height)
  @page_width = width
  @page_height = height
  @column_landscape = compute_column_width([width, height].max)
  @column_portrait = compute_column_width([width, height].min)
end