diff --git a/ppb/sprites.py b/ppb/sprites.py index 03e648c7..f9b0cf8e 100644 --- a/ppb/sprites.py +++ b/ppb/sprites.py @@ -1,8 +1,5 @@ from inspect import getfile -from numbers import Number -from os.path import realpath from pathlib import Path -from typing import Dict, Iterable, Sequence from typing import Union from ppb import Vector @@ -296,5 +293,9 @@ def __image__(self): def __resource_path__(self): if self.resource_path is None: - self.resource_path = Path(realpath(getfile(type(self)))).absolute().parent + try: + file_path = Path(getfile(type(self))).resolve().parent + except TypeError: + file_path = Path.cwd().resolve() + self.resource_path = file_path return self.resource_path diff --git a/tests/test_sprites.py b/tests/test_sprites.py index 1a264f1f..da84761f 100644 --- a/tests/test_sprites.py +++ b/tests/test_sprites.py @@ -1,4 +1,5 @@ from unittest import TestCase +from unittest.mock import patch from ppb import BaseSprite, Vector from ppb.sprites import Rotatable @@ -325,3 +326,18 @@ def test_rotatable_base_sprite(): test_sprite.rotate(1) assert test_sprite.rotation == 1 + + +def test_sprite_in_main(): + """ + Test that Sprite.__resource_path__ returns a meaningful value inside + REPLs where __main__ doesn't have a file. + """ + class TestSprite(BaseSprite): + pass + + s = TestSprite() + + with patch("ppb.sprites.getfile", side_effect=TypeError): + # This patch simulates what happens when TestSprite was defined in the REPL + assert s.__resource_path__() # We don't care what it is, as long as it's something