class GemsBond::Gem

Handles gem data

Constants

GITHUB_KEYS
RUBY_GEM_KEYS

Attributes

unknown[R]

Public Class Methods

new(dependency, unknown: false) click to toggle source

Initializes an instance @param dependency [Bundler::Dependency] @param unknown [Boolean] is it a current dependency? @return [GemsBond::Gem]

# File lib/gems_bond/gem.rb, line 28
def initialize(dependency, unknown: false)
  @dependency = dependency
  @unknown = unknown
end

Public Instance Methods

description() click to toggle source

Returns description @return [String] (memoized)

# File lib/gems_bond/gem.rb, line 47
def description
  memoize(__method__) do
    unknown ? info : @dependency.to_spec.description
  end
end
exist?() click to toggle source

Is the gem hosted on RubyGems? @retun [Boolean]

# File lib/gems_bond/gem.rb, line 35
def exist?
  ruby_gems_fetcher.started?
end
github_url() click to toggle source

Returns GitHub url if exist @return [String, nil]

# File lib/gems_bond/gem.rb, line 77
def github_url
  [homepage, source_code_uri].find do |url|
    GemsBond::Fetchers::Github.valid_url?(url)
  end
end
homepage() click to toggle source

Returns homepage @return [String] (memoized)

# File lib/gems_bond/gem.rb, line 63
def homepage
  memoize(__method__) do
    @dependency.to_spec.homepage unless unknown
  end
end
name() click to toggle source

Returns name @return [String] (memoized)

# File lib/gems_bond/gem.rb, line 41
def name
  memoize(__method__) { @dependency.name }
end
prepare_data(keys: nil, concurrency: false, verbose: false) click to toggle source

Fetches data from APIs @param concurrency [Boolean] should it be run concurrently? @param verbose [Boolean] should gem's name be stdout? @return [void]

# File lib/gems_bond/gem.rb, line 117
def prepare_data(keys: nil, concurrency: false, verbose: false)
  fetch_key = ->(key) { (keys.nil? || key.in?(keys)) && __send__(key) }
  if concurrency
    each_concurrently(RUBY_GEM_KEYS + GITHUB_KEYS, &fetch_key)
  else
    (RUBY_GEM_KEYS + GITHUB_KEYS).each(&fetch_key)
  end
  puts(name) if verbose
end
url() click to toggle source

Returns url @return [String]

# File lib/gems_bond/gem.rb, line 71
def url
  homepage || source_code_uri
end
version() click to toggle source

Returns used version @return [String] (memoized)

# File lib/gems_bond/gem.rb, line 55
def version
  memoize(__method__) do
    @dependency.to_spec.version.to_s unless unknown
  end
end
version_gap() click to toggle source

Returns gap between installed and last released version, in days @return [Integer, nil] (memoized)

# File lib/gems_bond/gem.rb, line 101
def version_gap
  memoize(:version_gap) do
    return unless version && versions

    index = versions.index { |v| v[:number] == version }
    return unless index

    gap = versions[0..index].count { |v| !v[:prerelease] } - 1
    gap.positive? ? gap : 0
  end
end

Private Instance Methods

fetch(fetcher, key) click to toggle source

Fetches the given data with the given fetcher @param fetcher [GemsBond::Fetchers] @param key [String] @return [Object, nil]

# File lib/gems_bond/gem.rb, line 133
def fetch(fetcher, key)
  return if fetcher.nil?
  raise GemsBond::Fetchers::NotStartedError unless fetcher.started?

  fetcher.public_send(key)
end
github_fetcher() click to toggle source

Returns a started GitHub fetcher @return [GemsBond::Fetchers::Github, nil] @note start is needed to ensure the fetcher works (especially the token)

# File lib/gems_bond/gem.rb, line 152
def github_fetcher
  return @github_fetcher if defined?(@github_fetcher)

  @github_fetcher = github_url && GemsBond::Fetchers::Github.new(github_url).tap(&:start)
end
memoize(key) { || ... } click to toggle source

Memoizes the given key and apply the given block @param key [String] the instance variable key @yieldparam [Object] the value to memoize @return [Object]

# File lib/gems_bond/gem.rb, line 162
def memoize(key)
  return instance_variable_get("@#{key}") if instance_variable_defined?("@#{key}")

  instance_variable_set("@#{key}", yield)
end
ruby_gems_fetcher() click to toggle source

Returns a started RubyGems fetcher @return [GemsBond::Fetchers::RubyGems, nil] @note start is needed to ensure the fetcher works

# File lib/gems_bond/gem.rb, line 143
def ruby_gems_fetcher
  return @ruby_gems_fetcher if defined?(@ruby_gems_fetcher)

  @ruby_gems_fetcher = GemsBond::Fetchers::RubyGems.new(name).tap(&:start)
end