lib/imap/backup/configuration/account.rb in imap-backup-1.0.5 vs lib/imap/backup/configuration/account.rb in imap-backup-1.0.6

- old
+ new

@@ -1,84 +1,138 @@ # encoding: utf-8 -module Imap - module Backup - module Configuration - class Account - def initialize(store, account) - @store, @account = store, account +module Imap::Backup::Configuration + class Account < Struct.new(:store, :account, :highline) + def run + catch :done do + loop do + system('clear') + create_menu end + end + end - def run - loop do - system('clear') - Setup.highline.choose do |menu| - password = - if @account[:password] == '' - '(unset)' - else - @account[:password].gsub(/./, 'x') - end - menu.header = <<EOT + private + + def create_menu + highline.choose do |menu| + header menu + modify_email menu + modify_password menu + modify_server menu + modify_backup_path menu + choose_folders menu + test_connection menu + delete_account menu + menu.choice('return to main menu') { throw :done } + menu.hidden('quit') { throw :done } + end + end + + def header(menu) + menu.header = <<-EOT Account: - email: #{@account[:username]} - path: #{@account[:local_path]} - folders: #{@account[:folders].map { |f| f[:name] }.join(', ')} - password: #{password} -EOT - menu.choice('modify email') do - username = Asker.email(username) - others = @store.data[:accounts].select { |a| a != @account}.map { |a| a[:username] } - if others.include?(username) - puts 'There is already an account set up with that email address' - else - @account[:username] = username - end - end - menu.choice('modify password') do - password = Asker.password - if ! password.nil? - @account[:password] = password - end - end - menu.choice('modify backup path') do - validator = lambda do |p| - same = @store.data[:accounts].find do |a| - a[:username] != @account[:username] && a[:local_path] == p - end - if same - puts "The path '#{p}' is used to backup the account '#{same[:username]}'" - false - else - true - end - end - @account[:local_path] = Asker.backup_path(@account[:local_path], validator) - end - menu.choice('choose backup folders') do - FolderChooser.new(@account).run - end - menu.choice 'test authentication' do - result = ConnectionTester.test(@account) - puts result - Setup.highline.ask 'Press a key ' - end - menu.choice(:delete) do - if Setup.highline.agree("Are you sure? (y/n) ") - @store.data[:accounts].reject! { |a| a[:username] == @account[:username] } - return - end - end - menu.choice('return to main menu') do - return - end - menu.hidden('quit') do - return - end - end + email: #{account[:username]} + server: #{account[:server]} + path: #{account[:local_path]} + folders: #{folders.map { |f| f[:name] }.join(', ')} + password: #{masked_password} + EOT + end + + def modify_email(menu) + menu.choice('modify email') do + username = Asker.email(username) + puts "username: #{username}" + others = store.data[:accounts].select { |a| a != account}.map { |a| a[:username] } + puts "others: #{others.inspect}" + if others.include?(username) + puts 'There is already an account set up with that email address' + else + account[:username] = username + if account[:server].nil? or account[:server] == '' + account[:server] = default_server(username) end end end end + + def modify_password(menu) + menu.choice('modify password') do + password = Asker.password + if ! password.nil? + account[:password] = password + end + end + end + + def modify_server(menu) + menu.choice('modify server') do + server = highline.ask('server: ') + if ! server.nil? + account[:server] = server + end + end + end + + def modify_backup_path(menu) + menu.choice('modify backup path') do + validator = lambda do |p| + same = store.data[:accounts].find do |a| + a[:username] != account[:username] && a[:local_path] == p + end + if same + puts "The path '#{p}' is used to backup the account '#{same[:username]}'" + false + else + true + end + end + account[:local_path] = Asker.backup_path(account[:local_path], validator) + end + end + + def choose_folders(menu) + menu.choice('choose backup folders') do + FolderChooser.new(account).run + end + end + + def test_connection(menu) + menu.choice('test connection') do + result = ConnectionTester.test(account) + puts result + highline.ask 'Press a key ' + end + end + + def delete_account(menu) + menu.choice('delete') do + if highline.agree("Are you sure? (y/n) ") + store.data[:accounts].reject! { |a| a[:username] == account[:username] } + throw :done + end + end + end + + def folders + account[:folders] || [] + end + + def masked_password + if account[:password] == '' or account[:password].nil? + '(unset)' + else + account[:password].gsub(/./, 'x') + end + end + + def default_server(username) + case username + when /@gmail\.com/ + 'imap.gmail.com' + when /@fastmail\.fm/ + 'mail.messagingengine.com' + end + end end end -