class GemHadar

def build_task

def build_task
  desc 'Build task (builds all packages for a release)'
  task :build => build_task_dependencies
end

def clean(*args)

def clean(*args)
  if args.empty?
    CLEAN
  else
    CLEAN.include(*args)
  end
end

def clobber(*args)

def clobber(*args)
  if args.empty?
    CLOBBER
  else
    CLOBBER.include(*args)
  end
end

def create_all_tasks

def create_all_tasks
  default_task
  build_task
  version_task
  gemspec_task
  gems_install_task
  doc_task
  if test_dir
    test_task
    rcov_task
  end
  package_task
  install_library_task
  version_tag_task
  write_ignore_file
  write_gemfile
  self
end

def default_task

def default_task
  desc 'Default task'
  task :default => default_task_dependencies
end

def dependency(*args)

def dependency(*args)
  @dependencies << args
end

def development_dependency(*args)

def development_dependency(*args)
  @development_dependencies << args
end

def doc_task

def doc_task
  clean 'doc'
  desc "Creating documentation"
  task :doc do
    cmd = 'sdoc'
    if readme
      cmd << " --main '#{readme}'"
    end
    if title
      cmd << " --title '#{title}'"
    else
      cmd << " --title '#{name.camelize} - #{summary}'"
    end
    cmd << ' ' << Dir['lib/**/*.rb'] * ' '
    if readme
      cmd << " #{readme}"
    end
    sh cmd
  end
end

def gems_install_task(&block)

def gems_install_task(&block)
  block ||= lambda {  sh 'bundle install' }
  desc 'Install all gems from the Gemfile'
  task :'gems:install', &block
end

def gemspec

def gemspec
  Gem::Specification.new do |s|
    s.name        = name
    s.version     = version
    s.author      = author
    s.email       = email
    s.homepage    = homepage
    s.summary     = summary
    s.description = description
    s.files       = files
    s.test_files  = test_files
    s.add_development_dependency('gem_hadar', "~>#{VERSION}")
    for d in @development_dependencies
      s.add_development_dependency(*d)
    end
    for d in @dependencies
      s.add_dependency(*d)
    end
    s.require_path = require_path
    if title
      s.rdoc_options << '--title' << title
    else
      s.rdoc_options << '--title' << "#{name.camelize} - #{summary}"
    end
    if readme
      s.rdoc_options << '--main' << readme
      s.extra_rdoc_files << readme
    end
  end
end

def gemspec_task

def gemspec_task
  desc 'Create a gemspec file'
  task :gemspec => :version do
    filename = "#{name}.gemspec"
    warn "Writing to #{filename.inspect} for #{version}"
    File.open(filename, 'w') do |output|
      output.write gemspec.to_ruby
    end
  end
end

def has_to_be_set(name)

def has_to_be_set(name)
  fail "#{self.class}: #{name} has to be set for gem"
end

def ignore(*args)

def ignore(*args)
  if args.empty?
    ignore_files
  else
    ignore_files.push(*args)
  end
end

def initialize(&block)

def initialize(&block)
  @dependencies = []
  @development_dependencies = []
  block and instance_eval(&block)
end

def install_library(&block)

def install_library(&block)
  @install_library_block = lambda do
    desc 'Install executable/library into site_ruby directories'
    task :install, &block
  end
end

def install_library_task

def install_library_task
  @install_library_block.full?(:call)
end

def package_task

def package_task
  Gem::PackageTask.new(gemspec) do |pkg|
    pkg.need_tar      = true
    pkg.package_files += files
  end
end

def rcov_task

def rcov_task
  Rcov::RcovTask.new do |t|
    t.libs << test_dir
    t.test_files = test_files
    t.verbose    = true
    t.rcov_opts  = %W[-x '\\b#{test_dir}\/' -x '\\bgems\/']
  end
end

def test_task

def test_task
  Rake::TestTask.new do |t|
    t.libs << test_dir
    t.test_files = test_files
    t.verbose    = true
  end
end

def version_tag_task

def version_tag_task
  namespace :version do
    desc "Tag this commit as version #{version}"
    task :tag do
      begin
        sh "git tag -a -m 'Version #{version}' #{'-f' if ENV['FORCE']} v#{version}"
      rescue RuntimeError => e
        warn "Call rake with FORCE=1 to overwrite version tag #{version}"
        exit 1
      end
    end
  end
end

def version_task

def version_task
  desc m = "Writing version information for #{name}-#{version}"
  task :version do
    puts m
    mkdir_p dir = File.join('lib', path_name)
    File.write(File.join(dir, 'version.rb')) do |v|
      v.puts <<EOT
module_type} #{path_module}
# #{path_module} version
VERSION         = '#{version}'
VERSION_ARRAY   = VERSION.split(/\\./).map { |x| x.to_i } # :nodoc:
VERSION_MAJOR   = VERSION_ARRAY[0] # :nodoc:
VERSION_MINOR   = VERSION_ARRAY[1] # :nodoc:
VERSION_BUILD   = VERSION_ARRAY[2] # :nodoc:
d
T
    end
  end
end

def write_gemfile

def write_gemfile
  File.write('Gemfile') do |output|
    output.puts <<EOT
vim: set filetype=ruby et sw=2 ts=2:
urce :rubygems
mspec
T
  end
end

def write_ignore_file

def write_ignore_file 
  File.write('.gitignore') do |output|
    output.puts ignore
  end
end