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