lib/spontaneous/cli.rb
require 'thor'
require 'thor/group'
module Spontaneous
module Cli
module TaskUtils
# include Thor::Actions
def self.included(base)
base.class_eval do
def self.banner(task, namespace = true, subcommand = false)
"#{basename} #{task.formatted_usage(self, true, subcommand)}"
end
end
base.class_option :site, :type => :string, :aliases => ["-s", "--root"], :default => ".", :desc => "Site root dir"
base.class_option :environment, :type => :string, :aliases => "-e", :required => true, :default => :development, :desc => "Spontaneous Environment"
base.class_option :mode, :type => :string, :aliases => "-m", :default => :back, :desc => "Spontaneous mode ('front' or 'back')"
base.class_option :help, :type => :boolean, :desc => "Show help usage"
end
protected
def fix_schema(error)
modification = error.modification
actions = modification.actions
say(actions.description, :red)
say("Please choose one of the solutions below", :yellow)
actions.each_with_index do |a, i|
say(" #{i+1}: #{a.description}")
end
choice = ( ask "Choose action : ").to_i rescue nil
if choice and choice <= actions.length and choice > 0
action = actions[choice - 1]
begin
Spontaneous.schema.apply(action)
rescue Spontaneous::SchemaModificationError => error
fix_schema(error)
end
else
say("Invalid choice '#{choice.inspect}'\n", :red)
fix_schema(error)
end
end
def prepare(task, mode = "console")
if options.help?
help(task.to_s)
raise SystemExit
end
ENV["SPOT_ENV"] ||= options.environment.to_s ||
ENV["RACK_ENV"] = ENV["SPOT_ENV"] # Also set this for middleware
ENV["SPOT_MODE"] = mode.to_s
chdir(options.site)
unless File.exist?('config/boot.rb')
puts "=> Could not find boot file in: #{options.chdir}/config/boot.rb\n=> Are you sure this is a Spontaneous site?"
raise SystemExit
end
end
def prepare!(task, mode = "console")
prepare(task, mode)
boot!
end
def boot!
begin
require File.expand_path('config/boot.rb')
Spontaneous::Site.instance
rescue Spontaneous::SchemaModificationError => error
fix_schema(error)
end
end
def chdir(dir)
return unless dir
begin
Dir.chdir(dir.to_s)
rescue Errno::ENOENT
puts "=> Specified site '#{dir}' does not appear to exist"
rescue Errno::EACCES
puts "=> Specified site '#{dir}' cannot be accessed by the current user"
end
end
end
autoload :Assets, "spontaneous/cli/assets"
autoload :Console, "spontaneous/cli/console"
autoload :Fields, "spontaneous/cli/fields"
autoload :Generate, "spontaneous/cli/generate"
autoload :Init, "spontaneous/cli/init"
autoload :Media, "spontaneous/cli/media"
autoload :Migrate, "spontaneous/cli/migrate"
autoload :Server, "spontaneous/cli/server"
autoload :Site, "spontaneous/cli/site"
autoload :Sync, "spontaneous/cli/sync"
autoload :User, "spontaneous/cli/user"
autoload :Content, "spontaneous/cli/content"
class Root < ::Thor
register Spontaneous::Cli::Console, "console", "console", "Gives you console access to the current site"
register Spontaneous::Cli::Console, "c", "c", "Gives you console access to the current site"
register Spontaneous::Cli::User, "user", "user [ACTION]", "Administer site users"
register Spontaneous::Cli::Generate, "generate", "generate [OBJECT]", "Generates things"
register Spontaneous::Cli::Site, "site", "site [ACTION]", "Run site-wide actions"
register Spontaneous::Cli::Init, "init", "init", "Creates databases and initialises a new Spontaneous site"
register Spontaneous::Cli::Server, "server", "server [ACTION]", "Launch development server(s)"
register Spontaneous::Cli::Server, "s", "s [ACTION]", "Launch development server(s)"
# register Spontaneous::Cli::Media, "media", "media [ACTION]", "Manage site media"
# register Spontaneous::Cli::Sync, "sync", "sync [DIRECTION]", "Sync database and media to and from the production server"
register Spontaneous::Cli::Migrate, "migrate", "migrate", "Runs Spontaneous migrations"
register Spontaneous::Cli::Assets, "assets", "assets [ACTION]", "Manage Spontaneous assets"
register Spontaneous::Cli::Fields, "fields", "fields [ACTION]", "Manage Spontaneous fields"
register Spontaneous::Cli::Content, "content", "content [ACTION]", "Manage Spontaneous content"
desc :browse, "Launces a browser pointing to the current development CMS"
def browse
prepare! :browse
require 'launchy'
::Launchy.open("http://localhost:#{::Spontaneous::Site.config.port}/@spontaneous")
end
map %w(--version -v) => :version
desc :version, "Show the version of Spontaneous in use"
def version
require "spontaneous/version"
say "Spontaneous #{Spontaneous::VERSION}"
end
end
end
end