class SchemaDev::Gem

Attributes

email[RW]
fullname[RW]
gem_base_name[RW]
gem_lib_path[RW]
gem_module[RW]
gem_name[RW]
gem_parent_name[RW]
gem_root[RW]

Public Class Methods

build(name) click to toggle source
# File lib/schema_dev/gem.rb, line 14
def self.build(name)
  new(name).build
end
new(name) click to toggle source
# File lib/schema_dev/gem.rb, line 62
def initialize(name)
  self.gem_name = name.underscore
  self.gem_root = Pathname.new(gem_name)
  if gem_name =~ /^(schema_plus)_(.*)/
    parent, base = [$1, $2]
    self.gem_module = [parent, base].map(&:camelize).join('::')
    self.gem_lib_path = [parent, base].join('/')
    self.gem_parent_name = parent
    self.gem_base_name = base
    @subdir = true
  else
    self.gem_module = gem_name.camelize
    self.gem_lib_path = gem_name
    self.gem_base_name = gem_name
    @subdir = false
  end
  get_fullname_and_email
end

Public Instance Methods

build() click to toggle source
# File lib/schema_dev/gem.rb, line 81
    def build
      ensure_not_in_git
      ensure_doesnt_exist
      copy_template
      self.gem_root = gem_root.realpath
      rename_files
      fixup_subdir if @subdir
      freshen
      git_init
      puts <<~TEXT

        Created #{gem_name}.  Your recommended next steps are:

               $ cd #{gem_name}
               $ bundle install
               $ schema_dev bundle install
               $ schema_dev rspec
      TEXT
    end
copy_template() click to toggle source
# File lib/schema_dev/gem.rb, line 125
def copy_template
  Templates.install_subtree src: 'gem', dst: gem_root, bound: template_binding
end
die(msg) click to toggle source
# File lib/schema_dev/gem.rb, line 101
def die(msg)
  abort "schema_dev: #{msg}"
end
ensure_doesnt_exist() click to toggle source
# File lib/schema_dev/gem.rb, line 111
def ensure_doesnt_exist
  if gem_root.exist?
    die "Cannot create new gem: '#{gem_root}' already exists"
  end
end
ensure_not_in_git() click to toggle source
# File lib/schema_dev/gem.rb, line 105
def ensure_not_in_git
  if system('git rev-parse >& /dev/null')
    die 'Cannot create new gem inside existing git worktree; please cd elsewhere'
  end
end
erb(string) click to toggle source
# File lib/schema_dev/gem.rb, line 153
def erb(string)
  ERB.new(string).result template_binding
end
fixup_subdir() click to toggle source
# File lib/schema_dev/gem.rb, line 140
    def fixup_subdir
      libdir = gem_root + 'lib'
      aside = libdir.to_s + 'x'
      subdir = libdir + gem_parent_name

      FileUtils.mv libdir, aside
      libdir.mkpath
      FileUtils.mv aside, subdir
      (gem_root + 'lib' + "#{gem_name}.rb").write <<~RUBY
        require_relative '#{gem_parent_name}/#{gem_base_name}'
      RUBY
    end
freshen() click to toggle source
# File lib/schema_dev/gem.rb, line 161
def freshen
  Dir.chdir gem_root do
    Runner.new(Config.read).freshen(quiet: true)
  end
end
get_fullname_and_email() click to toggle source
# File lib/schema_dev/gem.rb, line 117
def get_fullname_and_email
  { 'fullname' => 'name', 'email' => 'email' }.each do |myattr, gitattr|
    if (send myattr + '=', `git config user.#{gitattr}`.strip).blank?
      die "Who are you?  Please run 'git config --global user.#{gitattr} <your-#{gitattr}>'"
    end
  end
end
git_init() click to toggle source
# File lib/schema_dev/gem.rb, line 167
def git_init
  Dir.chdir gem_name do
    system 'git init'
    add_param = gem_root.find
                        .select(&:exist?)
                        .reject { |e| e.basename.to_s == 'Gemfile.local' }
                        .join(' ')
    system "git add #{add_param}"
    system "git commit -m 'Initial skeleton generated by `schema_dev gem #{gem_name}`'"
  end
end
rename_files() click to toggle source
# File lib/schema_dev/gem.rb, line 129
def rename_files
  (gem_root + 'gitignore').rename gem_root + '.gitignore'
  (gem_root + 'simplecov').rename gem_root + '.simplecov'
  Dir.glob(gem_root + '**/*GEM_NAME*').each do |path|
    FileUtils.mv path, path.gsub(/GEM_NAME/, gem_name)
  end
  Dir.glob(gem_root + '**/*GEM_BASE_NAME*').each do |path|
    FileUtils.mv path, path.gsub(/GEM_BASE_NAME/, gem_base_name)
  end
end
template_binding() click to toggle source
# File lib/schema_dev/gem.rb, line 157
def template_binding
  @template_binding ||= TemplateEnv.new(self).get_binding
end