Skip to content

Commit

Permalink
Test "getframe_fallback" separately and not against all unit tests
Browse files Browse the repository at this point in the history
  • Loading branch information
Delgan committed Nov 3, 2017
1 parent d4970e8 commit 80f8748
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 18 deletions.
19 changes: 11 additions & 8 deletions loguru/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,21 +56,24 @@

start_time = now()

def get_frame_fallback(_):
def getframe_fallback(n):
"""Return the frame object for the caller's stack frame."""
try:
raise Exception
except Exception:
return exc_info()[2].tb_frame.f_back.f_back
frame = exc_info()[2].tb_frame.f_back
for _ in range(n):
frame = frame.f_back
return frame

def get_get_frame_function():
def get_getframe_function():
if hasattr(sys, '_getframe'):
get_frame = sys._getframe
getframe = sys._getframe
else:
get_frame = get_frame_fallback
return get_frame
getframe = getframe_fallback
return getframe

get_frame = get_get_frame_function()
getframe = get_getframe_function()

def patch_datetime(date):
date._FORMATTER = 'alternative'
Expand Down Expand Up @@ -707,7 +710,7 @@ def make_log_function(level, log_exception=0):
level_name = getLevelName(level)

def log_function(self, message, *args, **kwargs):
frame = get_frame(1)
frame = getframe(1)
name = frame.f_globals['__name__']

# TODO: Early exit if no handler
Expand Down
5 changes: 0 additions & 5 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,6 @@
import pytest
import sys

@pytest.fixture(autouse=True, params=['with_sys_getframe', 'without_sys_getframe'])
def with_and_without_sys_getframe(request, monkeypatch):
if request.param == 'without_sys_getframe':
monkeypatch.setattr(loguru, 'get_frame', loguru.get_frame_fallback)

@pytest.fixture
def logger():
return loguru.Logger()
Expand Down
28 changes: 23 additions & 5 deletions tests/test_get_frame.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,30 @@
import sys

import pytest
import loguru

def test_with_get_frame(monkeypatch):
def test_with_sys_getframe(monkeypatch):
patched = lambda: None
monkeypatch.setattr(sys, '_getframe', patched)
assert loguru.get_get_frame_function() == patched
assert loguru.get_getframe_function() == patched

def test_without_get_frame(monkeypatch):
def test_without_sys_getframe(monkeypatch):
monkeypatch.delattr(sys, '_getframe')
assert loguru.get_get_frame_function() == loguru.get_frame_fallback
assert loguru.get_getframe_function() == loguru.getframe_fallback

def test_getframe_fallback():
frame_root = frame_a = frame_b = None

def a():
nonlocal frame_a
frame_a = loguru.getframe_fallback(1)
b()

def b():
nonlocal frame_b
frame_b = loguru.getframe_fallback(2)

frame_root = loguru.getframe_fallback(0)
a()

assert frame_a == frame_b == frame_root

0 comments on commit 80f8748

Please sign in to comment.