Created
April 3, 2013 19:46
-
-
Save niklas/5304603 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env ruby-1.9.3-p392@markup_snapshot | |
# Our pixel hero wants to know when we change the HTML layout. This script runs | |
# selected cucumber features in given branch/sha1 and makes snapshots in HTML | |
# and HAML, original and stripped. | |
# | |
# Prerequisites: | |
# you | |
# * have rails project | |
# * use cucumber with capybara | |
# * use git | |
# * use rvm & bundler | |
# * have bash in your path | |
# Setup: | |
# rvm use ruby-1.9.3-p392@markup_snapshot --create | |
require 'pathname' | |
require 'fileutils' | |
class MarkupSnapshot | |
Root = Pathname.pwd.join('tmp/markup_snapshots').expand_path | |
Cukes = [] | |
StepsPath = Root.join('snapshot_steps.rb') | |
class Cuke < Struct.new(:name, :content) | |
def initialize(*a) | |
super | |
name.gsub!(/\W/i,'_') | |
unless name =~ /\.feature$/ | |
self.name += '.feature' | |
end | |
end | |
end | |
def self.cuke(name, content) | |
Cukes << Cuke.new(name,content) | |
end | |
def self.run(*a) | |
new(*a).run | |
end | |
attr_reader :commit | |
def initialize(commit=nil) | |
@commit = commit | |
end | |
def run | |
#checkout | |
#bundle | |
#migrate | |
#run_cukes | |
#install_gems | |
dump_hamls | |
end | |
private | |
def install_gems | |
html2haml_version = '1.0.1' | |
sys %Q~gem list | grep html2haml | grep #{html2haml_version} || gem install html2haml --no-ri --no-rdoc -v #{html2haml_version}~ | |
nokogiri_version = '1.5.9' | |
sys %Q~gem list | grep nokogiri | grep #{nokogiri_version} || gem install nokogiri --no-ri --no-rdoc -v #{nokogiri_version}~ | |
end | |
def checkout | |
if commit | |
sys %Q~git checkout #{commit}~ | |
end | |
end | |
def bundle | |
sys_project %Q~bundle check || bundle install~ | |
end | |
def migrate | |
sys_project %Q~bundle exec rake db:drop db:create db:migrate RAILS_ENV=test~ | |
end | |
def root | |
Root.join commit ? commit : 'current' | |
end | |
def run_cukes | |
FileUtils.mkdir_p root | |
write_steps | |
write_cukes | |
cukes = Cukes.map { |cuke| Root.join(cuke.name) } | |
sys_project %Q~bundle exec cucumber -r features/ -r #{StepsPath} #{cukes.join(' ')}~ | |
end | |
# TODO run wget mirror to save all assets | |
def write_steps | |
File.open StepsPath, 'w' do |f| | |
f.puts <<-EOSTEPS | |
When /^I take a snapshot$/ do | |
require 'capybara/util/save_and_open_page' | |
@snapshot_index ||= 0 | |
@snapshot_index += 1 | |
Capybara.save_and_open_page_path = #{root.to_s.inspect} | |
Capybara.save_page(body, @snapshot_index.to_s + '.html') | |
end | |
EOSTEPS | |
end | |
end | |
def write_cukes | |
Cukes.each do |cuke| | |
File.open Root.join(cuke.name), 'w' do |f| | |
f.write cuke.content | |
end | |
end | |
end | |
def htmls | |
@htmls ||= [].tap do |files| | |
root.find do |html| | |
if html.fnmatch('*.html') | |
files << html | |
end | |
end | |
end | |
end | |
def dump_hamls | |
require 'nokogiri' | |
htmls.each do |html| | |
dump_haml(html) | |
stripped = html.sub(/.html$/, '.stripped.html') | |
File.open(stripped, 'w') { |f| f.print strip_text_from_html(File.read(html)) } | |
dump_haml(stripped) | |
end | |
end | |
def dump_haml(html) | |
haml = html.sub(/.html$/, '.haml') | |
sys 'html2haml', '--trace', html.to_s, haml.to_s | |
end | |
def strip_text_from_html(html) | |
Nokogiri::HTML.parse(html).tap do |doc| | |
doc.css('*').each do |node| | |
node[:alt] = nil if node[:alt] | |
if node.text? | |
node.remove | |
else | |
node.children.each do |child| | |
child.remove if child.text? | |
end | |
end | |
end | |
end.to_s | |
end | |
# runs the given command and tells the user about it | |
def sys(*a) | |
line = a.join(' ') | |
STDERR.puts " >>> #{line}" | |
system line | |
end | |
# runs the given command in the original rvm environment | |
def sys_project(*a) | |
line = a.join(' ') | |
STDERR.puts " >>> #{line}" | |
line = 'source .rvmrc && ' + line | |
system 'bash', '-l', '-c', line | |
end | |
end | |
MarkupSnapshot.cuke 'homepage', <<EOCUKE | |
Feature: Homepage | |
Scenario: empty | |
Given I am on the home page | |
Then I take a snapshot | |
EOCUKE | |
# Add more cukes here | |
MarkupSnapshot.run(ARGV.first) | |
# vim:filetype=ruby |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment