remotivelabs-cli 0.0.11__py3-none-any.whl → 0.0.13__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.
cli/broker/brokers.py CHANGED
@@ -1,12 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import os
4
- import signal as os_signal
5
4
  from time import sleep
6
- from typing import List
7
5
 
8
6
  import typer
9
- from rich.progress import Progress, SpinnerColumn, TextColumn
10
7
  from zeroconf import (
11
8
  IPVersion,
12
9
  ServiceBrowser,
@@ -15,7 +12,6 @@ from zeroconf import (
15
12
  )
16
13
 
17
14
  from . import export, files, playback, record, scripting, signals
18
- from .lib.broker import Broker
19
15
 
20
16
  app = typer.Typer(rich_markup_mode="rich")
21
17
 
@@ -31,60 +27,6 @@ def main(
31
27
  return
32
28
 
33
29
 
34
- @app.command(name="x-diagnose")
35
- def diagnose(
36
- namespace: List[str] = typer.Option([], help="Namespace to diagnose"),
37
- all_namespaces: bool = typer.Option(False, help="Scan all namespaces, must be true if no namespaces provided"),
38
- wait_for_traffic: bool = typer.Option(False, help="Wait until traffic is found on any bus"),
39
- quiet: bool = typer.Option(False, help="Do not prompt me"),
40
- url: str = typer.Option(..., help="Broker URL", envvar="REMOTIVE_BROKER_URL"),
41
- api_key: str = typer.Option("offline", help="Cloud Broker API-KEY or access token", envvar="REMOTIVE_BROKER_API_KEY"),
42
- ):
43
- """
44
- [Experimental] - Performs a scan on specified buses to see if the is any traffic coming on the buses. This works
45
- for both recordings and live data
46
-
47
- """
48
-
49
- if not quiet:
50
- do_it = typer.confirm(
51
- """
52
- This will perform recordings on selected buses, make sure there are no recordings currently running on the broker.
53
- """
54
- )
55
- if not do_it:
56
- print("Skipping diagnosis")
57
- raise typer.Abort()
58
-
59
- broker = Broker(url, api_key)
60
- with Progress(
61
- SpinnerColumn(),
62
- TextColumn("[progress.description]{task.description}"),
63
- transient=True,
64
- ) as progress:
65
- if len(namespace) > 0 and all_namespaces:
66
- print("No namespaces should be supplied when all-namespaces is used")
67
- raise typer.Exit(1)
68
- if len(namespace) == 0 and not all_namespaces:
69
- print("No namespaces chosen")
70
- raise typer.Exit(1)
71
-
72
- if all_namespaces:
73
- namespace = broker.list_namespaces()
74
-
75
- if wait_for_traffic:
76
- progress.add_task(description=f"Scanning for traffic on {namespace} [Ctrl+C to exit] ", total=1)
77
- else:
78
- progress.add_task(description=f"Scanning for traffic on {namespace}... (just a few seconds)", total=1)
79
-
80
- def on_sigint(sig, frame):
81
- progress.add_task(description="Cleaning up, please wait...", total=None)
82
-
83
- os_signal.signal(os_signal.SIGINT, on_sigint)
84
-
85
- broker.diagnose(namespace, wait_for_traffic)
86
-
87
-
88
30
  @app.command(help="Discover brokers on this network")
89
31
  def discover():
90
32
  # print("Not implemented")
cli/broker/lib/broker.py CHANGED
@@ -1,6 +1,7 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  import binascii
4
+ import datetime
4
5
  import ntpath
5
6
  import os
6
7
  import posixpath
@@ -8,6 +9,7 @@ import queue
8
9
  import signal as os_signal
9
10
  import tempfile
10
11
  import time
12
+ import typing
11
13
  import zipfile
12
14
  from dataclasses import dataclass
13
15
  from threading import Thread
@@ -181,6 +183,27 @@ class Broker:
181
183
  self.__check_playbackmode_result(status)
182
184
  return status
183
185
 
186
+ def listen_on_playback(self, callback: Callable[[str], None]):
187
+ def get_mode(mode: int):
188
+ if mode == 0:
189
+ return "playing"
190
+ if mode == 1:
191
+ return "paused"
192
+ if mode == 2:
193
+ return "stopped"
194
+
195
+ sub = self.traffic_stub.PlayTrafficStatus(br.common_pb2.Empty())
196
+ for playback_state in sub:
197
+ p = typing.cast(br.traffic_api_pb2.PlaybackInfos, playback_state)
198
+ offset_time = int(p.playbackInfo[0].playbackMode.offsetTime / 1000000)
199
+ start_time = p.playbackInfo[0].playbackMode.startTime
200
+ end_time = p.playbackInfo[0].playbackMode.endTime
201
+ mode = p.playbackInfo[0].playbackMode.mode
202
+
203
+ length = int((end_time - start_time) / 1000000)
204
+
205
+ callback(f"{(datetime.timedelta(seconds=offset_time))} / {(datetime.timedelta(seconds=length))} ({get_mode(mode)})")
206
+
184
207
  def pause(self, namespace: str, path: str, silent: bool = False):
185
208
  playback_list = [
186
209
  {
cli/broker/signals.py CHANGED
@@ -5,13 +5,12 @@ import numbers
5
5
  import os
6
6
  import signal as os_signal
7
7
  from pathlib import Path
8
- from typing import List, TypedDict, Union
8
+ from typing import List, TypedDict
9
9
 
10
10
  import grpc
11
11
  import plotext as plt
12
12
  import typer
13
13
  from rich import print as rich_rprint
14
- from typing_extensions import Annotated
15
14
 
16
15
  from cli.errors import ErrorPrinter
17
16
 
@@ -57,43 +56,38 @@ def read_scripted_code_file(file_path: Path) -> bytes:
57
56
 
58
57
  @app.command()
59
58
  def subscribe( # noqa: C901
60
- url: str = typer.Option(help="Broker URL", envvar="REMOTIVE_BROKER_URL"),
59
+ url: str = typer.Option(..., help="Broker URL", envvar="REMOTIVE_BROKER_URL"),
61
60
  api_key: str = typer.Option(None, help="Cloud Broker API-KEY or access token", envvar="REMOTIVE_BROKER_API_KEY"),
62
61
  signal: List[str] = typer.Option(None, help="Signal names to subscribe to, mandatory when not using script"),
63
- namespace: List[str] = typer.Option(None, help="Deprecated, use --signal namespace:signal"),
64
- script: Union[
65
- Annotated[
66
- Path,
67
- typer.Option(
68
- ...,
69
- exists=True,
70
- file_okay=True,
71
- dir_okay=False,
72
- writable=False,
73
- readable=True,
74
- resolve_path=True,
75
- help="Supply a path to Lua script that to use for signal transformation",
76
- ),
77
- ],
62
+ script: Path = typer.Option(
78
63
  None,
79
- ] = None,
64
+ exists=True,
65
+ file_okay=True,
66
+ dir_okay=False,
67
+ writable=False,
68
+ readable=True,
69
+ resolve_path=True,
70
+ help="Supply a path to Lua script that to use for signal transformation",
71
+ ),
80
72
  on_change_only: bool = typer.Option(default=False, help="Only get signal if value is changed"),
81
- x_plot: bool = typer.Option(default=False, help="Experimental: Plot the signal in terminal. Note graphs are not aligned by time"),
73
+ x_plot: bool = typer.Option(default=False, help="Experimental: Plot the signal in terminal. Note graphs are not " "aligned by time"),
82
74
  x_plot_size: int = typer.Option(default=100, help="Experimental: how many points show for each plot"),
83
75
  # samples: int = typer.Option(default=0, he)
84
76
  ):
85
77
  """
86
- Sample usage:
78
+ Subscribe to a selection of signals
87
79
 
88
- remotive broker signals subscribe --url http://localhost:50051 --namespace can0 --signal signal1 --signal signal2
80
+ Subscribe to two signals and have it printed to terminal
81
+ ```
82
+ remotive broker signals subscribe --url http://localhost:50051 --signal can1:signal1 --signal can0:signal2
83
+ ```
89
84
 
85
+ Subscribe using a LUA script with signal transformations, read more about scripted signals at https://docs.remotivelabs.com/docs/remotive-broker
86
+ ```
90
87
  remotive broker signals subscribe --url http://localhost:50051 --script myvss_script.lua
88
+ ```
91
89
  """
92
90
 
93
- if namespace is not None and len(namespace) > 0:
94
- ErrorPrinter.print_hint("--namespace has been deprecated and you should instead use --signal namespace:signal when subscribing")
95
- exit(1)
96
-
97
91
  if script is None:
98
92
  if len(signal) == 0:
99
93
  ErrorPrinter.print_generic_error("You must use include at least one signal and one namespace or use script when subscribing")
cli/cloud/configs.py CHANGED
@@ -1,5 +1,7 @@
1
+ import os.path
1
2
  import shutil
2
3
  import sys
4
+ from pathlib import Path
3
5
 
4
6
  import requests
5
7
  import typer
@@ -23,6 +25,26 @@ def delete(
23
25
  rest.handle_delete(f"/api/project/{project}/files/config/{signal_db_file}")
24
26
 
25
27
 
28
+ @app.command()
29
+ def upload(
30
+ path: Path = typer.Argument(
31
+ ...,
32
+ exists=True,
33
+ file_okay=True,
34
+ dir_okay=False,
35
+ writable=False,
36
+ readable=True,
37
+ resolve_path=True,
38
+ help="Path to signal database file to upload",
39
+ ),
40
+ project: str = typer.Option(..., help="Project ID", envvar="REMOTIVE_CLOUD_PROJECT"),
41
+ ):
42
+ """
43
+ Uploads signal database to project
44
+ """
45
+ rest.upload_file(path=path, url=f"/api/project/{project}/files/config/{os.path.basename(path)}/uploadfile")
46
+
47
+
26
48
  @app.command()
27
49
  def download(
28
50
  signal_db_file: str = typer.Argument("", help="Signal database file"),
cli/cloud/recordings.py CHANGED
@@ -11,8 +11,7 @@ from pathlib import Path
11
11
  import grpc
12
12
  import requests
13
13
  import typer
14
- from rich.progress import track
15
- from typing_extensions import Annotated
14
+ from rich.progress import Progress, SpinnerColumn, TextColumn, track
16
15
 
17
16
  from cli.errors import ErrorPrinter
18
17
 
@@ -193,19 +192,16 @@ def delete_recording_file(
193
192
 
194
193
  @app.command()
195
194
  def upload(
196
- path: Annotated[
197
- Path,
198
- typer.Argument(
199
- ...,
200
- exists=True,
201
- file_okay=True,
202
- dir_okay=False,
203
- writable=False,
204
- readable=True,
205
- resolve_path=True,
206
- help="Path to recording file to upload",
207
- ),
208
- ],
195
+ path: Path = typer.Argument(
196
+ ...,
197
+ exists=True,
198
+ file_okay=True,
199
+ dir_okay=False,
200
+ writable=False,
201
+ readable=True,
202
+ resolve_path=True,
203
+ help="Path to recording file to upload",
204
+ ),
209
205
  project: str = typer.Option(..., help="Project ID", envvar="REMOTIVE_CLOUD_PROJECT"),
210
206
  recording_type: str = typer.Option("remotive-broker", help="Type of recording"),
211
207
  signal_database: str = typer.Option(None, help="Signal database to use with candump"),
@@ -230,7 +226,9 @@ def upload(
230
226
  else:
231
227
  r = rest.handle_post(f"/api/project/{project}/files/recording/{filename}", return_response=True)
232
228
 
233
- response = rest.upload_file(path=path.name, url=r.text, upload_headers={"Content-Type": "application/x-www-form-urlencoded"})
229
+ response = rest.upload_file_with_signed_url(
230
+ path=path.name, url=r.text, upload_headers={"Content-Type": "application/x-www-form-urlencoded"}
231
+ )
234
232
 
235
233
  if 200 <= response.status_code < 300:
236
234
  print(
@@ -385,6 +383,18 @@ def pause(
385
383
  _do_change_playback_mode("pause", recording_session, broker, project)
386
384
 
387
385
 
386
+ @app.command(name="playback-status")
387
+ def playback_status(
388
+ recording_session: str = typer.Argument(..., help="Recording session id", envvar="REMOTIVE_CLOUD_RECORDING_SESSION"),
389
+ broker: str = typer.Option(None, help="Broker to use"),
390
+ project: str = typer.Option(..., help="Project ID", envvar="REMOTIVE_CLOUD_PROJECT"),
391
+ ):
392
+ """
393
+ Display status and progress of the recording beeing played
394
+ """
395
+ _do_change_playback_mode("status", recording_session, broker, project)
396
+
397
+
388
398
  @app.command()
389
399
  def seek(
390
400
  recording_session: str = typer.Argument(..., help="Recording session id", envvar="REMOTIVE_CLOUD_RECORDING_SESSION"),
@@ -455,6 +465,12 @@ def _do_change_playback_mode(mode: str, recording_session: str, broker: str, pro
455
465
  broker.seek(files, int(seconds * 1000000), True)
456
466
  elif mode == "stop":
457
467
  broker.seek(files, 0, True)
468
+ elif mode == "status":
469
+ p = Progress(SpinnerColumn(), TextColumn("[progress.description]{task.description}"), transient=True)
470
+ t = p.add_task("label", total=1)
471
+
472
+ with p:
473
+ broker.listen_on_playback(lambda c: p.update(t, description=str(c)))
458
474
  else:
459
475
  raise Exception(f"Illegal command {mode}")
460
476
 
cli/cloud/rest_helper.py CHANGED
@@ -150,6 +150,21 @@ def handle_put(url, body=None, params={}, return_response: bool = False):
150
150
 
151
151
 
152
152
  def upload_file(
153
+ path: Union[str, Path], url: str, upload_headers: dict[str, str] = None, return_response: bool = False, progress_label="Uploading..."
154
+ ):
155
+ ensure_auth_token()
156
+ if upload_headers is not None:
157
+ headers.update(upload_headers)
158
+ with open(path, "rb") as file:
159
+ with wrap_file(file, os.stat(path).st_size, description=progress_label) as f:
160
+ r = requests.post(f"{base_url}{url}", files={os.path.basename(path): f}, headers=headers)
161
+ if return_response:
162
+ check_api_result(r)
163
+ return r
164
+ print_api_result(r)
165
+
166
+
167
+ def upload_file_with_signed_url(
153
168
  path: Union[str, Path], url: str, upload_headers: dict[str, str], return_response: bool = False, progress_label="Uploading..."
154
169
  ):
155
170
  with open(path, "rb") as file:
cli/connect/connect.py CHANGED
@@ -4,7 +4,7 @@ import sys
4
4
  from pathlib import Path
5
5
 
6
6
  import typer
7
- from typing_extensions import Annotated, List, Union
7
+ from typing_extensions import List
8
8
 
9
9
  from cli.broker.lib.broker import SubscribableSignal
10
10
  from cli.errors import ErrorPrinter
@@ -14,21 +14,16 @@ app = typer.Typer()
14
14
 
15
15
  @app.command()
16
16
  def protopie(
17
- config: Union[
18
- Annotated[
19
- Path,
20
- typer.Option(
21
- exists=True,
22
- file_okay=True,
23
- dir_okay=False,
24
- writable=False,
25
- readable=True,
26
- resolve_path=True,
27
- help="Configuration file with signal subscriptions and mapping if needed",
28
- ),
29
- ],
17
+ config: Path = typer.Option(
30
18
  None,
31
- ] = None,
19
+ exists=True,
20
+ file_okay=True,
21
+ dir_okay=False,
22
+ writable=False,
23
+ readable=True,
24
+ resolve_path=True,
25
+ help="Configuration file with signal subscriptions and mapping if needed",
26
+ ),
32
27
  signal: List[str] = typer.Option(None, help="Signal names to subscribe to, mandatory when not using script"),
33
28
  signal_name_expression: str = typer.Option(
34
29
  None, help='[Experimental] Python expression to rename signal names, i.e \'lower().replace(".","_")\''
cli/tools/can/can.py CHANGED
@@ -3,7 +3,6 @@ from pathlib import Path
3
3
  import can
4
4
  import typer
5
5
  from rich.console import Console
6
- from typing_extensions import Annotated
7
6
 
8
7
  err_console = Console(stderr=True)
9
8
  console = Console()
@@ -17,30 +16,24 @@ app = typer.Typer(help=help)
17
16
 
18
17
  @app.command("convert")
19
18
  def convert(
20
- in_file: Annotated[
21
- Path,
22
- typer.Argument(
23
- exists=True,
24
- file_okay=True,
25
- dir_okay=False,
26
- writable=False,
27
- readable=True,
28
- resolve_path=True,
29
- help="File to convert from (.blf .asc .log)",
30
- ),
31
- ],
32
- out_file: Annotated[
33
- Path,
34
- typer.Argument(
35
- exists=False,
36
- file_okay=True,
37
- dir_okay=False,
38
- writable=True,
39
- readable=True,
40
- resolve_path=True,
41
- help="File to convert to (.blf .asc .log)",
42
- ),
43
- ],
19
+ in_file: Path = typer.Argument(
20
+ exists=True,
21
+ file_okay=True,
22
+ dir_okay=False,
23
+ writable=False,
24
+ readable=True,
25
+ resolve_path=True,
26
+ help="File to convert from (.blf .asc .log)",
27
+ ),
28
+ out_file: Path = typer.Argument(
29
+ exists=False,
30
+ file_okay=True,
31
+ dir_okay=False,
32
+ writable=True,
33
+ readable=True,
34
+ resolve_path=True,
35
+ help="File to convert to (.blf .asc .log)",
36
+ ),
44
37
  ):
45
38
  r"""
46
39
  Converts between ASC, BLF and LOG files. Files must end with .asc, .blf or .log.
@@ -59,18 +52,15 @@ def convert(
59
52
 
60
53
  @app.command("validate")
61
54
  def validate(
62
- in_file: Annotated[
63
- Path,
64
- typer.Argument(
65
- exists=True,
66
- file_okay=True,
67
- dir_okay=False,
68
- writable=False,
69
- readable=True,
70
- resolve_path=True,
71
- help="File to validate (.blf .asc .log)",
72
- ),
73
- ],
55
+ in_file: Path = typer.Argument(
56
+ exists=True,
57
+ file_okay=True,
58
+ dir_okay=False,
59
+ writable=False,
60
+ readable=True,
61
+ resolve_path=True,
62
+ help="File to validate (.blf .asc .log)",
63
+ ),
74
64
  print: bool = typer.Option(False, help="Print file contents to terminal"),
75
65
  ):
76
66
  r"""
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: remotivelabs-cli
3
- Version: 0.0.11
3
+ Version: 0.0.13
4
4
  Summary: CLI for operating RemotiveCloud and RemotiveBroker
5
5
  Author: Johan Rask
6
6
  Author-email: johan.rask@remotivelabs.com
@@ -1,28 +1,28 @@
1
1
  cli/__about__.py,sha256=qXVkxWb3aPCF-4MjQhB0wqL2GEblEH4Qwk70o29UkJk,122
2
2
  cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- cli/broker/brokers.py,sha256=BLjnoNX-WrJx77YMy4j1h0BdwbWkUnsfs-KdbezSXps,5338
3
+ cli/broker/brokers.py,sha256=sSX--mm5ln5RUFR60VFHQR6NWu4Qz7Jqi2Ws-4TJsDI,3052
4
4
  cli/broker/export.py,sha256=GxwE9ufWRwfxVh3eTLkwuOqwUOtsvS9Wb7b-BooULC8,3734
5
5
  cli/broker/files.py,sha256=_8elBjbmJ5MEEeFGJ7QYkXzyuLDCDpO6UvEVXHbRy7U,4133
6
6
  cli/broker/lib/__about__.py,sha256=xnZ5V6ZcHW9dhWLWdMzVjYJbEnMKpeXm0_S_mbNzypE,141
7
- cli/broker/lib/broker.py,sha256=65Y2MqwPNk0XGv284gKkIJuMeFMYcMdBFRYizzIm_3w,19713
7
+ cli/broker/lib/broker.py,sha256=fmGsdxmdC3llrIvr0o3E2cpkGHU6mxrbZ7_ac2ZqVvU,20664
8
8
  cli/broker/playback.py,sha256=oOfC8Jn4Ib-nc9T6ob_uNXZSeCWfft7MrMQPafH4U2I,4846
9
9
  cli/broker/record.py,sha256=gEvo3myHbIl6UyXzhJE741NiwRrFf7doBg6HXzzp5z0,1382
10
10
  cli/broker/scripting.py,sha256=sLDtuktWsVk0fJ3RW4kYyh-_YAVJP3VM0xFIQR499Oo,3392
11
- cli/broker/signals.py,sha256=vQAxnxNYzrtuSTGua5MUXWbacF9mZ6WnLSq7lRmUVUQ,6792
11
+ cli/broker/signals.py,sha256=3z4vVivPdo8dfz8XY-s7Ga5I75uQaptWarixrfSsm-0,6547
12
12
  cli/cloud/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
13
13
  cli/cloud/auth.py,sha256=xi47cQWjs6q7Kje4XUbTqEk_BgG3NJ1gMOYPU-_4tgw,3470
14
14
  cli/cloud/auth_tokens.py,sha256=5ox0Pxfij8aTgEcDwRBasaSQvDuLIGCJc-INjmIQN2M,3408
15
15
  cli/cloud/brokers.py,sha256=wa3uMg91IZdrP0tMpTdO9cBIkZHtMHxQ-zEXwFiye_I,4127
16
16
  cli/cloud/cloud_cli.py,sha256=nRRXFF_IgUMayerxS-h7oqsNe6tt34Q5VeThq8gatEg,1443
17
- cli/cloud/configs.py,sha256=XkSXuJFrWJxkwtbfJrexAiqMQ6StqbJlH2JDJAZTlN0,3489
17
+ cli/cloud/configs.py,sha256=2p1mCHf5BwYNtwbY0Cbed5t6-79WHGKWU4Fv6LuJ21o,4069
18
18
  cli/cloud/projects.py,sha256=-uqltAOficwprOKaPd2R0Itm4sqTz3VJNs9Sc8jtO5k,1369
19
- cli/cloud/recordings.py,sha256=Dd2tp-PtpFziIDqWnwceTT0P4-iVv1pMu4gpQ3FH4nw,19611
20
- cli/cloud/rest_helper.py,sha256=B41uYaIxc7K1efD9aZ2VdE_aqQY6dDldVxD-eiYvuLY,5885
19
+ cli/cloud/recordings.py,sha256=F42VXWuoIVKmjkSxr4fq0M9w1GwszNE1kUbkVzxEaf4,20334
20
+ cli/cloud/rest_helper.py,sha256=g7lmGosAS0IDlo9Aso0bH0tdlLTCz0IYx3R71DXKtkc,6491
21
21
  cli/cloud/sample_recordings.py,sha256=g1X6JTxvzWInSP9R1BJsDmL4WqvpEKqjdJR_xT4bo1U,639
22
22
  cli/cloud/service_account_tokens.py,sha256=7vjoMd6Xq7orWCUP7TVUVa86JA0OiX8O10NZcHUE6rM,2294
23
23
  cli/cloud/service_accounts.py,sha256=GCYdYPnP5uWVsg1bTIS67CmoPWDng5dupJHmlThrJ80,1606
24
24
  cli/connect/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
25
- cli/connect/connect.py,sha256=CAPh8d-pqCTQrPVZiX5j3J9lT-NdzGYp519eJdPmvXY,3805
25
+ cli/connect/connect.py,sha256=xeQLgbLvwB-l2pL6ulbOkYeMQZb5B_rLvy7oQVNa78k,3649
26
26
  cli/connect/protopie/protopie.py,sha256=aMF7rQHX4xLN9ylijJB1SMNlB1IIl14YBLw6oLweWH4,5646
27
27
  cli/errors.py,sha256=sOjYasWbwqu2IcK4MvrG4ddpQ7idLGxiFYOxjhdsahM,1319
28
28
  cli/remotive.py,sha256=KKahzVZACa3MIBqt2lZDiSsDOTmoZIdNeKex8LJR8ZQ,1645
@@ -30,10 +30,10 @@ cli/requirements.txt,sha256=Tjpv2HSAPemgKC-eJbwDw-gvAdklfJ18LixRcwzvQIU,78
30
30
  cli/settings.py,sha256=r0txIWXNTH1veGu97J84PiYEDBsAphkXYTN64n_C-qw,792
31
31
  cli/tools/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
32
32
  cli/tools/can/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
33
- cli/tools/can/can.py,sha256=sl95utXl2gjXV8cN0AVzJut95oeWzKn7hgVTQn136V0,2407
33
+ cli/tools/can/can.py,sha256=kSd1c-nxxXyeKkm19oDILiDBZsKOcpjsUT0T3xox5Qs,2172
34
34
  cli/tools/tools.py,sha256=LwQdWMcJ19pCyKUsVfSB2B3R6ui61NxxFWP0Nrnd5Jk,198
35
- remotivelabs_cli-0.0.11.dist-info/LICENSE,sha256=qDPP_yfuv1fF-u7EfexN-cN3M8aFgGVndGhGLovLKz0,608
36
- remotivelabs_cli-0.0.11.dist-info/METADATA,sha256=QJTlnudIpCSpyyv41IHMd7xvRJLZq9KrkQ2qLyQtx88,1224
37
- remotivelabs_cli-0.0.11.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
38
- remotivelabs_cli-0.0.11.dist-info/entry_points.txt,sha256=lvDhPgagLqW_KTnLPCwKSqfYlEp-1uYVosRiPjsVj10,45
39
- remotivelabs_cli-0.0.11.dist-info/RECORD,,
35
+ remotivelabs_cli-0.0.13.dist-info/LICENSE,sha256=qDPP_yfuv1fF-u7EfexN-cN3M8aFgGVndGhGLovLKz0,608
36
+ remotivelabs_cli-0.0.13.dist-info/METADATA,sha256=q4vUcxbJSS14XERa8zL9nWJpHA6bVeFSWnja5b75tEo,1224
37
+ remotivelabs_cli-0.0.13.dist-info/WHEEL,sha256=FMvqSimYX_P7y0a7UY-_Mc83r5zkBZsCYPm7Lr0Bsq4,88
38
+ remotivelabs_cli-0.0.13.dist-info/entry_points.txt,sha256=lvDhPgagLqW_KTnLPCwKSqfYlEp-1uYVosRiPjsVj10,45
39
+ remotivelabs_cli-0.0.13.dist-info/RECORD,,