scrapely-python 0.1.27__tar.gz → 0.1.30__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- scrapely_python-0.1.30/CHANGELOG.md +12 -0
- scrapely_python-0.1.30/MANIFEST.in +2 -0
- scrapely_python-0.1.30/NOTICE +16 -0
- {scrapely_python-0.1.27/src/scrapely_python.egg-info → scrapely_python-0.1.30}/PKG-INFO +10 -9
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/README.md +4 -5
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/pyproject.toml +6 -4
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/__init__.py +2 -2
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/actor.py +22 -22
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/charging.py +274 -50
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/configuration.py +7 -8
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/errors.py +1 -2
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/events/__init__.py +1 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/log.py +8 -4
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/pricing_types.py +1 -6
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/proxy_configuration.py +36 -42
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/request_loaders/_scrapely_request_list.py +2 -2
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/solver.py +1 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/__init__.py +1 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/_file_system/__init__.py +1 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/_file_system/_key_value_store_client.py +5 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/_file_system/_storage_client.py +5 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/api_client.py +2 -2
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/client.py +4 -4
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/patch_storage.py +4 -4
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/scrapely_rq_client.py +1 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/scrapely_storage_client.py +3 -3
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/smart_scrapely_storage_client.py +5 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/types.py +2 -2
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/utils.py +4 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage_clients/__init__.py +2 -2
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storages/__init__.py +1 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/types.py +2 -3
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/webhook.py +1 -1
- {scrapely_python-0.1.27 → scrapely_python-0.1.30/src/scrapely_python.egg-info}/PKG-INFO +10 -9
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely_python.egg-info/SOURCES.txt +3 -21
- scrapely_python-0.1.27/NOTICE +0 -27
- scrapely_python-0.1.27/tests/test_api_client_retries.py +0 -241
- scrapely_python-0.1.27/tests/test_apify_parity.py +0 -135
- scrapely_python-0.1.27/tests/test_browser_configuration.py +0 -93
- scrapely_python-0.1.27/tests/test_cdp_retry.py +0 -169
- scrapely_python-0.1.27/tests/test_charge_limit_guard.py +0 -825
- scrapely_python-0.1.27/tests/test_charge_retries.py +0 -195
- scrapely_python-0.1.27/tests/test_charging_parity.py +0 -378
- scrapely_python-0.1.27/tests/test_charging_pending.py +0 -745
- scrapely_python-0.1.27/tests/test_debug_capture.py +0 -54
- scrapely_python-0.1.27/tests/test_input_proxy_aliases.py +0 -98
- scrapely_python-0.1.27/tests/test_lazy_crawlee.py +0 -311
- scrapely_python-0.1.27/tests/test_parity.py +0 -381
- scrapely_python-0.1.27/tests/test_patch_browser_pool.py +0 -1212
- scrapely_python-0.1.27/tests/test_proxy_configuration.py +0 -755
- scrapely_python-0.1.27/tests/test_push_idempotency.py +0 -242
- scrapely_python-0.1.27/tests/test_run_control.py +0 -499
- scrapely_python-0.1.27/tests/test_secrets.py +0 -134
- scrapely_python-0.1.27/tests/test_solver.py +0 -327
- scrapely_python-0.1.27/tests/test_storage.py +0 -477
- scrapely_python-0.1.27/tests/test_terminal_status_message.py +0 -149
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/LICENSE +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/LICENSE-APACHE +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/setup.cfg +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/_browser_locations.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/browser_configuration.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/cdp_retry.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/charging_client.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/crypto/__init__.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/crypto/_secrets.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/events/_types.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/events/event_manager.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/patch_browser_pool.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/py.typed +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/request_loaders/__init__.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/_metadata.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/scrapely_dataset_client.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely/storage/scrapely_kvs_client.py +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely_python.egg-info/dependency_links.txt +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely_python.egg-info/requires.txt +0 -0
- {scrapely_python-0.1.27 → scrapely_python-0.1.30}/src/scrapely_python.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project will be documented in this file.
|
|
4
|
+
|
|
5
|
+
## [0.1.30] - 2026-10-20
|
|
6
|
+
|
|
7
|
+
- Removed `apify_margin_percentage` from the pricing info models; the API no longer returns it.
|
|
8
|
+
- Added Apache-2.0 change notices to the storage clients, storage utils and log module derived from apify-sdk-python, and listed them in NOTICE.
|
|
9
|
+
|
|
10
|
+
## [0.1.29] - 2026-10-19
|
|
11
|
+
|
|
12
|
+
- Initial public release.
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
scrapely-python
|
|
2
|
+
Copyright (c) 2025-2026 TeraShift GmbH (Scrape.ly)
|
|
3
|
+
|
|
4
|
+
Licensed under the MIT License (see LICENSE), except for the files below,
|
|
5
|
+
which are derived from apify-sdk-python (https://github.com/apify/apify-sdk-python),
|
|
6
|
+
Copyright Apify Technologies s.r.o., and remain under the Apache License,
|
|
7
|
+
Version 2.0 (see LICENSE-APACHE). They have been modified by TeraShift GmbH:
|
|
8
|
+
|
|
9
|
+
- src/scrapely/events/_types.py
|
|
10
|
+
- src/scrapely/events/event_manager.py
|
|
11
|
+
- src/scrapely/log.py
|
|
12
|
+
- src/scrapely/request_loaders/_scrapely_request_list.py
|
|
13
|
+
- src/scrapely/storage/_file_system/_key_value_store_client.py
|
|
14
|
+
- src/scrapely/storage/_file_system/_storage_client.py
|
|
15
|
+
- src/scrapely/storage/smart_scrapely_storage_client.py
|
|
16
|
+
- src/scrapely/storage/utils.py
|
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: scrapely-python
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.30
|
|
4
4
|
Summary: Scrapely Python SDK - A toolkit for building Actors on the Scrapely platform
|
|
5
5
|
Author-email: Scrapely <support@scrape.ly>
|
|
6
6
|
License-Expression: MIT AND Apache-2.0
|
|
7
7
|
Project-URL: Homepage, https://scrape.ly
|
|
8
|
-
Project-URL: Documentation, https://
|
|
9
|
-
Project-URL: Repository, https://github.com/
|
|
10
|
-
|
|
8
|
+
Project-URL: Documentation, https://scrape.ly/docs/sdk-python
|
|
9
|
+
Project-URL: Repository, https://github.com/scrapely-app/scrapely-python
|
|
10
|
+
Project-URL: Issues, https://github.com/scrapely-app/scrapely-python/issues
|
|
11
|
+
Project-URL: Changelog, https://github.com/scrapely-app/scrapely-python/blob/main/CHANGELOG.md
|
|
12
|
+
Keywords: scraping,actor,serverless,scrapely
|
|
11
13
|
Classifier: Development Status :: 3 - Alpha
|
|
12
14
|
Classifier: Intended Audience :: Developers
|
|
13
15
|
Classifier: Operating System :: OS Independent
|
|
@@ -43,7 +45,7 @@ Build Python Actors for the [Scrapely](https://scrape.ly) platform with lifecycl
|
|
|
43
45
|
|
|
44
46
|
## Install
|
|
45
47
|
|
|
46
|
-
Scrapely requires Python 3.
|
|
48
|
+
Scrapely requires Python 3.11 or newer.
|
|
47
49
|
|
|
48
50
|
```bash
|
|
49
51
|
python -m pip install scrapely-python
|
|
@@ -81,12 +83,11 @@ if __name__ == "__main__":
|
|
|
81
83
|
- Automatic remote Chromium CDP wiring through `CDP_URL`
|
|
82
84
|
- Actor start, call, abort, reboot, and metamorph operations
|
|
83
85
|
- Ad-hoc webhooks, proxy configuration, and charging/pricing types
|
|
84
|
-
-
|
|
86
|
+
- Legacy environment variable aliases and asynchronous client access
|
|
85
87
|
|
|
86
|
-
See the [complete Python SDK guide](
|
|
88
|
+
See the [complete Python SDK guide](https://scrape.ly/docs/sdk-python) for lifecycle details, option objects, storage selection, events, CDP behavior, run control, environment variables, errors, and the full public export list.
|
|
87
89
|
|
|
88
90
|
## License
|
|
89
91
|
|
|
90
|
-
MIT (see [LICENSE](./LICENSE)), except for three files
|
|
91
|
-
[apify-sdk-python](https://github.com/apify/apify-sdk-python), which stay under the Apache License 2.0
|
|
92
|
+
MIT (see [LICENSE](./LICENSE)), except for three files that stay under the Apache License 2.0
|
|
92
93
|
(see [LICENSE-APACHE](./LICENSE-APACHE) and [NOTICE](./NOTICE)).
|
|
@@ -4,7 +4,7 @@ Build Python Actors for the [Scrapely](https://scrape.ly) platform with lifecycl
|
|
|
4
4
|
|
|
5
5
|
## Install
|
|
6
6
|
|
|
7
|
-
Scrapely requires Python 3.
|
|
7
|
+
Scrapely requires Python 3.11 or newer.
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
python -m pip install scrapely-python
|
|
@@ -42,12 +42,11 @@ if __name__ == "__main__":
|
|
|
42
42
|
- Automatic remote Chromium CDP wiring through `CDP_URL`
|
|
43
43
|
- Actor start, call, abort, reboot, and metamorph operations
|
|
44
44
|
- Ad-hoc webhooks, proxy configuration, and charging/pricing types
|
|
45
|
-
-
|
|
45
|
+
- Legacy environment variable aliases and asynchronous client access
|
|
46
46
|
|
|
47
|
-
See the [complete Python SDK guide](
|
|
47
|
+
See the [complete Python SDK guide](https://scrape.ly/docs/sdk-python) for lifecycle details, option objects, storage selection, events, CDP behavior, run control, environment variables, errors, and the full public export list.
|
|
48
48
|
|
|
49
49
|
## License
|
|
50
50
|
|
|
51
|
-
MIT (see [LICENSE](./LICENSE)), except for three files
|
|
52
|
-
[apify-sdk-python](https://github.com/apify/apify-sdk-python), which stay under the Apache License 2.0
|
|
51
|
+
MIT (see [LICENSE](./LICENSE)), except for three files that stay under the Apache License 2.0
|
|
53
52
|
(see [LICENSE-APACHE](./LICENSE-APACHE) and [NOTICE](./NOTICE)).
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "scrapely-python"
|
|
7
|
-
version = "0.1.
|
|
7
|
+
version = "0.1.30"
|
|
8
8
|
description = "Scrapely Python SDK - A toolkit for building Actors on the Scrapely platform"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
license = "MIT AND Apache-2.0"
|
|
@@ -22,7 +22,7 @@ classifiers = [
|
|
|
22
22
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
23
23
|
"Topic :: Internet :: WWW/HTTP :: Dynamic Content",
|
|
24
24
|
]
|
|
25
|
-
keywords = ["scraping", "actor", "serverless", "
|
|
25
|
+
keywords = ["scraping", "actor", "serverless", "scrapely"]
|
|
26
26
|
requires-python = ">=3.11"
|
|
27
27
|
dependencies = [
|
|
28
28
|
"httpx>=0.25.0",
|
|
@@ -47,8 +47,10 @@ dev = [
|
|
|
47
47
|
|
|
48
48
|
[project.urls]
|
|
49
49
|
Homepage = "https://scrape.ly"
|
|
50
|
-
Documentation = "https://
|
|
51
|
-
Repository = "https://github.com/
|
|
50
|
+
Documentation = "https://scrape.ly/docs/sdk-python"
|
|
51
|
+
Repository = "https://github.com/scrapely-app/scrapely-python"
|
|
52
|
+
Issues = "https://github.com/scrapely-app/scrapely-python/issues"
|
|
53
|
+
Changelog = "https://github.com/scrapely-app/scrapely-python/blob/main/CHANGELOG.md"
|
|
52
54
|
|
|
53
55
|
[tool.setuptools.packages.find]
|
|
54
56
|
where = ["src"]
|
|
@@ -227,13 +227,13 @@ if TYPE_CHECKING: # Static analysers and IDEs see the lazy names as plain impor
|
|
|
227
227
|
set_api_storage,
|
|
228
228
|
)
|
|
229
229
|
|
|
230
|
-
__version__ = '0.1.
|
|
230
|
+
__version__ = '0.1.30'
|
|
231
231
|
__all__ = [
|
|
232
232
|
# Core
|
|
233
233
|
'Actor',
|
|
234
234
|
'Configuration',
|
|
235
235
|
'set_cdp_url',
|
|
236
|
-
#
|
|
236
|
+
# Charging client
|
|
237
237
|
'create_charging_client',
|
|
238
238
|
'USES_PUSH_DATA_INTERCEPTION',
|
|
239
239
|
'push_data_charging_context',
|
|
@@ -204,7 +204,7 @@ def _run_options_params(
|
|
|
204
204
|
force_permission_level: Optional[Any] = None,
|
|
205
205
|
webhooks: Optional[List[Any]] = None,
|
|
206
206
|
) -> Dict[str, Any]:
|
|
207
|
-
"""Build the
|
|
207
|
+
"""Build the run-option query parameters for run-start requests.
|
|
208
208
|
|
|
209
209
|
Server wire contract: the POST body of a run-start request is the run
|
|
210
210
|
input itself; run options (build/timeout/memory/maxTotalChargeUsd/
|
|
@@ -319,9 +319,9 @@ class Actor(metaclass=_ActorMeta):
|
|
|
319
319
|
exit_process: Optional[bool] = None,
|
|
320
320
|
event_listeners_timeout: Optional[timedelta] = None,
|
|
321
321
|
):
|
|
322
|
-
"""
|
|
322
|
+
"""Support ``async with Actor(configure_logging=False):`` as well as ``async with Actor:``.
|
|
323
323
|
|
|
324
|
-
``options`` is a configuration dict
|
|
324
|
+
``options`` is a configuration dict. The context
|
|
325
325
|
manager never calls ``sys.exit`` (``exit_process`` is accepted for signature parity),
|
|
326
326
|
and ``event_listeners_timeout`` is accepted but not applied.
|
|
327
327
|
"""
|
|
@@ -422,7 +422,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
422
422
|
'run_id': run_id,
|
|
423
423
|
})
|
|
424
424
|
elif not cls._config.get('is_at_home'):
|
|
425
|
-
# Local development without credentials: Smart → FS
|
|
425
|
+
# Local development without credentials: Smart → FS
|
|
426
426
|
logger.info('[Scrapely] Initializing local file-system storage')
|
|
427
427
|
smart = _lazy('set_api_storage')()
|
|
428
428
|
else:
|
|
@@ -635,7 +635,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
635
635
|
) -> None:
|
|
636
636
|
"""Exit the Actor with an optional terminal status message.
|
|
637
637
|
|
|
638
|
-
|
|
638
|
+
Supports keyword-only ``status_message`` and
|
|
639
639
|
``exit_code`` arguments (``await Actor.exit(status_message="Done")``).
|
|
640
640
|
The pre-existing positional forms (``Actor.exit("message")`` /
|
|
641
641
|
``Actor.exit(ExitOptions(...))``) remain supported; explicit keyword
|
|
@@ -678,7 +678,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
678
678
|
) -> None:
|
|
679
679
|
"""Fail the Actor run (exit code defaults to ``1``).
|
|
680
680
|
|
|
681
|
-
|
|
681
|
+
Supports keyword-only ``status_message``,
|
|
682
682
|
``exit_code`` and ``exception`` arguments
|
|
683
683
|
(``await Actor.fail(status_message="Boom", exception=e)``). When
|
|
684
684
|
``exception`` is given its traceback is logged.
|
|
@@ -724,7 +724,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
724
724
|
def is_paying(cls) -> bool:
|
|
725
725
|
"""Whether the user who started this Actor run is a paying user.
|
|
726
726
|
|
|
727
|
-
|
|
727
|
+
Reads ``APIFY_USER_IS_PAYING`` (config key
|
|
728
728
|
``user_is_paying``). Note the platform currently sets this from the
|
|
729
729
|
subscription plan only — PAYG balance alone does not flip it.
|
|
730
730
|
"""
|
|
@@ -833,8 +833,8 @@ class Actor(metaclass=_ActorMeta):
|
|
|
833
833
|
) -> ChargeResult:
|
|
834
834
|
"""Push data to the default dataset, charging pay-per-event items.
|
|
835
835
|
|
|
836
|
-
|
|
837
|
-
|
|
836
|
+
Usage: ``Actor.push_data(data, charged_event_name=...)``.
|
|
837
|
+
When the Actor uses pay-per-event pricing, each pushed item is charged for the
|
|
838
838
|
default-dataset-item event (if priced) and, when ``charged_event_name`` is
|
|
839
839
|
provided, for that explicit event as well. Actors without pay-per-event
|
|
840
840
|
pricing push without charging and receive an empty result.
|
|
@@ -842,7 +842,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
842
842
|
Args:
|
|
843
843
|
data: Item or list of items to push to the default dataset.
|
|
844
844
|
charged_event_name: Optional pricing event to charge for each pushed item
|
|
845
|
-
(
|
|
845
|
+
(also accepted positionally).
|
|
846
846
|
event_name: Deprecated alias of ``charged_event_name`` (JS ``eventName``),
|
|
847
847
|
kept so existing callers keep working.
|
|
848
848
|
charges: Several events per row, charged atomically: ``{'result': 1, 'page': 3}``
|
|
@@ -872,7 +872,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
872
872
|
raise ValueError('Pass only one of charged_event_name / event_name')
|
|
873
873
|
event_name = charged_event_name if charged_event_name is not None else event_name
|
|
874
874
|
# Exact synthetic names only (JS parity) — a prefix heuristic would block
|
|
875
|
-
# real priced events
|
|
875
|
+
# real priced events.
|
|
876
876
|
if event_name and is_default_dataset_item_event(event_name):
|
|
877
877
|
raise ValueError(f"Cannot charge for synthetic event '{event_name}' manually")
|
|
878
878
|
|
|
@@ -1168,7 +1168,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1168
1168
|
Args:
|
|
1169
1169
|
message: The status message to set.
|
|
1170
1170
|
options: Optional settings (``is_status_message_terminal``, ``level``).
|
|
1171
|
-
is_terminal:
|
|
1171
|
+
is_terminal: Terminal flag. When given, it
|
|
1172
1172
|
overrides ``options.is_status_message_terminal``.
|
|
1173
1173
|
|
|
1174
1174
|
Returns:
|
|
@@ -1276,7 +1276,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1276
1276
|
|
|
1277
1277
|
@classmethod
|
|
1278
1278
|
async def _persist_terminal_status_message(cls, message: Optional[str], timeout_secs: float = 10.0) -> None:
|
|
1279
|
-
"""Store the exit/fail status message on the run as terminal
|
|
1279
|
+
"""Store the exit/fail status message on the run as terminal.
|
|
1280
1280
|
|
|
1281
1281
|
Runs before teardown so it lands while the run still exists and the
|
|
1282
1282
|
process is alive, on success and failure alike. Best effort: a failed
|
|
@@ -1322,7 +1322,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1322
1322
|
|
|
1323
1323
|
@classmethod
|
|
1324
1324
|
def _env_config(cls) -> Configuration:
|
|
1325
|
-
#
|
|
1325
|
+
# is_at_home() and friends read the environment even
|
|
1326
1326
|
# before init(). Doesn't set cls._config, so init() state is unchanged.
|
|
1327
1327
|
return cls._config if cls._config is not None else Configuration.get_global_config()
|
|
1328
1328
|
|
|
@@ -1335,14 +1335,14 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1335
1335
|
return ApiClient(api_url=api_url, token=api_token, run_id=run_id)
|
|
1336
1336
|
|
|
1337
1337
|
# -------------------------------------------------------------------------
|
|
1338
|
-
#
|
|
1338
|
+
# Client and configuration properties
|
|
1339
1339
|
# -------------------------------------------------------------------------
|
|
1340
1340
|
|
|
1341
1341
|
@classmethod
|
|
1342
1342
|
def _get_apify_client(cls) -> 'ApifyClientAsync':
|
|
1343
1343
|
"""Get or create a cached charging-configured ``ApifyClientAsync`` instance.
|
|
1344
1344
|
|
|
1345
|
-
This client provides full ApifyClient
|
|
1345
|
+
This client provides the full ApifyClient API including
|
|
1346
1346
|
actor(), dataset(), key_value_store(), etc. methods.
|
|
1347
1347
|
"""
|
|
1348
1348
|
if cls._apify_client_instance is None:
|
|
@@ -1372,9 +1372,9 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1372
1372
|
|
|
1373
1373
|
@_ClassProperty
|
|
1374
1374
|
def apify_client(cls) -> 'ApifyClientAsync':
|
|
1375
|
-
"""Get a charging-configured ``ApifyClientAsync
|
|
1375
|
+
"""Get a charging-configured ``ApifyClientAsync``.
|
|
1376
1376
|
|
|
1377
|
-
This provides full ApifyClient
|
|
1377
|
+
This provides the full ApifyClient API including:
|
|
1378
1378
|
- client.actor('id').call()
|
|
1379
1379
|
- client.dataset('id').list_items()
|
|
1380
1380
|
- client.key_value_store('id').get_record('key')
|
|
@@ -1390,7 +1390,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1390
1390
|
|
|
1391
1391
|
@_ClassProperty
|
|
1392
1392
|
def config(cls) -> Configuration:
|
|
1393
|
-
"""Return the Configuration instance
|
|
1393
|
+
"""Return the Configuration instance."""
|
|
1394
1394
|
return cls.get_config()
|
|
1395
1395
|
|
|
1396
1396
|
@_ClassProperty
|
|
@@ -1530,7 +1530,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1530
1530
|
client = cls.new_client(token=opts.token) if opts.token else cls.new_client()
|
|
1531
1531
|
|
|
1532
1532
|
# Wire format (server contract): the POST body is the run input itself;
|
|
1533
|
-
# run options are
|
|
1533
|
+
# run options are query parameters. Inline webhooks ride
|
|
1534
1534
|
# along base64-encoded in the `webhooks` query param.
|
|
1535
1535
|
params = _run_options_params(
|
|
1536
1536
|
build=opts.build,
|
|
@@ -1615,7 +1615,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1615
1615
|
"""Poll ``GET /v2/actor-runs/:runId`` until the run reaches a terminal status.
|
|
1616
1616
|
|
|
1617
1617
|
When ``timeout_seconds`` elapses first, the run is aborted (best-effort)
|
|
1618
|
-
and ``TimeoutError`` is raised
|
|
1618
|
+
and ``TimeoutError`` is raised.
|
|
1619
1619
|
"""
|
|
1620
1620
|
deadline = time.monotonic() + timeout_seconds if timeout_seconds is not None else None
|
|
1621
1621
|
|
|
@@ -1693,7 +1693,7 @@ class Actor(metaclass=_ActorMeta):
|
|
|
1693
1693
|
|
|
1694
1694
|
# Wire format (server contract): the POST body is the task input
|
|
1695
1695
|
# override (merged over the task's saved input by the server); run
|
|
1696
|
-
# options are
|
|
1696
|
+
# options are query parameters. The task-run endpoint is
|
|
1697
1697
|
# /v2/actor-tasks/:taskId/runs (there is no /v2/tasks/:taskId/runs).
|
|
1698
1698
|
params = _run_options_params(
|
|
1699
1699
|
build=opts.build,
|