1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
"""Client and Session classes for the beachcomber daemon.
Typical usage::
from beachcomber import Client
client = Client()
result = client.get("git.branch", path="/path/to/repo")
if result.is_hit:
print(result.data)
For multiple queries on one connection use a session::
with client.session() as session:
session.set_context("/path/to/repo")
branch = session.get("git.branch")
status = session.get("git")
"""
# Default socket timeout in seconds (matches Rust client: 100 ms).
: = 0.1
"""Open a Unix domain socket connection to the daemon.
Args:
socket_path: Absolute path to the Unix domain socket.
timeout: Read/write timeout in seconds.
Returns:
Connected :class:`socket.socket`.
Raises:
DaemonNotRunning: If the connection is refused or the socket does
not exist.
"""
=
return
"""Send a request and read one response line.
Args:
sock: Connected socket.
request: Encoded request bytes (must include trailing newline).
Returns:
Parsed response dict (``ok`` has already been verified to be
``True``).
Raises:
ProtocolError: On I/O or parse failure.
ServerError: If the daemon returns ``ok: false``.
"""
# Read until newline using a file-like wrapper.
=
=
# Do not close the underlying socket.
return
"""Build a :class:`CombResult` from a parsed ``get`` response dict."""
=
=
=
return
"""One-shot client for the beachcomber daemon.
Each method opens a new socket connection, sends one request, reads
the response, then closes the connection. This is simple and safe
for occasional queries.
For repeated queries (e.g. populating a shell prompt) prefer
:meth:`session` which reuses the connection.
Args:
socket_path: Explicit path to the daemon socket. If ``None`` the
path is auto-discovered via
:func:`~beachcomber.discovery.discover_socket_path`.
timeout: Socket read/write timeout in seconds. Default ``0.1``.
"""
=
=
return or
"""Read a cached value from the daemon.
Args:
key: Provider key. Use ``"provider.field"`` for a single
scalar (e.g. ``"git.branch"``) or ``"provider"`` for the
full provider object (e.g. ``"git"``).
path: Working-directory path for per-directory providers.
Global providers (e.g. ``"hostname"``) ignore this.
Returns:
:class:`~beachcomber.result.CombResult` with ``is_hit``
``True`` when a cached value exists.
Raises:
DaemonNotRunning: If the socket cannot be reached.
ServerError: If the daemon returns an error response.
ProtocolError: On I/O or JSON parse failure.
"""
=
=
return
"""Trigger recomputation of a provider.
The daemon will recompute the value in the background. This is
fire-and-forget — the method returns once the daemon acknowledges
the poke.
Args:
key: Provider key to recompute.
path: Working-directory path for per-directory providers.
Raises:
DaemonNotRunning: If the socket cannot be reached.
ServerError: If the daemon returns an error response.
ProtocolError: On I/O or JSON parse failure.
"""
=
"""Return available providers from the daemon.
Returns:
List of provider dicts. Each dict has at least ``"name"``,
``"global"``, and ``"fields"`` keys.
Raises:
DaemonNotRunning: If the socket cannot be reached.
ServerError: If the daemon returns an error response.
ProtocolError: On I/O or JSON parse failure.
"""
=
=
return
"""Return daemon scheduler and cache status.
Returns:
Status dict as returned by the daemon.
Raises:
DaemonNotRunning: If the socket cannot be reached.
ServerError: If the daemon returns an error response.
ProtocolError: On I/O or JSON parse failure.
"""
=
=
return
"""Open a persistent connection as a context manager.
Yields a :class:`Session` that reuses a single socket for all
operations within the ``with`` block.
Example::
with client.session() as session:
session.set_context("/my/repo")
result = session.get("git.branch")
Raises:
DaemonNotRunning: If the socket cannot be reached.
"""
=
=
yield
"""Persistent connection to the beachcomber daemon.
Reuses a single Unix domain socket across multiple operations.
Create via :meth:`Client.session` rather than directly.
Args:
sock: Already-connected :class:`socket.socket`.
"""
=
"""Set the default working-directory path for this connection.
After calling this, :meth:`get` and :meth:`poke` calls do not
need an explicit ``path`` argument.
Args:
path: Absolute path to set as the session context.
Raises:
ServerError: If the daemon returns an error response.
ProtocolError: On I/O or JSON parse failure.
"""
"""Read a cached value using the persistent connection.
Args:
key: Provider key (``"git.branch"``, ``"git"``, etc.).
path: Optional path override. If omitted and
:meth:`set_context` has been called, the session context
is used by the daemon.
Returns:
:class:`~beachcomber.result.CombResult`.
Raises:
ServerError: If the daemon returns an error response.
ProtocolError: On I/O or JSON parse failure.
"""
=
return
"""Trigger recomputation via the persistent connection.
Args:
key: Provider key to recompute.
path: Optional path override.
Raises:
ServerError: If the daemon returns an error response.
ProtocolError: On I/O or JSON parse failure.
"""
"""Return available providers via the persistent connection.
Returns:
List of provider dicts.
"""
=
return
"""Return daemon status via the persistent connection.
Returns:
Status dict as returned by the daemon.
"""
=
return