jhsu802701/generic_gem

View on GitHub
lib/generic_gem.rb

Summary

Maintainability
A
2 hrs
Test Coverage
require 'generic_gem/version'
require 'string_in_file'
require 'replace_quotes'
require 'line_containing'

#
module GenericGem
  def self.create(gem_name)
    puts '**********************'
    puts 'Welcome to Generic Gem'
    puts "GEM NAME: #{gem_name}"
    ENV['DIR_MAIN'] = File.expand_path('../../', __FILE__)

    bundle_config
    bundle_gem(gem_name)
    copy_credentials_sh(gem_name)
    enter_credentials_sh(gem_name)
    update_version(gem_name)
    update_gemspec(gem_name)
    add_gem_dep(gem_name, 'rubocop')
    add_gem_dep(gem_name, 'sandi_meter')
    add_gem_dep(gem_name, 'bundler-audit')
    add_gem_dep(gem_name, 'gemsurance')
    add_gem_dep(gem_name, 'ruby-graphviz')
    add_gem_dep(gem_name, 'simplecov')
    update_spec_helper(gem_name)
    update_tests(gem_name)
    update_bin_scripts(gem_name)
    add_rakefile(gem_name)
    add_readme_todo(gem_name)
    add_bash_scripts(gem_name)
    update_gitignore(gem_name)
    update_readme(gem_name)
    update_main_module(gem_name)
    add_rubocop_yml(gem_name)
    reset_git(gem_name)
  end

  def self.bundle_config
    puts '----------------------------------------'
    puts "Setting up #{ENV['HOME']}/.bundle/config"
    puts 'Includes the Code of Conduct (CODE_OF_CONDUCT.md file) and MIT license (LICENSE.txt file)'
    puts 'Using rspec testing'
    system("mkdir -p #{ENV['HOME']}/.bundle")
    system("cp #{ENV['DIR_MAIN']}/lib/files_to_add/config #{ENV['HOME']}/.bundle/config")
  end

  def self.bundle_gem(gem_name)
    t1 = Thread.new do
      puts '--------------------'
      puts 'Creating the new gem'
      puts "bundle gem #{gem_name}"
      system("bundle gem #{gem_name}")
    end
    t1.join
  end

  def self.copy_credentials_sh(gem_name)
    puts '----------------------'
    puts 'Copying credentials.sh'
    system("cp #{ENV['DIR_MAIN']}/credentials.sh #{gem_name}")
  end

  def self.enter_credentials_sh(gem_name)
    puts '-----------------------------------'
    puts 'Entering credentials (if necessary)'

    # Skip this step in Travis
    system("sh #{gem_name}/credentials.sh") if ENV['TRAVIS'] != 'true'
  end

  def self.update_version(gem_name)
    puts '----------------------'
    puts 'Initial version: 0.0.0'
    StringInFile.replace('0.1.0', '0.0.0', "#{gem_name}/lib/#{gem_name}/version.rb")
    ReplaceQuotes.update("#{gem_name}/lib/#{gem_name}/version.rb")
    StringInFile.replace('module', "#\nmodule", "#{gem_name}/lib/#{gem_name}/version.rb")
    StringInFile.replace("'0.0.0'", "'0.0.0'.freeze", "#{gem_name}/lib/#{gem_name}/version.rb")
  end

  def self.update_gemspec(gem_name)
    puts '----------------------------------------------'
    puts "Filling in spec.summary in #{gem_name}.gemspec"
    summary = "  spec.summary       = 'GENERIC SUMMARY'"
    LineContaining.replace('spec.summary', summary, "#{gem_name}/#{gem_name}.gemspec")

    puts '--------------------------------------------------'
    puts "Filling in spec.description in #{gem_name}.gemspec"
    desc = "  spec.description   = 'GENERIC DESCRIPTION'"
    LineContaining.replace('spec.description', desc, "#{gem_name}/#{gem_name}.gemspec")

    puts '-----------------------------------------------'
    puts "Filling in spec.homepage in #{gem_name}.gemspec"
    homepage = "  spec.homepage      = 'HTTP://WWW.EXAMPLE.COM'"
    LineContaining.replace('spec.homepage', homepage, "#{gem_name}/#{gem_name}.gemspec")

    puts '------------------------------------------------------------------'
    puts "Removing instances of 'TODO:' from #{gem_name}/#{gem_name}.gemspec"
    LineContaining.replace('TODO: ', '', "#{gem_name}/#{gem_name}.gemspec")

    puts '---------------------------------------------------'
    puts "Updating #{gem_name}.gemspec for RuboCop compliance"
    ReplaceQuotes.update("#{gem_name}/#{gem_name}.gemspec")
    StringInFile.replace("'\\x0'", '"\\x0"', "#{gem_name}/#{gem_name}.gemspec")

    puts '----------------------------------------------------'
    puts "Updating #{gem_name}.gemspec to remove excess spaces"
    while StringInFile.present('  =', "#{gem_name}/#{gem_name}.gemspec")
      StringInFile.replace('  =', ' =', "#{gem_name}/#{gem_name}.gemspec")
    end

    puts '------------------------------------------------------------------'
    puts "Updating #{gem_name}.gemspec to add empty line after magic comment"
    LineContaining.add_after('# coding: utf-8', '', "#{gem_name}/#{gem_name}.gemspec")
  end

  def self.add_gem_dep(gem_name, gem_dep)
    puts '----------------------------------------'
    puts "Adding #{gem_dep} development dependency"
    str1 = "spec.add_development_dependency 'rspec'"
    str2 = "\n  spec.add_development_dependency '#{gem_dep}'"
    LineContaining.add_after(str1, str2, "#{gem_name}/#{gem_name}.gemspec")
  end

  def self.update_spec_helper(gem_name)
    puts '----------------------------'
    puts 'Updating spec/spec_helper.rb'
    file_new = "#{gem_name}/spec/spec_helper_new.rb"
    file_old = "#{gem_name}/spec/spec_helper.rb"
    open(file_new, 'a') do |f|
      f << "require 'simplecov'\n"
      f << "SimpleCov.start\n\n"
      f << File.read(file_old)
    end
    system("mv #{file_new} #{file_old}")
    ReplaceQuotes.update(file_old)
  end

  def self.update_tests(gem_name)
    puts '--------------------------------'
    puts 'Revising the initial rspec tests'
    StringInFile.replace('expect(false).to eq(true)', 'expect(true).to eq(true)', "#{gem_name}/spec/#{gem_name}_spec.rb")
    puts '----------------------------------------'
    puts 'Convering double quotes to single quotes'
    ReplaceQuotes.update("#{gem_name}/spec/#{gem_name}_spec.rb")
  end

  def self.update_bin_scripts(gem_name)
    puts '----------------------------------'
    puts 'Updating bin/console and bin/setup'
    ReplaceQuotes.update("#{gem_name}/bin/console")
    system("chmod +x #{gem_name}/bin/*")
  end

  def self.add_rakefile(gem_name)
    puts '-------------------'
    puts 'Adding the Rakefile'
    system("cp #{ENV['DIR_MAIN']}/lib/files_to_add/Rakefile #{gem_name}")
  end

  def self.add_readme_todo(gem_name)
    puts '--------------------------------'
    puts 'Adding the README-to_do.txt file'
    system("cp #{ENV['DIR_MAIN']}/lib/files_to_add/README-to_do.txt #{gem_name}")
  end

  def self.add_bash_scripts(gem_name)
    puts '-------------------'
    puts 'Adding Bash scripts'
    system("cp #{ENV['DIR_MAIN']}/lib/files_to_add/*.sh #{gem_name}")

    puts '----------------------------------------------'
    puts "Adding 'gem uninstall' command to Bash scripts"
    str_old = '# uninstall'
    str_new = "gem uninstall #{gem_name}"
    StringInFile.replace(str_old, str_new, "#{gem_name}/code_test.sh")
    StringInFile.replace(str_old, str_new, "#{gem_name}/gem_test.sh")
    StringInFile.replace(str_old, str_new, "#{gem_name}/gem_install.sh")
    StringInFile.replace(str_old, str_new, "#{gem_name}/gem_console.sh")
  end

  def self.update_gitignore(gem_name)
    puts '----------------------------'
    puts 'Updating the .gitignore file'
    puts 'Adding tmp* and .DS_Store'
    open("#{gem_name}/.gitignore", 'a') do |f|
      f << "\nlog/"
      f << "\ntmp*"
      f << "\n.DS_Store"
      f << "\n*.gem"
    end
  end

  def self.update_readme(gem_name)
    puts '---------------------------'
    puts 'Updating the README.md file'
    t1 = Thread.new do
      file_w = open("#{gem_name}/README.md", 'a')
      file_w.write("## Bash Scripts\n")
      file_w.write("### Testing this gem\n")
      file_w.write("After you download this source code, enter `sh gem_test.sh` to set up and test this gem.\n\n")
      file_w.write("### Testing this gem's source code\n")
      file_w.write("Enter `sh code_test.sh` to test the quality of this gem's source code.\n")
      file_w.write("### Running this gem in irb\n")
      file_w.write("Enter `sh gem_console.sh`.\n\n")
      file_w.write("### Installing this gem\n")
      file_w.write("Enter `sh gem_install.sh`.\n")
      file_w.write("### Testing the gem, source code, and installation process\n")
      file_w.write("Enter `sh all.sh` to run the gem_test.sh, code_test.sh, and gem_install.sh scripts.\n")
      file_w.close
    end
    t1.join
  end

  def self.update_main_module(gem_name)
    puts '--------------------------------------------------------------'
    puts "Updating #{gem_name}/lib/#{gem_name}.rb to comply with RuboCop"
    ReplaceQuotes.update("#{gem_name}/lib/#{gem_name}.rb")
    StringInFile.replace('module', "#\nmodule", "#{gem_name}/lib/#{gem_name}.rb")

    puts '-------------------------------------------------------------------------------'
    puts "Adding the suggestion of using a class or module to the lib/#{gem_name}.rb file"
    open("#{gem_name}/lib/#{gem_name}.rb", 'a') do |f|
      f << "# Your new gem is a module by default.  You may wish to use a class instead.\n"
    end
  end

  def self.add_rubocop_yml(gem_name)
    puts '-------------------'
    puts 'Adding .rubocop.yml'
    system("cp #{ENV['DIR_MAIN']}/lib/files_to_add/rubocop.yml #{gem_name}/.rubocop.yml")
    StringInFile.replace('gemspec_file', "#{gem_name}.gemspec", "#{gem_name}/.rubocop.yml")
  end

  def self.reset_git(gem_name)
    puts '---------'
    puts 'Reset Git'
    system("cd #{gem_name} && git init")
    system("cd #{gem_name} && git add .")
    system("cd #{gem_name} && git commit -m 'Initial commit'")
  end
end