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