artefacts-cli 0.6.16__tar.gz → 0.6.17__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.
Files changed (61) hide show
  1. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/PKG-INFO +2 -1
  2. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/__init__.py +1 -1
  3. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/app.py +56 -3
  4. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/app_containers.py +27 -6
  5. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/containers/__init__.py +8 -1
  6. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/containers/docker.py +18 -0
  7. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/containers/utils.py +3 -0
  8. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/version.py +2 -2
  9. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts.yaml +3 -3
  10. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts_cli.egg-info/PKG-INFO +2 -1
  11. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts_cli.egg-info/requires.txt +1 -0
  12. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/pyproject.toml +1 -0
  13. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/test_app_containers.py +7 -11
  14. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/README.md +0 -0
  15. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/README_INTERNAL.md +0 -0
  16. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/bagparser.py +0 -0
  17. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/constants.py +0 -0
  18. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/other.py +0 -0
  19. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/parameters.py +0 -0
  20. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/ros1.py +0 -0
  21. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/ros2.py +0 -0
  22. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/utils.py +0 -0
  23. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/cli/utils_ros.py +0 -0
  24. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts/wrappers/artefacts_ros1_meta.launch +0 -0
  25. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts_cli.egg-info/SOURCES.txt +0 -0
  26. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts_cli.egg-info/dependency_links.txt +0 -0
  27. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts_cli.egg-info/entry_points.txt +0 -0
  28. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/artefacts_cli.egg-info/top_level.txt +0 -0
  29. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/bin/release +0 -0
  30. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/CMakeLists.txt +0 -0
  31. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/launch/test_meta.launch +0 -0
  32. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/launch/test_turtle.launch +0 -0
  33. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/launch/turtle_odometry.launch +0 -0
  34. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/package.xml +0 -0
  35. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/setup.py +0 -0
  36. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/TestTurtle.py +0 -0
  37. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/__init__.py +0 -0
  38. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/turtle_odom.py +0 -0
  39. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/turtle_post_process.py +0 -0
  40. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/src/turtle_trajectory.py +0 -0
  41. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim1/ros_workspace/src/turtle_odometry/test/viz_turtle_odom.xml +0 -0
  42. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim2/launch_turtle.py +0 -0
  43. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/infra-tests/turtlesim2/sample_node.py +0 -0
  44. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/pytest.ini +0 -0
  45. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/setup.cfg +0 -0
  46. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/__init__.py +0 -0
  47. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/__init__.py +0 -0
  48. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/test_cli.py +0 -0
  49. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/test_config_validation.py +0 -0
  50. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/test_other.py +0 -0
  51. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/test_parameters.py +0 -0
  52. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/test_ros1.py +0 -0
  53. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/test_ros2.py +0 -0
  54. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/cli/test_warp.py +0 -0
  55. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/conftest.py +0 -0
  56. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/fixtures/artefacts_deprecated.yaml +0 -0
  57. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/fixtures/artefacts_ros1.yaml +0 -0
  58. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/fixtures/warp-env-param.yaml +0 -0
  59. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/fixtures/warp.yaml +0 -0
  60. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/test_config_validation.py +0 -0
  61. {artefacts_cli-0.6.16 → artefacts_cli-0.6.17}/tests/utils/docker_mock.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: artefacts_cli
3
- Version: 0.6.16
3
+ Version: 0.6.17
4
4
  Author-email: FD <fabian@artefacts.com>, AGC <alejandro@artefacts.com>, TN <tomo@artefacts.com>, EP <eric@artefacts.com>
5
5
  Project-URL: Homepage, https://github.com/art-e-fact/artefacts-client
6
6
  Project-URL: Bug Tracker, https://github.com/art-e-fact/artefacts-client/issues
@@ -18,6 +18,7 @@ Requires-Dist: mcap-ros2-support
18
18
  Requires-Dist: PyYAML>=6.0
19
19
  Requires-Dist: requests>=2.27.1
20
20
  Requires-Dist: setuptools-scm
21
+ Requires-Dist: setuptools>=74
21
22
  Provides-Extra: dev
22
23
  Requires-Dist: awscli; extra == "dev"
23
24
  Requires-Dist: build; extra == "dev"
@@ -15,7 +15,7 @@ logging.basicConfig(level=logging.INFO)
15
15
 
16
16
 
17
17
  try:
18
- __version__ = version("package-name")
18
+ __version__ = version("artefacts-cli")
19
19
  except PackageNotFoundError:
20
20
  try:
21
21
  # Package is not installed, most likely dev/test mode
@@ -231,11 +231,64 @@ def hello(project_name):
231
231
  is_eager=True, # Necessary for callbacks to see it.
232
232
  help="Skip configuration validation, so that unsupported settings can be tried out, e.g. non-ROS settings or simulators like SAPIEN.",
233
233
  )
234
+ @click.option(
235
+ "--in-container",
236
+ is_flag=True,
237
+ default=False,
238
+ help='[Experimental] Run the job inside a package container. The container image is build if it does not exist yet, with default name as "artefacts" (please use --with-image to override the image name). This option overrides (for now) --dryrun, --nosim, --noisolation and --description.',
239
+ )
240
+ @click.option(
241
+ "--with-image",
242
+ default="artefacts",
243
+ help="[Experimental] Run the job using the image name passed here. Only used when running with --in-container set.",
244
+ )
245
+ @click.option(
246
+ "--rebuild-container",
247
+ is_flag=True,
248
+ default=False,
249
+ help="[Experimental] Rebuild the container image before running. This flag guarantees that the run uses the latest code available when building the image, and usually takes more time before the run can start (time to compile and generate the image).",
250
+ )
251
+ @click.option(
252
+ "--with-gui",
253
+ is_flag=True,
254
+ default=False,
255
+ help="Show any GUI if any is created by the test runs. By default, UI elements are run but hidden---only test logs are returned. Please note GUI often assume X11 (e.g. ROS), typically with Qt, so this may not work without a appropriate environment.",
256
+ )
234
257
  @click.argument("jobname")
258
+ @click.pass_context
235
259
  def run(
236
- config, jobname, dryrun, nosim, noisolation, description="", skip_validation=False
260
+ ctx: click.Context,
261
+ config,
262
+ jobname,
263
+ dryrun,
264
+ nosim,
265
+ noisolation,
266
+ description="",
267
+ skip_validation=False,
268
+ in_container: bool = False,
269
+ with_image: str = "artefacts",
270
+ rebuild_container: bool = False,
271
+ with_gui: bool = False,
237
272
  ):
238
- """Run JOBNAME locally"""
273
+ """
274
+ Run JOBNAME locally
275
+
276
+ * Directly in the shell by default.
277
+ * Inside a packaged container when using the --in-container option.
278
+ """
279
+ if in_container:
280
+ if rebuild_container or not ctx.invoke(containers.check, name=with_image):
281
+ ctx.invoke(
282
+ containers.build, path=".", dockerfile="Dockerfile", name=with_image
283
+ )
284
+ return ctx.invoke(
285
+ containers.run,
286
+ image=with_image,
287
+ jobname=jobname,
288
+ config=config,
289
+ with_gui=with_gui,
290
+ )
291
+
239
292
  warpconfig = read_config(config)
240
293
 
241
294
  project_id = warpconfig["project"]
@@ -573,7 +626,7 @@ artefacts.add_command(config)
573
626
  artefacts.add_command(hello)
574
627
  artefacts.add_command(run)
575
628
  artefacts.add_command(run_remote)
576
- artefacts.add_command(containers.package)
629
+ artefacts.add_command(containers.containers)
577
630
 
578
631
 
579
632
  if __name__ == "__main__":
@@ -10,12 +10,12 @@ from artefacts.cli.containers.utils import ContainerMgr
10
10
  @click.group()
11
11
  @click.option("--debug/--no-debug", default=False)
12
12
  @click.pass_context
13
- def package(ctx: click.Context, debug: bool):
13
+ def containers(ctx: click.Context, debug: bool):
14
14
  ctx.ensure_object(dict)
15
15
  ctx.obj["debug"] = debug
16
16
 
17
17
 
18
- @package.command()
18
+ @containers.command()
19
19
  @click.option(
20
20
  "--path",
21
21
  default=".",
@@ -29,13 +29,13 @@ def package(ctx: click.Context, debug: bool):
29
29
  @click.option(
30
30
  "--name",
31
31
  required=False,
32
- help="Name for the generated package",
32
+ help="Name for the generated container",
33
33
  )
34
34
  @click.pass_context
35
35
  def build(ctx: click.Context, path: str, dockerfile: str, name: str):
36
36
  if not os.path.exists(os.path.join(path, dockerfile)):
37
37
  raise click.ClickException(
38
- f"No {dockerfile} found here. I cannot build the package."
38
+ f"No {dockerfile} found here. I cannot build the container."
39
39
  )
40
40
  if name is None:
41
41
  name = "artefacts"
@@ -44,7 +44,21 @@ def build(ctx: click.Context, path: str, dockerfile: str, name: str):
44
44
  print(f"Package complete in image: {image}")
45
45
 
46
46
 
47
- @package.command()
47
+ @containers.command()
48
+ @click.argument("name")
49
+ @click.pass_context
50
+ def check(ctx: click.Context, name: str):
51
+ if name is None:
52
+ name = "artefacts"
53
+ handler = ContainerMgr()
54
+ result = handler.check(name)
55
+ if ctx.parent is None:
56
+ # Print only if the command is called directly.
57
+ print(f"Package {name} exists and ready to use.")
58
+ return result
59
+
60
+
61
+ @containers.command()
48
62
  @click.argument("image")
49
63
  @click.argument("jobname")
50
64
  @click.option(
@@ -53,8 +67,14 @@ def build(ctx: click.Context, path: str, dockerfile: str, name: str):
53
67
  default="artefacts.yaml",
54
68
  help="Artefacts config file.",
55
69
  )
70
+ @click.option(
71
+ "--with-gui",
72
+ "with_gui",
73
+ default=False,
74
+ help="Show any GUI if any is created by the test runs. By default, UI elements are run but hidden---only test logs are returned. Please note GUI often assume an X11 environment, typically with Qt, so this may not work without a appropriate environment.",
75
+ )
56
76
  @click.pass_context
57
- def run(ctx: click.Context, image: str, jobname: str, config: str):
77
+ def run(ctx: click.Context, image: str, jobname: str, config: str, with_gui: bool):
58
78
  try:
59
79
  artefacts_config = read_config(config)
60
80
  except FileNotFoundError:
@@ -67,6 +87,7 @@ def run(ctx: click.Context, image: str, jobname: str, config: str):
67
87
  jobname=jobname,
68
88
  # Hidden setting primarily useful to Artefacts developers
69
89
  api_url=os.environ.get("ARTEFACTS_API_URL", DEFAULT_API_URL),
90
+ with_gui=with_gui,
70
91
  )
71
92
  container, logs = handler.run(**params)
72
93
  if container:
@@ -15,6 +15,12 @@ class CMgr:
15
15
  """
16
16
  raise NotImplemented()
17
17
 
18
+ def check(self, image: str) -> bool:
19
+ """
20
+ Checks whether a target image exists locally.
21
+ """
22
+ raise NotImplemented()
23
+
18
24
  def run(
19
25
  self,
20
26
  image: str,
@@ -22,6 +28,7 @@ class CMgr:
22
28
  jobname: str = None,
23
29
  artefacts_dir: str = Path("~/.artefacts").expanduser(),
24
30
  api_url: str = DEFAULT_API_URL,
31
+ with_gui: bool = False,
25
32
  ) -> Tuple[Any, Generator]:
26
33
  """
27
34
  Returns a container (Any type as depends on the framework)
@@ -45,7 +52,7 @@ class CMgr:
45
52
  """
46
53
  if not path:
47
54
  raise Exception(
48
- "`path` must be a string, a Path object, or exclusded from the kwargs"
55
+ "`path` must be a string, a Path object, or excluded from the kwargs"
49
56
  )
50
57
  if os.environ.get("ARTEFACTS_KEY", None):
51
58
  return True
@@ -2,6 +2,7 @@ from collections.abc import Generator
2
2
  import json
3
3
  import os
4
4
  from pathlib import Path
5
+ import platform
5
6
  from typing import Any, Tuple
6
7
  from uuid import uuid4
7
8
 
@@ -39,6 +40,12 @@ class DockerManager(CMgr):
39
40
  img_id = self.client.inspect_image(kwargs["tag"])["Id"]
40
41
  return img_id, iter(logs)
41
42
 
43
+ def check(
44
+ self,
45
+ image: str,
46
+ ) -> bool:
47
+ return len(self.client.images(name=image)) > 0
48
+
42
49
  def run(
43
50
  self,
44
51
  image: str,
@@ -46,6 +53,7 @@ class DockerManager(CMgr):
46
53
  jobname: str = None,
47
54
  artefacts_dir: str = Path("~/.artefacts").expanduser(),
48
55
  api_url: str = DEFAULT_API_URL,
56
+ with_gui: bool = False,
49
57
  ) -> Tuple[Any, Generator]:
50
58
  if not self._valid_artefacts_api_key(project, artefacts_dir):
51
59
  return None, iter(
@@ -60,6 +68,15 @@ class DockerManager(CMgr):
60
68
  "ARTEFACTS_API_URL": api_url,
61
69
  }
62
70
 
71
+ if platform.system() in ["Darwin", "Windows"]:
72
+ # Assume we run in Docker Desktop
73
+ env["DISPLAY"] = "host.docker.internal:0"
74
+ else:
75
+ env["DISPLAY"] = os.environ.get("DISPLAY", ":0")
76
+
77
+ if not with_gui:
78
+ env["QT_QPA_PLATFORM"] = "offscreen"
79
+
63
80
  container = self.client.create_container(
64
81
  image,
65
82
  environment=env,
@@ -72,6 +89,7 @@ class DockerManager(CMgr):
72
89
  "mode": "ro",
73
90
  },
74
91
  },
92
+ network_mode="host",
75
93
  ),
76
94
  )
77
95
  self.client.start(container=container.get("Id"))
@@ -50,5 +50,8 @@ class ContainerMgr:
50
50
  def build(self, **kwargs) -> Tuple[str, Generator]:
51
51
  return self.mgr.build(**kwargs)
52
52
 
53
+ def check(self, image: str) -> bool:
54
+ return self.mgr.check(image)
55
+
53
56
  def run(self, **kwargs) -> Tuple[Any, Generator]:
54
57
  return self.mgr.run(**kwargs)
@@ -12,5 +12,5 @@ __version__: str
12
12
  __version_tuple__: VERSION_TUPLE
13
13
  version_tuple: VERSION_TUPLE
14
14
 
15
- __version__ = version = '0.6.16'
16
- __version_tuple__ = version_tuple = (0, 6, 16)
15
+ __version__ = version = '0.6.17'
16
+ __version_tuple__ = version_tuple = (0, 6, 17)
@@ -1,6 +1,6 @@
1
1
  version: 0.1.0
2
2
 
3
- project: client-test-platform
3
+ project: artefacts-tests/cli-run-remote-testing
4
4
 
5
5
  on:
6
6
  push:
@@ -23,7 +23,7 @@ jobs:
23
23
  timeout: 5 # minutes
24
24
  scenarios:
25
25
  defaults: # Global to all scenarios, and overriden in specific scenarios.
26
- output_dirs:
26
+ output_dirs:
27
27
  - /tmp/outputs/
28
28
  subscriptions:
29
29
  pose: turtle1/pose
@@ -55,4 +55,4 @@ jobs:
55
55
  pose: turtle1/pose
56
56
  settings:
57
57
  - name: turtle
58
- ros_testfile: infra-tests/turtlesim2/launch_turtle.py
58
+ ros_testfile: infra-tests/turtlesim2/launch_turtle.py
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: artefacts_cli
3
- Version: 0.6.16
3
+ Version: 0.6.17
4
4
  Author-email: FD <fabian@artefacts.com>, AGC <alejandro@artefacts.com>, TN <tomo@artefacts.com>, EP <eric@artefacts.com>
5
5
  Project-URL: Homepage, https://github.com/art-e-fact/artefacts-client
6
6
  Project-URL: Bug Tracker, https://github.com/art-e-fact/artefacts-client/issues
@@ -18,6 +18,7 @@ Requires-Dist: mcap-ros2-support
18
18
  Requires-Dist: PyYAML>=6.0
19
19
  Requires-Dist: requests>=2.27.1
20
20
  Requires-Dist: setuptools-scm
21
+ Requires-Dist: setuptools>=74
21
22
  Provides-Extra: dev
22
23
  Requires-Dist: awscli; extra == "dev"
23
24
  Requires-Dist: build; extra == "dev"
@@ -7,6 +7,7 @@ mcap-ros2-support
7
7
  PyYAML>=6.0
8
8
  requests>=2.27.1
9
9
  setuptools-scm
10
+ setuptools>=74
10
11
 
11
12
  [dev]
12
13
  awscli
@@ -28,6 +28,7 @@ dependencies = [
28
28
  "PyYAML>=6.0",
29
29
  "requests>=2.27.1",
30
30
  "setuptools-scm",
31
+ "setuptools>=74", # setuptools-scm requires without version, but does not work with oldish versions, so let's ensure a recent, tested one.
31
32
  ]
32
33
  dynamic = ["version"]
33
34
 
@@ -3,11 +3,11 @@ from uuid import uuid4
3
3
 
4
4
  import pytest
5
5
 
6
- from artefacts.cli import app_containers as containers
6
+ from artefacts.cli.app_containers import containers
7
7
 
8
8
 
9
9
  def test_container_package_exists(cli_runner):
10
- result = cli_runner.invoke(containers.package, [])
10
+ result = cli_runner.invoke(containers, [])
11
11
  assert result.exit_code == 0
12
12
 
13
13
 
@@ -15,9 +15,7 @@ def test_container_package_build_specific_dockerfile(
15
15
  cli_runner, dockerfile_available, docker_mocker
16
16
  ):
17
17
  dockerfile = "non_standard_dockerfile"
18
- result = cli_runner.invoke(
19
- containers.package, ["build", "--dockerfile", dockerfile]
20
- )
18
+ result = cli_runner.invoke(containers, ["build", "--dockerfile", dockerfile])
21
19
  dockerfile_available.assert_any_call(os.path.join(".", dockerfile))
22
20
  assert result.exit_code == 0
23
21
 
@@ -26,14 +24,12 @@ def test_container_package_build_specific_dockerfile_missing(
26
24
  cli_runner, dockerfile_not_available
27
25
  ):
28
26
  dockerfile = "non_standard_dockerfile"
29
- result = cli_runner.invoke(
30
- containers.package, ["build", "--dockerfile", dockerfile]
31
- )
27
+ result = cli_runner.invoke(containers, ["build", "--dockerfile", dockerfile])
32
28
  dockerfile_not_available.assert_any_call(os.path.join(".", dockerfile))
33
29
  assert result.exit_code == 1
34
30
  assert (
35
31
  result.output.strip()
36
- == f"Error: No {dockerfile} found here. I cannot build the package."
32
+ == f"Error: No {dockerfile} found here. I cannot build the container."
37
33
  )
38
34
 
39
35
 
@@ -42,7 +38,7 @@ def test_container_package_build_specific_image_name(
42
38
  ):
43
39
  name = str(uuid4())
44
40
  before = len(docker_mocker.images())
45
- result = cli_runner.invoke(containers.package, ["build", "--name", name])
41
+ result = cli_runner.invoke(containers, ["build", "--name", name])
46
42
  assert result.exit_code == 0
47
43
  assert len(docker_mocker.images()) == before + 1
48
44
  assert docker_mocker.get_image(name).Repository == name
@@ -52,7 +48,7 @@ def test_container_package_build_default_image_name(
52
48
  cli_runner, dockerfile_available, docker_mocker
53
49
  ):
54
50
  before = len(docker_mocker.images())
55
- result = cli_runner.invoke(containers.package, ["build"])
51
+ result = cli_runner.invoke(containers, ["build"])
56
52
  assert result.exit_code == 0
57
53
  assert len(docker_mocker.images()) == before + 1
58
54
  assert docker_mocker.get_image("artefacts") is not None
File without changes
File without changes