lib/shelly/cli/main.rb in shelly-0.0.10 vs lib/shelly/cli/main.rb in shelly-0.0.11

- old
+ new

@@ -1,30 +1,154 @@ require "shelly" require "thor/group" -require "shelly/cli/account" -require "shelly/cli/apps" module Shelly module CLI class Main < Thor include Thor::Actions - register(Account, "account", "account <command>", "Manages your account") - register(Apps, "apps", "apps <command>", "Manages your applications") + include Helpers map %w(-v --version) => :version desc "version", "Displays shelly version" def version say "shelly version #{Shelly::VERSION}" end desc "register [EMAIL]", "Registers new user account on Shelly Cloud" def register(email = nil) - invoke "account:register", email + say "Registering with email: #{email}" if email + user = User.new(email || ask_for_email, ask_for_password) + user.register + if user.ssh_key_exists? + say "Uploading your public SSH key from #{user.ssh_key_path}" + end + say "Successfully registered!" + say "Check you mailbox for email address confirmation" + rescue Client::APIError => e + if e.message == "Validation Failed" + e.errors.each { |error| say "#{error.first} #{error.last}" } + exit 1 + end end + desc "login [EMAIL]", "Logins user to Shelly Cloud" + def login(email = nil) + user = User.new(email || ask_for_email, ask_for_password(false)) + user.login + say "Login successful" + say "Uploading your public SSH key" + user.upload_ssh_key + rescue RestClient::Unauthorized + say "Wrong email or password or your email is unconfirmend" + exit 1 + end + desc "add", "Adds new application to Shelly Cloud" def add - invoke "apps:add" + say_error "Must be run inside your project git repository" unless App.inside_git_repository? + + @app = Shelly::App.new + @app.purpose = ask_for_purpose + @app.code_name = ask_for_code_name + @app.databases = ask_for_databases + @app.create + + unless @app.remote_exists? + say "Adding remote #{@app.purpose} #{@app.git_url}", :green + @app.add_git_remote + else + say "Remote #{@app.purpose} already exists" + if yes?("Would you like to overwrite remote #{@app.purpose} with #{@app.git_url} (Y/N)?:") + @app.add_git_remote(true) + end + end + + say "Creating Cloudfile", :green + @app.create_cloudfile + + say "Provide billing details. Opening browser...", :green + @app.open_billing_page + + info_adding_cloudfile_to_repository + info_deploying_to_shellycloud + rescue Client::APIError => e + if e.message == "Validation Failed" + e.errors.each { |error| say "#{error.first} #{error.last}" } + exit 1 + end + end + + + # FIXME: move to helpers + no_tasks do + def ask_for_email + email_question = User.guess_email.blank? ? "Email:" : "Email (#{User.guess_email} - default):" + email = ask(email_question) + email = email.blank? ? User.guess_email : email + return email if email.present? + say_error "Email can't be blank, please try again" + end + + def ask_for_password(with_confirmation = true) + loop do + say "Password: " + password = echo_disabled { $stdin.gets.strip } + say_new_line + return password unless with_confirmation + say "Password confirmation: " + password_confirmation = echo_disabled { $stdin.gets.strip } + say_new_line + if password.present? + return password if password == password_confirmation + say "Password and password confirmation don't match, please type them again" + else + say "Password can't be blank" + end + end + end + + def ask_for_purpose + purpose = ask("How will you use this system (production - default,staging):") + purpose.blank? ? "production" : purpose + end + + def ask_for_code_name + default_code_name = "#{Shelly::App.guess_code_name}-#{@app.purpose}" + code_name = ask("Application code name (#{default_code_name} - default):") + code_name.blank? ? default_code_name : code_name + end + + def ask_for_databases + kinds = Shelly::App::DATABASE_KINDS + databases = ask("Which database do you want to use #{kinds.join(", ")} (postgresql - default):") + begin + databases = databases.split(/[\s,]/) + valid = databases.all? { |kind| kinds.include?(kind) } + break if valid + databases = ask("Unknown database kind. Supported are: #{kinds.join(", ")}:") + end while not valid + + databases.empty? ? ["postgresql"] : databases + end + + def info_adding_cloudfile_to_repository + say_new_line + say "Project is now configured for use with Shell Cloud:", :green + say "You can review changes using", :green + say " git status" + end + + def info_deploying_to_shellycloud + say_new_line + say "When you make sure all settings are correct please issue following commands:", :green + say " git add ." + say ' git commit -m "Application added to Shelly Cloud"' + say " git push" + say_new_line + say "Deploy to #{@app.purpose} using:", :green + say " git push #{@app.purpose} master" + say_new_line + end end end end end