experimaestro 1.7.0rc0__py3-none-any.whl → 1.7.0rc2__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.

Potentially problematic release.


This version of experimaestro might be problematic. Click here for more details.

@@ -194,7 +194,11 @@ def experiments_cli( # noqa: C901
194
194
  xp_file = Path(xp_file)
195
195
  if not python_path:
196
196
  python_path.append(xp_file.parent)
197
- logging.info("Using python path: %s", ", ".join(str(s) for s in python_path))
197
+ logging.info(
198
+ "Using python path: %s", ", ".join(str(s) for s in python_path)
199
+ )
200
+ else:
201
+ xp_file = Path(xp_file)
198
202
 
199
203
  assert (
200
204
  module_name or xp_file
@@ -269,11 +273,11 @@ def experiments_cli( # noqa: C901
269
273
 
270
274
  # Define the workspace
271
275
  ws_env = find_workspace(workdir=workdir, workspace=workspace)
272
-
276
+
273
277
  workdir = ws_env.path
274
278
 
275
279
  logging.info("Using working directory %s", str(workdir.resolve()))
276
-
280
+
277
281
  # --- Runs the experiment
278
282
  with experiment(
279
283
  ws_env, configuration.id, host=host, port=port, run_mode=run_mode
@@ -1,5 +1,6 @@
1
1
  # Configuration registers
2
2
 
3
+ from contextlib import contextmanager
3
4
  from typing import ClassVar, Dict, Optional, Set, Type, Union
4
5
 
5
6
  from pathlib import Path
@@ -36,6 +37,16 @@ def load_yaml(schema, path: Path):
36
37
  )
37
38
 
38
39
 
40
+ @contextmanager
41
+ def ensure_enter(fp):
42
+ """Behaves as a resource, whether it is one or not"""
43
+ if hasattr(fp, "__enter__"):
44
+ with fp as _fp:
45
+ yield _fp
46
+ else:
47
+ yield fp
48
+
49
+
39
50
  class LauncherRegistry:
40
51
  INSTANCES: ClassVar[Dict[Path, "LauncherRegistry"]] = {}
41
52
  CURRENT_CONFIG_DIR: ClassVar[Optional[Path]] = None
@@ -78,7 +89,7 @@ class LauncherRegistry:
78
89
 
79
90
  from importlib import util
80
91
 
81
- with launchers_py.__fspath__() as fp:
92
+ with ensure_enter(launchers_py.__fspath__()) as fp:
82
93
  spec = util.spec_from_file_location("xpm_launchers_conf", fp)
83
94
  module = util.module_from_spec(spec)
84
95
  spec.loader.exec_module(module)
@@ -0,0 +1,17 @@
1
+ syntax = "proto3";
2
+ import "google/protobuf/any.proto";
3
+
4
+
5
+ message Envelope {
6
+ google.protobuf.Any payload = 1;
7
+ }
8
+
9
+ message LevelInformation {
10
+ int32 level = 1;
11
+
12
+ optional string desc = 2; // Optional in proto3 is handled by default unless you want to use 'optional'
13
+ float progress = 3;
14
+
15
+ float previous_progress = 4;
16
+ string previous_desc = 5;
17
+ }
@@ -12,15 +12,16 @@ from tqdm.auto import tqdm as std_tqdm
12
12
 
13
13
  from .utils import logger
14
14
  from experimaestro.taskglobals import Env as TaskEnv
15
+ from experimaestro.notifications_pb2 import LevelInformation
15
16
 
16
17
  # --- Progress and other notifications
17
18
 
18
19
  T = TypeVar("T")
19
20
 
20
-
21
21
  @dataclass
22
22
  class LevelInformation:
23
23
  level: int
24
+
24
25
  desc: Optional[str]
25
26
  progress: float
26
27
 
@@ -213,6 +214,7 @@ class Reporter(threading.Thread):
213
214
 
214
215
  self.cv.notify_all()
215
216
 
217
+ #: The reporter instance
216
218
  INSTANCE: ClassVar[Optional["Reporter"]] = None
217
219
 
218
220
  @staticmethod
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: src/experimaestro/notifications.proto
5
+ # Protobuf Python Version: 5.29.3
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 29,
16
+ 3,
17
+ '',
18
+ 'src/experimaestro/notifications.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+ from google.protobuf import any_pb2 as google_dot_protobuf_dot_any__pb2
26
+
27
+
28
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n%src/experimaestro/notifications.proto\x1a\x19google/protobuf/any.proto\"1\n\x08\x45nvelope\x12%\n\x07payload\x18\x01 \x01(\x0b\x32\x14.google.protobuf.Any\"\x81\x01\n\x10LevelInformation\x12\r\n\x05level\x18\x01 \x01(\x05\x12\x11\n\x04\x64\x65sc\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x10\n\x08progress\x18\x03 \x01(\x02\x12\x19\n\x11previous_progress\x18\x04 \x01(\x02\x12\x15\n\rprevious_desc\x18\x05 \x01(\tB\x07\n\x05_descb\x06proto3')
29
+
30
+ _globals = globals()
31
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
32
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'src.experimaestro.notifications_pb2', _globals)
33
+ if not _descriptor._USE_C_DESCRIPTORS:
34
+ DESCRIPTOR._loaded_options = None
35
+ _globals['_ENVELOPE']._serialized_start=68
36
+ _globals['_ENVELOPE']._serialized_end=117
37
+ _globals['_LEVELINFORMATION']._serialized_start=120
38
+ _globals['_LEVELINFORMATION']._serialized_end=249
39
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,124 @@
1
+ """Handles streaming states
2
+
3
+ Allows to track a global state via a file
4
+
5
+ - partial states can be output
6
+ - every K bytes, a global state is output
7
+
8
+ The reader can then recover quickly by seeking the last global state output.
9
+
10
+ """
11
+
12
+ import struct
13
+ from io import BufferedWriter, BufferedReader, SEEK_END
14
+ from typing import Type, Generator, Union
15
+
16
+ from google.protobuf.message import Message
17
+
18
+ # Constants
19
+ PARTIAL_UPDATE = 1
20
+ GLOBAL_STATE = 2
21
+ HEADER_FORMAT = ">BI" # 1-byte type tag, 4-byte message size
22
+ HEADER_SIZE = struct.calcsize(HEADER_FORMAT)
23
+ MAGIC_NUMBER = b"\xab\xcd\xef\x00"
24
+ MAGIC_SIZE = len(MAGIC_NUMBER)
25
+
26
+
27
+ class StreamingStateWriter:
28
+ def __init__(
29
+ self,
30
+ file: BufferedWriter,
31
+ partial_cls: Type[Message],
32
+ snapshot_cls: Type[Message],
33
+ chunk_size: int = 8192,
34
+ ):
35
+ self.file = file
36
+ self.partial_cls = partial_cls
37
+ self.snapshot_cls = snapshot_cls
38
+ self.chunk_size = chunk_size
39
+ self.bytes_since_last_snapshot = 0
40
+
41
+ def write_partial(self, message: Message):
42
+ assert isinstance(message, self.partial_cls)
43
+ self._write_message(PARTIAL_UPDATE, message)
44
+
45
+ def write_snapshot_if_needed(self, message: Message):
46
+ assert isinstance(message, self.snapshot_cls)
47
+ if self.bytes_since_last_snapshot >= self.chunk_size:
48
+ self._write_message(GLOBAL_STATE, message, with_magic=True)
49
+ self.bytes_since_last_snapshot = 0
50
+
51
+ def _write_message(self, type_tag: int, message: Message, with_magic: bool = False):
52
+ data = message.SerializeToString()
53
+ header = struct.pack(HEADER_FORMAT, type_tag, len(data))
54
+ if with_magic:
55
+ self.file.write(MAGIC_NUMBER)
56
+ self.bytes_since_last_snapshot += MAGIC_SIZE
57
+ self.file.write(header + data)
58
+ self.file.flush()
59
+ self.bytes_since_last_snapshot += HEADER_SIZE + len(data)
60
+
61
+
62
+ class StreamingStateReader:
63
+ def __init__(
64
+ self,
65
+ file: BufferedReader,
66
+ partial_cls: Type[Message],
67
+ snapshot_cls: Type[Message],
68
+ ):
69
+ self.file = file
70
+ self.partial_cls = partial_cls
71
+ self.snapshot_cls = snapshot_cls
72
+
73
+ def __iter__(self) -> Generator[Union[Message, Message], None, None]:
74
+ while True:
75
+ peek = self.file.peek(MAGIC_SIZE)[:MAGIC_SIZE]
76
+ if peek == MAGIC_NUMBER:
77
+ self.file.read(MAGIC_SIZE)
78
+
79
+ header = self.file.read(HEADER_SIZE)
80
+ if len(header) < HEADER_SIZE:
81
+ break
82
+
83
+ type_tag, length = struct.unpack(HEADER_FORMAT, header)
84
+ payload = self.file.read(length)
85
+
86
+ if type_tag == PARTIAL_UPDATE:
87
+ msg = self.partial_cls()
88
+ elif type_tag == GLOBAL_STATE:
89
+ msg = self.snapshot_cls()
90
+ else:
91
+ raise ValueError(f"Unknown type tag: {type_tag}")
92
+
93
+ msg.ParseFromString(payload)
94
+ yield msg
95
+
96
+ def seek_last_snapshot(self) -> Union[Message, None]:
97
+ self.file.seek(0, SEEK_END)
98
+ file_size = self.file.tell()
99
+
100
+ window = 4096
101
+ pos = file_size
102
+
103
+ while pos > 0:
104
+ read_size = min(window, pos)
105
+ pos -= read_size
106
+ self.file.seek(pos)
107
+ data = self.file.read(read_size)
108
+
109
+ idx = data.rfind(MAGIC_NUMBER)
110
+ if idx != -1:
111
+ snapshot_pos = pos + idx + MAGIC_SIZE
112
+ self.file.seek(snapshot_pos)
113
+ header = self.file.read(HEADER_SIZE)
114
+ if len(header) < HEADER_SIZE:
115
+ break
116
+ type_tag, length = struct.unpack(HEADER_FORMAT, header)
117
+ if type_tag != GLOBAL_STATE:
118
+ continue
119
+ payload = self.file.read(length)
120
+ msg = self.snapshot_cls()
121
+ msg.ParseFromString(payload)
122
+ return msg
123
+
124
+ return None
@@ -0,0 +1,9 @@
1
+ syntax = "proto3";
2
+
3
+ message PartialUpdate {
4
+ int32 updated_field = 1;
5
+ }
6
+
7
+ message GlobalState {
8
+ int32 field = 1;
9
+ }
@@ -0,0 +1,38 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # NO CHECKED-IN PROTOBUF GENCODE
4
+ # source: src/experimaestro/tests/state_streamer.proto
5
+ # Protobuf Python Version: 5.29.3
6
+ """Generated protocol buffer code."""
7
+ from google.protobuf import descriptor as _descriptor
8
+ from google.protobuf import descriptor_pool as _descriptor_pool
9
+ from google.protobuf import runtime_version as _runtime_version
10
+ from google.protobuf import symbol_database as _symbol_database
11
+ from google.protobuf.internal import builder as _builder
12
+ _runtime_version.ValidateProtobufRuntimeVersion(
13
+ _runtime_version.Domain.PUBLIC,
14
+ 5,
15
+ 29,
16
+ 3,
17
+ '',
18
+ 'src/experimaestro/tests/state_streamer.proto'
19
+ )
20
+ # @@protoc_insertion_point(imports)
21
+
22
+ _sym_db = _symbol_database.Default()
23
+
24
+
25
+
26
+
27
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n,src/experimaestro/tests/state_streamer.proto\"&\n\rPartialUpdate\x12\x15\n\rupdated_field\x18\x01 \x01(\x05\"\x1c\n\x0bGlobalState\x12\r\n\x05\x66ield\x18\x01 \x01(\x05\x62\x06proto3')
28
+
29
+ _globals = globals()
30
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
31
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'src.experimaestro.tests.state_streamer_pb2', _globals)
32
+ if not _descriptor._USE_C_DESCRIPTORS:
33
+ DESCRIPTOR._loaded_options = None
34
+ _globals['_PARTIALUPDATE']._serialized_start=48
35
+ _globals['_PARTIALUPDATE']._serialized_end=86
36
+ _globals['_GLOBALSTATE']._serialized_start=88
37
+ _globals['_GLOBALSTATE']._serialized_end=116
38
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,18 @@
1
+ from .state_streamer_pb2 import PartialUpdate, GlobalState
2
+
3
+ # Writing
4
+ with open("log.bin", "wb") as f:
5
+ writer = StreamingStateWriter(f, PartialUpdate, GlobalState)
6
+ for i in range(1000):
7
+ writer.write_partial(PartialUpdate(updated_field=i))
8
+ if i % 100 == 0:
9
+ writer.write_snapshot_if_needed(GlobalState(field=i))
10
+
11
+ # Reading
12
+ with open("log.bin", "rb") as f:
13
+ reader = StreamingStateReader(f, PartialUpdate, GlobalState)
14
+ last_snapshot = reader.seek_last_snapshot()
15
+ print("Last Snapshot:", last_snapshot)
16
+
17
+ for msg in reader:
18
+ print(type(msg).__name__, msg)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: experimaestro
3
- Version: 1.7.0rc0
3
+ Version: 1.7.0rc2
4
4
  Summary: "Experimaestro is a computer science experiment manager"
5
5
  License: GPL-3
6
6
  Keywords: experiment manager
@@ -34,6 +34,7 @@ Requires-Dist: huggingface-hub (>0.17)
34
34
  Requires-Dist: humanfriendly (>=10,<11)
35
35
  Requires-Dist: marshmallow (>=3.20,<4.0)
36
36
  Requires-Dist: omegaconf (>=2.3,<3.0)
37
+ Requires-Dist: protobuf (>5)
37
38
  Requires-Dist: psutil (>=7)
38
39
  Requires-Dist: pyparsing (>=3.1,<4.0)
39
40
  Requires-Dist: pytools (>=2023.1.1,<2024.0.0)
@@ -22,7 +22,7 @@ experimaestro/core/types.py,sha256=gSLv9F1HszVxI8jla6e-aVVS7q3KBwSzG1MImUHdGMg,2
22
22
  experimaestro/core/utils.py,sha256=JfC3qGUS9b6FUHc2VxIYUI9ysNpXSQ1LjOBkjfZ8n7o,495
23
23
  experimaestro/exceptions.py,sha256=cUy83WHM3GeynxmMk6QRr5xsnpqUAdAoc-m3KQVrE2o,44
24
24
  experimaestro/experiments/__init__.py,sha256=GcpDUIbCvhnv6rxFdAp4wTffCVNTv-InY6fbQAlTy-o,159
25
- experimaestro/experiments/cli.py,sha256=IyoYL2tBR33tI2bxLD0Z5fwXlyTQH626eFE8NAws-VE,8633
25
+ experimaestro/experiments/cli.py,sha256=fvHz2aih7Aw1DK3GoVkeaVtG3r1tU6qbnwIv-uD0eVI,8697
26
26
  experimaestro/experiments/configuration.py,sha256=cFDiUHnUGblJsctAUxAqx0jlM7_Ja_527lzk-4G-44k,1368
27
27
  experimaestro/generators.py,sha256=DQsEgdMwRUud9suWr-QGxI3vCO5sywP6MVGZWRNQXkk,1372
28
28
  experimaestro/huggingface.py,sha256=gnVlr6SZnbutYz4PLH0Q77n1TRF-uk-dR-3UFzFqAY0,2956
@@ -30,7 +30,7 @@ experimaestro/ipc.py,sha256=Xn3tYME83jLEB0nFak3DwEIhpL5IRZpCl3jirBF_jl4,1570
30
30
  experimaestro/launcherfinder/__init__.py,sha256=qRUDyv3B9UsAM8Q31mRrZrTZox0AptwdmOY4f2K-TUo,279
31
31
  experimaestro/launcherfinder/base.py,sha256=q47SsF_cXdo5O6ZhFKn5385WVFcx8Wd-BcEpd6tRpbs,515
32
32
  experimaestro/launcherfinder/parser.py,sha256=pYbfEJw7osnqZWm7fkVhQawhpNU8dLU_6vEjtXdc8E8,2279
33
- experimaestro/launcherfinder/registry.py,sha256=Eng8Y-EnHhcqWfMGF2kvBo7OJiWVuQsIH9MAqjih12U,5849
33
+ experimaestro/launcherfinder/registry.py,sha256=5KKElGd9aS1gegx-A6JVXL-LACk02wFVQxeUIEbZfUc,6105
34
34
  experimaestro/launcherfinder/specs.py,sha256=G8za6mEmkVxuZY_ab3OhWJIpONpcBMO_iXeB30sUbhI,6448
35
35
  experimaestro/launchers/__init__.py,sha256=lXn544sgJExr6uirILWzAXu_IfmfyqFZOt4OzRnjHXg,2525
36
36
  experimaestro/launchers/direct.py,sha256=JZh6WOPnO6ED_xlOs8pL4MRFmnRhmXzpVxTl-ByaD2A,258
@@ -44,7 +44,9 @@ experimaestro/mkdocs/base.py,sha256=SwLh9s7BZfrTAZdBaealSqVeLAroDSwLLMOHmLCxMPQ,
44
44
  experimaestro/mkdocs/metaloader.py,sha256=qCqnTWhlgxql-oe46E8AbvYdoM311-lQh-msmPnbllQ,1481
45
45
  experimaestro/mkdocs/style.css,sha256=42kJ6Ozq_n4Iw5UfJ4-nO1u-HN3ELvV7Vhvj1Xkn7rQ,66
46
46
  experimaestro/mypy.py,sha256=M39VFuDrab-ymlCDIF5jys9oKpTwnuBPzb1T8Un5J3s,285
47
- experimaestro/notifications.py,sha256=UOcCai8wPGzAI_Zu1-KUr9a8Ns1eHUym3gwjUHXUtSE,9274
47
+ experimaestro/notifications.proto,sha256=0bDb3DYeuP_69rUsBJxMA_2m-P9HznQampw7YGovLUU,363
48
+ experimaestro/notifications.py,sha256=j5BbUkQ9JkRvAJCH60MtrOPbaZ1iWTafc-6bFKYrod8,9368
49
+ experimaestro/notifications_pb2.py,sha256=nkUsLXGOXtKIxdASePIFPgLEH6DuGXUKVX1TpxjMS4M,1847
48
50
  experimaestro/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
49
51
  experimaestro/rpyc.py,sha256=ZRKol-3tVoeoUITLNFenLF4dhWBLW_FvSV_GvsypmeI,3605
50
52
  experimaestro/run.py,sha256=58ZlIZ2dQ7a0un2iGiyHJhK14zc18BnpEFDis7OyTPA,5222
@@ -89,6 +91,7 @@ experimaestro/server/data/manifest.json,sha256=EpzHQZzrGh9c1Kf63nrqvI33H1cm0nLYf
89
91
  experimaestro/settings.py,sha256=U6gTVBL5Z4Rk0_7BAVoavVJKN2sQNRpspE-601Elfys,3170
90
92
  experimaestro/sphinx/__init__.py,sha256=heovvtwbYToZM-b6HNi4pJdBoo_97usdEawhMGSK3bk,9560
91
93
  experimaestro/sphinx/static/experimaestro.css,sha256=0rEgt1LoDdD-a_R5rVfWZ19zD1gR-1L7q3f4UibIB58,294
94
+ experimaestro/streaming_state.py,sha256=NEneDTRWRYfvhqButJCg8rzmVb5coy-sTazljub7umQ,3927
92
95
  experimaestro/taskglobals.py,sha256=Lp0bqobVLndR7fOtF9qPI7utTKQXXwTdVN6l5Av9Dc4,660
93
96
  experimaestro/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
97
  experimaestro/tests/conftest.py,sha256=CtC6TvUS9sbgSc3pZYyTyEvfilnNGPpOUJvi-jn6twI,695
@@ -109,6 +112,8 @@ experimaestro/tests/restart.py,sha256=wivq06i3SoxL_cUKti9J_o3MykynmLic6czuCZSHc_
109
112
  experimaestro/tests/restart_main.py,sha256=iAFzw0H1q9Aq7t6TrSAj236QBnYU52qx0VF-2dz6tx4,295
110
113
  experimaestro/tests/scripts/notifyandwait.py,sha256=3BLXLI5XgP3BnKf6sQ56oKoMVqR80VMHmploJ3JO6Ko,407
111
114
  experimaestro/tests/scripts/waitforfile.py,sha256=EDT-TuFi2fU_qt51K5EmAxjw_OnJKkBW7UCfhrtDbVw,120
115
+ experimaestro/tests/state_streamer.proto,sha256=KopoTOt0VpRKbZ_ed9boQyaWB7oNOlDDKhqX-cj9pZs,121
116
+ experimaestro/tests/state_streamer_pb2.py,sha256=5mbmirhDMAOU09Kx9Wo_YrKF1PK6Ebr2TNBELQ2dfMQ,1541
112
117
  experimaestro/tests/task_tokens.py,sha256=vgqUa-S_YC2Id9pGOSv40qFTwq1WGZkFhr556Z5o678,477
113
118
  experimaestro/tests/tasks/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
114
119
  experimaestro/tests/tasks/all.py,sha256=OMkHsWZkErCmTajiNO7hNhvnk9eKzJC-VatWgabWlsI,1955
@@ -126,6 +131,7 @@ experimaestro/tests/test_progress.py,sha256=wtIGQzlV3ldd_wMng11LinVESchW-1J954mC
126
131
  experimaestro/tests/test_serializers.py,sha256=xSCezAM9yH_Ix1wr7j0au9SyBv9DtZ7b0zs2-Ynt-VM,2338
127
132
  experimaestro/tests/test_snippets.py,sha256=rojnyDjtmAMnSuDUj6Bv9XEgdP8oQf2nVc132JF8vsM,3081
128
133
  experimaestro/tests/test_ssh.py,sha256=KS1NWltiXrJBSStY9d4mwrexeqgNGWmhxuAU_WLQDAU,1449
134
+ experimaestro/tests/test_state_streamer.py,sha256=T1_Mz-dkHEcpPjCGcUsat6s4cOizxHt1so4bw7VkypM,609
129
135
  experimaestro/tests/test_tags.py,sha256=v_8_7LuEHfY_gfa0JRCUkmgJh8h6RMya_nd5NcPAJPw,2852
130
136
  experimaestro/tests/test_tasks.py,sha256=bUSB_UT1MTN2P_RPHd4AT5NK-DFsgCVeFKSiXu3bEz8,9429
131
137
  experimaestro/tests/test_tokens.py,sha256=U3nKBL1KftWhmk3dQZZLQd-MLJL_SscMjI3zMieMHfc,7823
@@ -146,8 +152,8 @@ experimaestro/utils/jupyter.py,sha256=JcEo2yQK7x3Cr1tNl5FqGMZOICxCv9DwMvL5xsWdQP
146
152
  experimaestro/utils/resources.py,sha256=j-nvsTFwmgENMoVGOD2Ap-UD3WU85WkI0IgeSszMCX4,1328
147
153
  experimaestro/utils/settings.py,sha256=jpFMqF0DLL4_P1xGal0zVR5cOrdD8O0Y2IOYvnRgN3k,793
148
154
  experimaestro/xpmutils.py,sha256=S21eMbDYsHfvmZ1HmKpq5Pz5O-1HnCLYxKbyTBbASyQ,638
149
- experimaestro-1.7.0rc0.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
150
- experimaestro-1.7.0rc0.dist-info/METADATA,sha256=GSilZL53OZQGs3cwGv3lzBiUnZCGyFJV2fgtm8XW_w4,6162
151
- experimaestro-1.7.0rc0.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
152
- experimaestro-1.7.0rc0.dist-info/entry_points.txt,sha256=TppTNiz5qm5xm1fhAcdLKdCLMrlL-eQggtCrCI00D9c,446
153
- experimaestro-1.7.0rc0.dist-info/RECORD,,
155
+ experimaestro-1.7.0rc2.dist-info/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
156
+ experimaestro-1.7.0rc2.dist-info/METADATA,sha256=61zmKYFsyGyj3HXvJATsPb3CFO3dn2ZXlR66pegSjic,6191
157
+ experimaestro-1.7.0rc2.dist-info/WHEEL,sha256=fGIA9gx4Qxk2KDKeNJCbOEwSrmLtjWCwzBz351GyrPQ,88
158
+ experimaestro-1.7.0rc2.dist-info/entry_points.txt,sha256=TppTNiz5qm5xm1fhAcdLKdCLMrlL-eQggtCrCI00D9c,446
159
+ experimaestro-1.7.0rc2.dist-info/RECORD,,