class U3dCore::UpdateChecker

Verifies the user runs the latest version of this gem

Attributes

start_time[R]

Public Class Methods

ensure_rubygems_source() click to toggle source

Check if RubyGems is set as a gem source on some machines that might not be the case and then users can't find the update when running the specified command

# File lib/u3d_core/update_checker/update_checker.rb, line 113
def self.ensure_rubygems_source
  return if `gem sources`.include?("https://rubygems.org")
  puts("")
  UI.error("RubyGems is not listed as your Gem source")
  UI.error("You can run `gem sources` to see all your sources")
  UI.error("Please run the following command to fix this:")
  UI.command("gem sources --add https://rubygems.org")
end
fetch_latest(gem_name) click to toggle source
# File lib/u3d_core/update_checker/update_checker.rb, line 122
def self.fetch_latest(gem_name)
  JSON.parse(U3d::Utils.page_content(generate_fetch_url(gem_name)))["version"]
end
generate_fetch_url(gem_name) click to toggle source
# File lib/u3d_core/update_checker/update_checker.rb, line 126
def self.generate_fetch_url(gem_name)
  "https://rubygems.org/api/v1/gems/#{gem_name}.json"
end
server_results() click to toggle source
# File lib/u3d_core/update_checker/update_checker.rb, line 48
def self.server_results
  @results ||= {}
end
show_update_message(gem_name, current_version) click to toggle source

Show a message to the user to update to a new version of u3d Use this method, as this will detect the current Ruby environment and show an appropriate message to the user

# File lib/u3d_core/update_checker/update_checker.rb, line 74
def self.show_update_message(gem_name, current_version)
  available = server_results[gem_name]
  puts("")
  puts('#######################################################################')
  if available
    puts("# #{gem_name} #{available} is available. You are on #{current_version}.")
  else
    puts("# An update for #{gem_name} is available. You are on #{current_version}.")
  end
  puts("# You should use the latest version.")
  puts("# Please update using `#{update_command(gem_name: gem_name)}`.")

  # this could be fetched from the gem
  puts("# To see what's new, open https://github.com/DragonBox/#{gem_name}/releases.") if U3dCore::Env.truthy?("U3D_HIDE_CHANGELOG")

  if !Helper.bundler? && Random.rand(5) == 1
    # We want to show this message from time to time, if the user doesn't use bundler
    puts('#######################################################################')
    puts("# Run `sudo gem cleanup` from time to time to speed up u3d")
  end
  puts('#######################################################################')
  Changelog.show_changes(gem_name, current_version, update_gem_command: UpdateChecker.update_command(gem_name)) unless U3dCore::Env.truthy?("U3D_HIDE_CHANGELOG")

  ensure_rubygems_source
end
show_update_status(gem_name, current_version) click to toggle source
# File lib/u3d_core/update_checker/update_checker.rb, line 66
def self.show_update_status(gem_name, current_version)
  wait_for_results unless update_available?(gem_name, current_version)
  show_update_message(gem_name, current_version) if update_available?(gem_name, current_version)
end
start_looking_for_update(gem_name) click to toggle source
# File lib/u3d_core/update_checker/update_checker.rb, line 31
def self.start_looking_for_update(gem_name)
  return if Helper.test?
  return if U3dCore::Env.truthy?("U3D_SKIP_UPDATE_CHECK")

  @start_time = Time.now

  Thread.new do
    begin
      server_results[gem_name] = fetch_latest(gem_name)
      # rubocop:disable Lint/HandleExceptions
    rescue StandardError
      # rubocop:enable Lint/HandleExceptions
      # we don't want to show a stack trace if something goes wrong
    end
  end
end
update_available?(gem_name, current_version) click to toggle source
# File lib/u3d_core/update_checker/update_checker.rb, line 56
def self.update_available?(gem_name, current_version)
  latest = server_results[gem_name]
  return (latest && (Gem::Version.new(latest) > Gem::Version.new(current_version)))
end
update_command(gem_name) click to toggle source

The command that the user should use to update the gem

# File lib/u3d_core/update_checker/update_checker.rb, line 101
def self.update_command(gem_name)
  if Helper.bundler?
    "bundle update #{gem_name.downcase}"
  else
    "sudo gem install #{gem_name.downcase}"
  end
end
wait_for_results() click to toggle source

wait a abit for results when commands run real quick

# File lib/u3d_core/update_checker/update_checker.rb, line 62
def self.wait_for_results
  sleep([0, 0.4 - (Time.now - @start_time)].max) if @start_time
end