lib/capy.rb in capy-1.2.0 vs lib/capy.rb in capy-1.3.0

- old
+ new

@@ -4,40 +4,61 @@ require "colored" require 'capybara/dsl' module Capy class << self - attr_reader :opts + attr_reader :opts, :mode def run(args) - @opts = Slop.parse!(args, :help => true) do + @opts = Slop.parse!(args, :help => true, :strict => true) do banner "capy [script.capy]\n" on :b, :browser=, 'chrome, firefox', :default => 'chrome' + on :j, :js, 'eval script as javascript with -a option' + on :a, :'app-host=', 'app host' + on :s, :'stop', 'stop after eval script' end - exit if opts.help? + return 1 if opts.help? trap('INT') { exit } Capybara.register_driver :selenium do |app| Capybara::Selenium::Driver.new(app, :browser => opts[:browser].to_sym) end Capybara.current_driver = :selenium + Capybara.app_host = opts[:'app-host'] + @mode = opts.js? ? :javascript : :capybara + + evaluater = Evaluater.new + evaluater.visit (Capybara.app_host) if Capybara.app_host + if args.empty? - start_shell + start_shell evaluater else args.each do |script_file| - abort "No such file: #{script_file}".red unless File.exists?(script_file) + unless File.exists?(script_file) + puts "No such file: #{script_file}".red + return 1 + end puts "Running: #{script_file} ..." - eval_script script_file + evaluater.eval_script File.read(script_file), mode + start_shell evaluater if opts.stop? end end + + 0 + rescue Slop::InvalidOptionError => e + puts e.message.red + 1 + rescue => e + error e + 1 end EXIT_COMMANDS = %w(exit quit) - def start_shell(evaluater = Evaluater.new) + def start_shell(evaluater) return if @_start_shell @_start_shell = true Readline.completion_proc = lambda do |text| (Evaluater.instance_methods - Object.methods + EXIT_COMMANDS).grep(/^#{Regexp.quote(text.strip)}/) @@ -63,37 +84,48 @@ file.print(lines.join("\n")) end return else begin - result = evaluater.instance_eval(buf) + result = evaluater.eval_script(buf, mode) puts "=> #{result.inspect}".cyan rescue => e error e end end end @_start_shell = false end - def eval_script(script_file) - evaluater = Evaluater.new - evaluater.instance_eval(File.read(script_file), script_file, 1) - rescue => e - error e - end - private def error(e) - puts "#{e.backtrace[0]} #{e}".red + puts "#{e.backtrace[0]} #{e} (#{e.class})".red puts "\t#{e.backtrace[1..-1].join("\n\t")}".red end end class Evaluater include Capybara::DSL + + def eval_script(script, mode) + case mode + when :javascript + javascript script + else + capybara script + end + end + + def javascript(script) + page.evaluate_script script.sub(/\A#!.*\n/, '') + end + alias_method :js, :javascript + + def capybara(script) + instance_eval script + end def host(app_host) Capybara.app_host = app_host end