Skip to content

Commit db5f85a

Browse files
committed
Added http_defaults and http_config_for_url_prefix configs
1 parent 57ef59d commit db5f85a

File tree

5 files changed

+64
-12
lines changed

5 files changed

+64
-12
lines changed

src/omnipy/api/enums.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,10 @@ class RunStateLogMessages(str, Enum):
6565
INITIALIZED = 'Initialized "{}"'
6666
RUNNING = 'Started running "{}"...'
6767
FINISHED = 'Finished running "{}"!'
68+
69+
70+
class BackoffStrategy(str, Enum):
71+
EXPONENTIAL = 'exponential'
72+
JITTER = 'jitter'
73+
FIBONACCI = 'fibonacci'
74+
RANDOM = 'random'

src/omnipy/api/protocols/public/config.py

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
from collections import defaultdict
12
from typing import Protocol, TextIO
23

3-
from omnipy.api.enums import (ConfigOutputStorageProtocolOptions,
4+
from omnipy.api.enums import (BackoffStrategy,
5+
ConfigOutputStorageProtocolOptions,
46
ConfigPersistOutputsOptions,
57
ConfigRestoreOutputsOptions)
68
from omnipy.api.typedefs import LocaleType
@@ -32,6 +34,17 @@ class IsDataConfig(Protocol):
3234
dynamically_convert_elements_to_models: bool
3335
terminal_size_columns: int
3436
terminal_size_lines: int
37+
http_defaults: 'IsHttpConfig'
38+
http_config_for_url_prefix: defaultdict[str, 'IsHttpConfig']
39+
40+
41+
class IsHttpConfig(Protocol):
42+
""""""
43+
requests_per_time_period: float
44+
time_period_in_secs: float
45+
retry_http_statuses: tuple[int, ...]
46+
retry_attempts: int
47+
retry_backoff_strategy: BackoffStrategy
3548

3649

3750
class IsRootLogConfig(Protocol):

src/omnipy/config/data.py

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,35 @@
1-
from dataclasses import dataclass
1+
from collections import defaultdict
2+
from copy import copy
3+
from dataclasses import dataclass, field
24
import shutil
35

6+
from omnipy.api.enums import BackoffStrategy
7+
from omnipy.api.protocols.public.config import IsHttpConfig
8+
49
_terminal_size = shutil.get_terminal_size()
510

611

12+
@dataclass
13+
class HttpConfig:
14+
# For RateLimitingClientSession helper class
15+
requests_per_time_period: float = 60
16+
time_period_in_secs: float = 60
17+
18+
# For get_*_from_api_endpoint tasks
19+
retry_http_statuses: tuple[int, ...] = (408, 425, 429, 500, 502, 503, 504)
20+
retry_attempts: int = 5
21+
retry_backoff_strategy: BackoffStrategy = BackoffStrategy.EXPONENTIAL
22+
23+
724
@dataclass
825
class DataConfig:
926
interactive_mode: bool = True
1027
dynamically_convert_elements_to_models: bool = False
1128
terminal_size_columns: int = _terminal_size.columns
1229
terminal_size_lines: int = _terminal_size.lines
30+
http_defaults: IsHttpConfig = field(default_factory=HttpConfig)
31+
http_config_for_url_prefix: defaultdict[str, IsHttpConfig] = field(
32+
default_factory=lambda: defaultdict(HttpConfig))
33+
34+
def __post_init__(self):
35+
self.http_config_for_url_prefix = defaultdict(lambda: copy(self.http_defaults))

src/omnipy/modules/remote/tasks.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from enum import Enum
21
from typing import AsyncGenerator, cast
32

43
from aiohttp import ClientResponse, ClientSession
54
from aiohttp_retry import ExponentialRetry, FibonacciRetry, JitterRetry, RandomRetry, RetryClient
65

6+
from omnipy.api.enums import BackoffStrategy
77
from omnipy.compute.task import TaskTemplate
88

99
from ..json.datasets import JsonDataset
@@ -12,14 +12,6 @@
1212
from ..raw.models import BytesModel, StrModel
1313
from .models import HttpUrlModel
1414

15-
16-
class BackoffStrategy(str, Enum):
17-
EXPONENTIAL = 'exponential'
18-
JITTER = 'jitter'
19-
FIBONACCI = 'fibonacci'
20-
RANDOM = 'random'
21-
22-
2315
DEFAULT_RETRIES = 5
2416
DEFAULT_BACKOFF_STRATEGY = BackoffStrategy.EXPONENTIAL
2517
DEFAULT_RETRY_STATUSES = (408, 425, 429, 500, 502, 503, 504)

tests/hub/runtime/test_runtime.py

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
from collections import defaultdict
12
import os
23
from pathlib import Path
34
from typing import Annotated, Type
45

56
import pytest
67

7-
from omnipy.api.enums import (ConfigOutputStorageProtocolOptions,
8+
from omnipy.api.enums import (BackoffStrategy,
9+
ConfigOutputStorageProtocolOptions,
810
ConfigPersistOutputsOptions,
911
ConfigRestoreOutputsOptions,
1012
EngineChoice)
@@ -59,6 +61,12 @@ def _assert_runtime_config_default(config: IsRuntimeConfig, dir_path: Path):
5961
assert config.data.dynamically_convert_elements_to_models is False
6062
assert config.data.terminal_size_columns == 80
6163
assert config.data.terminal_size_lines == 24
64+
assert config.data.http_defaults.requests_per_time_period == 60
65+
assert config.data.http_defaults.time_period_in_secs == 60
66+
assert config.data.http_defaults.retry_http_statuses == (408, 425, 429, 500, 502, 503, 504)
67+
assert config.data.http_defaults.retry_attempts == 5
68+
assert config.data.http_defaults.retry_backoff_strategy == BackoffStrategy.EXPONENTIAL
69+
assert isinstance(config.data.http_config_for_url_prefix, defaultdict)
6270
assert config.engine == EngineChoice.LOCAL
6371
assert config.prefect.use_cached_results is False
6472

@@ -104,6 +112,15 @@ def test_default_runtime(runtime: Annotated[IsRuntime, pytest.fixture],
104112
_assert_runtime_objects_default(runtime.objects)
105113

106114

115+
def test_data_config_http_config_for_url_prefix_default(
116+
runtime: Annotated[IsRuntime, pytest.fixture]) -> None:
117+
assert runtime.config.data.http_config_for_url_prefix['http://myserver.com']\
118+
.requests_per_time_period == 60
119+
runtime.config.data.http_defaults.requests_per_time_period = 30
120+
assert runtime.config.data.http_config_for_url_prefix['http://myserver.com']\
121+
.requests_per_time_period == 60
122+
123+
107124
def test_runtime_config_after_data_class_creator(
108125
runtime_cls: Annotated[Type[IsRuntime], pytest.fixture]) -> None:
109126
DataClassBase.data_class_creator.config.dynamically_convert_elements_to_models = True

0 commit comments

Comments
 (0)