artefacts-cli 0.7.3__tar.gz → 0.9.2__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.
- artefacts_cli-0.9.2/.pyre_configuration +10 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/CHANGELOG.md +35 -1
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/PKG-INFO +10 -3
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/README.md +4 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/__init__.py +72 -21
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/app.py +209 -166
- artefacts_cli-0.9.2/artefacts/cli/app_containers.py +257 -0
- artefacts_cli-0.9.2/artefacts/cli/app_containers.pyi +3 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/bagparser.py +4 -0
- artefacts_cli-0.9.2/artefacts/cli/config.py +62 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/constants.py +7 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/containers/__init__.py +5 -5
- artefacts_cli-0.9.2/artefacts/cli/containers/docker_cm.py +175 -0
- artefacts_cli-0.9.2/artefacts/cli/containers/docker_utils.py +98 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/containers/utils.py +20 -8
- artefacts_cli-0.9.2/artefacts/cli/helpers.py +55 -0
- artefacts_cli-0.9.2/artefacts/cli/i18n.py +35 -0
- artefacts_cli-0.9.2/artefacts/cli/locales/art.pot +524 -0
- artefacts_cli-0.9.2/artefacts/cli/locales/base.pot +995 -0
- artefacts_cli-0.9.2/artefacts/cli/locales/click.pot +496 -0
- artefacts_cli-0.9.2/artefacts/cli/locales/ja_JP/LC_MESSAGES/artefacts.po +1028 -0
- artefacts_cli-0.9.2/artefacts/cli/logger.py +26 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/other.py +4 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/ros1.py +21 -6
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/ros2.py +31 -15
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/utils.py +8 -4
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/utils_ros.py +37 -11
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/version.py +2 -2
- artefacts_cli-0.9.2/artefacts/copava/__init__.py +1 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts_cli.egg-info/PKG-INFO +10 -3
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts_cli.egg-info/SOURCES.txt +16 -1
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts_cli.egg-info/requires.txt +4 -1
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/pyproject.toml +10 -4
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/pytest.ini +1 -1
- artefacts_cli-0.9.2/tests/cli/containers/test_docker.py +162 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/test_app_containers.py +4 -3
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/test_cli.py +4 -5
- artefacts_cli-0.9.2/tests/cli/test_other.py +51 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/test_ros2.py +71 -7
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/test_utils.py +5 -15
- artefacts_cli-0.9.2/tests/cli/test_utils_ros.py +43 -0
- artefacts_cli-0.9.2/tests/cli/test_warp_run.py +139 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/conftest.py +38 -2
- artefacts_cli-0.9.2/tests/fixtures/test_junit.xml +17 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/utils/docker_mock.py +4 -0
- artefacts_cli-0.7.3/artefacts/cli/app_containers.py +0 -165
- artefacts_cli-0.7.3/artefacts/cli/containers/docker.py +0 -119
- artefacts_cli-0.7.3/artefacts/cli/logger.py +0 -10
- artefacts_cli-0.7.3/tests/cli/test_other.py +0 -22
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/README_INTERNAL.md +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/__init__.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/errors.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/cli/parameters.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts/wrappers/artefacts_ros1_meta.launch +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts.yaml +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts_cli.egg-info/dependency_links.txt +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts_cli.egg-info/entry_points.txt +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/artefacts_cli.egg-info/top_level.txt +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/bin/release +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/test_run_remote.yaml +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/CMakeLists.txt +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/launch/test_meta.launch +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/launch/test_turtle.launch +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/launch/turtle_odometry.launch +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/package.xml +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/setup.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/TestTurtle.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/__init__.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/turtle_odom.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/turtle_post_process.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/turtle_trajectory.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/test/viz_turtle_odom.xml +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim2/launch_turtle.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/infra-tests/turtlesim2/sample_node.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/setup.cfg +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/__init__.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/__init__.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/containers/__init__.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/containers/test_utils.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/test_config_validation.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/test_parameters.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/test_ros1.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/cli/test_warp.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/fixtures/artefacts_deprecated.yaml +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/fixtures/artefacts_ros1.yaml +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/fixtures/bad_launch_test.py +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/fixtures/warp-env-param.yaml +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/fixtures/warp.yaml +0 -0
- {artefacts_cli-0.7.3 → artefacts_cli-0.9.2}/tests/test_config_validation.py +0 -0
@@ -7,6 +7,31 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
7
7
|
|
8
8
|
## [Unreleased]
|
9
9
|
|
10
|
+
## [0.9.2] - 2025-05-27
|
11
|
+
|
12
|
+
### Added
|
13
|
+
|
14
|
+
- Deeper and tentatively complete localisation of the CLI framework (#262)
|
15
|
+
- ROS tests can be recorded as "error" rather than just fail or success (#267)
|
16
|
+
|
17
|
+
### Fixed
|
18
|
+
|
19
|
+
- Compliance with the Artefacts API protocol on reporting common scenario names
|
20
|
+
across parameterised runs.
|
21
|
+
|
22
|
+
## [0.9.1] - 2025-04-30
|
23
|
+
|
24
|
+
### Added
|
25
|
+
|
26
|
+
- Runs in container accept and pass options to the underlying container engine (#246)
|
27
|
+
- Internationalisation of command output and Japanese support (#139)
|
28
|
+
|
29
|
+
### Fixed
|
30
|
+
|
31
|
+
- Compliance with the Artefacts API protocol on upload/no-upload option (#217)
|
32
|
+
|
33
|
+
## [0.8.0] - 2025-04-04
|
34
|
+
|
10
35
|
### Added
|
11
36
|
|
12
37
|
- Run in containers with only an artefacts.yaml configuration file. No need to
|
@@ -16,6 +41,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
16
41
|
|
17
42
|
- New logging messages and format.
|
18
43
|
|
44
|
+
### Fixed
|
45
|
+
|
46
|
+
- Logging correctly filters between logs for stderr and stdout
|
47
|
+
- Client now correctly handles rosbags not saved to the top level of a project.
|
48
|
+
- Fixed error formatting of test error(s).
|
49
|
+
|
19
50
|
## [0.7.3] - 2025-03-26
|
20
51
|
|
21
52
|
### Fixed
|
@@ -68,6 +99,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
68
99
|
- Local metrics errors do not block publication of results.
|
69
100
|
- Introduction of Black formatting.
|
70
101
|
|
71
|
-
[unreleased]: https://github.com/art-e-fact/artefacts-client/compare/0.
|
102
|
+
[unreleased]: https://github.com/art-e-fact/artefacts-client/compare/0.9.2...HEAD
|
103
|
+
[0.9.2]: https://github.com/art-e-fact/artefacts-client/releases/tag/0.9.2
|
104
|
+
[0.9.1]: https://github.com/art-e-fact/artefacts-client/releases/tag/0.9.1
|
105
|
+
[0.8.0]: https://github.com/art-e-fact/artefacts-client/releases/tag/0.8.0
|
72
106
|
[0.7.0]: https://github.com/art-e-fact/artefacts-client/releases/tag/0.7.0
|
73
107
|
[0.5.8]: https://github.com/art-e-fact/artefacts-client/releases/tag/0.5.8
|
@@ -1,26 +1,28 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: artefacts_cli
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.9.2
|
4
4
|
Author-email: FD <fabian@artefacts.com>, AGC <alejandro@artefacts.com>, TN <tomo@artefacts.com>, EP <eric@artefacts.com>
|
5
|
+
License-Expression: Apache-2.0
|
5
6
|
Project-URL: Homepage, https://github.com/art-e-fact/artefacts-client
|
6
7
|
Project-URL: Bug Tracker, https://github.com/art-e-fact/artefacts-client/issues
|
7
8
|
Project-URL: Changelog, https://github.com/art-e-fact/artefacts-client/CHANGELOG.md
|
8
9
|
Classifier: Programming Language :: Python :: 3
|
9
|
-
Classifier: License :: OSI Approved :: Apache Software License
|
10
10
|
Classifier: Operating System :: OS Independent
|
11
11
|
Requires-Python: >=3.8
|
12
12
|
Description-Content-Type: text/markdown
|
13
13
|
Requires-Dist: artefacts-c2d>=1.7.1
|
14
14
|
Requires-Dist: artefacts-copava>=0.1.11
|
15
|
-
Requires-Dist: click
|
15
|
+
Requires-Dist: artefacts-click
|
16
16
|
Requires-Dist: gitignore_parser>=0.1.11
|
17
17
|
Requires-Dist: junitparser>=2.5
|
18
18
|
Requires-Dist: mcap
|
19
19
|
Requires-Dist: mcap-ros2-support
|
20
20
|
Requires-Dist: PyYAML>=6.0
|
21
21
|
Requires-Dist: requests>=2.27.1
|
22
|
+
Requires-Dist: rospkg
|
22
23
|
Provides-Extra: dev
|
23
24
|
Requires-Dist: awscli; extra == "dev"
|
25
|
+
Requires-Dist: babel==2.17.0; extra == "dev"
|
24
26
|
Requires-Dist: build; extra == "dev"
|
25
27
|
Requires-Dist: docker; extra == "dev"
|
26
28
|
Requires-Dist: lark; extra == "dev"
|
@@ -37,6 +39,7 @@ Requires-Dist: pytest-env; extra == "dev"
|
|
37
39
|
Requires-Dist: pytest-mock; extra == "dev"
|
38
40
|
Requires-Dist: python-markdown-math; extra == "dev"
|
39
41
|
Requires-Dist: ruff>=0.9.2; extra == "dev"
|
42
|
+
Requires-Dist: setuptools_scm>=8; extra == "dev"
|
40
43
|
Requires-Dist: twine; extra == "dev"
|
41
44
|
|
42
45
|
# Artefacts CLI
|
@@ -102,3 +105,7 @@ mkdocs serve -a 127.0.0.1:7000
|
|
102
105
|
```
|
103
106
|
|
104
107
|
The docs are automatically deployed by the documentation workflow.
|
108
|
+
|
109
|
+
## Development notes
|
110
|
+
|
111
|
+
We use Pyre for static analysis. If it does not work out of the box, please consider adapting the `.pyre_configuration` file included with this repository. One assumption is that developers work in a virtual environment under `./venv`.
|
@@ -61,3 +61,7 @@ mkdocs serve -a 127.0.0.1:7000
|
|
61
61
|
```
|
62
62
|
|
63
63
|
The docs are automatically deployed by the documentation workflow.
|
64
|
+
|
65
|
+
## Development notes
|
66
|
+
|
67
|
+
We use Pyre for static analysis. If it does not work out of the box, please consider adapting the `.pyre_configuration` file included with this repository. One assumption is that developers work in a virtual environment under `./venv`.
|
@@ -1,13 +1,15 @@
|
|
1
|
+
from datetime import datetime, timezone
|
1
2
|
from importlib.metadata import version, PackageNotFoundError
|
2
|
-
import
|
3
|
+
from typing import Optional
|
4
|
+
import copy
|
3
5
|
import glob
|
4
|
-
|
5
|
-
import os
|
6
|
+
import json
|
6
7
|
import math
|
8
|
+
import os
|
7
9
|
import requests
|
8
|
-
import copy
|
9
|
-
from typing import Optional
|
10
10
|
|
11
|
+
from .config import APIConf
|
12
|
+
from .i18n import localise
|
11
13
|
from .parameters import iter_grid
|
12
14
|
from .logger import logger
|
13
15
|
|
@@ -21,7 +23,13 @@ except PackageNotFoundError:
|
|
21
23
|
|
22
24
|
__version__ = get_version()
|
23
25
|
except Exception as e:
|
24
|
-
logger.warning(
|
26
|
+
logger.warning(
|
27
|
+
localise(
|
28
|
+
"Could not determine package version: {error_message}. Default to 0.0.0".format(
|
29
|
+
error_message=e
|
30
|
+
)
|
31
|
+
)
|
32
|
+
)
|
25
33
|
__version__ = "0.0.0"
|
26
34
|
|
27
35
|
|
@@ -35,7 +43,7 @@ class WarpJob:
|
|
35
43
|
def __init__(
|
36
44
|
self,
|
37
45
|
project_id,
|
38
|
-
api_conf,
|
46
|
+
api_conf: APIConf,
|
39
47
|
jobname,
|
40
48
|
jobconf,
|
41
49
|
dryrun=False,
|
@@ -86,7 +94,13 @@ class WarpJob:
|
|
86
94
|
msg = response.json()["message"]
|
87
95
|
logger.warning(msg)
|
88
96
|
raise AuthenticationError(msg)
|
89
|
-
logger.warning(
|
97
|
+
logger.warning(
|
98
|
+
localise(
|
99
|
+
"Error on job creation: {status_code}".format(
|
100
|
+
status_code=response.status_code
|
101
|
+
)
|
102
|
+
)
|
103
|
+
)
|
90
104
|
logger.warning(response.text)
|
91
105
|
raise AuthenticationError(str(response.status_code))
|
92
106
|
self.job_id = response.json()["job_id"]
|
@@ -117,22 +131,26 @@ class WarpJob:
|
|
117
131
|
return
|
118
132
|
|
119
133
|
def new_run(self, scenario):
|
120
|
-
run = WarpRun(self, scenario, self.n_runs)
|
134
|
+
run = WarpRun(self, scenario["name"], scenario, self.n_runs)
|
121
135
|
self.n_runs += 1
|
122
136
|
return run
|
123
137
|
|
124
138
|
|
125
139
|
class WarpRun:
|
126
|
-
def __init__(self, job,
|
140
|
+
def __init__(self, job: WarpJob, name: str, params: dict, run_n: int):
|
127
141
|
self.job = job
|
128
142
|
self.start = datetime.now(timezone.utc).timestamp()
|
129
143
|
self.uploads = {}
|
130
|
-
self.
|
144
|
+
self.scenario_name = name
|
145
|
+
self.params = params
|
131
146
|
self.metrics = {}
|
132
147
|
self.run_n = run_n
|
133
148
|
self.output_path = self.params.get(
|
134
149
|
"output_path", f"{self.job.output_path}/{self.run_n}"
|
135
150
|
)
|
151
|
+
self.test_results = None
|
152
|
+
self.success = False
|
153
|
+
self.logger = logger
|
136
154
|
os.makedirs(self.output_path, exist_ok=True)
|
137
155
|
data = {
|
138
156
|
"job_id": job.job_id,
|
@@ -140,6 +158,7 @@ class WarpRun:
|
|
140
158
|
"start": round(self.start),
|
141
159
|
"tests": [],
|
142
160
|
"params": json.dumps(self.params),
|
161
|
+
"scenario_name": self.scenario_name,
|
143
162
|
}
|
144
163
|
|
145
164
|
if self.job.dryrun:
|
@@ -155,10 +174,16 @@ class WarpRun:
|
|
155
174
|
if response.status_code != 200:
|
156
175
|
if response.status_code == 403:
|
157
176
|
msg = response.json()["message"]
|
158
|
-
logger.warning(msg)
|
177
|
+
self.logger.warning(msg)
|
159
178
|
raise AuthenticationError(msg)
|
160
|
-
logger.warning(
|
161
|
-
|
179
|
+
self.logger.warning(
|
180
|
+
localise(
|
181
|
+
"Error on scenario creation: {status_code}".format(
|
182
|
+
status_code=response.status_code
|
183
|
+
)
|
184
|
+
)
|
185
|
+
)
|
186
|
+
self.logger.warning(response.text)
|
162
187
|
raise AuthenticationError(str(response.status_code))
|
163
188
|
return
|
164
189
|
|
@@ -235,8 +260,10 @@ class WarpRun:
|
|
235
260
|
|
236
261
|
def stop(self):
|
237
262
|
end = datetime.now(timezone.utc).timestamp()
|
263
|
+
|
238
264
|
if self.job.dryrun:
|
239
265
|
return
|
266
|
+
|
240
267
|
# Log metadata
|
241
268
|
data = {
|
242
269
|
"job_id": self.job.job_id,
|
@@ -247,18 +274,24 @@ class WarpRun:
|
|
247
274
|
"duration": math.ceil(end - self.start),
|
248
275
|
"tests": self.test_results,
|
249
276
|
"success": self.success,
|
250
|
-
"uploads": self.uploads,
|
251
277
|
"metrics": self.metrics,
|
278
|
+
"scenario_name": self.scenario_name,
|
252
279
|
}
|
280
|
+
if not self.job.noupload:
|
281
|
+
data["uploads"] = self.uploads
|
282
|
+
|
253
283
|
response = requests.put(
|
254
284
|
f"{self.job.api_conf.api_url}/{self.job.project_id}/job/{self.job.job_id}/run/{self.run_n}",
|
255
285
|
json=data,
|
256
286
|
headers=self.job.api_conf.headers,
|
257
287
|
)
|
288
|
+
|
258
289
|
# use s3 presigned urls to upload the artifacts
|
259
290
|
if self.job.noupload:
|
260
291
|
print(
|
261
|
-
|
292
|
+
localise(
|
293
|
+
"Files generated by the job are not uploaded to Artefacts, including the ones specified in output_dirs"
|
294
|
+
)
|
262
295
|
)
|
263
296
|
else:
|
264
297
|
upload_urls = response.json()["upload_urls"]
|
@@ -267,7 +300,13 @@ class WarpRun:
|
|
267
300
|
upload_info = upload_urls[key]
|
268
301
|
file_size_mb = os.path.getsize(file_name) / 1024 / 1024
|
269
302
|
try:
|
270
|
-
print(
|
303
|
+
print(
|
304
|
+
localise(
|
305
|
+
"Uploading {file_name} ({file_size:.2f} MB)".format(
|
306
|
+
file_name=file_name, file_size=file_size_mb
|
307
|
+
)
|
308
|
+
)
|
309
|
+
)
|
271
310
|
# TODO: add a retry policy
|
272
311
|
requests.post(
|
273
312
|
upload_info["url"],
|
@@ -275,14 +314,26 @@ class WarpRun:
|
|
275
314
|
files=files,
|
276
315
|
)
|
277
316
|
except OverflowError:
|
278
|
-
logger.warning(
|
317
|
+
self.logger.warning(
|
318
|
+
localise(
|
319
|
+
"File too large: {file_name} could not be uploaded".format(
|
320
|
+
file_name=file_name
|
321
|
+
)
|
322
|
+
)
|
323
|
+
)
|
279
324
|
except Exception as e:
|
280
|
-
logger.warning(
|
325
|
+
self.logger.warning(
|
326
|
+
localise(
|
327
|
+
"Error uploading {file_name}: {error_message}, skipping".format(
|
328
|
+
file_name=file_name, error_message=e
|
329
|
+
)
|
330
|
+
)
|
331
|
+
)
|
281
332
|
|
282
333
|
|
283
334
|
def init_job(
|
284
335
|
project_id: str,
|
285
|
-
|
336
|
+
api_conf: APIConf,
|
286
337
|
jobname: str,
|
287
338
|
jobconf: dict,
|
288
339
|
dryrun: bool = False,
|
@@ -294,7 +345,7 @@ def init_job(
|
|
294
345
|
):
|
295
346
|
return WarpJob(
|
296
347
|
project_id,
|
297
|
-
|
348
|
+
api_conf,
|
298
349
|
jobname,
|
299
350
|
jobconf,
|
300
351
|
dryrun,
|