dara-core 1.15.6a1__py3-none-any.whl → 1.16.0a1__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.
Files changed (50) hide show
  1. dara/core/__init__.py +16 -27
  2. dara/core/auth/base.py +3 -2
  3. dara/core/auth/definitions.py +0 -3
  4. dara/core/auth/utils.py +1 -1
  5. dara/core/base_definitions.py +122 -65
  6. dara/core/cli.py +12 -0
  7. dara/core/configuration.py +5 -8
  8. dara/core/defaults.py +0 -3
  9. dara/core/definitions.py +95 -231
  10. dara/core/interactivity/__init__.py +12 -18
  11. dara/core/interactivity/actions.py +22 -19
  12. dara/core/interactivity/any_data_variable.py +2 -4
  13. dara/core/interactivity/any_variable.py +10 -2
  14. dara/core/interactivity/condition.py +7 -10
  15. dara/core/interactivity/data_variable.py +11 -12
  16. dara/core/interactivity/derived_data_variable.py +7 -7
  17. dara/core/interactivity/derived_variable.py +20 -17
  18. dara/core/interactivity/filtering.py +1 -1
  19. dara/core/interactivity/plain_variable.py +10 -6
  20. dara/core/interactivity/url_variable.py +7 -6
  21. dara/core/internal/download.py +1 -1
  22. dara/core/internal/hashing.py +1 -1
  23. dara/core/internal/normalization.py +0 -24
  24. dara/core/internal/routing.py +10 -10
  25. dara/core/internal/scheduler.py +3 -2
  26. dara/core/internal/settings.py +2 -4
  27. dara/core/internal/store.py +0 -3
  28. dara/core/internal/tasks.py +2 -2
  29. dara/core/internal/websocket.py +29 -20
  30. dara/core/js_tooling/js_utils.py +1 -1
  31. dara/core/main.py +2 -2
  32. dara/core/persistence.py +12 -4
  33. dara/core/umd/dara.core.umd.js +13 -277
  34. dara/core/visual/components/__init__.py +0 -3
  35. dara/core/visual/components/fallback.py +3 -3
  36. dara/core/visual/components/invalid_component.py +3 -3
  37. dara/core/visual/components/menu.py +3 -3
  38. dara/core/visual/components/progress_tracker.py +3 -2
  39. dara/core/visual/components/raw_string.py +3 -3
  40. dara/core/visual/components/router_content.py +3 -3
  41. dara/core/visual/components/sidebar_frame.py +3 -3
  42. dara/core/visual/components/topbar_frame.py +3 -3
  43. dara/core/visual/css/__init__.py +2 -6
  44. dara/core/visual/dynamic_component.py +3 -6
  45. {dara_core-1.15.6a1.dist-info → dara_core-1.16.0a1.dist-info}/METADATA +13 -12
  46. {dara_core-1.15.6a1.dist-info → dara_core-1.16.0a1.dist-info}/RECORD +49 -50
  47. dara/core/visual/components/for_cmp.py +0 -150
  48. {dara_core-1.15.6a1.dist-info → dara_core-1.16.0a1.dist-info}/LICENSE +0 -0
  49. {dara_core-1.15.6a1.dist-info → dara_core-1.16.0a1.dist-info}/WHEEL +0 -0
  50. {dara_core-1.15.6a1.dist-info → dara_core-1.16.0a1.dist-info}/entry_points.txt +0 -0
@@ -17,14 +17,14 @@ limitations under the License.
17
17
 
18
18
  from typing import ClassVar
19
19
 
20
- from dara.core.definitions import BaseFallback, JsComponentDef, StyledComponentInstance
20
+ from dara.core.definitions import BaseFallback, JsComponentDef
21
21
 
22
22
  DefaultFallbackDef = JsComponentDef(name='DefaultFallback', js_module='@darajs/core', py_module='dara.core')
23
23
  RowFallbackDef = JsComponentDef(name='RowFallback', js_module='@darajs/core', py_module='dara.core')
24
24
 
25
25
 
26
26
  class Fallback:
27
- class Default(BaseFallback, StyledComponentInstance):
27
+ class Default(BaseFallback):
28
28
  """
29
29
  ![FallbackDefault](../../../../../docs/packages/dara-core/assets/FallbackDefault.gif)
30
30
 
@@ -49,7 +49,7 @@ class Fallback:
49
49
 
50
50
  py_component: ClassVar[str] = 'DefaultFallback'
51
51
 
52
- class Row(BaseFallback, StyledComponentInstance):
52
+ class Row(BaseFallback):
53
53
  """
54
54
  ![FallbackRow](../../../../../docs/packages/dara-core/assets/FallbackRow.gif)
55
55
 
@@ -15,6 +15,8 @@ See the License for the specific language governing permissions and
15
15
  limitations under the License.
16
16
  """
17
17
 
18
+ from pydantic import ConfigDict
19
+
18
20
  from dara.core.definitions import ComponentInstance
19
21
 
20
22
 
@@ -24,6 +26,4 @@ class InvalidComponent(ComponentInstance):
24
26
  """
25
27
 
26
28
  error: str
27
-
28
- class Config:
29
- extra = 'forbid'
29
+ model_config = ConfigDict(extra='forbid')
@@ -17,6 +17,8 @@ limitations under the License.
17
17
 
18
18
  from typing import List
19
19
 
20
+ from pydantic import ConfigDict
21
+
20
22
  from dara.core.definitions import ComponentInstance, JsComponentDef, TemplateRouterLink
21
23
 
22
24
  MenuDef = JsComponentDef(name='Menu', js_module='@darajs/core', py_module='dara.core')
@@ -24,6 +26,4 @@ MenuDef = JsComponentDef(name='Menu', js_module='@darajs/core', py_module='dara.
24
26
 
25
27
  class Menu(ComponentInstance):
26
28
  routes: List[TemplateRouterLink]
27
-
28
- class Config:
29
- extra = 'forbid'
29
+ model_config = ConfigDict(extra='forbid')
@@ -15,6 +15,8 @@ See the License for the specific language governing permissions and
15
15
  limitations under the License.
16
16
  """
17
17
 
18
+ from pydantic import ConfigDict
19
+
18
20
  from dara.core.definitions import ComponentInstance, JsComponentDef
19
21
 
20
22
  ProgressTrackerDef = JsComponentDef(name='ProgressTracker', js_module='@darajs/core', py_module='dara.core')
@@ -49,5 +51,4 @@ class ProgressTracker(ComponentInstance):
49
51
 
50
52
  """
51
53
 
52
- class Config:
53
- extra = 'forbid'
54
+ model_config = ConfigDict(extra='forbid')
@@ -15,6 +15,8 @@ See the License for the specific language governing permissions and
15
15
  limitations under the License.
16
16
  """
17
17
 
18
+ from pydantic import ConfigDict
19
+
18
20
  from dara.core.definitions import ComponentInstance
19
21
 
20
22
 
@@ -25,6 +27,4 @@ class RawString(ComponentInstance):
25
27
  """
26
28
 
27
29
  content: str
28
-
29
- class Config:
30
- extra = 'forbid'
30
+ model_config = ConfigDict(extra='forbid')
@@ -17,6 +17,8 @@ limitations under the License.
17
17
 
18
18
  from typing import List
19
19
 
20
+ from pydantic import ConfigDict
21
+
20
22
  from dara.core.definitions import (
21
23
  ComponentInstance,
22
24
  JsComponentDef,
@@ -28,6 +30,4 @@ RouterContentDef = JsComponentDef(name='RouterContent', js_module='@darajs/core'
28
30
 
29
31
  class RouterContent(ComponentInstance):
30
32
  routes: List[TemplateRouterContent]
31
-
32
- class Config:
33
- extra = 'forbid'
33
+ model_config = ConfigDict(extra='forbid')
@@ -17,6 +17,8 @@ limitations under the License.
17
17
 
18
18
  from typing import Optional
19
19
 
20
+ from pydantic import ConfigDict
21
+
20
22
  from dara.core.definitions import ComponentInstance, JsComponentDef
21
23
 
22
24
  SideBarFrameDef = JsComponentDef(name='SideBarFrame', js_module='@darajs/core', py_module='dara.core')
@@ -32,6 +34,4 @@ class SideBarFrame(ComponentInstance):
32
34
  side_bar_padding: Optional[str] = None
33
35
  side_bar_position: Optional[str] = None
34
36
  side_bar_width: Optional[str] = None
35
-
36
- class Config:
37
- extra = 'forbid'
37
+ model_config = ConfigDict(extra='forbid')
@@ -17,6 +17,8 @@ limitations under the License.
17
17
 
18
18
  from typing import Optional
19
19
 
20
+ from pydantic import ConfigDict
21
+
20
22
  from dara.core.definitions import ComponentInstance, JsComponentDef
21
23
 
22
24
  TopBarFrameDef = JsComponentDef(name='TopBarFrame', js_module='@darajs/core', py_module='dara.core')
@@ -32,6 +34,4 @@ class TopBarFrame(ComponentInstance):
32
34
  top_bar_padding: Optional[str] = None
33
35
  top_bar_position: Optional[str] = None
34
36
  top_bar_height: Optional[str] = None
35
-
36
- class Config:
37
- extra = 'forbid'
37
+ model_config = ConfigDict(extra='forbid')
@@ -24,7 +24,7 @@ from __future__ import annotations
24
24
 
25
25
  from typing import Literal, Optional, Union
26
26
 
27
- from pydantic import Field
27
+ from pydantic import ConfigDict, Field
28
28
 
29
29
  from dara.core.base_definitions import DaraBaseModel
30
30
 
@@ -7684,8 +7684,4 @@ class CSSProperties(DaraBaseModel):
7684
7684
  default=None,
7685
7685
  description='The non-standard **`zoom`** CSS property can be used to control the magnification level of an element. `transform: scale()` should be used instead of this property, if possible. However, unlike CSS Transforms, `zoom` affects the layout size of the element.\n\n**Syntax**: `normal | reset | <number> | <percentage>`\n\n**Initial value**: `normal`\n\n| Chrome | Firefox | Safari | Edge | IE |\n| :----: | :-----: | :-----: | :----: | :-----: |\n| **1** | No | **3.1** | **12** | **5.5** |',
7686
7686
  )
7687
-
7688
- class Config:
7689
- extra = 'allow'
7690
- use_enum_values = True
7691
- smart_union = True
7687
+ model_config = ConfigDict(extra='allow', use_enum_values=True)
@@ -14,9 +14,6 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
14
  See the License for the specific language governing permissions and
15
15
  limitations under the License.
16
16
  """
17
-
18
- from __future__ import annotations
19
-
20
17
  import json
21
18
  import uuid
22
19
  from contextvars import ContextVar
@@ -59,8 +56,8 @@ CURRENT_COMPONENT_ID = ContextVar('current_component_id', default='')
59
56
 
60
57
  class PyComponentInstance(ComponentInstance):
61
58
  func_name: str
62
- dynamic_kwargs: Optional[Mapping[str, AnyVariable]]
63
- polling_interval: Optional[int]
59
+ dynamic_kwargs: Optional[Mapping[str, AnyVariable]] = None
60
+ polling_interval: Optional[int] = None
64
61
  js_module: ClassVar[Optional[str]] = None
65
62
 
66
63
 
@@ -327,7 +324,7 @@ def _make_render_safe(handler: Callable):
327
324
 
328
325
  # Handle primitives being returned by just displaying the value as a string
329
326
  safe_result = RawString(content=str(result))
330
- elif not isinstance(result, ComponentInstance):
327
+ elif not ComponentInstance.isinstance(result):
331
328
  # Otherwise it must be a component instance, return the error for frontend to display
332
329
  safe_result = InvalidComponent(
333
330
  error=f'PyComponent "{handler.__name__}" did not return a ComponentInstance, found "{result}"'
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dara-core
3
- Version: 1.15.6a1
3
+ Version: 1.16.0a1
4
4
  Summary: Dara Framework Core
5
5
  Home-page: https://dara.causalens.com/
6
6
  License: Apache-2.0
@@ -20,13 +20,13 @@ Requires-Dist: async-asgi-testclient (>=1.4.11,<2.0.0)
20
20
  Requires-Dist: certifi (>=2024.7.4)
21
21
  Requires-Dist: click (==8.1.3)
22
22
  Requires-Dist: colorama (>=0.4.6,<0.5.0)
23
- Requires-Dist: create-dara-app (==1.15.6-alpha.1)
23
+ Requires-Dist: create-dara-app (==1.16.0-alpha.1)
24
24
  Requires-Dist: croniter (>=1.0.15,<3.0.0)
25
25
  Requires-Dist: cryptography (>=42.0.4)
26
- Requires-Dist: dara-components (==1.15.6-alpha.1) ; extra == "all"
26
+ Requires-Dist: dara-components (==1.16.0-alpha.1) ; extra == "all"
27
27
  Requires-Dist: exceptiongroup (>=1.1.3,<2.0.0)
28
28
  Requires-Dist: fastapi (==0.109.0)
29
- Requires-Dist: fastapi_vite_dara (==0.3.1.0)
29
+ Requires-Dist: fastapi_vite_dara (==0.4.0)
30
30
  Requires-Dist: httpx (>=0.23.0)
31
31
  Requires-Dist: jinja2 (>=2.1.1,<3.2.0)
32
32
  Requires-Dist: odfpy
@@ -35,7 +35,8 @@ Requires-Dist: packaging (>=23.1,<24.0)
35
35
  Requires-Dist: pandas (>=1.1.0,<3.0.0)
36
36
  Requires-Dist: prometheus-client (>=0.14.1,<0.15.0)
37
37
  Requires-Dist: pyarrow
38
- Requires-Dist: pydantic (>=1.8.1,<2.0.0)
38
+ Requires-Dist: pydantic (>=2.10.0,<3.0.0)
39
+ Requires-Dist: pydantic-settings (>=2.8.1,<3.0.0)
39
40
  Requires-Dist: pyjwt (>=2.0.1,<3.0.0)
40
41
  Requires-Dist: python-dotenv (>=0.19.2)
41
42
  Requires-Dist: python-multipart (>=0.0.7,<0.0.8)
@@ -51,7 +52,7 @@ Description-Content-Type: text/markdown
51
52
 
52
53
  # Dara Application Framework
53
54
 
54
- <img src="https://github.com/causalens/dara/blob/v1.15.6-alpha.1/img/dara_light.svg?raw=true">
55
+ <img src="https://github.com/causalens/dara/blob/v1.16.0-alpha.1/img/dara_light.svg?raw=true">
55
56
 
56
57
  ![Master tests](https://github.com/causalens/dara/actions/workflows/tests.yml/badge.svg?branch=master)
57
58
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
@@ -96,7 +97,7 @@ source .venv/bin/activate
96
97
  dara start
97
98
  ```
98
99
 
99
- ![Dara App](https://github.com/causalens/dara/blob/v1.15.6-alpha.1/img/components_gallery.png?raw=true)
100
+ ![Dara App](https://github.com/causalens/dara/blob/v1.16.0-alpha.1/img/components_gallery.png?raw=true)
100
101
 
101
102
  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:
102
103
 
@@ -113,9 +114,9 @@ Explore some of our favorite apps - a great way of getting started and getting t
113
114
 
114
115
  | Dara App | Description |
115
116
  | -------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
116
- | ![Large Language Model](https://github.com/causalens/dara/blob/v1.15.6-alpha.1/img/llm.png?raw=true) | Demonstrates how to use incorporate a LLM chat box into your decision app to understand model insights |
117
- | ![Plot Interactivity](https://github.com/causalens/dara/blob/v1.15.6-alpha.1/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 |
118
- | ![Graph Editor](https://github.com/causalens/dara/blob/v1.15.6-alpha.1/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. |
117
+ | ![Large Language Model](https://github.com/causalens/dara/blob/v1.16.0-alpha.1/img/llm.png?raw=true) | Demonstrates how to use incorporate a LLM chat box into your decision app to understand model insights |
118
+ | ![Plot Interactivity](https://github.com/causalens/dara/blob/v1.16.0-alpha.1/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 |
119
+ | ![Graph Editor](https://github.com/causalens/dara/blob/v1.16.0-alpha.1/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. |
119
120
 
120
121
  Check out our [App Gallery](https://dara.causalens.com/gallery) for more inspiration!
121
122
 
@@ -142,9 +143,9 @@ And the supporting UI packages and tools.
142
143
  - `ui-utils` - miscellaneous utility functions
143
144
  - `ui-widgets` - widget components
144
145
 
145
- More information on the repository structure can be found in the [CONTRIBUTING.md](https://github.com/causalens/dara/blob/v1.15.6-alpha.1/CONTRIBUTING.md) file.
146
+ More information on the repository structure can be found in the [CONTRIBUTING.md](https://github.com/causalens/dara/blob/v1.16.0-alpha.1/CONTRIBUTING.md) file.
146
147
 
147
148
  ## License
148
149
 
149
- Dara is open-source and licensed under the [Apache 2.0 License](https://github.com/causalens/dara/blob/v1.15.6-alpha.1/LICENSE).
150
+ Dara is open-source and licensed under the [Apache 2.0 License](https://github.com/causalens/dara/blob/v1.16.0-alpha.1/LICENSE).
150
151
 
@@ -1,31 +1,31 @@
1
- dara/core/__init__.py,sha256=w3OUU03lGXA45_Sf99CsNWL6SZ7tr7y4wRYq6pdGmhM,2186
1
+ dara/core/__init__.py,sha256=eF6Fmf5TkWYIPiZ3CR6kMGinIcFXoA8LQN5m4EpZzHY,2094
2
2
  dara/core/actions.py,sha256=gARcrrtzYuBAVJUCtuHwpFc6PPVPb7x3ITIISCLw0GA,965
3
3
  dara/core/auth/__init__.py,sha256=H0bJoXff5wIRZmHvvQ3y9p5SXA9lM8OuLCGceYGqfb0,851
4
- dara/core/auth/base.py,sha256=jZNuCMoBHQcxWeLpTUzcxdbkbWUJ42jbtKgnnrwvNVA,3201
4
+ dara/core/auth/base.py,sha256=u4INu-p9aZyxm73I_fbzwB5MDk5tNpfARu0h545L8Ho,3239
5
5
  dara/core/auth/basic.py,sha256=IMkoC1OeeRmnmjIqPHpybs8zSdbLlNKYLRvj08ajirg,4692
6
- dara/core/auth/definitions.py,sha256=fx-VCsElP9X97gM0Eql-4lFpLa0UryokmGZhQQat2NU,3511
6
+ dara/core/auth/definitions.py,sha256=cPR0viun0paUNBVpP8MdBkcCoSm01qtCJDwjxiqcYS0,3465
7
7
  dara/core/auth/routes.py,sha256=1gOe1Z2Vv5MtpW5uvUYvyYWTJ_BDoLRllji1Plk4nss,7180
8
- dara/core/auth/utils.py,sha256=_iyS_FExxlYZVDvnHJO5uhFpOW-g8YlhBH9zz8oPsPE,7314
9
- dara/core/base_definitions.py,sha256=r_W_qk6_VvvskbPEPjTF6xUh3o_lkNBWMFhN1Pic8Ks,14868
10
- dara/core/cli.py,sha256=ycTB7QHCB-74OnKnjXqkXq-GBqyjBqo7u4v1kTgv2jE,7656
11
- dara/core/configuration.py,sha256=8VynDds7a_uKXSpeNvjOUK3qfclg0WPniFEspL-6fi8,21153
8
+ dara/core/auth/utils.py,sha256=sFQWbkclDi2842mhauTeLh5g5RsSrzS7AxlKSSnzhYM,7320
9
+ dara/core/base_definitions.py,sha256=MoLQ2VdtCtbGun15Zn7gvpgK-HFV3vvi5Xm-HpUYq8U,17661
10
+ dara/core/cli.py,sha256=uttatNgqyJ86lj_IMLDJsEebh_sR3M2Ka7TncnT_PeU,8080
11
+ dara/core/configuration.py,sha256=l_knar1Xwd_svUiiYZUlgZ1uzh-nVt1ZYlfi9Q3CBWU,21156
12
12
  dara/core/css.py,sha256=KWCJTPpx4tTezP9VJO3k-RSVhWwomJr-4USoLz9vNAs,1771
13
13
  dara/core/data_utils.py,sha256=TUbCQkxkMndhwQEAFpvlcNTK13Xq0WlM8uavY9qUy3o,12601
14
- dara/core/defaults.py,sha256=UkjWwIbo8GLyn8RZRoD3cJe174-3wHZYzvMB0hQCnMg,4150
15
- dara/core/definitions.py,sha256=S64F4celEbiQphAlP-_B-ScRv4io0zYhrTl8mNPKav0,21148
14
+ dara/core/defaults.py,sha256=jRYXdLrEL5NvCDZ2On3Bxije25qvVAduSgrR5PjmUO0,4103
15
+ dara/core/definitions.py,sha256=QouD2P2XInW6bqrhPtrfIyDi8i99Au2PTBdWBtgBVrE,16713
16
16
  dara/core/http.py,sha256=LR1Kr5Hca-Z6klNl-M8R8Q1eOfFh3hLrjVS3kVrRsKA,4658
17
- dara/core/interactivity/__init__.py,sha256=sYMipjx2wgaAkS5sk7HVSEsvFXlbdqAN2W1vRycQzQk,2501
18
- dara/core/interactivity/actions.py,sha256=uWrlz4U_K5PQECSYYiDNVB9Imc1-K3LqAnWm2Lyn1Lk,45393
19
- dara/core/interactivity/any_data_variable.py,sha256=npgtgAIEKNix8VGYLFCc1G3jwXr195G-1lPejj9hCB8,5261
20
- dara/core/interactivity/any_variable.py,sha256=HuQTcCw1ysqYcJ5T9Jl--nV_1XzDWMfGw26g6eaQM2k,13281
21
- dara/core/interactivity/condition.py,sha256=ynK53cGuVMC852X6kkbrgltcdpIX7Otw7j1DEXEO4Q8,1424
22
- dara/core/interactivity/data_variable.py,sha256=NNSQAeyNDOdpQ_h4B8LSuuwGkiiRqoiF_QHNk9uA760,11654
23
- dara/core/interactivity/derived_data_variable.py,sha256=730kg9_5Xf78L0P7RAennomh4Y3qqUjHExODQrDwjU8,15179
24
- dara/core/interactivity/derived_variable.py,sha256=6xOv-E5wQj-fd9S2RVmRdE_DfkvxVGyptfZlDSj0fmY,21497
25
- dara/core/interactivity/filtering.py,sha256=veQbDi4ogeDO5SODOp3hpx1FQGAYKFLwnhqmbfFDyJo,9168
17
+ dara/core/interactivity/__init__.py,sha256=3e5G5Nww33irzs1LinUmfs6wYpmSLPp9e4BHplw3gIk,2294
18
+ dara/core/interactivity/actions.py,sha256=IXv60SHWIM5YKLlh6ndCwhwdCBd7XSdPLPoxhWKqJpM,45807
19
+ dara/core/interactivity/any_data_variable.py,sha256=1dLLxLuDErRsgaFPSTXxZHvpVucKKty90twQE6N-_NI,5286
20
+ dara/core/interactivity/any_variable.py,sha256=LOGhbDdYffujlRxF4LR9ZuWdai03R-EXuGsTEJAwfo0,13544
21
+ dara/core/interactivity/condition.py,sha256=q_RDDt-DtZEUQL054Mc7zHyJIJIGACljJ2gOFygCHQc,1309
22
+ dara/core/interactivity/data_variable.py,sha256=pvPOx6SMxHWDxoo5Ea5xqLwrBTrWN68x8lnBiblYSGg,11760
23
+ dara/core/interactivity/derived_data_variable.py,sha256=u2HOts5rtmzK3D1K383YfYYQnb4pHZF3rTu1lfwMpPA,15323
24
+ dara/core/interactivity/derived_variable.py,sha256=eJXZ6OJgMdi_LJHvEeO-eRNmunONME2_ANu_5WyRPEU,21728
25
+ dara/core/interactivity/filtering.py,sha256=NXd4tzWSqSxZXXdhphm9rx9oBpofbejpvKSZy9VSfkI,9162
26
26
  dara/core/interactivity/non_data_variable.py,sha256=ewPaNaTpMixR5YCVY1pjmyHgeC53K0CsjQxMusbJsiw,1147
27
- dara/core/interactivity/plain_variable.py,sha256=iuISw0x14ruOnZqrRg1Zay6ny7Ey0QImRUHVg0S11e0,8017
28
- dara/core/interactivity/url_variable.py,sha256=DEHEvg1mE7xXlK69p1D5iZZbf4emzNe6r_RH6DHcyoc,4219
27
+ dara/core/interactivity/plain_variable.py,sha256=M6upKnB8GPE9ENZYTiMSE5dJ1N27cJ-nAyv5MWz74Ps,8250
28
+ dara/core/interactivity/url_variable.py,sha256=1ZPFHO3gq7ZuATHt4S9x5ijmk4GBVlUv5KJN6DkM49w,4357
29
29
  dara/core/internal/__init__.py,sha256=QN0wbG9HPQ_vXh8BO8DnBXeYLIENVTNtRmYzZf1lx7c,577
30
30
  dara/core/internal/cache_store/__init__.py,sha256=7JCmQwNIMzfyLZGnsk0BbT1EdDFO_PRZz86E9ATcC6c,139
31
31
  dara/core/internal/cache_store/base_impl.py,sha256=gQ3N2diA4QihkLctP82vxfsSBntQy4cbjsAmmcSEPP4,1237
@@ -37,12 +37,12 @@ dara/core/internal/cgroup.py,sha256=o1Qqn5LV3TOPK7lQ0xbQj01zYT1pv-X_edGx8VhFvEw,
37
37
  dara/core/internal/custom_response.py,sha256=aSPonh8AdRjioTk1MaPwdaJHkO4R4aG_osGAGCIHbtg,1341
38
38
  dara/core/internal/dependency_resolution.py,sha256=y0CUop-RNNhwZLbafeqjhNEiTY549mLvDyNMTfvEl2Q,5456
39
39
  dara/core/internal/devtools.py,sha256=YmJdYKEqfxrpXFYAM5sJ2wUtUhfvaCMbb9PuDcqFdt4,2441
40
- dara/core/internal/download.py,sha256=in0H-AURTfouwje6Q-WpHAENO-_g9VXLWIVLQLRE5eA,3141
40
+ dara/core/internal/download.py,sha256=raVp0b27XOV1yF5gpbS-IBnXD1Nb4BiRTF6AzYh9pZ8,3148
41
41
  dara/core/internal/encoder_registry.py,sha256=mcZWUQgsfB8WcfSrHzKP0O-H9qeBiHf767fAvvE6otQ,10372
42
42
  dara/core/internal/execute_action.py,sha256=4lcU4ElyMlaybIv5oDlahsncJA4PM-6hLOKbtEpHPRI,7021
43
- dara/core/internal/hashing.py,sha256=vDlChxGrmpVsyxN3Vg3Bu0GFF7_baIRkrz059kZa4Rk,1133
43
+ dara/core/internal/hashing.py,sha256=bKskv9n7s83uYVRxva77EC9exMbMZudmWsrsTPmg8W8,1139
44
44
  dara/core/internal/import_discovery.py,sha256=rh9RS-NCkux_dShIe-XXjX2LiJQN8WiJ5cltrb0YlUE,7853
45
- dara/core/internal/normalization.py,sha256=eLr1X-5fazlVmPgq8j1Qw_dLVwkVwTF9CRtSa6y5pCk,6894
45
+ dara/core/internal/normalization.py,sha256=s618icfYaEcxI7vgsQjH54PKeefUE_gYKvDJ-D-iscI,6314
46
46
  dara/core/internal/pandas_utils.py,sha256=hWOGZbfuakDulviMpaedpi4mhP45hpe9HSRCiDhlF44,2913
47
47
  dara/core/internal/pool/__init__.py,sha256=pBbXE5GR3abVC9Lg3i0QxfdmsrBDMJUYAYb0SiAEBkk,657
48
48
  dara/core/internal/pool/channel.py,sha256=TbyIE-PnfzzsQYhl3INOs5UIHHbF_h9bMFne5FjbWlQ,4948
@@ -54,18 +54,18 @@ dara/core/internal/port_utils.py,sha256=AQOUNiFNBYKVUwQ7i9UlY1NQ3sWb5xh5GkO6P1Bm
54
54
  dara/core/internal/registries.py,sha256=9WDczIsNeSmzi6aViIq_b14lmmYGGkdsUGHpv0Sg9zo,3278
55
55
  dara/core/internal/registry.py,sha256=ONCDusqaL0q59Py_r8-fFVN3vbkkDf5TXzNvbB9SrGQ,4305
56
56
  dara/core/internal/registry_lookup.py,sha256=8snHu2wUUsngXjHyHh6eZqL_WwonTTQB6-WBX-R_WZg,2238
57
- dara/core/internal/routing.py,sha256=XViBysQSchhX9yoFyDoGe4r5OQ8xMfn6rvA2fi8Yd70,22847
58
- dara/core/internal/scheduler.py,sha256=z6OYwazBf3GYo8CzMC9IuGC2P96gI7JwxquT8GaoTMk,12944
59
- dara/core/internal/settings.py,sha256=wAWxl-HXjq7PW3twe_CrR-UuMRw9VBudC3eRmevZAhM,3869
60
- dara/core/internal/store.py,sha256=qVyU7JfC3zE2vYC2mfjmvECWMlFS9b-nMF1k-alg4Y8,7756
61
- dara/core/internal/tasks.py,sha256=XK-GTIyge8RBYAfzNs3rmLYVNSKIarCzPdqRSVGg-4M,24728
57
+ dara/core/internal/routing.py,sha256=-t6EXkQWlri4jcSLRvUce9PCGH4MN3wma2VVOzcBfyI,22918
58
+ dara/core/internal/scheduler.py,sha256=tKpyN_yhtEepfqfkNTfFep055dl-Lq1_Itte6FTkH9o,12978
59
+ dara/core/internal/settings.py,sha256=JWLPP_BrxVPeOKUDEoeWGYAz68hTzD_7h0QBuAwQZfw,3908
60
+ dara/core/internal/store.py,sha256=kLRDuYEFwqpJMS0CmL5jGmETs645Xcug4jlelJqk5w4,7706
61
+ dara/core/internal/tasks.py,sha256=oCfmOMm3pVH0-dvZzJv4nspCRWc_u-J3J7lmNI_ys5E,24763
62
62
  dara/core/internal/utils.py,sha256=b1YYkn8qHl6-GY6cCm2MS1NXRS9j_rElYCKMZOxJgrY,8232
63
- dara/core/internal/websocket.py,sha256=eEtQoz7SApvmZPKiG2aKlU2bkx2Zhz8p_HG7MOb0rio,21813
63
+ dara/core/internal/websocket.py,sha256=qeW7KOeJ_FPkpAJNZaVwxIN_DqDv7XK7uyjTxJ8HIno,22043
64
64
  dara/core/jinja/index.html,sha256=iykqiRh3H_HkcjHJeeSRXRu45nZ2y1sZX5FLdPRhlQY,726
65
65
  dara/core/jinja/index_autojs.html,sha256=MRF5J0vNfzZQm9kPEeLl23sbr08fVSRd_PAUD6Fkc_0,1253
66
66
  dara/core/js_tooling/custom_js_scaffold/index.tsx,sha256=FEzSV5o5Nyzxw6eXvGLi7BkEBkXf3brV34_7ATLnY7o,68
67
67
  dara/core/js_tooling/custom_js_scaffold/local-js-component.tsx,sha256=Ojsyeh9MYJnH_XJXGkSc8PAUZIqJcqcGTu_uRITo_88,709
68
- dara/core/js_tooling/js_utils.py,sha256=RsGFaK0W2ThsbWzAn5Aush7g4Lz3jpvasCEeidZcttg,26101
68
+ dara/core/js_tooling/js_utils.py,sha256=cKkUmBrClZOCmra6lzjWoqQy3nRS87UBOelZXpE3tD4,26112
69
69
  dara/core/js_tooling/statics/favicon.ico,sha256=CJP26erMMIwQB8FFmyhoUJ-Cx1cXEopiVGxFwyxcpo0,47068
70
70
  dara/core/js_tooling/statics/tsconfig.json,sha256=ubnFjwvPHbx2F7wVWsU2VHLDeEnnOwXkTIk7hLNY8ZM,446
71
71
  dara/core/js_tooling/templates/.npmrc,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -75,38 +75,37 @@ dara/core/js_tooling/templates/dara.config.json,sha256=RZG_R_xJv_5rYIoz2QZulcG49
75
75
  dara/core/js_tooling/templates/vite.config.template.ts,sha256=f7_DbAQPDq6FJcOFJDnf2bMtzsvGWnN6VclRJjVdql8,631
76
76
  dara/core/log_configs/logging.yaml,sha256=YJyD18psAmSVz6587dcEOyoulLuRFFu1g8yMXl1ylM0,706
77
77
  dara/core/logging.py,sha256=QXf8qQDNdh5UW5-jnYwFz7U7KDmhPiZXmObBal_mwPo,13093
78
- dara/core/main.py,sha256=xcdxeNBis_wxioZ1EiIFqsp-87ekqq6x9ChIktmLZ2k,18075
78
+ dara/core/main.py,sha256=wc1Q5GJxZN4MWzhkq0sONO3MrsVtNEIA04YvawmnPZQ,18087
79
79
  dara/core/metrics/__init__.py,sha256=2UqpWHv-Ie58QLJIHJ9Szfjq8xifAuwy5FYGUIFwWtI,823
80
80
  dara/core/metrics/cache.py,sha256=ybofUhZO0TCHeyhB_AtldWk1QTmTKh7GucTXpOkeTFA,2580
81
81
  dara/core/metrics/runtime.py,sha256=YP-6Dz0GeI9_Yr7bUk_-OqShyFySGH_AKpDO126l6es,1833
82
82
  dara/core/metrics/utils.py,sha256=rYlBinxFc7VehFT5cTNXLk8gC74UEj7ZGq6vLgIDpSg,2247
83
- dara/core/persistence.py,sha256=9GBLhK_so-T-DnNOVT3zo7mHXNjwIU2TzgcIOr7XEro,10497
84
- dara/core/umd/dara.core.umd.js,sha256=57VF59BwRQpgC4hjRclh5Bh6r2RGBcOujHZ9nzVYxk4,4879982
83
+ dara/core/persistence.py,sha256=RaGiGQE3oIzEH7kHC1ZXji2VJa0aP0ewMjt1wRWYWjI,10634
84
+ dara/core/umd/dara.core.umd.js,sha256=dJIDEmWOw_J6bmktPc4M9LxtKT5MEmkTWd8YeLxihA8,4869323
85
85
  dara/core/umd/style.css,sha256=YQtQ4veiSktnyONl0CU1iU1kKfcQhreH4iASi1MP7Ak,4095007
86
86
  dara/core/visual/__init__.py,sha256=QN0wbG9HPQ_vXh8BO8DnBXeYLIENVTNtRmYzZf1lx7c,577
87
- dara/core/visual/components/__init__.py,sha256=O-Em_glGdZNO0LLl2RWmJSrQiXKxliXg_PuhVXGT81I,1811
87
+ dara/core/visual/components/__init__.py,sha256=mlmlTKelYVZoyEKGLLO-_HgLwI4uEpVwHVZajpXfSZk,1726
88
88
  dara/core/visual/components/dynamic_component.py,sha256=w7rxrM9ZTNvkHymkAto_s9UKg7EE8VrlpL9QdRe4sgY,692
89
- dara/core/visual/components/fallback.py,sha256=uazqdqgmWXPHluPRl3-5DofjE_cMMyKusIsn_pHuz1s,3378
90
- dara/core/visual/components/for_cmp.py,sha256=h15J_uVc974ILSRVYRLOWFOqaWIllivd6j-lNjpQU4U,6600
91
- dara/core/visual/components/invalid_component.py,sha256=HbWj5tjD5M8o8e-s6awnkDn3boHV7GyOWhALjWGOQmk,866
92
- dara/core/visual/components/menu.py,sha256=xaBqHqf0P9JjnD0S5poSsovVKSOZwklm6RRfjzIJk4s,893
93
- dara/core/visual/components/progress_tracker.py,sha256=qgGxwk8SsRNzennzj6YSaiguPo-tHlCnD2-WeqeiEzM,1669
94
- dara/core/visual/components/raw_string.py,sha256=NqvjoacE3JxwVxI-qA9YV1jV0nAQamW7Zc3kdZxak44,886
95
- dara/core/visual/components/router_content.py,sha256=QImJuOS4c8jrqzlVmmK7Q3vf5sMIU2lK6BusbpclLnM,943
96
- dara/core/visual/components/sidebar_frame.py,sha256=9KRZuLdY2zLMkPDq-0duGSNhmftWv_f-FJT6qbG8FAc,1207
97
- dara/core/visual/components/topbar_frame.py,sha256=aHTCmaI9tX5c1yVLoPWgFbDos-P81Kzv-f3ANFeTqdQ,1220
89
+ dara/core/visual/components/fallback.py,sha256=9bhDbyGrWjdSuMX_8eSggkicSjgIa8mP75y9oFNIXK8,3303
90
+ dara/core/visual/components/invalid_component.py,sha256=Q6O9rAwVUNZXjEmliAKLfWf2lsyYK5JhgQvMM6jVco8,901
91
+ dara/core/visual/components/menu.py,sha256=ied87GzIoZgmEINgX3WahBqofn-WK1PIBZAgMjR-Bxg,928
92
+ dara/core/visual/components/progress_tracker.py,sha256=5p_nEJf7RK2oPimXL4YhAN7v0Jcx2HHQzlLxPr7Co38,1705
93
+ dara/core/visual/components/raw_string.py,sha256=jtG9hDZz3s-sCg__Eg4__XkD80OhnNaWiRo-W88LK4M,921
94
+ dara/core/visual/components/router_content.py,sha256=ZFJBuT-Vpn4yvbzgt5IGQbBqiWFhYfHa6mgB2O8Xt8I,978
95
+ dara/core/visual/components/sidebar_frame.py,sha256=rXkPQF9TORuAgbMMx-BL_XDVE-CKcZHY9XV9-gZr_FI,1242
96
+ dara/core/visual/components/topbar_frame.py,sha256=7L4Bi7Ba_gdfS6yoduXQ3k0-XQaNuahmkumyfzlpzzY,1255
98
97
  dara/core/visual/components/types.py,sha256=uH2IGufr4-I8cNbZgnEd3YbqoPFgyqG91rfNXZVG7a0,686
99
98
  dara/core/visual/css/Property.py,sha256=XJzlMeASyrquhXmaQZvrsgin3xlVfm94dHRY9aJkhXk,43028
100
- dara/core/visual/css/__init__.py,sha256=XEO9yc0BHLI4dbk1ziMLmHc5MW2KDDfVdqlqtlSmk-A,367298
101
- dara/core/visual/dynamic_component.py,sha256=bTDTYu12B3wSZmqFPisQvvnA_Q-fyYp0Ds0Y08lE-jM,13608
99
+ dara/core/visual/css/__init__.py,sha256=OfxYRjeQweul_cF2Zgh6U9E-v933mO2MCKeh5rVZkyI,367276
100
+ dara/core/visual/dynamic_component.py,sha256=M9HQOE0gJYbZFIV97L0kT6WCY4dJ2juT9R9YZ1TB1EA,13584
102
101
  dara/core/visual/progress_updater.py,sha256=35_fb_F68YjtYf8MMRA76FoajjfPAlutmqz5fUNgTPs,5840
103
102
  dara/core/visual/template.py,sha256=y0KJU2913Q10y1TVMpTVnIxIoUsabzYfpUHEGuX2QyM,5707
104
103
  dara/core/visual/themes/__init__.py,sha256=aM4mgoIYo2neBSw5FRzswsht7PUKjLthiHLmFIkyRKw,794
105
104
  dara/core/visual/themes/dark.py,sha256=UQGDooOc8ric73eHs9E0ltYP4UCrwqQ3QxqN_fb4PwY,1942
106
105
  dara/core/visual/themes/definitions.py,sha256=m3oN0txs65MZepqjj7AKMMxybf2aq5fTjcTwJmHqEbk,2744
107
106
  dara/core/visual/themes/light.py,sha256=-Tviq8oEwGbdFULoDOqPuHO0UpAZGsBy8qFi0kAGolQ,1944
108
- dara_core-1.15.6a1.dist-info/LICENSE,sha256=r9u1w2RvpLMV6YjuXHIKXRBKzia3fx_roPwboGcLqCc,10944
109
- dara_core-1.15.6a1.dist-info/METADATA,sha256=8uiMIuDyEAk2evgMmSoQt2zQ2B7tSCuDn5Io3mSdssU,7464
110
- dara_core-1.15.6a1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
111
- dara_core-1.15.6a1.dist-info/entry_points.txt,sha256=H__D5sNIGuPIhVam0DChNL-To5k8Y7nY7TAFz9Mz6cc,139
112
- dara_core-1.15.6a1.dist-info/RECORD,,
107
+ dara_core-1.16.0a1.dist-info/LICENSE,sha256=r9u1w2RvpLMV6YjuXHIKXRBKzia3fx_roPwboGcLqCc,10944
108
+ dara_core-1.16.0a1.dist-info/METADATA,sha256=oKLzWHVK87YMLThSqGRswv9VGnlVNpoAVLmY_nygTjw,7513
109
+ dara_core-1.16.0a1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
110
+ dara_core-1.16.0a1.dist-info/entry_points.txt,sha256=H__D5sNIGuPIhVam0DChNL-To5k8Y7nY7TAFz9Mz6cc,139
111
+ dara_core-1.16.0a1.dist-info/RECORD,,
@@ -1,150 +0,0 @@
1
- """
2
- Copyright 2023 Impulse Innovations Limited
3
-
4
-
5
- Licensed under the Apache License, Version 2.0 (the "License");
6
- you may not use this file except in compliance with the License.
7
- You may obtain a copy of the License at
8
-
9
- http://www.apache.org/licenses/LICENSE-2.0
10
-
11
- Unless required by applicable law or agreed to in writing, software
12
- distributed under the License is distributed on an "AS IS" BASIS,
13
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- See the License for the specific language governing permissions and
15
- limitations under the License.
16
- """
17
-
18
- from typing import Optional
19
-
20
- from pydantic import validator
21
-
22
- from dara.core.definitions import ComponentInstance, JsComponentDef
23
- from dara.core.interactivity import AnyVariable
24
- from dara.core.visual.components.types import Direction
25
-
26
- ForDef = JsComponentDef(name='For', js_module='@darajs/core', py_module='dara.core')
27
-
28
-
29
- class For(ComponentInstance):
30
- """
31
- The For component is a special component designed to handle rendering
32
- of templated components created using the `@template` decorator. It accepts a
33
- template component and a data source, then dynamically renders the template
34
- component for each item in the data source.
35
-
36
- The For component is ideal for situations where you need to generate a list
37
- of components based on data, such as rendering a list of cards. It is particularly useful
38
- for improving performance when rendering large lists of components.
39
-
40
- Supports virtualization, which is enabled by default. Virtualization is a technique
41
- that only renders the components that are visible on the screen which can significantly improve performance when rendering
42
- large lists of components.
43
-
44
- Virtualized example:
45
-
46
- ```
47
- from dara.core import template, For, Variable
48
- from dara_dashboarding_extension import Card, Heading, Text, Button, If, Stack
49
-
50
- var = Variable([
51
- {'title': 'Experiment 1', 'description': 'Description 1', 'button_text': 'Run 1', 'button_color': 'red', 'size': 200},
52
- {'title': 'Experiment 2', 'description': 'Description 2', 'button_text': 'Run 2', 'button_color': 'blue', 'extra': 'Extra text', 'size': 300},
53
- ...
54
- ])
55
-
56
- @template
57
- def ExperimentCard(template_var: template.Value):
58
- return Card(
59
- Heading(template_var.title, level=2),
60
- Text(template_var.description),
61
- # Conditionally render the extra field if it exists
62
- If(template_var.extra, Text(template_var.extra)),
63
- Button(template_var.button_text, raw_css={'backgroundColor': template_var.button_color}),
64
- ...
65
- )
66
-
67
- Stack(
68
- For(
69
- key_accessor='title',
70
- data=var,
71
- template=ExperimentCard(),
72
- size_accessor='size' # Use the 'size' field to determine the height of each rendered component
73
- )
74
- )
75
- ```
76
-
77
- In this example the For component will render an ExperimentCard for each item in the 'var' data source,
78
- with the appropriate data injected into the template component. The 'title' field is used here as the
79
- `key_accessor`, this works here because the title is unique for each item; in general it is recommended
80
- to use a unique identifier for the `key_accessor` such as an `id` field. Note how the `size_accessor` is
81
- used to determine the height of each rendered component, this is required for virtualization to work correctly.
82
-
83
- Non-virtualized example:
84
-
85
- ```
86
- from dara.core import template, For, Variable
87
- from dara_dashboarding_extension import Card, Heading, Text, Button, Stack
88
-
89
- var = Variable([
90
- {'title': 'Experiment 1', 'description': 'Description 1', 'button_text': 'Run 1', 'button_color': 'red'},
91
- {'title': 'Experiment 2', 'description': 'Description 2', 'button_text': 'Run 2', 'button_color': 'blue'},
92
- ...
93
- ])
94
-
95
- @template
96
- def ExperimentCard(template_var: template.Value):
97
- return Card(
98
- Heading(template_var.title, level=2),
99
- Text(template_var.description),
100
- Button(template_var.button_text, raw_css={'backgroundColor': template_var.button_color}),
101
- ...
102
- )
103
-
104
- Stack(
105
- For(
106
- key_accessor='title',
107
- data=var,
108
- template=ExperimentCard(),
109
- virtualize=False
110
- ),
111
- scroll=True
112
- )
113
- ```
114
-
115
-
116
- :param data: The variable containing the data to iterate over. Should be a list of dictionaries when serialized, DataVariables are handled out-of-the-box.
117
- :param template: Templated component, created by `@template`, to render for each item in the variable.
118
- :param key_accessor: a string representing a property name in the data item, which will be used as the unique identifier for each rendered
119
- component. Must be unique for each item in the data source or else changes in data will not be correctly reflected in the rendered components.
120
- :param size_accessor: a string representing a property name in the data item which will be used as the size of each rendered component. The property must
121
- be a pixel size number (e.g. 100, 200, 300, etc). This is required when `virtualize=True` in order to correctly render the virtualized list. This corresponds
122
- to item height in the vertical direction and item width in the horizontal direction.
123
- :param virtualize: whether or not to use virtualization. Defaults to True. When virtualization is enabled, only the visible items are rendered, which can
124
- improve performance when rendering large lists of components. Requires `size_accessor` to be set if `True`.
125
- """
126
-
127
- data: AnyVariable
128
- template: ComponentInstance
129
- key_accessor: str
130
- size_accessor: Optional[str] = None
131
- direction: Direction = Direction.VERTICAL
132
- virtualize: bool = True
133
-
134
- @validator('template')
135
- @classmethod
136
- def is_templated_component(cls, v: ComponentInstance):
137
- if not v.templated:
138
- raise ValueError(
139
- '`For.template` must be a templated component. Make sure to use `@template` decorator to create a templated component'
140
- )
141
- return v
142
-
143
- @validator('size_accessor')
144
- @classmethod
145
- def require_size_accessor_if_virtualize(cls, v: Optional[str], values: dict):
146
- if v is None and values['virtualize']:
147
- raise ValueError(
148
- '`For.size_accessor` is required when `virtualize=True` in order to correctly render the virtualized list. Please provide a `size_accessor` or set `virtualize=False` to opt out of virtualization.'
149
- )
150
- return v