lib/capy.rb in capy-1.0.0 vs lib/capy.rb in capy-1.1.0

- old
+ new

@@ -1,5 +1,6 @@ +require 'readline' require "capy/version" require "slop" require "colored" require 'capybara/dsl' @@ -7,16 +8,19 @@ class << self attr_reader :opts def run(args) @opts = Slop.parse!(args, :help => true) do - banner "capy foo.capy\n" + banner "capy [script.capy]\n" + on :b, :browser=, 'chrome, firefox', :default => 'chrome' on :n, :nonstop end exit if opts.help? - Capybara.register_driver(:selenium) { |app| Capybara::Selenium::Driver.new(app, :browser => :chrome) } + Capybara.register_driver :selenium do |app| + Capybara::Selenium::Driver.new(app, :browser => opts[:browser].to_sym) + end Capybara.current_driver = :selenium if args.empty? start_shell else @@ -26,20 +30,38 @@ eval_script script_file end end end - def start_shell - require 'readline' + def start_shell(evaluater = Evaluater.new) + exit_commands = %w(exit quit) + Readline.completion_proc = lambda do |text| - (Capybara::DSL.instance_methods + [:exit]).grep /^#{Regexp.quote(text.strip)}/ + (Capybara::DSL.instance_methods + exit_commands).grep(/^#{Regexp.quote(text.strip)}/) end - evaluater = Evaluater.new + + history_file = File.expand_path('~/.capy_history') + if File.exists?(history_file) + File.read(history_file, :encoding => "BINARY"). + encode!(:invalid => :replace, :undef => :replace). + split(/\n/). + each { |line| Readline::HISTORY << line } + end + puts 'Type `exit` to exit' + while buf = Readline.readline('> ', true) + unless Readline::HISTORY.count == 1 + Readline::HISTORY.pop if buf.empty? || Readline::HISTORY[-1] == Readline::HISTORY[-2] + end + case buf.strip - when 'exit' + when *exit_commands + File.open(history_file, 'w') do |file| + lines = Readline::HISTORY.to_a[([Readline::HISTORY.size - 1000, 0].max)..-1] + file.print(lines.join("\n")) + end exit else begin result = evaluater.instance_eval(buf) puts "=> #{result.inspect}".cyan @@ -49,18 +71,16 @@ end end end def eval_script(script_file) - Evaluater.new.instance_eval(<<-SCRIPT, script_file, 1) - #{File.read(script_file)} - SCRIPT + evaluater = Evaluater.new + evaluater.instance_eval(File.read(script_file), script_file, 1) rescue => e error e ensure unless opts.nonstop? - print 'Press Enter to exit: '.bold - gets + start_shell(evaluater) end end private