lib/generic_app.rb in generic_app-0.0.1 vs lib/generic_app.rb in generic_app-0.1.0
- old
+ new
@@ -1,62 +1,219 @@
#!/usr/bin/ruby
require "generic_app/version"
require "string_in_file"
+require "line_containing"
-class GenericApp
+ENV['DIR_MAIN'] = File.expand_path("../../", __FILE__)
- def initialize
+module GenericApp
+
+ # Create app, stick with SQLite database in development
+ def self.sq (subdir_name)
+ self.git_clone (subdir_name)
+ self.guard_file (subdir_name)
+ self.app_views_password (subdir_name)
+ self.guard_file (subdir_name)
+ self.add_scripts (subdir_name) # Also used in the add-on procedure
+ self.add_notes (subdir_name)
+ self.add_readme (subdir_name)
+ self.update_gitignore (subdir_name) # Also used in the add-on procedure
+ self.git_init (subdir_name)
end
-
- def create (subdir_name)
- dir_main = File.expand_path("../../", __FILE__)
- subdir_name_final = subdir_name
- subdir_name_final = "sample_app_3rd_edition" if subdir_name == ""
- t1 = Thread.new {
- puts "*************************************************"
- puts "Downloading the Sample App from railstutorial.org"
+
+ def self.git_clone (subdir_name)
+ puts "*************************************************"
+ puts "Downloading the Sample App from railstutorial.org"
+ t1 = Thread.new {
system("git clone https://github.com/mhartl/sample_app_3rd_edition.git #{subdir_name}")
system("cd #{subdir_name} && git checkout remotes/origin/account-activation-password-reset")
- }
+ }
t1.join
- t1 = Thread.new {
- puts "*******************************"
- puts "Modifying the Rails source code"
-
- # Changing Guardfile settings
- str_guard_orig = "all_on_start: false"
- str_guard_new = "all_on_start: true"
- StringInFile.replace(str_guard_orig, str_guard_new, "#{subdir_name}/Guardfile")
-
- # Advise users to use a password management program when choosing a password
- str1 = "</h1>"
- str2a = "</h1>"
- str2b = "\nUsing the same password for all of your accounts is risky."
- str2b += "\nLimiting yourself to passwords that you can easily remember is risky."
- str2b += "\nYou should use a password management program like <a href='http://www.keepassx.org/'>KeePassX</a>"
- str2b += "\nto create much better passwords AND store them in encrypted form.<br>"
- str2 = str2a + str2b
- StringInFile.replace(str1, str2, "#{subdir_name}/app/views/users/new.html.erb")
- StringInFile.replace(str1, str2, "#{subdir_name}/app/views/users/edit.html.erb")
- StringInFile.replace(str1, str2, "#{subdir_name}/app/views/password_resets/new.html.erb")
- StringInFile.replace(str1, str2, "#{subdir_name}/app/views/password_resets/edit.html.erb")
-
- # Adding notes and special scripts
- system("cp -r #{dir_main}/to_add/* #{subdir_name}")
-
- # Adding automated list of files
- system("cd #{subdir_name} && sh list_files.sh")
-
- # Initializing Git
+ end
+
+ def self.guard_file (subdir_name)
+ puts "*************************************************************"
+ puts "Setting the Guardfile to automatically run tests upon startup"
+ str_guard_orig = "all_on_start: false"
+ str_guard_new = "all_on_start: true"
+ StringInFile.replace(str_guard_orig, str_guard_new, "#{subdir_name}/Guardfile")
+ end
+
+ def self.app_views_password (subdir_name)
+ puts "*********************************************************************************"
+ puts "Advising users to use a password management program to create and store passwords"
+ str1 = "</h1>"
+ str2a = "</h1>"
+ str2b = "\nUsing the same password for all of your accounts is risky."
+ str2b += "\nLimiting yourself to passwords that you can easily remember is risky."
+ str2b += "\nYou should use a password management program like <a href='http://www.keepassx.org/'>KeePassX</a>"
+ str2b += "\nto create much better passwords AND store them in encrypted form.<br>"
+ str2 = str2a + str2b
+ StringInFile.replace(str1, str2, "#{subdir_name}/app/views/users/new.html.erb")
+ StringInFile.replace(str1, str2, "#{subdir_name}/app/views/users/edit.html.erb")
+ StringInFile.replace(str1, str2, "#{subdir_name}/app/views/password_resets/new.html.erb")
+ StringInFile.replace(str1, str2, "#{subdir_name}/app/views/password_resets/edit.html.erb")
+ end
+
+ def self.git_init (subdir_name)
+ puts "****************"
+ puts "Initializing Git"
+ t1 = Thread.new {
+ $stdout = File.new( '/dev/null', 'w' )
system("cd #{subdir_name} && rm -rf .git")
system("cd #{subdir_name} && git init")
- }
+ system("cd #{subdir_name} && git add .")
+ system("cd #{subdir_name} && git commit -m 'Initial commit' >/dev/null")
+ $stdout = STDOUT
+ }
t1.join
- puts "*************************************************************"
- puts "Enter the following commands to set up and test your new app:"
- puts "cd #{subdir_name}"
- puts "sh setup.sh"
- puts "***********"
+ end
+
+ def self.add_scripts (subdir_name)
+ puts "*******************"
+ puts "Adding Bash scripts"
+ system("cp -r #{ENV['DIR_MAIN']}/to_add/*.sh #{subdir_name}")
+ system("cd #{subdir_name} && sh list_files.sh")
+ end
+
+ def self.add_notes (subdir_name)
+ puts "*****************************"
+ puts "Adding notes on MVC structure"
+ system("mkdir -p #{subdir_name}/notes")
+ system("cp -r #{ENV['DIR_MAIN']}/to_add/notes/* #{subdir_name}/notes")
+ end
+
+ def self.add_readme (subdir_name)
+ puts "*****************************"
+ puts "Adding README"
+ system("cp -r #{ENV['DIR_MAIN']}/to_add/README.md #{subdir_name}")
+ end
+
+ def self.update_gitignore (subdir_name)
+ puts "*******************"
+ puts "Updating .gitignore"
+ if StringInFile.present("tmp*","#{subdir_name}/.gitignore") == false
+ command = 'echo "\ntmp*" >> '
+ command += "#{subdir_name}/.gitignore"
+ system(command)
+ end
+ if StringInFile.present(".DS_Store","#{subdir_name}/.gitignore") == false
+ command = 'echo "\n.DS_Store" >> '
+ command += "#{subdir_name}/.gitignore"
+ system(command)
+ end
+ end
+
+ # Create app, use PostgreSQL instead of SQLite
+ # NOTE: Three databases are used: development, testing, and production.
+ # NOTE: Each database has the same username and password.
+
+ # INPUT PARAMETERS:
+ # Name of directory containing the app
+ # Database root name
+ # Name of environmental variable used to store the username
+ # Name of environmental variable used to store the password
+ # Username
+ # Password
+
+ def self.pg (subdir_name, db_rootname_x, var_store_username, var_store_password, username_x, password_x)
+ self.sq (subdir_name)
+ self.pg_gemfile (subdir_name)
+ self.pg_remove_sqlite (subdir_name)
+ t1 = Thread.new {
+ self.set_pg_params(subdir_name, db_rootname_x, var_store_username, var_store_password, username_x, password_x)
+ }
+ t1.join
+ self.git_init (subdir_name)
+ end
+
+ def self.pg_gemfile (subdir_name)
+ puts "**************************************************************************"
+ puts "Updating the Gemfile (PostgreSQL for development, testing, and production)"
+ LineContaining.delete("sqlite", "#{subdir_name}/Gemfile")
+ LineContaining.delete("gem 'pg'", "#{subdir_name}/Gemfile")
+ open("#{subdir_name}/Gemfile", 'a') {|f|
+ f << "\n\ngem 'pg'\n"
+ f << "gem 'figaro'\n"
+ }
+ end
+
+ def self.pg_remove_sqlite (subdir_name)
+ system("rm #{subdir_name}/db/*.sqlite")
+ end
+
+ def self.set_pg_params (subdir_name, db_rootname_x, var_store_username, var_store_password, username_x, password_x)
+ system("cp -r #{ENV['DIR_MAIN']}/to_add_pg/* #{subdir_name}")
+ puts "*********************************************"
+ puts "Setting up the PostgreSQL database parameters"
+ # NOTE: These environmental variables are temporary and only used here.
+ ENV['APP_DB_NAME_DEV'] = "#{db_rootname_x}_dev"
+ ENV['APP_DB_NAME_TEST'] = "#{db_rootname_x}_test"
+ ENV['APP_DB_NAME_PRO'] = "#{db_rootname_x}_pro"
+ ENV['APP_DB_USER'] = username_x
+ ENV['APP_DB_PASS'] = password_x
+ system(%q{sudo -u postgres psql -c"CREATE ROLE $APP_DB_USER WITH CREATEDB LOGIN PASSWORD '$APP_DB_PASS';"})
+
+ # Development database
+ system(%q{sudo -u postgres psql -c"CREATE DATABASE $APP_DB_NAME_DEV WITH OWNER=$APP_DB_USER;"})
+ system("wait")
+
+ # Testing database
+ system(%q{sudo -u postgres psql -c"CREATE DATABASE $APP_DB_NAME_TEST WITH OWNER=$APP_DB_USER;"})
+ system("wait")
+
+ # Production database
+ system(%q{sudo -u postgres psql -c"CREATE DATABASE $APP_DB_NAME_PRO WITH OWNER=$APP_DB_USER;"})
+ system("wait")
+
+ puts "****************************************"
+ puts "rm #{subdir_name}/config/application.yml"
+ system ("rm #{subdir_name}/config/application.yml")
+
+ puts "**************************************************"
+ puts "Using Figaro to create initial configuration files"
+ system("cd #{subdir_name} && figaro install")
+
puts
+ puts "*********************************"
+ puts "Setting up config/application.yml"
+ open("#{subdir_name}/config/application.yml", 'a') { |f|
+ f << "\n\n"
+ f << 'VAR_STORE_USERNAME: "USERNAME123"'
+ f << "\n"
+ f << 'VAR_STORE_PASSWORD: "PASSWORD123"'
+ }
+ StringInFile.replace("VAR_STORE_USERNAME", var_store_username, "#{subdir_name}/config/application.yml")
+ StringInFile.replace("USERNAME123", username_x, "#{subdir_name}/config/application.yml")
+ StringInFile.replace("VAR_STORE_PASSWORD", var_store_password, "#{subdir_name}/config/application.yml")
+ StringInFile.replace("PASSWORD123", password_x, "#{subdir_name}/config/application.yml")
+ puts
+ puts "******************************"
+ puts "Setting up config/database.yml"
+ system("cp -r #{ENV['DIR_MAIN']}/to_add_pg/* #{subdir_name}")
+ StringInFile.replace("VAR_STORE_USERNAME", var_store_username, "#{subdir_name}/config/database.yml")
+ StringInFile.replace("VAR_STORE_PASSWORD", var_store_password, "#{subdir_name}/config/database.yml")
+ StringInFile.replace("DB_NAME_DEV", ENV['APP_DB_NAME_DEV'], "#{subdir_name}/config/database.yml")
+ StringInFile.replace("DB_NAME_TEST", ENV['APP_DB_NAME_TEST'], "#{subdir_name}/config/database.yml")
+ StringInFile.replace("DB_NAME_PRO", ENV['APP_DB_NAME_PRO'], "#{subdir_name}/config/database.yml")
+ puts
+ puts "*************************************"
+ puts "POSTGRESQL PUBLIC DATABASE PARAMETERS"
+ puts "This information is stored in the config/database.yml file"
+ puts "Database Name (development): #{ENV['APP_DB_NAME_DEV']}"
+ puts "Database Name (testing): #{ENV['APP_DB_NAME_TEST']}"
+ puts "Database Name (production): #{ENV['APP_DB_NAME_PRO']}"
+ puts "Name of Environmental Variable Containing The Username: #{var_store_username}"
+ puts "Name of Environmental Variable Containing the Password: #{var_store_password}"
+ puts
+ puts "**************************************"
+ puts "POSTGRESQL PRIVATE DATABASE PARAMETERS"
+ puts "This information is stored in the config/application.yml file."
+ puts "The config/application.yml file is ignored by Git, which keeps it private."
+ puts "Be sure you have this information saved in KeePassX."
+ puts "Username: #{username_x}"
+ puts "Password: #{password_x}"
+
end
+
end