# Installs gems that are slightly broken
# As a name it expects the name of the gem.
# If you want to want to install a certain version
# you have to append the version to the gem name:
#
#    install a version of mime-types:
#       rubygems::gem{'mime-types': }
#
#    install version 0.0.4 of ruby-net-ldap:
#       rubygems::gem{'ruby-net-ldap-0.0.4': }
#
#    uninstall polygot gem (until no such gem is anymore installed):
#       rubygems::gem{'polygot': ensure => absent }
#
#    uninstall ruby-net-ldap version 0.0.3
#       rubygems::gem{'ruby-net-ldap-0.0.3': ensure => absent }
#
# You can also set your own buildlfags, which will then install
# the gem in question by the gem command.
#
# You can also enforce to use the gem command to manage the gem
# by setting provider to `exec`.
#
define rubygems::gem(
  $ensure = 'present',
  $source = 'absent',
  $provider = 'default',
  $buildflags = 'absent',
  $requiresgcc = false
) {
  require ::rubygems
  if $requiresgcc or ($buildflags != 'absent') {
    require ::gcc
  }

  if $name =~ /\-(\d|\.)+$/ {
    $real_name = regsubst($name,'^(.*)-(\d|\.)+$','\1')
    $gem_version = regsubst($name,'^(.*)-(\d+(\d|\.)+)$','\2')
  } else {
    $real_name = $name
  }

  if $source != 'absent' {
    if $ensure != 'absent' {
      require rubygems::gem::cachedir
      exec{"get-gem-$name":
        command => "/usr/bin/wget -O ${rubygems::gem::cachedir::dir}/$name.gem $source",
        creates => "${rubygems::gem::cachedir::dir}/$name.gem",
      }
    } else {
      file{"${rubygems::gem::cachedir::dir}/$name.gem":
        ensure => 'absent';
      }
    }
  }

  if ($buildflags != 'absent') or ($provider == 'exec') {
    if $gem_version {
        $gem_version_str = "-v ${gem_version}"
        $gem_version_check_str = $gem_version
    } else {
        $gem_version_check_str = '.*'
    }

    if $ensure == 'present' {
        $gem_cmd = 'install'
    } else {
        $gem_cmd = 'uninstall -x'
    }

    if $buildflags != 'absent' {
      $buildflags_str = "-- --build-flags ${buildflags}"
    } else {
      $buildflags_str = ''
    }

    exec{"manage_gem_${name}":
        command => "gem ${gem_cmd} ${real_name} ${gem_version_str} ${buildflags_str}",
    }

    $gem_cmd_check_str = "gem list | egrep -q '^${real_name} \\(${gem_version_check_str}\\)\$'"
    if $ensure == 'present' {
        Exec["manage_gem_${name}"]{
           unless => $gem_cmd_check_str
        }
    } else {
        Exec["manage_gem_${name}"]{
           onlyif => $gem_cmd_check_str
        }
    }
  } else {
    package{"$real_name":
      ensure => $ensure ? {
        'absent' => $ensure,
        default => $gem_version ? {
          undef => $ensure,
          default => $gem_version
        }
      },
      provider => gem,
    }
    if $source != 'absent' {
      Package["$name"]{
        source => "${rubygems::gem::cachedir::dir}/$name.gem"
      }
    }
  }
}