pybiolib 0.2.951__py3-none-any.whl → 1.2.1890__py3-none-any.whl
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.
- biolib/__init__.py +357 -11
- biolib/_data_record/data_record.py +380 -0
- biolib/_index/__init__.py +0 -0
- biolib/_index/index.py +55 -0
- biolib/_index/query_result.py +103 -0
- biolib/_internal/__init__.py +0 -0
- biolib/_internal/add_copilot_prompts.py +58 -0
- biolib/_internal/add_gui_files.py +81 -0
- biolib/_internal/data_record/__init__.py +1 -0
- biolib/_internal/data_record/data_record.py +85 -0
- biolib/_internal/data_record/push_data.py +116 -0
- biolib/_internal/data_record/remote_storage_endpoint.py +43 -0
- biolib/_internal/errors.py +5 -0
- biolib/_internal/file_utils.py +125 -0
- biolib/_internal/fuse_mount/__init__.py +1 -0
- biolib/_internal/fuse_mount/experiment_fuse_mount.py +209 -0
- biolib/_internal/http_client.py +159 -0
- biolib/_internal/lfs/__init__.py +1 -0
- biolib/_internal/lfs/cache.py +51 -0
- biolib/_internal/libs/__init__.py +1 -0
- biolib/_internal/libs/fusepy/__init__.py +1257 -0
- biolib/_internal/push_application.py +488 -0
- biolib/_internal/runtime.py +22 -0
- biolib/_internal/string_utils.py +13 -0
- biolib/_internal/templates/__init__.py +1 -0
- biolib/_internal/templates/copilot_template/.github/instructions/general-app-knowledge.instructions.md +10 -0
- biolib/_internal/templates/copilot_template/.github/instructions/style-general.instructions.md +20 -0
- biolib/_internal/templates/copilot_template/.github/instructions/style-python.instructions.md +16 -0
- biolib/_internal/templates/copilot_template/.github/instructions/style-react-ts.instructions.md +47 -0
- biolib/_internal/templates/copilot_template/.github/prompts/biolib_app_inputs.prompt.md +11 -0
- biolib/_internal/templates/copilot_template/.github/prompts/biolib_onboard_repo.prompt.md +19 -0
- biolib/_internal/templates/copilot_template/.github/prompts/biolib_run_apps.prompt.md +12 -0
- biolib/_internal/templates/dashboard_template/.biolib/config.yml +5 -0
- biolib/_internal/templates/github_workflow_template/.github/workflows/biolib.yml +21 -0
- biolib/_internal/templates/gitignore_template/.gitignore +10 -0
- biolib/_internal/templates/gui_template/.yarnrc.yml +1 -0
- biolib/_internal/templates/gui_template/App.tsx +53 -0
- biolib/_internal/templates/gui_template/Dockerfile +27 -0
- biolib/_internal/templates/gui_template/biolib-sdk.ts +82 -0
- biolib/_internal/templates/gui_template/dev-data/output.json +7 -0
- biolib/_internal/templates/gui_template/index.css +5 -0
- biolib/_internal/templates/gui_template/index.html +13 -0
- biolib/_internal/templates/gui_template/index.tsx +10 -0
- biolib/_internal/templates/gui_template/package.json +27 -0
- biolib/_internal/templates/gui_template/tsconfig.json +24 -0
- biolib/_internal/templates/gui_template/vite-plugin-dev-data.ts +50 -0
- biolib/_internal/templates/gui_template/vite.config.mts +10 -0
- biolib/_internal/templates/init_template/.biolib/config.yml +19 -0
- biolib/_internal/templates/init_template/Dockerfile +14 -0
- biolib/_internal/templates/init_template/requirements.txt +1 -0
- biolib/_internal/templates/init_template/run.py +12 -0
- biolib/_internal/templates/init_template/run.sh +4 -0
- biolib/_internal/templates/templates.py +25 -0
- biolib/_internal/tree_utils.py +106 -0
- biolib/_internal/utils/__init__.py +65 -0
- biolib/_internal/utils/auth.py +46 -0
- biolib/_internal/utils/job_url.py +33 -0
- biolib/_internal/utils/multinode.py +263 -0
- biolib/_runtime/runtime.py +157 -0
- biolib/_session/session.py +44 -0
- biolib/_shared/__init__.py +0 -0
- biolib/_shared/types/__init__.py +74 -0
- biolib/_shared/types/account.py +12 -0
- biolib/_shared/types/account_member.py +8 -0
- biolib/_shared/types/app.py +9 -0
- biolib/_shared/types/data_record.py +40 -0
- biolib/_shared/types/experiment.py +32 -0
- biolib/_shared/types/file_node.py +17 -0
- biolib/_shared/types/push.py +6 -0
- biolib/_shared/types/resource.py +37 -0
- biolib/_shared/types/resource_deploy_key.py +11 -0
- biolib/_shared/types/resource_permission.py +14 -0
- biolib/_shared/types/resource_version.py +19 -0
- biolib/_shared/types/result.py +14 -0
- biolib/_shared/types/typing.py +10 -0
- biolib/_shared/types/user.py +19 -0
- biolib/_shared/utils/__init__.py +7 -0
- biolib/_shared/utils/resource_uri.py +75 -0
- biolib/api/__init__.py +6 -0
- biolib/api/client.py +168 -0
- biolib/app/app.py +252 -49
- biolib/app/search_apps.py +45 -0
- biolib/biolib_api_client/api_client.py +126 -31
- biolib/biolib_api_client/app_types.py +24 -4
- biolib/biolib_api_client/auth.py +31 -8
- biolib/biolib_api_client/biolib_app_api.py +147 -52
- biolib/biolib_api_client/biolib_job_api.py +161 -141
- biolib/biolib_api_client/job_types.py +21 -5
- biolib/biolib_api_client/lfs_types.py +7 -23
- biolib/biolib_api_client/user_state.py +56 -0
- biolib/biolib_binary_format/__init__.py +1 -4
- biolib/biolib_binary_format/file_in_container.py +105 -0
- biolib/biolib_binary_format/module_input.py +24 -7
- biolib/biolib_binary_format/module_output_v2.py +149 -0
- biolib/biolib_binary_format/remote_endpoints.py +34 -0
- biolib/biolib_binary_format/remote_stream_seeker.py +59 -0
- biolib/biolib_binary_format/saved_job.py +3 -2
- biolib/biolib_binary_format/{attestation_document.py → stdout_and_stderr.py} +8 -8
- biolib/biolib_binary_format/system_status_update.py +3 -2
- biolib/biolib_binary_format/utils.py +175 -0
- biolib/biolib_docker_client/__init__.py +11 -2
- biolib/biolib_errors.py +36 -0
- biolib/biolib_logging.py +27 -10
- biolib/cli/__init__.py +38 -0
- biolib/cli/auth.py +46 -0
- biolib/cli/data_record.py +164 -0
- biolib/cli/index.py +32 -0
- biolib/cli/init.py +421 -0
- biolib/cli/lfs.py +101 -0
- biolib/cli/push.py +50 -0
- biolib/cli/run.py +63 -0
- biolib/cli/runtime.py +14 -0
- biolib/cli/sdk.py +16 -0
- biolib/cli/start.py +56 -0
- biolib/compute_node/cloud_utils/cloud_utils.py +110 -161
- biolib/compute_node/job_worker/cache_state.py +66 -88
- biolib/compute_node/job_worker/cache_types.py +1 -6
- biolib/compute_node/job_worker/docker_image_cache.py +112 -37
- biolib/compute_node/job_worker/executors/__init__.py +0 -3
- biolib/compute_node/job_worker/executors/docker_executor.py +532 -199
- biolib/compute_node/job_worker/executors/docker_types.py +9 -1
- biolib/compute_node/job_worker/executors/types.py +19 -9
- biolib/compute_node/job_worker/job_legacy_input_wait_timeout_thread.py +30 -0
- biolib/compute_node/job_worker/job_max_runtime_timer_thread.py +3 -5
- biolib/compute_node/job_worker/job_storage.py +108 -0
- biolib/compute_node/job_worker/job_worker.py +397 -212
- biolib/compute_node/job_worker/large_file_system.py +87 -38
- biolib/compute_node/job_worker/network_alloc.py +99 -0
- biolib/compute_node/job_worker/network_buffer.py +240 -0
- biolib/compute_node/job_worker/utilization_reporter_thread.py +197 -0
- biolib/compute_node/job_worker/utils.py +9 -24
- biolib/compute_node/remote_host_proxy.py +400 -98
- biolib/compute_node/utils.py +31 -9
- biolib/compute_node/webserver/compute_node_results_proxy.py +189 -0
- biolib/compute_node/webserver/proxy_utils.py +28 -0
- biolib/compute_node/webserver/webserver.py +130 -44
- biolib/compute_node/webserver/webserver_types.py +2 -6
- biolib/compute_node/webserver/webserver_utils.py +77 -12
- biolib/compute_node/webserver/worker_thread.py +183 -42
- biolib/experiments/__init__.py +0 -0
- biolib/experiments/experiment.py +356 -0
- biolib/jobs/__init__.py +1 -0
- biolib/jobs/job.py +741 -0
- biolib/jobs/job_result.py +185 -0
- biolib/jobs/types.py +50 -0
- biolib/py.typed +0 -0
- biolib/runtime/__init__.py +14 -0
- biolib/sdk/__init__.py +91 -0
- biolib/tables.py +34 -0
- biolib/typing_utils.py +2 -7
- biolib/user/__init__.py +1 -0
- biolib/user/sign_in.py +54 -0
- biolib/utils/__init__.py +162 -0
- biolib/utils/cache_state.py +94 -0
- biolib/utils/multipart_uploader.py +194 -0
- biolib/utils/seq_util.py +150 -0
- biolib/utils/zip/remote_zip.py +640 -0
- pybiolib-1.2.1890.dist-info/METADATA +41 -0
- pybiolib-1.2.1890.dist-info/RECORD +177 -0
- {pybiolib-0.2.951.dist-info → pybiolib-1.2.1890.dist-info}/WHEEL +1 -1
- pybiolib-1.2.1890.dist-info/entry_points.txt +2 -0
- README.md +0 -17
- biolib/app/app_result.py +0 -68
- biolib/app/utils.py +0 -62
- biolib/biolib-js/0-biolib.worker.js +0 -1
- biolib/biolib-js/1-biolib.worker.js +0 -1
- biolib/biolib-js/2-biolib.worker.js +0 -1
- biolib/biolib-js/3-biolib.worker.js +0 -1
- biolib/biolib-js/4-biolib.worker.js +0 -1
- biolib/biolib-js/5-biolib.worker.js +0 -1
- biolib/biolib-js/6-biolib.worker.js +0 -1
- biolib/biolib-js/index.html +0 -10
- biolib/biolib-js/main-biolib.js +0 -1
- biolib/biolib_api_client/biolib_account_api.py +0 -21
- biolib/biolib_api_client/biolib_large_file_system_api.py +0 -108
- biolib/biolib_binary_format/aes_encrypted_package.py +0 -42
- biolib/biolib_binary_format/module_output.py +0 -58
- biolib/biolib_binary_format/rsa_encrypted_aes_package.py +0 -57
- biolib/biolib_push.py +0 -114
- biolib/cli.py +0 -203
- biolib/cli_utils.py +0 -273
- biolib/compute_node/cloud_utils/enclave_parent_types.py +0 -7
- biolib/compute_node/enclave/__init__.py +0 -2
- biolib/compute_node/enclave/enclave_remote_hosts.py +0 -53
- biolib/compute_node/enclave/nitro_secure_module_utils.py +0 -64
- biolib/compute_node/job_worker/executors/base_executor.py +0 -18
- biolib/compute_node/job_worker/executors/pyppeteer_executor.py +0 -173
- biolib/compute_node/job_worker/executors/remote/__init__.py +0 -1
- biolib/compute_node/job_worker/executors/remote/nitro_enclave_utils.py +0 -81
- biolib/compute_node/job_worker/executors/remote/remote_executor.py +0 -51
- biolib/lfs.py +0 -196
- biolib/pyppeteer/.circleci/config.yml +0 -100
- biolib/pyppeteer/.coveragerc +0 -3
- biolib/pyppeteer/.gitignore +0 -89
- biolib/pyppeteer/.pre-commit-config.yaml +0 -28
- biolib/pyppeteer/CHANGES.md +0 -253
- biolib/pyppeteer/CONTRIBUTING.md +0 -26
- biolib/pyppeteer/LICENSE +0 -12
- biolib/pyppeteer/README.md +0 -137
- biolib/pyppeteer/docs/Makefile +0 -177
- biolib/pyppeteer/docs/_static/custom.css +0 -28
- biolib/pyppeteer/docs/_templates/layout.html +0 -10
- biolib/pyppeteer/docs/changes.md +0 -1
- biolib/pyppeteer/docs/conf.py +0 -299
- biolib/pyppeteer/docs/index.md +0 -21
- biolib/pyppeteer/docs/make.bat +0 -242
- biolib/pyppeteer/docs/reference.md +0 -211
- biolib/pyppeteer/docs/server.py +0 -60
- biolib/pyppeteer/poetry.lock +0 -1699
- biolib/pyppeteer/pyppeteer/__init__.py +0 -135
- biolib/pyppeteer/pyppeteer/accessibility.py +0 -286
- biolib/pyppeteer/pyppeteer/browser.py +0 -401
- biolib/pyppeteer/pyppeteer/browser_fetcher.py +0 -194
- biolib/pyppeteer/pyppeteer/command.py +0 -22
- biolib/pyppeteer/pyppeteer/connection/__init__.py +0 -242
- biolib/pyppeteer/pyppeteer/connection/cdpsession.py +0 -101
- biolib/pyppeteer/pyppeteer/coverage.py +0 -346
- biolib/pyppeteer/pyppeteer/device_descriptors.py +0 -787
- biolib/pyppeteer/pyppeteer/dialog.py +0 -79
- biolib/pyppeteer/pyppeteer/domworld.py +0 -597
- biolib/pyppeteer/pyppeteer/emulation_manager.py +0 -53
- biolib/pyppeteer/pyppeteer/errors.py +0 -48
- biolib/pyppeteer/pyppeteer/events.py +0 -63
- biolib/pyppeteer/pyppeteer/execution_context.py +0 -156
- biolib/pyppeteer/pyppeteer/frame/__init__.py +0 -299
- biolib/pyppeteer/pyppeteer/frame/frame_manager.py +0 -306
- biolib/pyppeteer/pyppeteer/helpers.py +0 -245
- biolib/pyppeteer/pyppeteer/input.py +0 -371
- biolib/pyppeteer/pyppeteer/jshandle.py +0 -598
- biolib/pyppeteer/pyppeteer/launcher.py +0 -683
- biolib/pyppeteer/pyppeteer/lifecycle_watcher.py +0 -169
- biolib/pyppeteer/pyppeteer/models/__init__.py +0 -103
- biolib/pyppeteer/pyppeteer/models/_protocol.py +0 -12460
- biolib/pyppeteer/pyppeteer/multimap.py +0 -82
- biolib/pyppeteer/pyppeteer/network_manager.py +0 -678
- biolib/pyppeteer/pyppeteer/options.py +0 -8
- biolib/pyppeteer/pyppeteer/page.py +0 -1728
- biolib/pyppeteer/pyppeteer/pipe_transport.py +0 -59
- biolib/pyppeteer/pyppeteer/target.py +0 -147
- biolib/pyppeteer/pyppeteer/task_queue.py +0 -24
- biolib/pyppeteer/pyppeteer/timeout_settings.py +0 -36
- biolib/pyppeteer/pyppeteer/tracing.py +0 -93
- biolib/pyppeteer/pyppeteer/us_keyboard_layout.py +0 -305
- biolib/pyppeteer/pyppeteer/util.py +0 -18
- biolib/pyppeteer/pyppeteer/websocket_transport.py +0 -47
- biolib/pyppeteer/pyppeteer/worker.py +0 -101
- biolib/pyppeteer/pyproject.toml +0 -97
- biolib/pyppeteer/spell.txt +0 -137
- biolib/pyppeteer/tox.ini +0 -72
- biolib/pyppeteer/utils/generate_protocol_types.py +0 -603
- biolib/start_cli.py +0 -7
- biolib/utils.py +0 -47
- biolib/validators/validate_app_version.py +0 -183
- biolib/validators/validate_argument.py +0 -134
- biolib/validators/validate_module.py +0 -323
- biolib/validators/validate_zip_file.py +0 -40
- biolib/validators/validator_utils.py +0 -103
- pybiolib-0.2.951.dist-info/LICENSE +0 -21
- pybiolib-0.2.951.dist-info/METADATA +0 -61
- pybiolib-0.2.951.dist-info/RECORD +0 -153
- pybiolib-0.2.951.dist-info/entry_points.txt +0 -3
- /LICENSE → /pybiolib-1.2.1890.dist-info/licenses/LICENSE +0 -0
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import logging
|
|
2
|
-
from typing import Callable, Optional
|
|
3
|
-
|
|
4
|
-
from pyppeteer import helpers
|
|
5
|
-
|
|
6
|
-
logger = logging.getLogger(__name__)
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
class PipeTransport:
|
|
10
|
-
def __init__(
|
|
11
|
-
self, pipeWrite, pipeRead,
|
|
12
|
-
):
|
|
13
|
-
self._pipeWrite = pipeWrite
|
|
14
|
-
self._pendingMessage = ''
|
|
15
|
-
self.onmessage: Optional[Callable[[Optional[str], str], None]] = None
|
|
16
|
-
self.onclose: Optional[Callable[[], None]] = None
|
|
17
|
-
|
|
18
|
-
def _onclose() -> None:
|
|
19
|
-
if self.onclose:
|
|
20
|
-
self.onclose()
|
|
21
|
-
|
|
22
|
-
self._eventListeners = [
|
|
23
|
-
helpers.addEventListener(pipeRead, 'data', lambda buffer: self._dispatch(buffer)),
|
|
24
|
-
helpers.addEventListener(pipeRead, 'close', _onclose),
|
|
25
|
-
helpers.addEventListener(
|
|
26
|
-
pipeRead, 'error', lambda e: logger.error(f'An exception occurred on pipe read: {e}')
|
|
27
|
-
),
|
|
28
|
-
helpers.addEventListener(
|
|
29
|
-
pipeWrite, 'error', lambda e: logger.error(f'An exception occurred on pipe read: {e}')
|
|
30
|
-
),
|
|
31
|
-
]
|
|
32
|
-
|
|
33
|
-
def send(self, message: str) -> None:
|
|
34
|
-
self._pipeWrite.write(message)
|
|
35
|
-
self._pipeWrite.write('\0')
|
|
36
|
-
|
|
37
|
-
def _dispatch(self, buffer: str) -> None:
|
|
38
|
-
end = buffer.find('\0') # -1 means nothing found
|
|
39
|
-
if end == -1:
|
|
40
|
-
self._pendingMessage += buffer
|
|
41
|
-
return
|
|
42
|
-
|
|
43
|
-
message = self._pendingMessage + buffer
|
|
44
|
-
if message and self.onmessage:
|
|
45
|
-
self.onmessage(None, message)
|
|
46
|
-
|
|
47
|
-
start = end + 1
|
|
48
|
-
end = buffer.find('\0', start)
|
|
49
|
-
while end != -1:
|
|
50
|
-
if self.onmessage:
|
|
51
|
-
self.onmessage(None, buffer)
|
|
52
|
-
start = end + 1
|
|
53
|
-
end = buffer.find('\0', start)
|
|
54
|
-
|
|
55
|
-
self._pendingMessage = buffer
|
|
56
|
-
|
|
57
|
-
def close(self) -> None:
|
|
58
|
-
self._pipeWrite = None
|
|
59
|
-
helpers.removeEventListeners(self._eventListeners)
|
|
@@ -1,147 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
|
|
4
|
-
"""Target module."""
|
|
5
|
-
|
|
6
|
-
import asyncio
|
|
7
|
-
from typing import TYPE_CHECKING, Awaitable, Callable, Dict, Optional
|
|
8
|
-
|
|
9
|
-
from biolib.pyppeteer.pyppeteer.connection import CDPSession
|
|
10
|
-
from biolib.pyppeteer.pyppeteer.events import Events
|
|
11
|
-
from biolib.pyppeteer.pyppeteer.helpers import safe_future_set_result
|
|
12
|
-
from biolib.pyppeteer.pyppeteer.models import Protocol
|
|
13
|
-
from biolib.pyppeteer.pyppeteer.page import Page
|
|
14
|
-
from biolib.pyppeteer.pyppeteer.task_queue import TaskQueue
|
|
15
|
-
from biolib.pyppeteer.pyppeteer.worker import Worker
|
|
16
|
-
|
|
17
|
-
if TYPE_CHECKING:
|
|
18
|
-
from pyppeteer.browser import Browser, BrowserContext
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
class Target:
|
|
22
|
-
"""Browser's target class."""
|
|
23
|
-
|
|
24
|
-
def __init__(
|
|
25
|
-
self,
|
|
26
|
-
targetInfo: Dict,
|
|
27
|
-
browserContext: 'BrowserContext',
|
|
28
|
-
sessionFactory: Callable[[], Awaitable[CDPSession]],
|
|
29
|
-
ignoreHTTPSErrors: bool,
|
|
30
|
-
defaultViewport: Protocol.Page.Viewport,
|
|
31
|
-
screenshotTaskQueue: TaskQueue,
|
|
32
|
-
loop: asyncio.AbstractEventLoop,
|
|
33
|
-
) -> None:
|
|
34
|
-
self._targetInfo = targetInfo
|
|
35
|
-
self._browserContext = browserContext
|
|
36
|
-
self._targetId = targetInfo.get('targetId', '')
|
|
37
|
-
self._sessionFactory = sessionFactory
|
|
38
|
-
self._ignoreHTTPSErrors = ignoreHTTPSErrors
|
|
39
|
-
self._defaultViewport = defaultViewport
|
|
40
|
-
self._screenshotTaskQueue = screenshotTaskQueue
|
|
41
|
-
self._page: Optional[Page] = None
|
|
42
|
-
self._workerFuture: Optional[Awaitable[Worker]] = None
|
|
43
|
-
self.loop = loop
|
|
44
|
-
|
|
45
|
-
self._initializedPromise = self.loop.create_future()
|
|
46
|
-
self._isClosedPromise = self.loop.create_future()
|
|
47
|
-
self._isInitialized = self._targetInfo['type'] != 'page' or self._targetInfo['url'] != ''
|
|
48
|
-
if self._isInitialized:
|
|
49
|
-
self._initializedCallback(True)
|
|
50
|
-
|
|
51
|
-
def _initializedCallback(self, success: bool) -> None:
|
|
52
|
-
if not success:
|
|
53
|
-
return safe_future_set_result(self._initializedPromise, False)
|
|
54
|
-
opener = self.opener
|
|
55
|
-
if not opener or not opener._page or self.type != 'page':
|
|
56
|
-
return self._initializedPromise.set_result(True)
|
|
57
|
-
openerPage = opener._page
|
|
58
|
-
if not openerPage.listeners(Events.Page.Popup):
|
|
59
|
-
return self._initializedPromise.set_result(True)
|
|
60
|
-
openerPage.emit(Events.Page.Popup, openerPage)
|
|
61
|
-
return self._initializedPromise.set_result(True)
|
|
62
|
-
|
|
63
|
-
def _closedCallback(self) -> None:
|
|
64
|
-
self._isClosedPromise.set_result(None)
|
|
65
|
-
|
|
66
|
-
async def createCDPSession(self) -> CDPSession:
|
|
67
|
-
"""Create a Chrome Devtools Protocol session attached to the target."""
|
|
68
|
-
return await self._sessionFactory()
|
|
69
|
-
|
|
70
|
-
async def page(self) -> Optional[Page]:
|
|
71
|
-
"""Get page of this target.
|
|
72
|
-
|
|
73
|
-
If the target is not of type "page" or "background_page", return
|
|
74
|
-
``None``.
|
|
75
|
-
"""
|
|
76
|
-
if self._page:
|
|
77
|
-
return self._page
|
|
78
|
-
if self._targetInfo['type'] in ['page', 'background_page']:
|
|
79
|
-
session = await self._sessionFactory()
|
|
80
|
-
self._page = await Page.create(
|
|
81
|
-
client=session,
|
|
82
|
-
target=self,
|
|
83
|
-
ignoreHTTPSErrors=self._ignoreHTTPSErrors,
|
|
84
|
-
defaultViewport=self._defaultViewport,
|
|
85
|
-
screenshotTaskQueue=self._screenshotTaskQueue,
|
|
86
|
-
)
|
|
87
|
-
return self._page
|
|
88
|
-
|
|
89
|
-
def worker(self) -> Optional[Awaitable[Worker]]:
|
|
90
|
-
_type = self._targetInfo['type']
|
|
91
|
-
if _type not in ['service_worker', 'shared_worker']:
|
|
92
|
-
return None
|
|
93
|
-
if not self._workerFuture:
|
|
94
|
-
|
|
95
|
-
async def worker_fut_task() -> Worker:
|
|
96
|
-
nonlocal self
|
|
97
|
-
session = await self._sessionFactory()
|
|
98
|
-
return Worker(session, self._targetInfo['url'], lambda *_: None, lambda *_: None)
|
|
99
|
-
|
|
100
|
-
self._workerFuture = self.loop.create_task(worker_fut_task())
|
|
101
|
-
return self._workerFuture
|
|
102
|
-
|
|
103
|
-
@property
|
|
104
|
-
def url(self) -> str:
|
|
105
|
-
"""Get url of this target."""
|
|
106
|
-
return self._targetInfo['url']
|
|
107
|
-
|
|
108
|
-
@property
|
|
109
|
-
def type(self) -> str:
|
|
110
|
-
"""Get type of this target.
|
|
111
|
-
|
|
112
|
-
Type can be ``'page'``, ``'background_page'``, ``'service_worker'``,
|
|
113
|
-
``'browser'``, or ``'other'``.
|
|
114
|
-
"""
|
|
115
|
-
_type = self._targetInfo['type']
|
|
116
|
-
if _type in ['page', 'background_page', 'service_worker', 'shared_worker', 'browser']:
|
|
117
|
-
return _type
|
|
118
|
-
return 'other'
|
|
119
|
-
|
|
120
|
-
@property
|
|
121
|
-
def browser(self) -> 'Browser':
|
|
122
|
-
"""Get the browser the target belongs to."""
|
|
123
|
-
return self._browserContext.browser
|
|
124
|
-
|
|
125
|
-
@property
|
|
126
|
-
def browserContext(self) -> 'BrowserContext':
|
|
127
|
-
"""Return the browser context the target belongs to."""
|
|
128
|
-
return self._browserContext
|
|
129
|
-
|
|
130
|
-
@property
|
|
131
|
-
def opener(self) -> Optional['Target']:
|
|
132
|
-
"""Get the target that opened this target.
|
|
133
|
-
|
|
134
|
-
Top-level targets return ``None``.
|
|
135
|
-
"""
|
|
136
|
-
openerId = self._targetInfo.get('openerId')
|
|
137
|
-
if openerId is None:
|
|
138
|
-
return None
|
|
139
|
-
return self.browser._targets.get(openerId)
|
|
140
|
-
|
|
141
|
-
def _targetInfoChanged(self, targetInfo: Dict) -> None:
|
|
142
|
-
self._targetInfo = targetInfo
|
|
143
|
-
|
|
144
|
-
if not self._isInitialized and (self._targetInfo['type'] != 'page' or self._targetInfo['url'] != ''):
|
|
145
|
-
self._isInitialized = True
|
|
146
|
-
self._initializedCallback(True)
|
|
147
|
-
return
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
import logging
|
|
3
|
-
from typing import Any, Awaitable
|
|
4
|
-
|
|
5
|
-
logger = logging.getLogger(__name__)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class TaskQueue:
|
|
9
|
-
def __init__(self, loop: asyncio.AbstractEventLoop = None):
|
|
10
|
-
self.loop = loop or asyncio.get_event_loop()
|
|
11
|
-
fut = self.loop.create_future()
|
|
12
|
-
fut.set_result(None)
|
|
13
|
-
self._task_chain = fut
|
|
14
|
-
|
|
15
|
-
def post_task(self, task: Awaitable[Any]) -> Awaitable[Any]:
|
|
16
|
-
async def run_awaitable(prev) -> None:
|
|
17
|
-
try:
|
|
18
|
-
await prev
|
|
19
|
-
return await task
|
|
20
|
-
except Exception as e:
|
|
21
|
-
logger.error(f'Exception while evaluating task queue: {e}')
|
|
22
|
-
|
|
23
|
-
self._task_chain = self.loop.create_task(run_awaitable(self._task_chain))
|
|
24
|
-
return self._task_chain
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
|
|
4
|
-
"""
|
|
5
|
-
Timeout setting module
|
|
6
|
-
|
|
7
|
-
puppeteer equivalent: TimeoutSettings.js
|
|
8
|
-
"""
|
|
9
|
-
|
|
10
|
-
DEFAULT_TIMEOUT = 30_000 # 30 seconds
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class TimeoutSettings:
|
|
14
|
-
def __init__(self):
|
|
15
|
-
self._defaultTimeout = None
|
|
16
|
-
self._defaultNavigationTimeout = None
|
|
17
|
-
|
|
18
|
-
def setDefaultTimeout(self, timeout: float) -> None:
|
|
19
|
-
self._defaultTimeout = timeout
|
|
20
|
-
|
|
21
|
-
def setDefaultNavigationTimeout(self, timeout: float) -> None:
|
|
22
|
-
self._defaultNavigationTimeout = timeout
|
|
23
|
-
|
|
24
|
-
@property
|
|
25
|
-
def navigationTimeout(self) -> float:
|
|
26
|
-
if self._defaultNavigationTimeout:
|
|
27
|
-
return self._defaultNavigationTimeout
|
|
28
|
-
if self._defaultTimeout:
|
|
29
|
-
return self._defaultTimeout
|
|
30
|
-
return DEFAULT_TIMEOUT
|
|
31
|
-
|
|
32
|
-
@property
|
|
33
|
-
def timeout(self) -> float:
|
|
34
|
-
if self._defaultTimeout:
|
|
35
|
-
return self._defaultTimeout
|
|
36
|
-
return DEFAULT_TIMEOUT
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
# -*- coding: utf-8 -*-
|
|
3
|
-
|
|
4
|
-
"""Tracing module."""
|
|
5
|
-
|
|
6
|
-
from pathlib import Path
|
|
7
|
-
from typing import Sequence, Union
|
|
8
|
-
|
|
9
|
-
from biolib.pyppeteer.pyppeteer import helpers
|
|
10
|
-
from biolib.pyppeteer.pyppeteer.connection import CDPSession
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
class Tracing:
|
|
14
|
-
"""Tracing class.
|
|
15
|
-
|
|
16
|
-
You can use :meth:`start` and :meth:`stop` to create a trace file which can
|
|
17
|
-
be opened in Chrome DevTools or
|
|
18
|
-
`timeline viewer <https://chromedevtools.github.io/timeline-viewer/>`_.
|
|
19
|
-
|
|
20
|
-
.. code::
|
|
21
|
-
|
|
22
|
-
await page.tracing.start({'path': 'trace.json'})
|
|
23
|
-
await page.goto('https://www.google.com')
|
|
24
|
-
await page.tracing.stop()
|
|
25
|
-
"""
|
|
26
|
-
|
|
27
|
-
def __init__(self, client: CDPSession) -> None:
|
|
28
|
-
self._client = client
|
|
29
|
-
self._recording = False
|
|
30
|
-
self._path = ''
|
|
31
|
-
|
|
32
|
-
async def start(
|
|
33
|
-
self, path: Union[Path, str] = '', screenshots: bool = False, categories: Sequence[str] = None
|
|
34
|
-
) -> None:
|
|
35
|
-
"""Start tracing.
|
|
36
|
-
|
|
37
|
-
Only one trace can be active at a time per browser.
|
|
38
|
-
|
|
39
|
-
This method accepts the following options:
|
|
40
|
-
|
|
41
|
-
* ``path`` (str): A path to write the trace file to.
|
|
42
|
-
* ``screenshots`` (bool): Capture screenshots in the trace.
|
|
43
|
-
* ``categories`` (List[str]): Specify custom categories to use instead
|
|
44
|
-
of default.
|
|
45
|
-
"""
|
|
46
|
-
defaultCategories = [
|
|
47
|
-
'-*',
|
|
48
|
-
'devtools.timeline',
|
|
49
|
-
'v8.execute',
|
|
50
|
-
'disabled-by-default-devtools.timeline',
|
|
51
|
-
'disabled-by-default-devtools.timeline.frame',
|
|
52
|
-
'toplevel',
|
|
53
|
-
'blink.console',
|
|
54
|
-
'blink.user_timing',
|
|
55
|
-
'latencyInfo',
|
|
56
|
-
'disabled-by-default-devtools.timeline.stack',
|
|
57
|
-
'disabled-by-default-v8.cpu_profiler',
|
|
58
|
-
'disabled-by-default-v8.cpu_profiler.hires',
|
|
59
|
-
]
|
|
60
|
-
|
|
61
|
-
if not isinstance(categories, list):
|
|
62
|
-
try:
|
|
63
|
-
categories = list(categories)
|
|
64
|
-
except TypeError:
|
|
65
|
-
categories = defaultCategories
|
|
66
|
-
|
|
67
|
-
if screenshots:
|
|
68
|
-
categories.append('disabled-by-default-devtools.screenshot')
|
|
69
|
-
|
|
70
|
-
self._path = path
|
|
71
|
-
self._recording = True
|
|
72
|
-
await self._client.send(
|
|
73
|
-
'Tracing.start', {'transferMode': 'ReturnAsStream', 'categories': ','.join(categories),}
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
async def stop(self) -> str:
|
|
77
|
-
"""Stop tracing.
|
|
78
|
-
|
|
79
|
-
:return: trace data as string.
|
|
80
|
-
"""
|
|
81
|
-
contentFuture = self._client.loop.create_future()
|
|
82
|
-
|
|
83
|
-
async def complete_trace(event):
|
|
84
|
-
nonlocal self, contentFuture
|
|
85
|
-
result = await helpers.readProtocolStream(self._client, event['stream'], self._path)
|
|
86
|
-
contentFuture.set_result(result)
|
|
87
|
-
|
|
88
|
-
self._client.once(
|
|
89
|
-
'Tracing.tracingComplete', complete_trace,
|
|
90
|
-
)
|
|
91
|
-
await self._client.send('Tracing.end')
|
|
92
|
-
self._recording = False
|
|
93
|
-
return await contentFuture
|