class Siba::Scaffold

Constants

CATEGORY_REPLACE_TEXT
NAME_REPLACE_TEXT

Attributes

category[RW]
name[RW]
name_camelized[RW]

Public Class Methods

new(category, name) click to toggle source
# File lib/siba/scaffold.rb, line 11
def initialize(category, name)
  @category = category
  unless Siba::Plugins.valid_category? category
    raise Siba::Error, "Invalid category '#{category}'. Available categories are: #{Siba::Plugins.categories_str}"
  end

  @name = Siba::StringHelper.str_to_alphnumeric name
  raise Siba::Error, "first character of gem name can not be number" if name =~ /^[0-9]/

  @name_camelized = StringHelper.camelize name
end

Public Instance Methods

scaffold(dest_dir) click to toggle source
# File lib/siba/scaffold.rb, line 23
def scaffold(dest_dir)
  run_scaffold dest_dir
ensure
  Siba.cleanup
end

Private Instance Methods

gitify(path_to_project) click to toggle source
# File lib/siba/scaffold.rb, line 128
def gitify(path_to_project)
  logger.debug "Initializing GIT repository"
  siba_file.file_utils_cd path_to_project
  siba_file.run_shell "git init", "Failed to init git repository"
  siba_file.run_shell "git add ."
  siba_file.run_shell "git commit -a -m 'Initial commit'"
end
replace_category_and_name(dir) click to toggle source
# File lib/siba/scaffold.rb, line 94
def replace_category_and_name(dir)
  Siba::FileHelper.entries(dir).each do |entry|
    entry_path = replace_path dir, entry
    if siba_file.file_directory? entry_path
      replace_category_and_name entry_path
    else
      replace_file_contents entry_path
    end
  end
end
replace_file_contents(path_to_file) click to toggle source
# File lib/siba/scaffold.rb, line 117
def replace_file_contents(path_to_file)
  return unless siba_file.file_file? path_to_file
  Siba::FileHelper.change_file(path_to_file) do |file_text|
    file_text.gsub! CATEGORY_REPLACE_TEXT, category
    file_text.gsub! CATEGORY_REPLACE_TEXT.capitalize, category.capitalize
    file_text.gsub! NAME_REPLACE_TEXT, name
    file_text.gsub! NAME_REPLACE_TEXT.capitalize, name_camelized
    file_text
  end
end
replace_init_example(scaffolds_dir, init_file_dest, example_file_name) click to toggle source
# File lib/siba/scaffold.rb, line 150
def replace_init_example(scaffolds_dir, init_file_dest, example_file_name)
  shared_dir = siba_file.file_expand_path File.join(scaffolds_dir, "shared")
  init_example_file = File.join shared_dir, example_file_name
  unless siba_file.file_file? init_example_file
    raise Siba::Error, "Can not find init example file: '#{init_example_file}'"
  end
  init_example = Siba::FileHelper.read init_example_file
  Siba::FileHelper.change_file(init_file_dest) do |f|
    replace_text = "## #{example_file_name} ##"
    unless f.include? replace_text
      raise Siba::Error, "Can not replacement text: #{replace_text}"
    end
    f.gsub! replace_text, init_example
  end
end
replace_init_examples(scaffolds_dir, init_file_dest) click to toggle source
# File lib/siba/scaffold.rb, line 145
def replace_init_examples(scaffolds_dir, init_file_dest)
  replace_init_example scaffolds_dir, init_file_dest, "init_example.rb"
  replace_init_example scaffolds_dir, init_file_dest, "examples.rb"
end
replace_path(dir, entry) click to toggle source
# File lib/siba/scaffold.rb, line 105
def replace_path(dir, entry)
  entry_path = File.join dir, entry
  entry_after = entry.gsub CATEGORY_REPLACE_TEXT, category
  entry_after = entry_after.gsub NAME_REPLACE_TEXT, name
  if entry_after != entry
    entry_path_after = File.join(dir, entry_after)
    siba_file.file_utils_mv entry_path, entry_path_after
    entry_path = entry_path_after
  end
  entry_path
end
replace_siba_version(project_dir) click to toggle source
# File lib/siba/scaffold.rb, line 136
def replace_siba_version(project_dir)
  path_to_gemspec = File.join project_dir, "siba-c6y-demo.gemspec"
  raise Siba::Error, "Can not find gemspec file #{path_to_gemspec}" unless siba_file.file_file? path_to_gemspec
  Siba::FileHelper.change_file(path_to_gemspec) do |file_text|
    version = Siba::VERSION.split('.')[0..-2].join('.')
    file_text.gsub "siba_version", version
  end
end
run_scaffold(dest_dir) click to toggle source
# File lib/siba/scaffold.rb, line 31
def run_scaffold(dest_dir)
  siba_file.run_this "scaffold" do
    LoggerPlug.create "Scaffolding", nil, false
    logger.debug "Scaffolding started"
    dest_dir = File.join dest_dir, name
    if siba_file.file_directory?(dest_dir) || siba_file.file_file?(dest_dir)
      raise Siba::Error, "Directory already exists #{dest_dir}."
    end

    logger.debug "Checking if GIT is installed"
    raise Siba::Error, "Please install GIT first" unless siba_file.shell_ok? "git help"
    scaffolds_dir = siba_file.file_expand_path "../../../scaffolds", __FILE__

    logger.debug "Creating a tmp dir"
    dest_tmp_dir = Siba::TestFiles.mkdir_in_tmp_dir "scaffold"

    logger.debug "Copying project files"
    project_dir = File.join scaffolds_dir, "project"
    unless siba_file.file_directory? project_dir
      raise Siba::Error, "Scaffold project dir does not exist '#{project_dir}'"
    end
    siba_file.file_utils_cp_r File.join(project_dir,"."), dest_tmp_dir

    logger.debug "Copying init file"
    init_file = File.join scaffolds_dir, "#{category}.rb"
    unless siba_file.file_file? init_file
      raise Siba::Error, "Scaffold init file does not exist '#{init_file}'"
    end
    init_dir = File.join dest_tmp_dir, "lib", "siba-#{CATEGORY_REPLACE_TEXT}-demo"
    unless siba_file.file_directory? init_dir
      raise Siba::Error, "Source dir does not exist '#{init_dir}'"
    end
    init_file_dest = File.join init_dir,"init.rb"
    siba_file.file_utils_cp init_file, init_file_dest
    unless siba_file.file_file? init_file_dest
      raise Siba::Error, "Filed to create init file '#{init_file_dest}'"
    end

    logger.debug "Writing examples to init.rb"
    replace_init_examples scaffolds_dir, init_file_dest

    logger.debug "Setting siba gem dependency"
    replace_siba_version dest_tmp_dir

    logger.debug "Setting gem category and name in file names and contents"
    replace_category_and_name dest_tmp_dir

    gitify dest_tmp_dir

    logger.debug "Copying the project to destination"
    siba_file.file_utils_mkpath dest_dir
    siba_file.file_utils_cp_r File.join(dest_tmp_dir,"."), dest_dir


    logger.info "Project created in #{dest_dir}"
    logger.info "There is a README file with instructions there"
    logger.show_finish_message = false
  end
rescue Exception => e
  logger.fatal e
  logger.log_exception e, true
end