Skip to content

Commit 5807727

Browse files
committed
Update config handling
1 parent d9137aa commit 5807727

File tree

5 files changed

+46
-10
lines changed

5 files changed

+46
-10
lines changed

src/apify/_actor.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
from apify_client import ApifyClientAsync
1515
from apify_shared.consts import ActorEnvVars, ActorExitCodes, ApifyEnvVars
16-
from crawlee import service_locator
1716
from crawlee.events import (
1817
Event,
1918
EventAbortingData,
@@ -25,7 +24,7 @@
2524
)
2625

2726
from apify._charging import ChargeResult, ChargingManager, ChargingManagerImplementation
28-
from apify._configuration import Configuration
27+
from apify._configuration import Configuration, service_locator
2928
from apify._consts import EVENT_LISTENERS_TIMEOUT
3029
from apify._crypto import decrypt_input_secrets, load_private_key
3130
from apify._models import ActorRun
@@ -119,7 +118,9 @@ def __init__(
119118
self._exit_process = self._get_default_exit_process() if exit_process is None else exit_process
120119
self._is_exiting = False
121120

122-
self._configuration = configuration or Configuration.get_global_configuration()
121+
if configuration:
122+
service_locator.set_configuration(configuration)
123+
self._configuration = service_locator.get_configuration()
123124
self._configure_logging = configure_logging
124125
self._apify_client = self.new_client()
125126

src/apify/_configuration.py

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
from pydantic import AliasChoices, BeforeValidator, Field, model_validator
1010
from typing_extensions import Self, deprecated
1111

12+
import crawlee
13+
from crawlee._service_locator import ServiceLocator
1214
from crawlee._utils.models import timedelta_ms
1315
from crawlee._utils.urls import validate_http_url
1416
from crawlee.configuration import Configuration as CrawleeConfiguration
@@ -429,8 +431,25 @@ def get_global_configuration(cls) -> Configuration:
429431
Mostly for the backwards compatibility. It is recommended to use the `service_locator.get_configuration()`
430432
instead.
431433
"""
432-
return cls()
434+
return service_locator.get_configuration()
433435

434436

435-
# Monkey-patch the base class so that it works with the extended configuration
436-
CrawleeConfiguration.get_global_configuration = Configuration.get_global_configuration # type: ignore[method-assign]
437+
class ApifyServiceLocator(ServiceLocator):
438+
"""Same as ServiceLocator from Crawlee, but it always returns Apify Configuration."""
439+
440+
def get_configuration(self) -> Configuration:
441+
# ApifyServiceLocator can store any children of Crawlee Configuration, but in Apify context it is desired to
442+
# return Apify Configuration.
443+
stored_configuration = super().get_configuration()
444+
# Ensure the returned configuration is of type Apify Configuration.
445+
model_dump = stored_configuration.model_dump()
446+
# The configuration will read env variables first and overridden with stored_configuration
447+
_config = Configuration()
448+
for key in model_dump:
449+
setattr(_config, key, model_dump[key])
450+
return _config
451+
452+
453+
# Ensure that ApifyServiceLocator is used to make sure Apify Configuration is used.
454+
service_locator = ApifyServiceLocator()
455+
crawlee.service_locator = ApifyServiceLocator()

tests/unit/actor/test_configuration.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import pytest
22

3-
from apify import Configuration
3+
from crawlee.configuration import Configuration as CrawleeConfiguration
4+
5+
from apify import Configuration as ApifyConfiguration
6+
from apify._configuration import service_locator
47

58

69
@pytest.mark.parametrize(
@@ -16,6 +19,19 @@ def test_disable_browser_sandbox(
1619
*, is_at_home: bool, disable_browser_sandbox_in: bool, disable_browser_sandbox_out: bool
1720
) -> None:
1821
assert (
19-
Configuration(is_at_home=is_at_home, disable_browser_sandbox=disable_browser_sandbox_in).disable_browser_sandbox
22+
ApifyConfiguration(
23+
is_at_home=is_at_home, disable_browser_sandbox=disable_browser_sandbox_in
24+
).disable_browser_sandbox
2025
== disable_browser_sandbox_out
2126
)
27+
28+
29+
def test_apify_configuration_is_always_used() -> None:
30+
"""Set Crawlee Configuration in service_locator and verify that Apify Configuration is returned."""
31+
# Some value to verify
32+
max_used_cpu_ratio = 0.123456
33+
service_locator.set_configuration(CrawleeConfiguration(max_used_cpu_ratio=max_used_cpu_ratio))
34+
35+
returned_config = service_locator.get_configuration()
36+
assert returned_config.max_used_cpu_ratio == max_used_cpu_ratio
37+
assert isinstance(returned_config, ApifyConfiguration)

tests/unit/conftest.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@
1313

1414
from apify_client import ApifyClientAsync
1515
from apify_shared.consts import ApifyEnvVars
16-
from crawlee import service_locator
1716

1817
import apify._actor
18+
from apify._configuration import service_locator
1919

2020
if TYPE_CHECKING:
2121
from collections.abc import Callable, Iterator

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)