rubygems/rubygems.org

View on GitHub
app/models/gem_typo.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
class GemTypo
  DOWNLOADS_THRESHOLD = 10_000
  LAST_RELEASE_TIME   = 5.years.ago

  attr_reader :protected_gem

  def initialize(rubygem_name)
    @rubygem_name = rubygem_name
  end

  def protected_typo?
    return false if GemTypoException.where("upper(name) = upper(?)", @rubygem_name).any?

    return false if published_exact_name_matches.any?

    match = matched_protected_gem_name
    return false if not_protected?(match)

    @protected_gem = match.name
    true
  end

  private

  def published_exact_name_matches
    Rubygem.with_versions.where("upper(name) = upper(?)", @rubygem_name)
  end

  def matched_protected_gem_name
    Rubygem.with_versions.find_by(
      "regexp_replace(upper(name), '[_-]', '', 'g') = regexp_replace(upper(?), '[_-]', '', 'g')",
      @rubygem_name
    )
  end

  def not_protected?(rubygem)
    return true unless rubygem
    rubygem.downloads < DOWNLOADS_THRESHOLD && rubygem.most_recent_version.created_at < LAST_RELEASE_TIME
  end
end