Skip to content

Commit

Permalink
Add version check if newer CLI available (#30)
Browse files Browse the repository at this point in the history
  • Loading branch information
trevor-e authored Dec 13, 2024
1 parent e27c5d6 commit 058fb54
Show file tree
Hide file tree
Showing 6 changed files with 92 additions and 3 deletions.
2 changes: 2 additions & 0 deletions lib/commands/global_options.rb
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ class GlobalOptions < Dry::CLI::Command
def before(args)
log_level = args[:debug] ? ::Logger::DEBUG : ::Logger::INFO
EmergeCLI::Logger.configure(log_level)

EmergeCLI::Utils::VersionCheck.new.check_version
end
end
end
Expand Down
1 change: 1 addition & 0 deletions lib/emerge_cli.rb
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
require_relative 'utils/network'
require_relative 'utils/profiler'
require_relative 'utils/project_detector'
require_relative 'utils/version_check'

require 'dry/cli'
require 'pry'
Expand Down
4 changes: 2 additions & 2 deletions lib/utils/network.rb
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ class Network
RETRY_DELAY = 5
MAX_RETRIES = 3

def initialize(api_token:, base_url: EMERGE_API_PROD_URL)
def initialize(api_token: nil, base_url: EMERGE_API_PROD_URL)
@base_url = base_url
@api_token = api_token
@internet = Async::HTTP::Internet.new
Expand Down Expand Up @@ -49,9 +49,9 @@ def request(method, path, body, custom_headers, query = nil)
absolute_uri = uri.to_s

headers = {
'X-API-Token' => @api_token,
'User-Agent' => "emerge-cli/#{EmergeCLI::VERSION}"
}
headers['X-API-Token'] = @api_token if @api_token
headers['Content-Type'] = 'application/json' if method == :post && body.is_a?(Hash)
headers.merge!(custom_headers)

Expand Down
32 changes: 32 additions & 0 deletions lib/utils/version_check.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
require 'json'

module EmergeCLI
module Utils
class VersionCheck
def initialize(network: EmergeCLI::Network.new)
@network = network
end

def check_version
Sync do
response = @network.get(
path: 'https://rubygems.org/api/v1/gems/emerge.json',
headers: {}
)
latest_version = JSON.parse(response.read).fetch('version')
current_version = EmergeCLI::VERSION

if Gem::Version.new(latest_version) > Gem::Version.new(current_version)
Logger.warn "A new version of emerge-cli is available (#{latest_version})"
Logger.warn "You are currently using version #{current_version}"
Logger.warn "To update, run: gem update emerge\n"
end
end
rescue KeyError
Logger.error 'Failed to parse version from RubyGems API response'
rescue StandardError => e
Logger.error "Failed to check for updates: #{e.message}"
end
end
end
end
1 change: 0 additions & 1 deletion test/reaper/ast_parser_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -830,7 +830,6 @@ class Factory(private val bookmarkDao: BookmarkDao) : ViewModelProvider.Factory
end

def test_removes_nested_object_class_from_kotlin_file
EmergeCLI::Logger.configure(::Logger::DEBUG)
language = 'kotlin'
parser = AstParser.new(language)
file_contents = <<~KOTLIN.strip
Expand Down
55 changes: 55 additions & 0 deletions test/utils/version_check_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
require 'test_helper'

module EmergeCLI
module Utils
class VersionCheckTest < Minitest::Test
def setup
@network = FakeNetwork.new
@version_check = VersionCheck.new(network: @network)
end

def test_warns_when_newer_version_available
@network = FakeNetwork.new(
'https://rubygems.org/api/v1/gems/emerge.json' => '{"version": "999.0.0"}'
)
@version_check = VersionCheck.new(network: @network)

Logger.stub :warn, lambda { |msg|
@captured_warnings ||= []
@captured_warnings << msg
} do
@version_check.check_version
end

assert_equal 3, @captured_warnings.length
assert_match(/A new version of emerge-cli is available \(999.0.0\)/, @captured_warnings[0])
assert_match(/You are currently using version #{EmergeCLI::VERSION}/, @captured_warnings[1])
assert_match(/To update, run: gem update emerge/, @captured_warnings[2])
end

def test_silent_when_current_version
@network = FakeNetwork.new(
'https://rubygems.org/api/v1/gems/emerge.json' => "{\"version\": \"#{EmergeCLI::VERSION}\"}"
)
@version_check = VersionCheck.new(network: @network)

Logger.stub :warn, ->(_msg) { flunk 'Should not warn when version is current' } do
@version_check.check_version
end
end

def test_logs_error_when_version_key_missing
@network = FakeNetwork.new(
'https://rubygems.org/api/v1/gems/emerge.json' => '{}'
)
@version_check = VersionCheck.new(network: @network)

Logger.stub :error, ->(msg) { @error_message = msg } do
@version_check.check_version
end

assert_equal 'Failed to parse version from RubyGems API response', @error_message
end
end
end
end

0 comments on commit 058fb54

Please sign in to comment.