gitlab-runner-tart-driver 0.1.2__tar.gz → 0.1.3__tar.gz

Sign up to get free protection for your applications and to get access to all the features.
Files changed (27) hide show
  1. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/PKG-INFO +23 -2
  2. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/README.md +22 -1
  3. gitlab-runner-tart-driver-0.1.3/gitlab_runner_tart_driver/__init__.py +1 -0
  4. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/commands/prepare.py +29 -23
  5. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/modules/tart.py +28 -6
  6. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver.egg-info/PKG-INFO +23 -2
  7. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/setup.py +1 -1
  8. gitlab-runner-tart-driver-0.1.2/gitlab_runner_tart_driver/__init__.py +0 -1
  9. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/LICENSE.txt +0 -0
  10. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/__main__.py +0 -0
  11. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/cli.py +0 -0
  12. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/commands/__init__.py +0 -0
  13. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/commands/cleanup.py +0 -0
  14. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/commands/config.py +0 -0
  15. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/commands/run.py +0 -0
  16. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/modules/__init__.py +0 -0
  17. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/modules/gitlab_custom_command_config.py +0 -0
  18. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/modules/gitlab_custom_driver_config.py +0 -0
  19. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver/modules/utils.py +0 -0
  20. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver.egg-info/SOURCES.txt +0 -0
  21. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver.egg-info/dependency_links.txt +0 -0
  22. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver.egg-info/entry_points.txt +0 -0
  23. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver.egg-info/not-zip-safe +0 -0
  24. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver.egg-info/requires.txt +0 -0
  25. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/gitlab_runner_tart_driver.egg-info/top_level.txt +0 -0
  26. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/pyproject.toml +0 -0
  27. {gitlab-runner-tart-driver-0.1.2 → gitlab-runner-tart-driver-0.1.3}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gitlab-runner-tart-driver
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Home-page: https://gitlab.com/schmieder.matthias/gitlab-runner-tart-driver
5
5
  Author: Matthias Schmieder
6
6
  Author-email: schmieder.matthias@gmail.com
@@ -114,15 +114,18 @@ The `config.toml` should be located at `~/.gitlab-runner/config.toml`. Open it a
114
114
  [runners.custom]
115
115
  config_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
116
116
  config_args = [ "config", '-x', '/opt/homebrew/bin/tart' ]
117
+ config_exec_timeout = 200
117
118
 
118
119
  prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
119
120
  prepare_args = [ "prepare", '-x', '/opt/homebrew/bin/tart' ]
121
+ prepare_exec_timeout = 200
120
122
 
121
123
  run_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
122
124
  run_args = [ "run", '-x', '/opt/homebrew/bin/tart' ]
123
125
 
124
126
  cleanup_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
125
127
  cleanup_args = [ "cleanup", '-x', '/opt/homebrew/bin/tart' ]
128
+ cleanup_exec_timeout = 200
126
129
  ```
127
130
 
128
131
  Now restart the gitlab-runner with `gitlab-runner restart`
@@ -276,6 +279,22 @@ prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
276
279
  prepare_args = [ "prepare", '-x', '/opt/homebrew/bin/tart', '--concurrency', '2', '--auto-resources', '--cache-dir', '/Users/gitlab/gitlab-runner/cache', '--builds-dir', '/Users/gitlab/gitlab-runner/builds']
277
280
  ```
278
281
 
282
+ ### Volume Mounts
283
+
284
+ Just like with `docker` the `gitlab-runner-tart-driver` allows you to mount any arbitrary host path into your VM. This can be especially useful if you have to mount runner-local resources like shared test-data or additional caches into the executor. You can follow the standard docker syntax for *volume mounts* `--volume /my/local/dir:/opt/remote/dir`. Additionally you can also pass the `ro` flag to make the mount *read-only* i.e. `--volume /my/local/dir:/opt/remote/dir:ro`.
285
+
286
+ ```ini
287
+ [runners.custom]
288
+ config_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
289
+ config_args = [ "config" ]
290
+
291
+ prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
292
+ prepare_args = [ "prepare",
293
+ '-x', '/opt/homebrew/bin/tart',
294
+ '--concurrency', '2',
295
+ '--auto-resources',
296
+ '--volume /data/models/:/opt/data/models:ro']
297
+ ```
279
298
  ### Auto Host Resource Distribution
280
299
 
281
300
  `tart` images come with a pre-defined number of CPUs and Memory allocation. Typical numbers for default images are `cpu_count=4` and `memory=8192`. With the concurrency limitation of two VMs/images running at the same time this might not utilize your host system completely.
@@ -356,8 +375,10 @@ Options:
356
375
  --builds-dir TEXT Path to the builds directory.
357
376
  --timeout INTEGER Timeout in seconds for the VM to be
358
377
  reachable via SSH.
378
+ --volume TEXT Volume mount definition with docker syntax.
379
+ <host_dir>:<vm_dir>[:ro]
359
380
  -x, --tart-executable TEXT Path to the tart executable.
360
- --help Show this message and exit.
381
+ --help Show this message and exit. Show this message and exit.
361
382
  ```
362
383
 
363
384
  ### Command `run`
@@ -99,15 +99,18 @@ The `config.toml` should be located at `~/.gitlab-runner/config.toml`. Open it a
99
99
  [runners.custom]
100
100
  config_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
101
101
  config_args = [ "config", '-x', '/opt/homebrew/bin/tart' ]
102
+ config_exec_timeout = 200
102
103
 
103
104
  prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
104
105
  prepare_args = [ "prepare", '-x', '/opt/homebrew/bin/tart' ]
106
+ prepare_exec_timeout = 200
105
107
 
106
108
  run_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
107
109
  run_args = [ "run", '-x', '/opt/homebrew/bin/tart' ]
108
110
 
109
111
  cleanup_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
110
112
  cleanup_args = [ "cleanup", '-x', '/opt/homebrew/bin/tart' ]
113
+ cleanup_exec_timeout = 200
111
114
  ```
112
115
 
113
116
  Now restart the gitlab-runner with `gitlab-runner restart`
@@ -261,6 +264,22 @@ prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
261
264
  prepare_args = [ "prepare", '-x', '/opt/homebrew/bin/tart', '--concurrency', '2', '--auto-resources', '--cache-dir', '/Users/gitlab/gitlab-runner/cache', '--builds-dir', '/Users/gitlab/gitlab-runner/builds']
262
265
  ```
263
266
 
267
+ ### Volume Mounts
268
+
269
+ Just like with `docker` the `gitlab-runner-tart-driver` allows you to mount any arbitrary host path into your VM. This can be especially useful if you have to mount runner-local resources like shared test-data or additional caches into the executor. You can follow the standard docker syntax for *volume mounts* `--volume /my/local/dir:/opt/remote/dir`. Additionally you can also pass the `ro` flag to make the mount *read-only* i.e. `--volume /my/local/dir:/opt/remote/dir:ro`.
270
+
271
+ ```ini
272
+ [runners.custom]
273
+ config_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
274
+ config_args = [ "config" ]
275
+
276
+ prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
277
+ prepare_args = [ "prepare",
278
+ '-x', '/opt/homebrew/bin/tart',
279
+ '--concurrency', '2',
280
+ '--auto-resources',
281
+ '--volume /data/models/:/opt/data/models:ro']
282
+ ```
264
283
  ### Auto Host Resource Distribution
265
284
 
266
285
  `tart` images come with a pre-defined number of CPUs and Memory allocation. Typical numbers for default images are `cpu_count=4` and `memory=8192`. With the concurrency limitation of two VMs/images running at the same time this might not utilize your host system completely.
@@ -341,8 +360,10 @@ Options:
341
360
  --builds-dir TEXT Path to the builds directory.
342
361
  --timeout INTEGER Timeout in seconds for the VM to be
343
362
  reachable via SSH.
363
+ --volume TEXT Volume mount definition with docker syntax.
364
+ <host_dir>:<vm_dir>[:ro]
344
365
  -x, --tart-executable TEXT Path to the tart executable.
345
- --help Show this message and exit.
366
+ --help Show this message and exit. Show this message and exit.
346
367
  ```
347
368
 
348
369
  ### Command `run`
@@ -0,0 +1 @@
1
+ __version__ = "0.1.3"
@@ -5,7 +5,7 @@ import click
5
5
 
6
6
  from gitlab_runner_tart_driver.modules.gitlab_custom_command_config import GitLabCustomCommandConfig
7
7
  from gitlab_runner_tart_driver.modules.tart import Tart
8
- from gitlab_runner_tart_driver.modules.tart import TartMount
8
+ from gitlab_runner_tart_driver.modules.tart import TartVolume
9
9
  from gitlab_runner_tart_driver.modules.utils import get_host_spec
10
10
  from gitlab_runner_tart_driver.modules.utils import print_host_spec
11
11
 
@@ -71,6 +71,15 @@ from gitlab_runner_tart_driver.modules.utils import print_host_spec
71
71
  type=int,
72
72
  help="Timeout in seconds for the VM to be reachable via SSH.",
73
73
  )
74
+ @click.option(
75
+ "--volume",
76
+ "volumes",
77
+ required=False,
78
+ default=[],
79
+ type=str,
80
+ multiple=True,
81
+ help="Volume mount definition with docker syntax. <host_dir>:<vm_dir>[:ro]",
82
+ )
74
83
  @click.option("-x", "--tart-executable", required=False, default="tart", type=str, help="Path to the tart executable.")
75
84
  def prepare(
76
85
  default_ssh_username,
@@ -87,6 +96,7 @@ def prepare(
87
96
  cache_dir,
88
97
  builds_dir,
89
98
  timeout,
99
+ volumes,
90
100
  tart_executable,
91
101
  ):
92
102
  """Prepare the environment and start the tart VM."""
@@ -117,7 +127,6 @@ def prepare(
117
127
  tart.login(username=p.ci_registry_user, password=p.ci_registry_password, host=p.ci_registry)
118
128
  except:
119
129
  click.secho(f"[ERROR] Failed to login to '{p.ci_registry}'", fg="red")
120
- sys.exit(1)
121
130
 
122
131
  if registry_username and registry_password and registry:
123
132
  click.echo(f"[INFO] Logging into OCI Registry '{registry}'")
@@ -125,7 +134,6 @@ def prepare(
125
134
  tart.login(username=registry_username, password=registry_password, host=registry)
126
135
  except:
127
136
  click.secho(f"[ERROR] Failed to login to '{registry}'", fg="red")
128
- sys.exit(1)
129
137
 
130
138
  if p.tart_registry_username and p.tart_registry_password and p.tart_registry:
131
139
  click.echo(f"[INFO] Logging into custom OCI Registry '{p.tart_registry}'")
@@ -133,7 +141,6 @@ def prepare(
133
141
  tart.login(username=p.tart_registry_username, password=p.tart_registry_password, host=p.tart_registry)
134
142
  except:
135
143
  click.secho(f"[ERROR] Failed to login to '{p.tart_registry}'", fg="red")
136
- sys.exit(1)
137
144
 
138
145
  ######################################################################
139
146
  # PULL
@@ -179,12 +186,16 @@ def prepare(
179
186
 
180
187
  click.echo(f"[INFO] Starting VM instance '{tart_vm_name}'")
181
188
 
182
- mount_dirs = []
189
+ remote_build_dir = "/opt/builds"
190
+ remote_script_dir = "/opt/temp"
191
+ remote_cache_dir = "/opt/cache"
192
+
193
+ volume_mounts = []
183
194
  if cache_dir:
184
195
  cache_dir = os.path.abspath(os.path.expanduser(cache_dir))
185
196
  os.makedirs(cache_dir, exist_ok=True)
186
197
  click.echo(f"[INFO] Cache directory set to '{cache_dir}'")
187
- mount_dirs.append(TartMount(source=cache_dir, dest="cache"))
198
+ volume_mounts.append(TartVolume(source=cache_dir, dest=remote_cache_dir, name="cache", ro=False))
188
199
  if builds_dir:
189
200
  # Concurrency compatible builds directory
190
201
  # see https://docs.gitlab.com/runner/executors/shell.html#run-scripts-as-a-privileged-user
@@ -194,40 +205,35 @@ def prepare(
194
205
  )
195
206
  os.makedirs(builds_dir, exist_ok=True)
196
207
  click.echo(f"[INFO] Builds directory set to '{builds_dir}'")
197
- mount_dirs.append(TartMount(source=builds_dir, dest="builds"))
208
+ volume_mounts.append(TartVolume(source=builds_dir, dest=remote_build_dir, name="builds", ro=False))
209
+
210
+ for v in volumes:
211
+ volume_mounts.append(TartVolume.from_string(v))
198
212
 
199
- tart.run(tart_vm_name, mount_dirs)
213
+ tart.run(tart_vm_name, volume_mounts)
200
214
  ip = tart.ip(tart_vm_name, timeout=timeout)
201
215
  if not ip:
202
216
  click.echo(f"[ERROR] Error, VM was not reacheable after '{timeout}' seconds")
203
217
  sys.exit(1)
204
218
 
205
219
  ssh_session = tart.ssh_session(name=p.vm_name(), username=p.tart_ssh_username, password=p.tart_ssh_password)
206
-
207
- remote_build_dir = "/opt/builds"
208
- remote_script_dir = "/opt/temp"
209
- remote_cache_dir = "/opt/cache"
210
-
211
220
  ssh_session.exec_ssh_command(
212
221
  f"sudo mkdir -p {remote_script_dir} && sudo chown {p.tart_ssh_username}:{p.tart_ssh_username} {remote_script_dir}",
213
222
  )
214
223
 
215
- if cache_dir:
216
- click.echo("[INFO] Bootstrapping cache directory")
224
+ for volume in volume_mounts:
225
+ click.echo("[INFO] Setting up volume mount '{volume.name}'")
217
226
  ssh_session.exec_ssh_command(
218
- f"sudo ln -sf '/Volumes/My Shared Files/cache' {remote_cache_dir}",
227
+ f"sudo mkdir -p $(dirname {volume.dest}); sudo ln -sf '/Volumes/My Shared Files/{volume.name}' {volume.dest}",
219
228
  )
220
- else:
229
+
230
+ # if cache and builds volumes are not mounted, make sure to create them locally inside the VM
231
+ if not cache_dir:
221
232
  ssh_session.exec_ssh_command(
222
233
  f"sudo mkdir -p {remote_cache_dir} && sudo chown {p.tart_ssh_username}:{p.tart_ssh_username} {remote_cache_dir}",
223
234
  )
224
235
 
225
- if builds_dir:
226
- click.echo("[INFO] Bootstrapping builds directory")
227
- ssh_session.exec_ssh_command(
228
- f"sudo ln -sf '/Volumes/My Shared Files/builds' {remote_build_dir}",
229
- )
230
- else:
236
+ if not builds_dir:
231
237
  ssh_session.exec_ssh_command(
232
238
  f"sudo mkdir -p {remote_build_dir} && sudo chown {p.tart_ssh_username}:{p.tart_ssh_username} {remote_build_dir}",
233
239
  )
@@ -26,9 +26,29 @@ class TartVmSpec(BaseModel):
26
26
  ip_address: str
27
27
 
28
28
 
29
- class TartMount(BaseModel):
29
+ class TartVolume(BaseModel):
30
+ name: str
30
31
  source: str
31
32
  dest: str
33
+ ro: bool = Field(default=False)
34
+
35
+ @classmethod
36
+ def from_string(cls, value):
37
+ components = value.split(":")
38
+ if len(components) < 2:
39
+ raise ValueError(f"'{value}' is not a valid volume mount definition")
40
+
41
+ source = os.path.abspath(os.path.expanduser(components[0])).rstrip("/")
42
+ dest = components[1].rstrip("/")
43
+ name = dest.strip("/").replace("/", "__")
44
+ ro = False
45
+ if len(components) > 2:
46
+ if "ro" == components[2]:
47
+ ro = True
48
+ else:
49
+ raise ValueError(f"'{components[2]}' flag unknown")
50
+
51
+ return cls(name=name, source=source, dest=dest, ro=ro)
32
52
 
33
53
 
34
54
  class TartSshSession:
@@ -130,16 +150,18 @@ class Tart(object):
130
150
  """stops a given tart VM"""
131
151
  self.exec(["stop", name])
132
152
 
133
- def run(self, name: str, dirs: list[TartMount] = [], no_graphics=True) -> None:
153
+ def run(self, name: str, volumes: list[TartVolume] = [], no_graphics=True) -> None:
134
154
  """starts a given tart VM"""
135
155
  args = ["run", name]
136
156
  if no_graphics:
137
157
  args.append("--no-graphics")
138
158
 
139
- if dirs:
140
- for d in dirs:
141
- args.extend(["--dir", f"{d.dest}:{os.path.abspath(os.path.expanduser(d.source))}"])
142
-
159
+ if volumes:
160
+ for d in volumes:
161
+ source_path = os.path.abspath(os.path.expanduser(d.source))
162
+ if d.ro:
163
+ source_path = f"{source_path}:ro"
164
+ args.extend(["--dir", f"{d.name}:{source_path}"])
143
165
  try:
144
166
  self.spawn_exec(args)
145
167
  except Exception as e:
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: gitlab-runner-tart-driver
3
- Version: 0.1.2
3
+ Version: 0.1.3
4
4
  Home-page: https://gitlab.com/schmieder.matthias/gitlab-runner-tart-driver
5
5
  Author: Matthias Schmieder
6
6
  Author-email: schmieder.matthias@gmail.com
@@ -114,15 +114,18 @@ The `config.toml` should be located at `~/.gitlab-runner/config.toml`. Open it a
114
114
  [runners.custom]
115
115
  config_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
116
116
  config_args = [ "config", '-x', '/opt/homebrew/bin/tart' ]
117
+ config_exec_timeout = 200
117
118
 
118
119
  prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
119
120
  prepare_args = [ "prepare", '-x', '/opt/homebrew/bin/tart' ]
121
+ prepare_exec_timeout = 200
120
122
 
121
123
  run_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
122
124
  run_args = [ "run", '-x', '/opt/homebrew/bin/tart' ]
123
125
 
124
126
  cleanup_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
125
127
  cleanup_args = [ "cleanup", '-x', '/opt/homebrew/bin/tart' ]
128
+ cleanup_exec_timeout = 200
126
129
  ```
127
130
 
128
131
  Now restart the gitlab-runner with `gitlab-runner restart`
@@ -276,6 +279,22 @@ prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
276
279
  prepare_args = [ "prepare", '-x', '/opt/homebrew/bin/tart', '--concurrency', '2', '--auto-resources', '--cache-dir', '/Users/gitlab/gitlab-runner/cache', '--builds-dir', '/Users/gitlab/gitlab-runner/builds']
277
280
  ```
278
281
 
282
+ ### Volume Mounts
283
+
284
+ Just like with `docker` the `gitlab-runner-tart-driver` allows you to mount any arbitrary host path into your VM. This can be especially useful if you have to mount runner-local resources like shared test-data or additional caches into the executor. You can follow the standard docker syntax for *volume mounts* `--volume /my/local/dir:/opt/remote/dir`. Additionally you can also pass the `ro` flag to make the mount *read-only* i.e. `--volume /my/local/dir:/opt/remote/dir:ro`.
285
+
286
+ ```ini
287
+ [runners.custom]
288
+ config_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
289
+ config_args = [ "config" ]
290
+
291
+ prepare_exec = "/opt/homebrew/bin/gitlab-runner-tart-driver"
292
+ prepare_args = [ "prepare",
293
+ '-x', '/opt/homebrew/bin/tart',
294
+ '--concurrency', '2',
295
+ '--auto-resources',
296
+ '--volume /data/models/:/opt/data/models:ro']
297
+ ```
279
298
  ### Auto Host Resource Distribution
280
299
 
281
300
  `tart` images come with a pre-defined number of CPUs and Memory allocation. Typical numbers for default images are `cpu_count=4` and `memory=8192`. With the concurrency limitation of two VMs/images running at the same time this might not utilize your host system completely.
@@ -356,8 +375,10 @@ Options:
356
375
  --builds-dir TEXT Path to the builds directory.
357
376
  --timeout INTEGER Timeout in seconds for the VM to be
358
377
  reachable via SSH.
378
+ --volume TEXT Volume mount definition with docker syntax.
379
+ <host_dir>:<vm_dir>[:ro]
359
380
  -x, --tart-executable TEXT Path to the tart executable.
360
- --help Show this message and exit.
381
+ --help Show this message and exit. Show this message and exit.
361
382
  ```
362
383
 
363
384
  ### Command `run`
@@ -10,7 +10,7 @@ this_directory = os.path.abspath(os.path.dirname(__file__))
10
10
  with open(os.path.join(this_directory, "README.md"), encoding="utf-8") as f:
11
11
  long_description = f.read()
12
12
 
13
- version = "0.1.2"
13
+ version = "0.1.3"
14
14
 
15
15
  version = f"{version}{os.environ.get('PIP_VERSION_POSTFIX','')}"
16
16
 
@@ -1 +0,0 @@
1
- __version__ = "0.1.2"