class GemsBond::Gem
Handles gem data
Constants
- GITHUB_KEYS
- RUBY_GEM_KEYS
Attributes
Public Class Methods
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
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
Is the gem hosted on RubyGems? @retun [Boolean]
# File lib/gems_bond/gem.rb, line 35 def exist? ruby_gems_fetcher.started? end
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
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
Returns name @return [String] (memoized)
# File lib/gems_bond/gem.rb, line 41 def name memoize(__method__) { @dependency.name } end
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
Returns url @return [String]
# File lib/gems_bond/gem.rb, line 71 def url homepage || source_code_uri end
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
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
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
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
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
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