dara-core 1.25.0__py3-none-any.whl → 1.25.2__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.
@@ -22,6 +22,7 @@ import uuid
22
22
  from collections.abc import Awaitable, Callable
23
23
  from inspect import Parameter, signature
24
24
  from typing import (
25
+ TYPE_CHECKING,
25
26
  Any,
26
27
  Generic,
27
28
  Protocol,
@@ -41,6 +42,15 @@ from pydantic import (
41
42
  )
42
43
  from typing_extensions import TypedDict, TypeVar, runtime_checkable
43
44
 
45
+ if TYPE_CHECKING:
46
+ from dara.core.interactivity.loop_variable import LoopVariable
47
+
48
+ # Type alias for static type checking
49
+ NestedKey = str | LoopVariable
50
+ else:
51
+ # At runtime, use Any to avoid forward reference issues with Pydantic
52
+ NestedKey = Any
53
+
44
54
  from dara.core.base_definitions import (
45
55
  BaseCachePolicy,
46
56
  BaseTask,
@@ -172,7 +182,7 @@ class DerivedVariable(ClientVariable, Generic[VariableType]):
172
182
  variables: list[AnyVariable]
173
183
  polling_interval: int | None
174
184
  deps: list[AnyVariable] | None = Field(validate_default=True)
175
- nested: list[str] = Field(default_factory=list)
185
+ nested: list[NestedKey] = Field(default_factory=list)
176
186
  uid: str
177
187
  model_config = ConfigDict(extra='forbid', use_enum_values=True, arbitrary_types_allowed=True)
178
188
 
@@ -185,7 +195,7 @@ class DerivedVariable(ClientVariable, Generic[VariableType]):
185
195
  polling_interval: int | None = None,
186
196
  deps: list[AnyVariable] | None = None,
187
197
  uid: str | None = None,
188
- nested: list[str] | None = None,
198
+ nested: list[NestedKey] | None = None,
189
199
  filter_resolver: FilterResolver | None = None,
190
200
  **kwargs,
191
201
  ):
@@ -271,7 +281,14 @@ class DerivedVariable(ClientVariable, Generic[VariableType]):
271
281
 
272
282
  return deps
273
283
 
274
- def get(self, key: str):
284
+ def get(self, key: NestedKey):
285
+ """
286
+ Create a copy of this DerivedVariable that points to a nested key.
287
+
288
+ The key can be a string or a LoopVariable for dynamic access within a For loop.
289
+
290
+ :param key: the key to access; can be a string or LoopVariable
291
+ """
275
292
  return self.model_copy(update={'nested': [*self.nested, key]}, deep=True)
276
293
 
277
294
  def trigger(self, force: bool = True):
@@ -21,7 +21,7 @@ import warnings
21
21
  from collections.abc import Callable
22
22
  from contextlib import contextmanager
23
23
  from contextvars import ContextVar
24
- from typing import Any, Generic
24
+ from typing import TYPE_CHECKING, Any, Generic
25
25
 
26
26
  from fastapi.encoders import jsonable_encoder
27
27
  from pydantic import (
@@ -40,6 +40,15 @@ from dara.core.internal.utils import call_async
40
40
  from dara.core.logging import dev_logger
41
41
  from dara.core.persistence import BackendStore, BrowserStore, PersistenceStore
42
42
 
43
+ if TYPE_CHECKING:
44
+ from dara.core.interactivity.loop_variable import LoopVariable
45
+
46
+ # Type alias for static type checking
47
+ NestedKey = str | LoopVariable
48
+ else:
49
+ # At runtime, use Any to avoid forward reference issues with Pydantic
50
+ NestedKey = Any
51
+
43
52
  VARIABLE_INIT_OVERRIDE = ContextVar[Callable[[dict], dict] | None]('VARIABLE_INIT_OVERRIDE', default=None)
44
53
 
45
54
  VariableType = TypeVar('VariableType')
@@ -56,7 +65,7 @@ class Variable(ClientVariable, Generic[VariableType, PersistenceStoreType_co]):
56
65
  default: VariableType | None = None
57
66
  store: SerializeAsAny[PersistenceStoreType_co | None] = None
58
67
  uid: str
59
- nested: list[str] = Field(default_factory=list)
68
+ nested: list[NestedKey] = Field(default_factory=list)
60
69
  model_config = ConfigDict(extra='forbid')
61
70
 
62
71
  def __init__(
@@ -65,7 +74,7 @@ class Variable(ClientVariable, Generic[VariableType, PersistenceStoreType_co]):
65
74
  persist_value: bool | None = False,
66
75
  uid: str | None = None,
67
76
  store: PersistenceStoreType_co | None = None,
68
- nested: list[str] | None = None,
77
+ nested: list[NestedKey] | None = None,
69
78
  **kwargs,
70
79
  ):
71
80
  """
@@ -144,11 +153,13 @@ class Variable(ClientVariable, Generic[VariableType, PersistenceStoreType_co]):
144
153
  yield
145
154
  VARIABLE_INIT_OVERRIDE.reset(token)
146
155
 
147
- def get(self, key: str):
156
+ def get(self, key: NestedKey):
148
157
  """
149
158
  Create a copy of this Variable that points to a nested key. This is useful when
150
159
  storing e.g. a dictionary in a Variable and wanting to access a specific key.
151
160
 
161
+ The key can be a string or a LoopVariable for dynamic access within a For loop.
162
+
152
163
  ```python
153
164
  from dara.core import Variable, UpdateVariable
154
165
  from dara_dashboarding_extension import Input, Text, Stack, Button
@@ -177,7 +188,11 @@ class Variable(ClientVariable, Generic[VariableType, PersistenceStoreType_co]):
177
188
  )
178
189
  )
179
190
 
180
- :param key: the key to access; must be a string
191
+ # Dynamic access using LoopVariable
192
+ items = Variable([{'id': 'a'}, {'id': 'b'}])
193
+ For(items=items, renderer=Input(value=state.get(items.list_item.get('id'))))
194
+
195
+ :param key: the key to access; can be a string or LoopVariable
181
196
  ```
182
197
  """
183
198
  return self.model_copy(update={'nested': [*self.nested, key]}, deep=True)
@@ -21,12 +21,21 @@ import asyncio
21
21
  import contextlib
22
22
  from collections.abc import AsyncGenerator, Callable
23
23
  from dataclasses import dataclass
24
- from typing import Any, Generic, Literal
24
+ from typing import TYPE_CHECKING, Any, Generic, Literal
25
25
 
26
26
  from fastapi import Request
27
27
  from pydantic import ConfigDict, Field, SerializerFunctionWrapHandler, field_validator, model_serializer
28
28
  from typing_extensions import TypeVar
29
29
 
30
+ if TYPE_CHECKING:
31
+ from dara.core.interactivity.loop_variable import LoopVariable
32
+
33
+ # Type alias for static type checking
34
+ NestedKey = str | LoopVariable
35
+ else:
36
+ # At runtime, use Any to avoid forward reference issues with Pydantic
37
+ NestedKey = Any
38
+
30
39
  from dara.core.base_definitions import BaseTask
31
40
  from dara.core.interactivity.any_variable import AnyVariable
32
41
  from dara.core.interactivity.client_variable import ClientVariable
@@ -119,7 +128,7 @@ class StreamVariable(ClientVariable, Generic[VariableType]):
119
128
  uid: str
120
129
  variables: list[AnyVariable] = Field(default_factory=list)
121
130
  key_accessor: str | None = None
122
- nested: list[str] = Field(default_factory=list)
131
+ nested: list[NestedKey] = Field(default_factory=list)
123
132
 
124
133
  model_config = ConfigDict(extra='forbid')
125
134
 
@@ -160,7 +169,7 @@ class StreamVariable(ClientVariable, Generic[VariableType]):
160
169
  variables: list[AnyVariable] | None = None,
161
170
  key_accessor: str | None = None,
162
171
  uid: str | None = None,
163
- nested: list[str] | None = None,
172
+ nested: list[NestedKey] | None = None,
164
173
  **kwargs,
165
174
  ):
166
175
  """
@@ -201,13 +210,15 @@ class StreamVariable(ClientVariable, Generic[VariableType]):
201
210
  ),
202
211
  )
203
212
 
204
- def get(self, *keys: str) -> StreamVariable[Any]:
213
+ def get(self, *keys: NestedKey) -> StreamVariable[Any]:
205
214
  """
206
215
  Access a nested value within the stream's accumulated state.
207
216
 
208
217
  This is useful when the stream accumulates complex state (via snapshot/patch)
209
218
  and you want to access a specific part of it.
210
219
 
220
+ Keys can be strings or LoopVariables for dynamic access within a For loop.
221
+
211
222
  Example::
212
223
 
213
224
  dashboard = StreamVariable(dashboard_stream, variables=[id_var])
@@ -215,11 +226,20 @@ class StreamVariable(ClientVariable, Generic[VariableType]):
215
226
  # Access nested value
216
227
  Text(dashboard.get('meta', 'count'))
217
228
 
229
+ # Dynamic access using LoopVariable
230
+ items = Variable([{'id': 'a'}, {'id': 'b'}])
231
+ For(items=items, renderer=Text(dashboard.get(items.list_item.get('id'))))
232
+
218
233
  :param keys: One or more keys to traverse into the nested structure.
234
+ Can be strings or LoopVariables.
219
235
  :return: A new StreamVariable pointing to the nested path.
220
236
  """
237
+ from dara.core.interactivity.loop_variable import LoopVariable
238
+
239
+ # Preserve LoopVariables as-is, convert other types to strings
240
+ processed_keys: list[NestedKey] = [k if isinstance(k, LoopVariable) else str(k) for k in keys]
221
241
  return self.model_copy(
222
- update={'nested': [*self.nested, *[str(k) for k in keys]]},
242
+ update={'nested': [*self.nested, *processed_keys]},
223
243
  deep=True,
224
244
  )
225
245
 
@@ -17,6 +17,7 @@ limitations under the License.
17
17
 
18
18
  from typing import Any, Literal, TypeGuard
19
19
 
20
+ from pydantic import BaseModel
20
21
  from typing_extensions import TypedDict
21
22
 
22
23
  from dara.core.base_definitions import BaseTask, PendingTask
@@ -75,16 +76,27 @@ def _resolve_nested(value: Any, nested: list[str] | None) -> Any:
75
76
  if not nested or len(nested) == 0:
76
77
  return value
77
78
 
78
- # Not a dict (equivalent to frontend's object check)
79
- if value is None or not isinstance(value, dict):
79
+ # Not a dict/model
80
+ if value is None or not isinstance(value, (dict, BaseModel)):
80
81
  return value
81
82
 
82
83
  result = value
83
84
  for key in nested:
84
- # If the key doesn't exist, return None as we're referring to a path which doesn't exist yet
85
- if not isinstance(result, dict) or key not in result:
86
- return None
87
- result = result[key]
85
+ # Defensive check: LoopVariable should have been resolved by frontend templating
86
+ if isinstance(key, dict):
87
+ raise ValueError(
88
+ 'LoopVariable found in nested path during backend resolution. '
89
+ 'This should have been resolved by frontend templating.'
90
+ )
91
+ # Can recurse into a dict or a pydantic model
92
+ if isinstance(result, dict):
93
+ # Path does not exist, resolve to None
94
+ if key not in result:
95
+ return None
96
+ result = result[key]
97
+ elif isinstance(result, BaseModel):
98
+ # fall back to None, if key doesn't exist/is None, we'll skip iterating anyway
99
+ result = getattr(result, key, None)
88
100
 
89
101
  return result
90
102
 
@@ -21,7 +21,6 @@ from typing import (
21
21
  Generic,
22
22
  TypeGuard,
23
23
  TypeVar,
24
- cast,
25
24
  overload,
26
25
  )
27
26
 
@@ -57,13 +56,26 @@ class Referrable(TypedDict):
57
56
 
58
57
 
59
58
  class ReferrableWithNested(Referrable):
60
- nested: list[str]
59
+ nested: list[str | dict] # dict represents serialized LoopVariable
61
60
 
62
61
 
63
62
  class ReferrableWithFilters(Referrable):
64
63
  filters: dict
65
64
 
66
65
 
66
+ def _serialize_nested_key(key: str | dict) -> str:
67
+ """
68
+ Serialize a single nested key for identifier computation.
69
+
70
+ Handles both string keys and LoopVariable dicts.
71
+ """
72
+ if isinstance(key, dict) and key.get('__typename') == 'LoopVariable':
73
+ # Format: LoopVar:uid:nested.joined
74
+ loop_nested = ','.join(key.get('nested', []))
75
+ return f'LoopVar:{key["uid"]}:{loop_nested}'
76
+ return str(key)
77
+
78
+
67
79
  def _get_identifier(obj: Referrable) -> str:
68
80
  """
69
81
  Get a unique identifier from a 'referrable' object
@@ -74,7 +86,9 @@ def _get_identifier(obj: Referrable) -> str:
74
86
 
75
87
  # If it's a Variable with 'nested', the property should be included in the identifier
76
88
  if _is_referrable_nested(obj) and len(obj['nested']) > 0:
77
- nested = ','.join(cast(list[str], obj['nested']))
89
+ # Handle mixed string/LoopVariable nested
90
+ nested_parts = [_serialize_nested_key(k) for k in obj['nested']]
91
+ nested = ','.join(nested_parts)
78
92
  identifier = f'{identifier}:{nested}'
79
93
 
80
94
  return identifier
@@ -4,6 +4,14 @@ from dara.core.definitions import ComponentInstance
4
4
  from dara.core.interactivity.derived_variable import DerivedVariable
5
5
  from dara.core.visual.dynamic_component import PyComponentInstance
6
6
 
7
+ # Control flow components have conditional children that shouldn't be preloaded
8
+ # since only one branch will actually render at runtime
9
+ CONTROL_FLOW_SKIP_ATTRS: dict[str, set[str]] = {
10
+ 'If': {'true_children', 'false_children'},
11
+ 'Match': {'when', 'default'},
12
+ 'For': {'renderer', 'placeholder'},
13
+ }
14
+
7
15
 
8
16
  class DependencyGraph(BaseModel):
9
17
  """
@@ -33,6 +41,9 @@ class DependencyGraph(BaseModel):
33
41
  def _analyze_component_dependencies(component: ComponentInstance, graph: DependencyGraph) -> None:
34
42
  """
35
43
  Recursively analyze a component tree to build a dependency graph of DerivedVariables and PyComponentInstances.
44
+
45
+ Note: Control flow components (If, Match, For) are treated as boundaries - their conditional
46
+ child properties are not recursed into since only one branch will render at runtime.
36
47
  """
37
48
  try:
38
49
  from dara.components import Table
@@ -45,8 +56,15 @@ def _analyze_component_dependencies(component: ComponentInstance, graph: Depende
45
56
  graph.py_components[component.uid] = component
46
57
  return
47
58
 
59
+ # Get properties to skip for control flow components
60
+ component_name = type(component).__name__
61
+ skip_attrs = CONTROL_FLOW_SKIP_ATTRS.get(component_name, set())
62
+
48
63
  # otherwise check each field
49
64
  for attr in component.model_fields_set:
65
+ # Skip conditional child properties of control flow components
66
+ if attr in skip_attrs:
67
+ continue
50
68
  value = getattr(component, attr, None)
51
69
 
52
70
  # Handle encountered variables and py_components
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dara-core
3
- Version: 1.25.0
3
+ Version: 1.25.2
4
4
  Summary: Dara Framework Core
5
5
  Home-page: https://dara.causalens.com/
6
6
  License: Apache-2.0
@@ -21,10 +21,10 @@ Requires-Dist: cachetools (>=5.0.0)
21
21
  Requires-Dist: certifi (>=2024.7.4)
22
22
  Requires-Dist: click (>=8.1.3,<9.0.0)
23
23
  Requires-Dist: colorama (>=0.4.6,<0.5.0)
24
- Requires-Dist: create-dara-app (==1.25.0)
24
+ Requires-Dist: create-dara-app (==1.25.2)
25
25
  Requires-Dist: croniter (>=6.0.0,<7.0.0)
26
26
  Requires-Dist: cryptography (>=42.0.4)
27
- Requires-Dist: dara-components (==1.25.0) ; extra == "all"
27
+ Requires-Dist: dara-components (==1.25.2) ; extra == "all"
28
28
  Requires-Dist: exceptiongroup (>=1.1.3,<2.0.0)
29
29
  Requires-Dist: fastapi (>=0.115.0,<0.121.0)
30
30
  Requires-Dist: fastapi_vite_dara (==0.4.0)
@@ -55,7 +55,7 @@ Description-Content-Type: text/markdown
55
55
 
56
56
  # Dara Application Framework
57
57
 
58
- <img src="https://github.com/causalens/dara/blob/v1.25.0/img/dara_light.svg?raw=true">
58
+ <img src="https://github.com/causalens/dara/blob/v1.25.2/img/dara_light.svg?raw=true">
59
59
 
60
60
  ![Master tests](https://github.com/causalens/dara/actions/workflows/tests.yml/badge.svg?branch=master)
61
61
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
@@ -100,7 +100,7 @@ source .venv/bin/activate
100
100
  dara start
101
101
  ```
102
102
 
103
- ![Dara App](https://github.com/causalens/dara/blob/v1.25.0/img/components_gallery.png?raw=true)
103
+ ![Dara App](https://github.com/causalens/dara/blob/v1.25.2/img/components_gallery.png?raw=true)
104
104
 
105
105
  Note: `pip` installation uses [PEP 660](https://peps.python.org/pep-0660/) `pyproject.toml`-based editable installs which require `pip >= 21.3` and `setuptools >= 64.0.0`. You can upgrade both with:
106
106
 
@@ -117,9 +117,9 @@ Explore some of our favorite apps - a great way of getting started and getting t
117
117
 
118
118
  | Dara App | Description |
119
119
  | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
120
- | ![Large Language Model](https://github.com/causalens/dara/blob/v1.25.0/img/llm.png?raw=true) | Demonstrates how to use incorporate a LLM chat box into your decision app to understand model insights |
121
- | ![Plot Interactivity](https://github.com/causalens/dara/blob/v1.25.0/img/plot_interactivity.png?raw=true) | Demonstrates how to enable the user to interact with plots, trigger actions based on clicks, mouse movements and other interactions with `Bokeh` or `Plotly` plots |
122
- | ![Graph Editor](https://github.com/causalens/dara/blob/v1.25.0/img/graph_viewer.png?raw=true) | Demonstrates how to use the `CausalGraphViewer` component to display your graphs or networks, customising the displayed information through colors and tooltips, and updating the page based on user interaction. |
120
+ | ![Large Language Model](https://github.com/causalens/dara/blob/v1.25.2/img/llm.png?raw=true) | Demonstrates how to use incorporate a LLM chat box into your decision app to understand model insights |
121
+ | ![Plot Interactivity](https://github.com/causalens/dara/blob/v1.25.2/img/plot_interactivity.png?raw=true) | Demonstrates how to enable the user to interact with plots, trigger actions based on clicks, mouse movements and other interactions with `Bokeh` or `Plotly` plots |
122
+ | ![Graph Editor](https://github.com/causalens/dara/blob/v1.25.2/img/graph_viewer.png?raw=true) | Demonstrates how to use the `CausalGraphViewer` component to display your graphs or networks, customising the displayed information through colors and tooltips, and updating the page based on user interaction. |
123
123
 
124
124
  Check out our [App Gallery](https://dara.causalens.com/gallery) for more inspiration!
125
125
 
@@ -146,9 +146,9 @@ And the supporting UI packages and tools.
146
146
  - `ui-utils` - miscellaneous utility functions
147
147
  - `ui-widgets` - widget components
148
148
 
149
- More information on the repository structure can be found in the [CONTRIBUTING.md](https://github.com/causalens/dara/blob/v1.25.0/CONTRIBUTING.md) file.
149
+ More information on the repository structure can be found in the [CONTRIBUTING.md](https://github.com/causalens/dara/blob/v1.25.2/CONTRIBUTING.md) file.
150
150
 
151
151
  ## License
152
152
 
153
- Dara is open-source and licensed under the [Apache 2.0 License](https://github.com/causalens/dara/blob/v1.25.0/LICENSE).
153
+ Dara is open-source and licensed under the [Apache 2.0 License](https://github.com/causalens/dara/blob/v1.25.2/LICENSE).
154
154
 
@@ -1,7 +1,7 @@
1
1
  dara/core/__init__.py,sha256=yTp-lXT0yy9XqLGYWlmjPgFG5g2eEg2KhKo8KheTHoo,1408
2
2
  dara/core/_assets/__init__.py,sha256=13vMoWHvl1zcFcjNHh8lbTwWOvu4f7krYSco978qxwM,723
3
3
  dara/core/_assets/auto_js/dara.core.css,sha256=yT3PKpi2sKI2-kQIF8xtVbTPQqgpK7-Ua7tfzDPuSsI,4095881
4
- dara/core/_assets/auto_js/dara.core.umd.cjs,sha256=oEcImrkdIvWJ_zE4my8n9EGECjIQ5JZTVm8q_ChmbVM,5186433
4
+ dara/core/_assets/auto_js/dara.core.umd.cjs,sha256=0vzgGyBGxycyQ7iIG69rUlOKOGoyv6XDsY_qKoWYEGU,5203204
5
5
  dara/core/_assets/auto_js/react-dom.development.js,sha256=vR2Fq5LXMKS5JsTo2CMl6oGCJT8scJV2wXSteTtx8aE,1077040
6
6
  dara/core/_assets/auto_js/react-is.development.js,sha256=2IRgmaphdMq6wx2MbsmVUQ0UwapGETNjgano3XEkGcc,7932
7
7
  dara/core/_assets/auto_js/react-query.development.js,sha256=lI2fTKMvWmjbagGQaVtZYr51_-C_U_so064JwetuDS0,130366
@@ -37,16 +37,16 @@ dara/core/interactivity/client_variable.py,sha256=Ku59TBDXrqEsMkc-upQ_GspWqHGBdt
37
37
  dara/core/interactivity/condition.py,sha256=BHfRA5kkULBjLbS9Q2NpkWUxcCicm0aKTTrsEWQQCVE,1567
38
38
  dara/core/interactivity/data_variable.py,sha256=FJ6vtsZ-39C2KrOIaxSnjOBCD0mOHjvunMUkUjXon6Q,2500
39
39
  dara/core/interactivity/derived_data_variable.py,sha256=nfHYrd2a4dT7penr2JhPVnHAv3MGpKn1pIIF5mh4xQo,3611
40
- dara/core/interactivity/derived_variable.py,sha256=RMZbc1capmj_ceSG45GiQpheNgE1y9TIf8xl08YYHdY,32276
40
+ dara/core/interactivity/derived_variable.py,sha256=pTB1w9j9Xlxxv2WoWS4O5ccMkrnsgvcMdjFubwqhxIs,32837
41
41
  dara/core/interactivity/filtering.py,sha256=_F0OtECufYCptRI6h98_vDliG9xcPD5SItlQkjiNqR4,9667
42
42
  dara/core/interactivity/loop_variable.py,sha256=9AvHUuyuneSLJstscv-o8gMd_FMd8p-U8QK5GqsPCVo,3611
43
43
  dara/core/interactivity/non_data_variable.py,sha256=k2yXTowWmH5UhG9iJfYo_bUG7AT5fdKSwX5LcDQ71-4,178
44
- dara/core/interactivity/plain_variable.py,sha256=tg4D8UMno5cwGtM4U6FJKPbjhRRk6rZ6hJeiGgbGdrw,13123
44
+ dara/core/interactivity/plain_variable.py,sha256=naN_7ejDKnbCGxDmyFZ7xkO-B4yFTPKgtj-9so64QXg,13707
45
45
  dara/core/interactivity/server_variable.py,sha256=s1OoLIyWIVF0TAId5Pv3b6ZZpBEHjzTotYQufAYHjZI,11109
46
46
  dara/core/interactivity/state_variable.py,sha256=Xpiazq25XS12dgvr3m1ojoqSy7svdmMaRMBxABusOzQ,2441
47
47
  dara/core/interactivity/stream_event.py,sha256=83zAwf_MqjoWONNvutGW4uoIlTXXBJvLUGg7JuPNIWs,10059
48
48
  dara/core/interactivity/stream_utils.py,sha256=xcqr4mQj4IH0bI_hfZ2jb2FImYftJea1qGmC_-Wh1oY,2404
49
- dara/core/interactivity/stream_variable.py,sha256=M13XrqRC9Gj4ZNAHXsTnR-Lw4SKYzvbTK8qOvCAzMoc,12750
49
+ dara/core/interactivity/stream_variable.py,sha256=pYKakNcwPazIgrTrMZHcMrcDVNFF0mfk6308irKEjpY,13614
50
50
  dara/core/interactivity/switch_variable.py,sha256=dhmAnF2KmL4944TJVipV-30BPYSLoD-uxyBP49W3V9Q,14099
51
51
  dara/core/interactivity/tabular_variable.py,sha256=rUz9jnU6ya_0J7dhIN8d0VCDfzO7N5AsvksrHNtCO7k,3337
52
52
  dara/core/interactivity/url_variable.py,sha256=lAtHgYvLA8RE-eFfv4Ix27T5YLGT5e0c0q9O5eQPOos,2282
@@ -59,7 +59,7 @@ dara/core/internal/cache_store/lru.py,sha256=6Jd4TmUX1LaEPnOraf8cSnL9Rx-A_LDhjqO
59
59
  dara/core/internal/cache_store/ttl.py,sha256=WzSZfdhK-nTf0fwCwtaRbJ-9I-FeTNBXgnZgSvZMbKQ,4966
60
60
  dara/core/internal/cgroup.py,sha256=yKCTY8RxyxnNy-Mw4tfzeZew1dL8qw381gHBVE96-OA,3217
61
61
  dara/core/internal/custom_response.py,sha256=MM0xEX7kVZWyX943Obl7sic3bxXr6kHGLWe6pc5pcYg,1304
62
- dara/core/internal/dependency_resolution.py,sha256=1ydLyUYzAQBKl13ECMT8_YaxUc8X8Tlvv9ZYdUvPgdE,11376
62
+ dara/core/internal/dependency_resolution.py,sha256=Y3o9wnvEmFSfTaqc5Dqw2msDzwl5VtCNC2TmCkeLGHQ,11910
63
63
  dara/core/internal/devtools.py,sha256=4LsK7sqES33fAqb53dyH3n0OSWang3W-MiPsmo57aXU,2586
64
64
  dara/core/internal/download.py,sha256=wBSUapMY6evZ_sA5ZgvnWhaRtzVMIDIC51mPzFCMWuM,3548
65
65
  dara/core/internal/encoder_registry.py,sha256=Q8F5Y2uZVkx7EUtk4MZ99wvPBWaMnPKcFZzK92FYNPw,11159
@@ -67,7 +67,7 @@ dara/core/internal/execute_action.py,sha256=di2WBTHw6smcRRYv1uqJbnnMxPTRq2uxYLdq
67
67
  dara/core/internal/hashing.py,sha256=LTX249EpWfJ8ikx66o8t4gtSYxvcC00RKLOW6epbqCA,1094
68
68
  dara/core/internal/import_discovery.py,sha256=8DFtLulbOIoPr4yxnS1OO431dZA27hLEjylklW_cm6s,8042
69
69
  dara/core/internal/multi_resource_lock.py,sha256=mUoc6KKk8mpLGCXfa6nFd60yNuas4b6wsAk8VrvGDxI,2496
70
- dara/core/internal/normalization.py,sha256=dgZZemPq8NP04uvcEwElqDd8JV6FYx_UuFfgyrOZSNk,6008
70
+ dara/core/internal/normalization.py,sha256=aCRCT5G9RZJzPGlVvMgNoqOZVXSs_Ku5QiqVp81hsfY,6583
71
71
  dara/core/internal/pandas_utils.py,sha256=1au2ixLfqdvwuFApwah580Y0WD6puw_Q0lBgFtK-Hdo,6514
72
72
  dara/core/internal/pool/__init__.py,sha256=pBbXE5GR3abVC9Lg3i0QxfdmsrBDMJUYAYb0SiAEBkk,657
73
73
  dara/core/internal/pool/channel.py,sha256=mLYa-R4KBGjRENDc9r1Hym5TpIeLv9y5kLJtjI7YXZA,4911
@@ -109,7 +109,7 @@ dara/core/persistence.py,sha256=EAEER1T0MHBrtT-iLZ-eXzAsqwu4Klqw5mDlTPSdPkI,1932
109
109
  dara/core/router/__init__.py,sha256=yGI_MgLQU37ircCtYVNjnhqCjWQxKd5amoNqvMyrhOs,121
110
110
  dara/core/router/compat.py,sha256=B83wq46AwQARTDfZwGrpr0slrnQmi_T7shOUNpqltSM,3112
111
111
  dara/core/router/components.py,sha256=Wsf_bBnnN-1EE5jhbjPSOyDv_TVKEsY4royyOQOazM4,6132
112
- dara/core/router/dependency_graph.py,sha256=4N8RVTLi1JD-zOMzgEFJgGemQw08i0ItBSWnRK73HP4,2577
112
+ dara/core/router/dependency_graph.py,sha256=iX2f7l_FaEuaTHsEyl2wOl_eboic9EXEOsMXpmduQP4,3368
113
113
  dara/core/router/router.py,sha256=ys3k48pIjTdbmch5516O4TAeo8IIUPThdqgeoXC-kMQ,32593
114
114
  dara/core/visual/__init__.py,sha256=QN0wbG9HPQ_vXh8BO8DnBXeYLIENVTNtRmYzZf1lx7c,577
115
115
  dara/core/visual/components/__init__.py,sha256=Jrh38Q4Lc8iFFVKPuEaDeloYHVLohTTHgK92u1e_ZtY,2515
@@ -137,8 +137,8 @@ dara/core/visual/themes/__init__.py,sha256=aM4mgoIYo2neBSw5FRzswsht7PUKjLthiHLmF
137
137
  dara/core/visual/themes/dark.py,sha256=QazCRDqh_SCOyQhdwMkH1wbHf301oL7gCFj91plbLww,2020
138
138
  dara/core/visual/themes/definitions.py,sha256=dtET2YUlwXkO6gJ23MqSb8gIq-LxJ343CWsgueWSifM,2787
139
139
  dara/core/visual/themes/light.py,sha256=dtHb6Q1HOb5r_AvJfe0vZajikVc-GnBEUrGsTcI5MHA,2022
140
- dara_core-1.25.0.dist-info/LICENSE,sha256=r9u1w2RvpLMV6YjuXHIKXRBKzia3fx_roPwboGcLqCc,10944
141
- dara_core-1.25.0.dist-info/METADATA,sha256=IJIVP_H8n7KDDql7fQQoK49XrIPU8JwiCK60A-ubO7E,7523
142
- dara_core-1.25.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
143
- dara_core-1.25.0.dist-info/entry_points.txt,sha256=nAT9o1kJCmTK1saDh29PFGFD6cbxDDDjTj31HDEDwfU,197
144
- dara_core-1.25.0.dist-info/RECORD,,
140
+ dara_core-1.25.2.dist-info/LICENSE,sha256=r9u1w2RvpLMV6YjuXHIKXRBKzia3fx_roPwboGcLqCc,10944
141
+ dara_core-1.25.2.dist-info/METADATA,sha256=caPbk-_UXnbnQpA4ZXSp7kJiocJYqz7G-tiqS4i-6tY,7523
142
+ dara_core-1.25.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
143
+ dara_core-1.25.2.dist-info/entry_points.txt,sha256=nAT9o1kJCmTK1saDh29PFGFD6cbxDDDjTj31HDEDwfU,197
144
+ dara_core-1.25.2.dist-info/RECORD,,