From b8a827dd2dae98d79629497ea6fb426f4a341043 Mon Sep 17 00:00:00 2001 From: John Bintz Date: Mon, 10 Sep 2012 13:25:11 -0400 Subject: [PATCH] add project mode --- hollandaise.rb | 9 +++++++ lib/hollandaise.rb | 29 ++++++++++++++++++++- lib/hollandaise/browser/base.rb | 11 ++++---- lib/hollandaise/browsers.rb | 28 +++++++++++++++----- lib/hollandaise/cli.rb | 32 +++++++++++++---------- lib/hollandaise/project.rb | 45 +++++++++++++++++++++++++++++++++ skel/hollandaise.rb.tt | 9 +++++++ 7 files changed, 136 insertions(+), 27 deletions(-) create mode 100644 hollandaise.rb create mode 100644 lib/hollandaise/project.rb create mode 100644 skel/hollandaise.rb.tt diff --git a/hollandaise.rb b/hollandaise.rb new file mode 100644 index 0000000..85a4fc5 --- /dev/null +++ b/hollandaise.rb @@ -0,0 +1,9 @@ +Hollandaise.project "cats" do |p| + p.root 'http://my.site/' + + p.screenshot 'Home', '/' + p.screenshot 'Archive', '/archive' + + p.browsers :chrome +end + diff --git a/lib/hollandaise.rb b/lib/hollandaise.rb index c8f09ca..4cb4208 100644 --- a/lib/hollandaise.rb +++ b/lib/hollandaise.rb @@ -1,14 +1,41 @@ require "hollandaise/version" require 'hollandaise/browsers' +require 'hollandaise/project' require 'hollandaise/browser' module Hollandaise class << self - attr_accessor :url, :browsers + attr_accessor :url, :browsers, :delay end def self.configure yield self end + + def self.project(name) + project = Project.new(name) + projects << project + + yield project + + project + end + + def self.dir + @dir ||= Pathname("screenshots") + end + + def self.chdir(name) + _odir = dir.clone + @dir = @dir.join(name) + + yield + + @dir = _odir + end + + def self.projects + @projects ||= [] + end end diff --git a/lib/hollandaise/browser/base.rb b/lib/hollandaise/browser/base.rb index 36cc230..1491b6f 100644 --- a/lib/hollandaise/browser/base.rb +++ b/lib/hollandaise/browser/base.rb @@ -3,16 +3,13 @@ module Hollandaise class Base attr_reader :browser - def run(url) + def run_and_take_screenshot(url) @url = url selenium.navigate.to url sleep @options[:delay].to_i selenium.execute_script %{window.resizeTo(1280, 1024)} - end - - def dir - @options[:dir] + take_screenshot end def take_screenshot @@ -26,6 +23,10 @@ module Hollandaise @selenium = nil end + + def dir + Hollandaise.dir + end end end end diff --git a/lib/hollandaise/browsers.rb b/lib/hollandaise/browsers.rb index 9222a84..5051786 100644 --- a/lib/hollandaise/browsers.rb +++ b/lib/hollandaise/browsers.rb @@ -1,11 +1,7 @@ module Hollandaise - module Browsers - def self.for(browsers, options) - browsers.collect { |browser| Hollandaise::Browser.for(self.send(browser), options) } - end - - def self.each(browsers, options, &block) - self.for(browsers, options).each(&block) + class Browsers + def self.for(browsers, options = {}) + new(browsers.flatten.collect { |browser| Hollandaise::Browser.for(self.send(browser), options) }) end def self.ie7 @@ -35,5 +31,23 @@ module Hollandaise def self.chrome [ :selenium, :chrome ] end + + def initialize(browsers) + @browsers = browsers + end + + def each(&block) + @browsers.each(&block) + end + + def run + @browsers.each do |browser| + begin + yield browser + ensure + browser.close + end + end + end end end diff --git a/lib/hollandaise/cli.rb b/lib/hollandaise/cli.rb index 08413ae..3b8977a 100644 --- a/lib/hollandaise/cli.rb +++ b/lib/hollandaise/cli.rb @@ -3,6 +3,21 @@ require 'pathname' module Hollandaise class CLI < Thor + include Thor::Actions + source_root File.expand_path('../../../skel', __FILE__) + + desc "cook", "Use the config file and take all the screenshots listed in there" + def cook + Hollandaise.projects.each(&:run) + end + + desc "project NAME", "Create a skeletal project file" + def project(name) + @name = name + + template 'hollandaise.rb.tt', 'hollandaise.rb' + end + desc "sauce URL BROWSER BROWSER...", "Take screenshots of a URL on Sauce Labs" method_options :delay => 0 def sauce(*browsers) @@ -16,15 +31,10 @@ module Hollandaise browsers = Hollandaise.browsers end - browser_objects = Hollandaise::Browsers.for(browsers, options.merge(:dir => dir)) + browser_objects = Hollandaise::Browsers.for(browsers, options) - browser_objects.each do |browser| - begin - browser.run(url) - browser.take_screenshot - ensure - browser.close - end + browser_objects.run do |browser| + browser.run_and_take_screenshot(url) end html = Arbre::Context.new do @@ -59,11 +69,5 @@ module Hollandaise end default_task :sauce - - no_tasks do - def dir - Pathname("screenshots") - end - end end end diff --git a/lib/hollandaise/project.rb b/lib/hollandaise/project.rb new file mode 100644 index 0000000..3b1f287 --- /dev/null +++ b/lib/hollandaise/project.rb @@ -0,0 +1,45 @@ +require 'uri' + +module Hollandaise + class Project + def initialize(project_name) + @project_name = project_name + end + + def root(root) + @root = URI(root) + end + + def screenshot(name, uri) + @screenshots ||= [] + + @screenshots << [ name, uri ] + end + + def browsers(*browsers) + @browsers = browsers + end + + def run + urls.each do |url, name| + Hollandaise.chdir "#{@project_name}/#{name}" do + browser_objects.run do |browser| + browser.run_and_take_screenshot(url) + end + end + end + end + + private + def urls + @screenshots.collect do |name, uri| + [ @root.merge(URI(uri)), name ] + end + end + + def browser_objects + @browser_objects ||= Hollandaise::Browsers.for(@browsers) + end + end +end + diff --git a/skel/hollandaise.rb.tt b/skel/hollandaise.rb.tt new file mode 100644 index 0000000..9e4f526 --- /dev/null +++ b/skel/hollandaise.rb.tt @@ -0,0 +1,9 @@ +Hollandaise.project "<%= @name %>" do |p| + p.root 'http://my.site/' + + p.screenshot 'Home', '/' + p.screenshot 'Archive', '/archive' + + p.browsers :chrome +end +