module StillActive::Workflow

Public Instance Methods

call() click to toggle source
# File lib/still_active/workflow.rb, line 16
def call
  task = Async do
    barrier = Async::Barrier.new
    semaphore = Async::Semaphore.new(StillActive.config.parallelism, parent: barrier)
    result_object = {}
    StillActive.config.gems.each_with_object(result_object) do |gem, hash|
      semaphore.async do
        gem_info(gem_name: gem[:name], result_object: hash, gem_version: gem.dig(:version))
      end
    end
    barrier.wait
    result_object
  end
  task.wait
end

Private Instance Methods

gem_info(gem_name:, result_object:, gem_version: nil) click to toggle source
# File lib/still_active/workflow.rb, line 34
def gem_info(gem_name:, result_object:, gem_version: nil)
  result_object[gem_name] = {}
  result_object[gem_name][:version_used] = gem_version if gem_version

  vs = versions(gem_name: gem_name)
  repo_info = repository_info(gem_name: gem_name, versions: vs)
  last_commit_date = last_commit_date(source: repo_info[:source], repository_owner: repo_info[:owner],
    repository_name: repo_info[:name])
  last_release = VersionHelper.find_version(versions: vs, pre_release: false)
  last_pre_release = VersionHelper.find_version(versions: vs, pre_release: true)
  result_object[gem_name].merge!({
    latest_version: VersionHelper.gem_version(version_hash: last_release),
    latest_version_release_date: VersionHelper.release_date(version_hash: last_release),

    latest_pre_release_version: VersionHelper.gem_version(version_hash: last_pre_release),
    latest_pre_release_version_release_date: VersionHelper.release_date(version_hash: last_pre_release),

    repository_url: repo_info[:url],
    last_commit_date: last_commit_date,
  })

  unless vs.empty?
    result_object[gem_name][:ruby_gems_url] = "https://rubygems.org/gems/#{gem_name}"
  end

  if gem_version
    version_used = VersionHelper.find_version(versions: vs, version_string: gem_version)
    result_object[gem_name].merge!({
      up_to_date:
      VersionHelper.up_to_date?(
        version_used: version_used,
        latest_version: last_release,
        latest_pre_release_version: last_pre_release
      ),

      version_used_release_date: VersionHelper.release_date(version_hash: version_used),
    })
  end
rescue StandardError => e
  puts "error occured for #{gem_name}: #{e.class}\n\t#{e.message}"
end
installed_gem_urls(gem_name:) click to toggle source
# File lib/still_active/workflow.rb, line 91
def installed_gem_urls(gem_name:)
  info = Gem::Dependency.new(gem_name).matching_specs.first
  return [] if info.nil?

  [
    info&.metadata&.dig("source_code_uri"),
    info&.homepage,
  ].compact.uniq
end
last_commit(source:, repository_owner:, repository_name:) click to toggle source
# File lib/still_active/workflow.rb, line 119
def last_commit(source:, repository_owner:, repository_name:)
  case source.to_sym
  when :github
    StillActive.config.github_client.repos.commits.all(repository_owner, repository_name, per_page: 1)&.first
    # when :gitlab
    #   Gitlab.commits(name, per_page: 1)
  end
end
last_commit_date(source:, repository_owner:, repository_name:) click to toggle source
# File lib/still_active/workflow.rb, line 128
def last_commit_date(source:, repository_owner:, repository_name:)
  commit = last_commit(source: source, repository_owner: repository_owner, repository_name: repository_name)
  case source.to_sym
  when :github
    commit&.dig("commit", "author", "date").then { |date| Time.parse(date) unless date.nil? }
    # when :gitlab
    #   commit
  end
end
repository_info(gem_name:, versions:) click to toggle source
# File lib/still_active/workflow.rb, line 83
def repository_info(gem_name:, versions:)
  valid_repository_url =
    installed_gem_urls(gem_name: gem_name).find { |url| Repository.valid?(url: url) } ||
    rubygems_versions_repository_url(versions: versions).find { |url| Repository.valid?(url: url) } ||
    rubygems_gem_repository_url(gem_name: gem_name).find { |url| Repository.valid?(url: url) }
  Repository.url_with_owner_and_name(url: valid_repository_url)
end
rubygems_gem_repository_url(gem_name:) click to toggle source
# File lib/still_active/workflow.rb, line 107
def rubygems_gem_repository_url(gem_name:)
  info = Gems.info(gem_name)
  return [] if info.nil?

  [
    info["homepage_uri"],
    info["source_code_uri"],
  ].compact.uniq
rescue Gems::NotFound
  []
end
rubygems_versions_repository_url(versions:) click to toggle source
# File lib/still_active/workflow.rb, line 101
def rubygems_versions_repository_url(versions:)
  versions
    .filter_map { |version| version.dig("metadata", "source_code_uri") }
    .uniq
end
versions(gem_name:) click to toggle source

makes network request

# File lib/still_active/workflow.rb, line 77
def versions(gem_name:)
  Gems.versions(gem_name)
rescue Gems::NotFound
  []
end