Skip to content

Commit afe9660

Browse files
authored
fix: allow import service defined under a Python package (#3794)
fix import service defined under a python package
1 parent 8a07c19 commit afe9660

File tree

7 files changed

+74
-1
lines changed

7 files changed

+74
-1
lines changed

src/bentoml/_internal/service/loader.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ def recover_standalone_env_change():
102102
'"<module>:<attribute>" or "<module>'
103103
)
104104

105-
if os.path.exists(import_path):
105+
if os.path.isfile(import_path):
106106
import_path = os.path.realpath(import_path)
107107
# Importing from a module file path:
108108
if not import_path.startswith(working_dir):

tests/unit/_internal/service_loader/bento_service_in_module/__init__.py

Whitespace-only changes.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import bentoml
2+
3+
svc_i = bentoml.Service("test-bento-service-in-module-i")
4+
svc_ii = bentoml.Service("test-bento-service-in-module-ii")
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import bentoml
2+
3+
svc = bentoml.Service("test-bento-service-in-module-single")
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
import bentoml
2+
3+
svc_i = bentoml.Service("test-multi-service-in-package-i")
4+
svc_ii = bentoml.Service("test-multi-service-in-package-ii")
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import bentoml
2+
3+
svc = bentoml.Service("test-bento-service-in-package")
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import pytest
2+
3+
from bentoml.exceptions import ImportServiceError
4+
from bentoml._internal.service.loader import import_service
5+
6+
7+
@pytest.mark.usefixtures("change_test_dir")
8+
def test_load_by_service_file():
9+
svc = import_service("bento_service_in_module/single_service.py")
10+
assert svc.name == "test-bento-service-in-module-single"
11+
12+
svc = import_service("./bento_service_in_module/single_service.py:svc")
13+
assert svc.name == "test-bento-service-in-module-single"
14+
15+
svc = import_service("./single_service_in_package/__init__.py")
16+
assert svc.name == "test-bento-service-in-package"
17+
18+
svc = import_service("./single_service_in_package/__init__.py:svc")
19+
assert svc.name == "test-bento-service-in-package"
20+
21+
22+
@pytest.mark.usefixtures("change_test_dir")
23+
def test_load_by_module_name():
24+
svc = import_service("bento_service_in_module.single_service")
25+
assert svc.name == "test-bento-service-in-module-single"
26+
27+
svc = import_service("bento_service_in_module.single_service:svc")
28+
assert svc.name == "test-bento-service-in-module-single"
29+
30+
svc = import_service("single_service_in_package")
31+
assert svc.name == "test-bento-service-in-package"
32+
33+
svc = import_service("single_service_in_package:svc")
34+
assert svc.name == "test-bento-service-in-package"
35+
36+
37+
@pytest.mark.usefixtures("change_test_dir")
38+
def test_load_multi_service_module():
39+
svc = import_service("bento_service_in_module.multi_service:svc_i")
40+
assert svc.name == "test-bento-service-in-module-i"
41+
42+
svc = import_service("bento_service_in_module.multi_service:svc_ii")
43+
assert svc.name == "test-bento-service-in-module-ii"
44+
45+
with pytest.raises(
46+
ImportServiceError, match="Multiple Service instances found in module"
47+
):
48+
import_service("bento_service_in_module.multi_service")
49+
50+
svc = import_service("multi_service_in_package:svc_i")
51+
assert svc.name == "test-multi-service-in-package-i"
52+
53+
svc = import_service("multi_service_in_package:svc_ii")
54+
assert svc.name == "test-multi-service-in-package-ii"
55+
56+
with pytest.raises(
57+
ImportServiceError, match="Multiple Service instances found in module"
58+
):
59+
import_service("multi_service_in_package")

0 commit comments

Comments
 (0)