#!/usr/bin/env ruby # encoding: UTF-8 gem 'rails', '~> 4.0' require 'rails/version' require "thor" require 'io/console' # for password prompt require File.expand_path('../../lib/alchemy/version', __FILE__) class AlchemyInstaller < Thor include Thor::Actions map "-v" => :version map "--version" => :version desc "version", "Prints current Alchemy CMS version", hide: true def version puts Alchemy.version end desc "new PROJECT", "Creates a new Alchemy CMS project." method_option :database, type: :string, aliases: "-d", desc: "Type of database to use for this project. Default sqlite." def new(project) @application = project.downcase.strip.gsub(/ /, '_') system("rails _#{rails_version}_ new #{@application} -m #{alchemy_template} -d #{options[:database]} -JT") || exit!(1) if options[:database] == 'mysql' || options[:database] == 'postgresql' create_database_yml(options[:database]) end system("#{rake_cmd} alchemy:install") || exit!(1) system("#{rake_cmd} alchemy_devise:install:migrations") || exit!(1) system("#{rake_cmd} db:migrate") || exit!(1) cleanup say "\n## SUCCESSFULLY INSTALLED ALCHEMY CMS\n", :green say further_instructions rescue say "\nError while installing Alchemy CMS!\n#{$!}\n", :red end private def rails_version Rails::VERSION::STRING end def rake_cmd "cd #{@application} && bin/rake" end def alchemy_template File.join(File.dirname(__FILE__), '..', 'lib', 'rails', 'templates', 'alchemy.rb') end def further_instructions <<-EOF :: FURTHER INSTRUCTIONS ::::::::::::::::::::::::::::::::::::::::::::::::: :: :: :: Change into your app folder: :: :: :: :: $ cd #{@application}#{' ' * (63 - @application.length)}:: :: :: :: Start your local Rails server with: :: :: :: :: $ bin/rails server :: :: :: :: Open your browser and enter the following URL: :: :: :: :: http://localhost:3000/admin :: :: :: :: and follow the on screen instructions to complete the installation. :: :: :: :: Read more about Alchemy in the guidelines: :: :: :: :: http://guides.alchemy-cms.com/ :: ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: EOF end def cleanup append_file "#{@application}/.gitignore" do <<-GITIGNORE # Ignore Alchemy uploads folder uploads/* # Ignore sensitive data config/database.yml config/initializers/secret_token.rb GITIGNORE end %x[ cd #{@application} mkdir -p ./uploads touch ./uploads/.gitkeep ] end def create_database_yml(type) case type when 'mysql' @db_user_name = ask("\nPlease enter your local mysql username (DEFAULT: root):") @db_user_name = 'root' if @db_user_name.empty? @db_password = ask_password("Please enter the password for #{@db_user_name} (Leave blank for none):") local_standard_socket = '/tmp/mysql.sock' @db_socket = ask("Please enter your local mysql socket (DEFAULT: #{local_standard_socket}):") @db_socket = local_standard_socket if @db_socket.empty? file = mysql_yml_file when 'postgresql' @db_user_name = ask("\nPlease enter the local postgresql user name:") @db_password = ask_password("Please enter the password for #{@db_user_name} (Leave blank for none):") file = postgres_yml_file end create_file "./#{@application}/config/database.yml", file, force: true end def mysql_yml_file <<-DATABASE # MySQL. Versions 4.1 and 5.0 are recommended. # # Install the MYSQL driver # gem install mysql2 # # Ensure the MySQL gem is defined in your Gemfile # gem 'mysql2' # # And be sure to use new-style password hashing: # http://dev.mysql.com/doc/refman/5.0/en/old-client.html development: adapter: mysql2 encoding: utf8 database: #{@application}_development pool: 5 username: #{@db_user_name} password: #{@db_password} socket: #{@db_socket} # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: adapter: mysql2 encoding: utf8 database: #{@application}_test pool: 5 username: #{@db_user_name} password: #{@db_password} socket: #{@db_socket} production: adapter: mysql2 encoding: utf8 database: #{@application}_production pool: 5 username: #{@db_user_name} password: #{@db_password} socket: #{@db_socket} DATABASE end def postgres_yml_file <<-DATABASE # PostgreSQL. Versions 8.2 and up are supported. # # Install the pg driver: # gem install pg # On OS X with Homebrew: # gem install pg -- --with-pg-config=/usr/local/bin/pg_config # On OS X with MacPorts: # gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config # On Windows: # gem install pg # Choose the win32 build. # Install PostgreSQL and put its /bin directory on your path. # # Configure Using Gemfile # gem 'pg' # development: adapter: postgresql encoding: unicode database: #{@application}_development pool: 5 username: #{@db_user_name} password: #{@db_password} # Connect on a TCP socket. Omitted by default since the client uses a # domain socket that doesn't need configuration. Windows does not have # domain sockets, so uncomment these lines. #host: localhost # The TCP port the server listens on. Defaults to 5432. # If your server runs on a different port number, change accordingly. #port: 5432 # Schema search path. The server defaults to $user,public #schema_search_path: myapp,sharedapp,public # Minimum log levels, in increasing order: # debug5, debug4, debug3, debug2, debug1, # log, notice, warning, error, fatal, and panic # Defaults to warning. #min_messages: notice # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: adapter: postgresql encoding: unicode database: #{@application}_test pool: 5 username: #{@db_user_name} password: #{@db_password} production: adapter: postgresql encoding: unicode database: #{@application}_production pool: 5 username: #{@db_user_name} password: #{@db_password} DATABASE end def ask_password(message) password = $stdin.noecho { ask(message) } puts "\n" password end end AlchemyInstaller.start