-
Notifications
You must be signed in to change notification settings - Fork 466
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* move logger over * fix default log level and tests * rubocop and sorbet * add bearer token log * make enabled_for_log_level and send_to_logger private * context should have nil shop * moving log level error to context * remove setter and add stub to test * add levels method to logger * add valid version method for better version comparision * change log to warn * log_level as string or symbol * unit tests for logger Co-authored-by: Bill Klenotiz <klenotiw@users.noreply.github.com> Co-authored-by: Nelson Wittwer <nelson.wittwer@shopify.com>
- Loading branch information
1 parent
fe85bf5
commit 211245b
Showing
8 changed files
with
259 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# typed: strict | ||
# frozen_string_literal: true | ||
|
||
module ShopifyAPI | ||
module Errors | ||
class FeatureDeprecatedError < StandardError | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
# typed: strict | ||
# frozen_string_literal: true | ||
|
||
module ShopifyAPI | ||
module Errors | ||
class LogLevelNotFoundError < StandardError | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
# typed: strict | ||
# frozen_string_literal: true | ||
|
||
module ShopifyAPI | ||
class Logger | ||
LOG_LEVELS = T.let({ debug: 0, info: 1, warn: 2, error: 3, off: 6 }, T::Hash[Symbol, Integer]) | ||
DEFAULT_LOG_LEVEL = :info | ||
|
||
class << self | ||
extend T::Sig | ||
|
||
sig { params(message: String).void } | ||
def debug(message) | ||
send_to_logger(:debug, message) | ||
end | ||
|
||
sig { params(message: String).void } | ||
def info(message) | ||
send_to_logger(:info, message) | ||
end | ||
|
||
sig { params(message: String).void } | ||
def warn(message) | ||
send_to_logger(:warn, message) | ||
end | ||
|
||
sig { params(message: String).void } | ||
def error(message) | ||
send_to_logger(:error, message) | ||
end | ||
|
||
sig { params(message: String, version: String).void } | ||
def deprecated(message, version) | ||
return unless enabled_for_log_level?(:warn) | ||
|
||
raise Errors::FeatureDeprecatedError unless valid_version(version) | ||
|
||
send_to_logger(:warn, message) | ||
end | ||
|
||
sig { returns(T::Array[Symbol]) } | ||
def levels | ||
LOG_LEVELS.keys | ||
end | ||
|
||
private | ||
|
||
sig { params(log_level: Symbol).returns(String) } | ||
def context(log_level) | ||
current_shop = ShopifyAPI::Context.active_session&.shop | ||
|
||
if current_shop.nil? | ||
"[ ShopifyAPI | #{log_level.to_s.upcase} ]" | ||
else | ||
"[ ShopifyAPI | #{log_level.to_s.upcase} | #{current_shop} ]" | ||
end | ||
end | ||
|
||
sig { params(log_level: Symbol, message: String).void } | ||
def send_to_logger(log_level, message) | ||
return unless enabled_for_log_level?(log_level) | ||
|
||
full_message = "#{context(log_level)} #{message}" | ||
|
||
ShopifyAPI::Context.logger.public_send(log_level, full_message) | ||
end | ||
|
||
sig { params(log_level: Symbol).returns(T::Boolean) } | ||
def enabled_for_log_level?(log_level) | ||
T.must(LOG_LEVELS[log_level]) >= T.must(LOG_LEVELS[ShopifyAPI::Context.log_level] || | ||
LOG_LEVELS[DEFAULT_LOG_LEVEL]) | ||
end | ||
|
||
sig { params(version: String).returns(T::Boolean) } | ||
def valid_version(version) | ||
current_version = Gem::Version.create(ShopifyAPI::VERSION) | ||
deprecate_version = Gem::Version.create(version) | ||
current_version < deprecate_version | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,97 @@ | ||
# typed: true | ||
# frozen_string_literal: true | ||
|
||
require_relative "./test_helper" | ||
|
||
module ShopifyAPITest | ||
class LoggerTest < Minitest::Test | ||
def test_deprecated_should_raise_an_error_if_version_is_lower_or_equal_to_current | ||
ShopifyAPI::Context.stubs(:log_level).returns(:warn) | ||
|
||
assert_raises(ShopifyAPI::Errors::FeatureDeprecatedError) do | ||
ShopifyAPI::Logger.deprecated("deprecated feature", ShopifyAPI::VERSION) | ||
end | ||
end | ||
|
||
def test_logging_with_log_levels | ||
expected_log_levels = [:debug, :info, :warn, :error] | ||
expected_log_levels.each do |log_level| | ||
test_when_expected_to_log_with_active_session(log_level) | ||
test_when_expected_to_log_without_active_session(log_level) | ||
end | ||
end | ||
|
||
def test_logging_is_ignored_if_below_log_level | ||
loggable_levels = ShopifyAPI::Logger::LOG_LEVELS.keys - [:off] | ||
log_level_mapping = { | ||
debug: [:debug, :info, :warn, :error], | ||
info: [:info, :warn, :error], | ||
warn: [:warn, :error], | ||
error: [:error], | ||
off: [], | ||
} | ||
stub_active_session(nil) | ||
message = "What kind of sushi does a lumberjack order? A log roll" | ||
|
||
log_level_mapping.each do |log_level, expected_loggable_levels| | ||
ignored_log_levels = loggable_levels - expected_loggable_levels | ||
|
||
expected_loggable_levels.each do |expected_to_log_level| | ||
stub_log_level(log_level) | ||
ShopifyAPI::Context.logger.expects(expected_to_log_level) | ||
ShopifyAPI::Logger.send(expected_to_log_level, message) | ||
end | ||
|
||
ignored_log_levels.each do |ignored_log_level| | ||
stub_log_level(log_level) | ||
ShopifyAPI::Context.logger.expects(ignored_log_level).never | ||
ShopifyAPI::Logger.send(ignored_log_level, message) | ||
end | ||
end | ||
end | ||
|
||
private | ||
|
||
def test_when_expected_to_log_with_active_session(log_level) | ||
stub_log_level(log_level) | ||
message = "What did the tree say to the lumberjack? Leaf me alone" | ||
shop_name = "Little shop of horrors" | ||
stub_active_session(shop_name) | ||
expected_log = "#{logging_context(log_level, shop_name)} #{message}" | ||
|
||
ShopifyAPI::Context.logger.expects(log_level).with(expected_log) | ||
ShopifyAPI::Logger.public_send(log_level, message) | ||
end | ||
|
||
def test_when_expected_to_log_without_active_session(log_level) | ||
stub_log_level(log_level) | ||
message = "What did the tree say to the lumberjack? Leaf me alone" | ||
stub_active_session(nil) | ||
expected_log = "#{logging_context(log_level)} #{message}" | ||
|
||
ShopifyAPI::Context.logger.expects(log_level).with(expected_log) | ||
ShopifyAPI::Logger.public_send(log_level, message) | ||
end | ||
|
||
def stub_log_level(log_level) | ||
ShopifyAPI::Context.expects(:log_level).returns(log_level) | ||
end | ||
|
||
def stub_active_session(shop_name) | ||
if shop_name | ||
session = ShopifyAPI::Auth::Session.new(shop: shop_name) | ||
ShopifyAPI::Context.stubs(:active_session).returns(session) | ||
else | ||
ShopifyAPI::Context.stubs(:active_session).returns(nil) | ||
end | ||
end | ||
|
||
def logging_context(log_level, shop_name = nil) | ||
if shop_name | ||
"[ ShopifyAPI | #{log_level.to_s.upcase} | #{shop_name} ]" | ||
else | ||
"[ ShopifyAPI | #{log_level.to_s.upcase} ]" | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters