conkernelclient 0.0.17__tar.gz → 0.0.19__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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: conkernelclient
3
- Version: 0.0.17
3
+ Version: 0.0.19
4
4
  Summary: Concurrent-safe Jupyter KernelClient
5
5
  Author-email: Jeremy Howard <github@jhoward.fastmail.fm>
6
6
  License: Apache-2.0
@@ -14,7 +14,7 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: jupyter_client
16
16
  Requires-Dist: fastcore>=2.1.17
17
- Requires-Dist: jupywire>=0.0.1
17
+ Requires-Dist: jupywire>=0.1.4
18
18
  Provides-Extra: dev
19
19
  Requires-Dist: ipykernel; extra == "dev"
20
20
  Requires-Dist: ipymini>=0.1.17; extra == "dev"
@@ -1,3 +1,3 @@
1
- __version__ = "0.0.17"
1
+ __version__ = "0.0.19"
2
2
  from .core import *
3
3
  from .ops import *
@@ -27,6 +27,8 @@ d = { 'settings': { 'branch': 'main',
27
27
  'conkernelclient.core.ConKernelClient.wait_for_ready': ( 'core.html#conkernelclient.wait_for_ready',
28
28
  'conkernelclient/core.py'),
29
29
  'conkernelclient.core.ConKernelManager': ('core.html#conkernelmanager', 'conkernelclient/core.py'),
30
+ 'conkernelclient.core.ConKernelManager.__init__': ( 'core.html#conkernelmanager.__init__',
31
+ 'conkernelclient/core.py'),
30
32
  'conkernelclient.core.ConKernelManager._transport_encryption_default': ( 'core.html#conkernelmanager._transport_encryption_default',
31
33
  'conkernelclient/core.py'),
32
34
  'conkernelclient.core.DeadKernelError': ('core.html#deadkernelerror', 'conkernelclient/core.py'),
@@ -71,10 +73,8 @@ d = { 'settings': { 'branch': 'main',
71
73
  'conkernelclient.ops._ReqProxy.__getattr__': ( 'ops.html#_reqproxy.__getattr__',
72
74
  'conkernelclient/ops.py'),
73
75
  'conkernelclient.ops._ReqProxy.__init__': ('ops.html#_reqproxy.__init__', 'conkernelclient/ops.py'),
74
- 'conkernelclient.ops.iopub_msgs': ('ops.html#iopub_msgs', 'conkernelclient/ops.py'),
75
76
  'conkernelclient.ops.iopub_streams': ('ops.html#iopub_streams', 'conkernelclient/ops.py'),
76
77
  'conkernelclient.ops.iter_timeout': ('ops.html#iter_timeout', 'conkernelclient/ops.py'),
77
- 'conkernelclient.ops.parent_id': ('ops.html#parent_id', 'conkernelclient/ops.py'),
78
78
  'conkernelclient.ops.parse_expr': ('ops.html#parse_expr', 'conkernelclient/ops.py'),
79
79
  'conkernelclient.ops.reconnect': ('ops.html#reconnect', 'conkernelclient/ops.py'),
80
80
  'conkernelclient.ops.run_kernel': ('ops.html#run_kernel', 'conkernelclient/ops.py')}}}
@@ -186,5 +186,8 @@ async def astop_channels(self:ConKernelClient):
186
186
  # %% ../nbs/00_core.ipynb #b828c222
187
187
  class ConKernelManager(AsyncKernelManager):
188
188
  client_class,client_factory = ConKernelClient,Type(ConKernelClient)
189
+ def __init__(self, *args, kernel_spec=None, **kwargs):
190
+ super().__init__(*args, **kwargs)
191
+ if kernel_spec is not None: self._kernel_spec = kernel_spec
189
192
  @default('transport_encryption')
190
193
  def _transport_encryption_default(self): return 'auto'
@@ -5,14 +5,17 @@ Docs: https://AnswerDotAI.github.io/conkernelclient/ops.html.md"""
5
5
  # AUTOGENERATED! DO NOT EDIT! File to edit: ../nbs/01_ops.ipynb.
6
6
 
7
7
  # %% auto #0
8
- __all__ = ['default_timeout', 'output_types', 'parent_id', 'iter_timeout', 'iopub_msgs', 'iopub_streams', 'EvalError',
9
- 'parse_expr', 'run_kernel', 'reconnect']
8
+ __all__ = ['default_timeout', 'iter_timeout', 'iopub_streams', 'EvalError', 'parse_expr', 'run_kernel', 'reconnect', 'parent_id',
9
+ 'iopub_msgs', 'output_types']
10
10
 
11
11
  # %% ../nbs/01_ops.ipynb #23936f1c
12
12
  from fastcore.utils import *
13
13
  from fastcore.ansi import strip_ansi
14
14
  from fastcore.nbio import msgs2outs, preferred_out
15
15
  from .core import ConKernelClient, ConKernelManager, DeadKernelError
16
+ from jupywire.ops import parent_id, iopub_msgs, output_types
17
+ from jupyter_client.kernelspec import KernelSpec
18
+ _all_ = ['parent_id', 'iopub_msgs', 'output_types']
16
19
  from contextlib import asynccontextmanager
17
20
  from ast import literal_eval
18
21
  from queue import Empty
@@ -21,10 +24,6 @@ import asyncio, time
21
24
  # %% ../nbs/01_ops.ipynb #d62f6b51
22
25
  default_timeout = 10
23
26
 
24
- def parent_id(msg):
25
- "The `msg_id` of the request this `msg` responds to, or None"
26
- return nested_idx(msg, "parent_header", "msg_id") or None
27
-
28
27
  def iter_timeout(timeout=None, default=default_timeout):
29
28
  "Yield remaining seconds until `timeout` expires, using monotonic time"
30
29
  end = time.monotonic() + (timeout or default)
@@ -51,17 +50,7 @@ async def iopub_flush(self:ConKernelClient, timeout=0.1):
51
50
  while True: await self.get_iopub_msg(timeout=timeout)
52
51
  except Empty: pass
53
52
 
54
- # %% ../nbs/01_ops.ipynb #add288fe
55
- output_types = {'stream', 'execute_result', 'display_data', 'error'}
56
-
57
-
58
53
  # %% ../nbs/01_ops.ipynb #ebdbd6eb
59
- def iopub_msgs(msgs, msg_type=None):
60
- "Filter iopub `msgs` by `msg_type` - a single type, or a collection of types (all messages if None)"
61
- if msg_type is None: return msgs
62
- types = {msg_type} if isinstance(msg_type, str) else msg_type
63
- return [m for m in msgs if m['msg_type'] in types]
64
-
65
54
  def iopub_streams(msgs, name=None):
66
55
  "The stream messages in `msgs`, optionally only stream `name` ('stdout'/'stderr')"
67
56
  streams = iopub_msgs(msgs, 'stream')
@@ -116,11 +105,10 @@ def reply(self:ConKernelClient,
116
105
  code, # A string of code in the kernel's language.
117
106
  user_expressions:NoneType=None, # A dict mapping names to expressions to be evaluated in the user's dict
118
107
  allow_stdin:NoneType=None, # Flag for whether the kernel can send stdin requests to frontends.
119
- cts_typ:str='code', timeout:int=None, msg_id:NoneType=None, priority:bool=False, **kw
108
+ cts_typ:str='code', timeout:int=None, msg_id:NoneType=None, **kw
120
109
  ):
121
- if priority: assert self.priority, 'no priority subshell configured'
122
110
  return self.execute(code, user_expressions=user_expressions, allow_stdin=allow_stdin, reply=True,
123
- cts_typ=cts_typ, timeout=timeout or getattr(self, 'default_timeout', default_timeout), msg_id=msg_id, subsh_id=self.priority if priority else None, **kw)
111
+ cts_typ=cts_typ, timeout=timeout or getattr(self, 'default_timeout', default_timeout), msg_id=msg_id, **kw)
124
112
 
125
113
  # %% ../nbs/01_ops.ipynb #5de02acb
126
114
  from jupywire.ops import EvalOps, EvalException, try_eval
@@ -215,12 +203,15 @@ async def interrupt(self:ConKernelClient, timeout=5):
215
203
  # %% ../nbs/01_ops.ipynb #edaf42c9
216
204
  @asynccontextmanager
217
205
  async def run_kernel(
218
- kernel_name='python3', # Kernelspec name to launch
206
+ kernel_name='python3', # Kernelspec name to launch, or display name when `argv` is given
207
+ argv=None, # Kernel argv; bypasses kernelspec discovery when provided
219
208
  manager_cls=ConKernelManager, # Manager class, e.g. a subclass customizing launch
220
209
  **kwargs # Passed to `start_kernel` (e.g. `env`, `cwd`)
221
210
  ):
222
- "Start a kernel, yield `(km, kc)` with channels running, and always shut both down"
223
- km = manager_cls(kernel_name=kernel_name)
211
+ "Start a named or direct-argv kernel, yielding `(km, kc)`, and always shut it down"
212
+ manager_kwargs = dict(kernel_name=kernel_name)
213
+ if argv is not None: manager_kwargs['kernel_spec'] = KernelSpec(argv=argv, display_name=kernel_name)
214
+ km = manager_cls(**manager_kwargs)
224
215
  await km.start_kernel(**kwargs)
225
216
  kc = await km.client().start_channels()
226
217
  try: yield km, kc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: conkernelclient
3
- Version: 0.0.17
3
+ Version: 0.0.19
4
4
  Summary: Concurrent-safe Jupyter KernelClient
5
5
  Author-email: Jeremy Howard <github@jhoward.fastmail.fm>
6
6
  License: Apache-2.0
@@ -14,7 +14,7 @@ Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
15
  Requires-Dist: jupyter_client
16
16
  Requires-Dist: fastcore>=2.1.17
17
- Requires-Dist: jupywire>=0.0.1
17
+ Requires-Dist: jupywire>=0.1.4
18
18
  Provides-Extra: dev
19
19
  Requires-Dist: ipykernel; extra == "dev"
20
20
  Requires-Dist: ipymini>=0.1.17; extra == "dev"
@@ -1,6 +1,6 @@
1
1
  jupyter_client
2
2
  fastcore>=2.1.17
3
- jupywire>=0.0.1
3
+ jupywire>=0.1.4
4
4
 
5
5
  [dev]
6
6
  ipykernel
@@ -18,7 +18,7 @@ classifiers = [
18
18
  dependencies = [
19
19
  'jupyter_client',
20
20
  'fastcore>=2.1.17',
21
- 'jupywire>=0.0.1',
21
+ 'jupywire>=0.1.4',
22
22
  ]
23
23
 
24
24
  [project.optional-dependencies]
@@ -37,11 +37,10 @@ class LockedClient(ConKernelClient):
37
37
  class LockedKernelManager(ConKernelManager):
38
38
  client_class,client_factory = LockedClient,Type(LockedClient)
39
39
 
40
-
41
40
  def test_burst_replies_under_send_jitter():
42
41
  "20 pending replies at once, every send jittered: the reader must route each reply to its waiter."
43
42
  async def _run():
44
- async with run_kernel(kernel_name="ipymini", manager_cls=LockedKernelManager) as (km, kc):
43
+ async with run_kernel("ipymini", ["ipymini", "-f", "{connection_file}"], manager_cls=LockedKernelManager) as (km, kc):
45
44
  reps = [kc.execute(f"x{i} = {i}; x{i}", reply=True, timeout=30) for i in range(20)]
46
45
  for i, r in enumerate(await asyncio.gather(*reps)): assert r["content"]["status"] == "ok", (i, r["content"])
47
46
  asyncio.run(_run())