dara-components 1.17.6__py3-none-any.whl → 1.18.1__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 (35) hide show
  1. dara/components/__init__.py +2 -0
  2. dara/components/common/__init__.py +1 -0
  3. dara/components/common/base_component.py +6 -6
  4. dara/components/common/button.py +2 -2
  5. dara/components/common/dropzone.py +1 -1
  6. dara/components/common/heading.py +2 -0
  7. dara/components/common/if_cmp.py +3 -1
  8. dara/components/common/label.py +0 -1
  9. dara/components/common/slider.py +1 -4
  10. dara/components/common/stack.py +1 -1
  11. dara/components/common/table.py +7 -8
  12. dara/components/common/text.py +1 -1
  13. dara/components/common/time_utils.py +1 -3
  14. dara/components/common/tooltip.py +1 -1
  15. dara/components/common/utils.py +4 -5
  16. dara/components/graphs/__init__.py +1 -0
  17. dara/components/graphs/components/base_graph_component.py +1 -1
  18. dara/components/graphs/components/causal_graph_viewer.py +1 -1
  19. dara/components/graphs/components/edge_encoder.py +2 -2
  20. dara/components/graphs/definitions.py +3 -3
  21. dara/components/plotting/__init__.py +2 -1
  22. dara/components/plotting/bokeh/bokeh.py +0 -1
  23. dara/components/plotting/bokeh/utils.py +7 -3
  24. dara/components/plotting/plotly/plotly.py +1 -2
  25. dara/components/plotting/plotly/themes.py +6 -4
  26. dara/components/smart/__init__.py +1 -0
  27. dara/components/smart/code_editor/util.py +9 -9
  28. dara/components/smart/data_slicer/data_slicer.py +1 -1
  29. dara/components/smart/data_slicer/data_slicer_modal.py +2 -2
  30. dara/components/smart/data_slicer/utils/core.py +13 -13
  31. dara/components/smart/data_slicer/utils/plotting.py +8 -6
  32. {dara_components-1.17.6.dist-info → dara_components-1.18.1.dist-info}/METADATA +3 -3
  33. {dara_components-1.17.6.dist-info → dara_components-1.18.1.dist-info}/RECORD +35 -35
  34. {dara_components-1.17.6.dist-info → dara_components-1.18.1.dist-info}/LICENSE +0 -0
  35. {dara_components-1.17.6.dist-info → dara_components-1.18.1.dist-info}/WHEEL +0 -0
@@ -14,6 +14,8 @@ 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
+ # ruff: noqa: F401, F403
18
+
17
19
  from importlib.metadata import version
18
20
 
19
21
  from pydantic import BaseModel
@@ -14,6 +14,7 @@ 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
+ # ruff: noqa: F401, F403
17
18
 
18
19
  from dara.components.common.accordion import Accordion, AccordionItem
19
20
  from dara.components.common.anchor import Anchor
@@ -78,7 +78,7 @@ class LayoutComponent(BaseDashboardComponent):
78
78
  :param align: the align-items value to be passed to the component
79
79
  """
80
80
 
81
- position: str = 'relative'
81
+ position: Union[str, None] = 'relative'
82
82
 
83
83
  justify: Optional[JustifyContent] = None
84
84
 
@@ -92,15 +92,15 @@ class LayoutComponent(BaseDashboardComponent):
92
92
  if ComponentInstance.isinstance(component) is False:
93
93
  name = self.__class__.__name__
94
94
  raise TypeError(f'You may only append other components to a {name} component. Not: {component}')
95
- self.children.append(component) # type: ignore
95
+ self.children.append(component) # type: ignore
96
96
 
97
97
  def pop(self):
98
98
  """
99
99
  Pops the last child from the list of children and returns it. Raises an IndexError if the parent is empty
100
100
  """
101
- if len(self.children) == 0: # type: ignore
101
+ if len(self.children) == 0: # type: ignore
102
102
  raise IndexError(f'{self.__class__.__name__} is empty')
103
- return self.children.pop() # type: ignore
103
+ return self.children.pop() # type: ignore
104
104
 
105
105
 
106
106
  class ContentComponent(BaseDashboardComponent):
@@ -114,8 +114,8 @@ class ContentComponent(BaseDashboardComponent):
114
114
  super().__init__(*args, **kwargs)
115
115
 
116
116
  cmp_name = self.__class__.__name__
117
- if len(self.children) != 0: # type: ignore
118
- for child in self.children: # type: ignore # pylint: disable=not-an-iterable
117
+ if len(self.children) != 0: # type: ignore
118
+ for child in self.children: # type: ignore
119
119
  if isinstance(child, LayoutComponent):
120
120
  raise LayoutError(f'A {child.__class__.__name__} component cannot be nested inside a {cmp_name}')
121
121
 
@@ -16,7 +16,7 @@ limitations under the License.
16
16
  """
17
17
 
18
18
  from enum import Enum
19
- from typing import Optional, Union
19
+ from typing import Optional, Union, cast
20
20
 
21
21
  from dara.components.common.base_component import LayoutComponent
22
22
  from dara.components.common.text import Text
@@ -134,4 +134,4 @@ class Button(LayoutComponent):
134
134
  if not styling and isinstance(children, ComponentInstance) and not isinstance(children, Text):
135
135
  style = ButtonStyle.PLAIN
136
136
 
137
- super().__init__(child, styling=style, **kwargs)
137
+ super().__init__(cast(ComponentInstance, child), styling=style, **kwargs)
@@ -81,7 +81,7 @@ class UploadDropzone(StyledComponentInstance):
81
81
  on_drop: Optional[Action] = None,
82
82
  accept: Optional[str] = None,
83
83
  enable_paste: Optional[bool] = False,
84
- **kwargs
84
+ **kwargs,
85
85
  ):
86
86
  from dara.core.interactivity.any_data_variable import upload
87
87
  from dara.core.internal.registries import upload_resolver_registry
@@ -74,6 +74,8 @@ class Heading(ContentComponent):
74
74
 
75
75
  @property
76
76
  def anchor_name(self):
77
+ if isinstance(self.heading, NonDataVariable):
78
+ raise ValueError('Heading anchor name cannot be accessed directly from a variable')
77
79
  return re.sub(r'\s+', '-', self.heading.lower())
78
80
 
79
81
  def __init__(self, heading: Union[str, NonDataVariable], **kwargs):
@@ -95,5 +95,7 @@ class If(ModifierComponent):
95
95
  condition = Condition(operator=Operator.TRUTHY, other=None, variable=condition)
96
96
 
97
97
  super().__init__(
98
- condition=condition, true_children=cast_list(true_children), false_children=cast_list(false_children) # type: ignore
98
+ condition=condition,
99
+ true_children=cast_list(true_children),
100
+ false_children=cast_list(false_children), # type: ignore
99
101
  )
@@ -72,7 +72,6 @@ class Label(ContentComponent):
72
72
  @field_validator('children')
73
73
  @classmethod
74
74
  def validate_only_one_child(cls, children: List[ComponentInstance]) -> List[ComponentInstance]:
75
-
76
75
  if len(children) > 1:
77
76
  raise TypeError(
78
77
  'More than one component was passed to the Label component. Label accepts only one child component'
@@ -168,10 +168,7 @@ class Slider(FormComponent):
168
168
  # If step is not provided, run inference to check if the
169
169
  # client-side computed step is compatible with the domain range.
170
170
  # The actual step is computed in the client-side but we check it here to fail early.
171
- if v is None:
172
- step = compute_step(domain_range)
173
- else:
174
- step = Decimal(str(v))
171
+ step = compute_step(domain_range) if v is None else Decimal(str(v))
175
172
 
176
173
  # Not divisible
177
174
  if domain_range % step != 0:
@@ -137,7 +137,7 @@ class Stack(LayoutComponent):
137
137
 
138
138
  collapsed: Union[Variable[bool], bool] = False
139
139
  direction: Direction = Direction.VERTICAL
140
- hug: bool = False
140
+ hug: Union[bool, None] = False
141
141
  scroll: bool = False
142
142
 
143
143
  # Dummy init that just passes through arguments to superclass, fixes Pylance complaining about types
@@ -376,7 +376,7 @@ class Column(BaseModel):
376
376
  unique_items: Optional[List[str]] = None
377
377
  filter: Optional[TableFilter] = None
378
378
  formatter: Optional[dict] = None
379
- label: Optional[str] = Field(default=None, validate_default=True) # mimics always=True in pydantic v1
379
+ label: Optional[str] = Field(default=None, validate_default=True) # mimics always=True in pydantic v1
380
380
  sticky: Optional[str] = None
381
381
  tooltip: Optional[str] = None
382
382
  width: Optional[Union[int, str]] = None
@@ -402,13 +402,12 @@ class Column(BaseModel):
402
402
  formatter_type = formatter.get('type')
403
403
  if formatter_type not in TableFormatterType:
404
404
  raise ValueError(
405
- f"Invalid formatter type: {formatter.get('type')}, accepted values {list(TableFormatterType)}"
405
+ f'Invalid formatter type: {formatter.get("type")}, accepted values {list(TableFormatterType)}'
406
406
  )
407
407
  if formatter_type in (TableFormatterType.NUMBER, TableFormatterType.PERCENT):
408
408
  precision = formatter.get('precision')
409
- if precision is not None:
410
- if not isinstance(precision, int) or precision <= 0:
411
- raise ValueError(f'Invalid precision value: {precision}, must be positive integer')
409
+ if precision is not None and (not isinstance(precision, int) or precision <= 0):
410
+ raise ValueError(f'Invalid precision value: {precision}, must be positive integer')
412
411
  elif formatter_type == TableFormatterType.NUMBER_INTL:
413
412
  locales = formatter.get('locales')
414
413
  if not isinstance(locales, str) or not (
@@ -442,9 +441,9 @@ class Column(BaseModel):
442
441
  )
443
442
  lower_bound = threshold.get('bounds')[0]
444
443
  upper_bound = threshold.get('bounds')[1]
445
- if not (isinstance(lower_bound, int) or isinstance(lower_bound, float)):
444
+ if not (isinstance(lower_bound, (int, float))):
446
445
  raise ValueError(f'Invalid bound type: {lower_bound}, must be int or float')
447
- if not (isinstance(upper_bound, int) or isinstance(upper_bound, float)):
446
+ if not (isinstance(upper_bound, (int, float))):
448
447
  raise ValueError(f'Invalid bound type: {upper_bound}, must be int or float')
449
448
  elif formatter_type == TableFormatterType.BADGE:
450
449
  badges = formatter.get('badges')
@@ -461,7 +460,7 @@ class Column(BaseModel):
461
460
  )
462
461
  if not isinstance(badges[badge].get('color'), str):
463
462
  raise ValueError(
464
- f"Invalid color: {badges[badge].get('color')} for badge: {badges[badge]}, must be a string"
463
+ f'Invalid color: {badges[badge].get("color")} for badge: {badges[badge]}, must be a string'
465
464
  )
466
465
  return formatter
467
466
 
@@ -54,7 +54,7 @@ class Text(ContentComponent):
54
54
  """
55
55
 
56
56
  text: Union[str, NonDataVariable]
57
- align: str = 'left'
57
+ align: Union[str, None] = 'left' # type: ignore # this is actually textAlign not align-items
58
58
  formatted: bool = False
59
59
 
60
60
  @field_validator('text')
@@ -39,9 +39,7 @@ def date_to_datetime(d: datetime.date, hh=23, mm=59, ss=59) -> datetime.datetime
39
39
 
40
40
  def coerce_to_timemilli(t: Union[int, float, datetime.date, datetime.datetime]) -> float:
41
41
  """Convert any of int/float/date/datetime into a timemilli."""
42
- if isinstance(t, int) or isinstance(t, numpy.signedinteger):
43
- return float(t)
44
- elif isinstance(t, float) or isinstance(t, numpy.floating):
42
+ if isinstance(t, (int, numpy.signedinteger, float, numpy.floating)):
45
43
  return float(t)
46
44
  # The order matters - datetime.datetime is a subclass of the datetime.date
47
45
  elif isinstance(t, datetime.datetime):
@@ -84,7 +84,7 @@ class Tooltip(ModifierComponent):
84
84
  content: Union[str, ComponentInstance, Variable[str], DerivedVariable[str]],
85
85
  placement: str = 'auto',
86
86
  styling: str = 'default',
87
- **kwargs
87
+ **kwargs,
88
88
  ):
89
89
  # Unless there's one component and it's Stack, wrap components in Stack
90
90
  if not (len(components) == 1 and isinstance(components[0], Stack)):
@@ -78,11 +78,11 @@ class Item(BaseModel):
78
78
  try:
79
79
  label = str(item)
80
80
  return Item(label=label, value=item)
81
- except Exception:
81
+ except Exception as e:
82
82
  raise ValueError(
83
83
  f'Item: {item} could not be parsed correctly. If your item is a complex structure please pass in an '
84
84
  f'Item class, with a string label defined'
85
- )
85
+ ) from e
86
86
 
87
87
 
88
88
  class CarouselItem(BaseModel):
@@ -116,7 +116,6 @@ class CarouselItem(BaseModel):
116
116
  image_height: Optional[str] = None,
117
117
  image_width: Optional[str] = None,
118
118
  ):
119
-
120
119
  super().__init__(
121
120
  title=title,
122
121
  subtitle=subtitle,
@@ -149,8 +148,8 @@ class CarouselItem(BaseModel):
149
148
  try:
150
149
  title = str(item)
151
150
  return CarouselItem(title=title)
152
- except Exception:
151
+ except Exception as e:
153
152
  raise ValueError(
154
153
  f'CarouselItem: {item} could not be parsed correctly. If your item is a complex structure please pass in an '
155
154
  f'CarouselItem class'
156
- )
155
+ ) from e
@@ -14,6 +14,7 @@ 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
+ # ruff: noqa: F401, F403
17
18
 
18
19
  from dara.components.graphs.components import *
19
20
  from dara.components.graphs.definitions import *
@@ -17,9 +17,9 @@ limitations under the License.
17
17
 
18
18
  from typing import Any, Dict, List, Optional, Union
19
19
 
20
- from cai_causal_graph import CausalGraph, Skeleton
21
20
  from pydantic import ConfigDict, SerializerFunctionWrapHandler, field_serializer
22
21
 
22
+ from cai_causal_graph import CausalGraph, Skeleton
23
23
  from dara.components.graphs.definitions import (
24
24
  DEFAULT_LEGENDS,
25
25
  EditorMode,
@@ -17,9 +17,9 @@ limitations under the License.
17
17
 
18
18
  from typing import Optional, Union
19
19
 
20
- from cai_causal_graph import CausalGraph, Skeleton
21
20
  from pydantic import field_validator, model_validator
22
21
 
22
+ from cai_causal_graph import CausalGraph, Skeleton
23
23
  from dara.components.graphs.components.base_graph_component import BaseGraphComponent
24
24
  from dara.components.graphs.definitions import EditorMode
25
25
  from dara.components.graphs.graph_layout import PlanarLayout
@@ -17,8 +17,6 @@ limitations under the License.
17
17
 
18
18
  from typing import Any, Dict, List, Optional, Union
19
19
 
20
- from cai_causal_graph.graph_components import Node
21
- from cai_causal_graph.type_definitions import EdgeConstraint as EdgeConstraintType
22
20
  from fastapi.encoders import jsonable_encoder
23
21
  from pydantic import (
24
22
  ConfigDict,
@@ -28,6 +26,8 @@ from pydantic import (
28
26
  )
29
27
  from typing_extensions import TypedDict
30
28
 
29
+ from cai_causal_graph.graph_components import Node
30
+ from cai_causal_graph.type_definitions import EdgeConstraint as EdgeConstraintType
31
31
  from dara.components.graphs.definitions import DEFAULT_LEGENDS, EditorMode, GraphLegend
32
32
  from dara.components.graphs.graph_layout import (
33
33
  GraphLayout,
@@ -64,7 +64,7 @@ class SpacerLegend(Legend):
64
64
  :param label: Optional label to show in the legend
65
65
  """
66
66
 
67
- type: Literal['spacer'] = Field(default='spacer', frozen=True) # type: ignore
67
+ type: Literal['spacer'] = Field(default='spacer', frozen=True) # type: ignore
68
68
  label: Optional[str] = None
69
69
 
70
70
 
@@ -79,7 +79,7 @@ class EdgeLegend(Legend):
79
79
  :param dash_array: Optional [stroke-dasharray](https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/stroke-dasharray) SVG path property - line will be dashed if specified
80
80
  """
81
81
 
82
- type: Literal['edge'] = Field(default='edge', frozen=True) # type: ignore
82
+ type: Literal['edge'] = Field(default='edge', frozen=True) # type: ignore
83
83
  label: Optional[str] = None
84
84
  arrow_type: Optional[ArrowType] = ArrowType.NORMAL
85
85
  center_symbol: Optional[CenterSymbol] = CenterSymbol.NONE
@@ -96,7 +96,7 @@ class NodeLegend(Legend):
96
96
  :param highlight_color: Optional color for the node symbol rim in the legend
97
97
  """
98
98
 
99
- type: Literal['node'] = Field(default='node', frozen=True) # type: ignore
99
+ type: Literal['node'] = Field(default='node', frozen=True) # type: ignore
100
100
  label: Optional[str] = None
101
101
  color: Optional[str] = 'theme.blue4'
102
102
  highlight_color: Optional[str] = 'theme.primary'
@@ -14,8 +14,9 @@ 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
+ # ruff: noqa: F401, F403
17
18
 
18
- import dara.components.plotting.palettes as PALETTES # pylint: disable=unused-import
19
+ import dara.components.plotting.palettes as PALETTES
19
20
  from dara.components.plotting.bokeh import *
20
21
  from dara.components.plotting.matplotlib import *
21
22
  from dara.components.plotting.plotly import *
@@ -69,7 +69,6 @@ class Bokeh(StyledComponentInstance):
69
69
  :param document: the document to display
70
70
  """
71
71
  if figure is not None:
72
-
73
72
  doc = Document()
74
73
  doc.theme = _get_theme(theme)
75
74
  doc.add_root(figure)
@@ -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 typing import Union
19
+
18
20
  from bokeh.models import CustomJS
19
21
  from bokeh.plotting import figure
20
22
 
@@ -35,21 +37,23 @@ def figure_events(fig: figure):
35
37
  :param
36
38
  """
37
39
 
38
- def generate_event(args: dict = {}):
40
+ def generate_event(args: Union[dict, None] = None):
39
41
  """
40
42
  Generate a CustomJS event with the code, event name and arguments provided
41
43
 
42
44
  :param args: The arguments to provide to the JS code
43
45
  """
46
+ if args is None:
47
+ args = {}
44
48
  return CustomJS(
45
49
  args=args,
46
50
  code=f"""
47
- function {event_name.replace(' ','')+'__'+fig.id}(cb_obj, args) {{
51
+ function {event_name.replace(' ', '') + '__' + fig.id}(cb_obj, args) {{
48
52
  {code}
49
53
  }}
50
54
 
51
55
  document.dispatchEvent(
52
- new CustomEvent("BOKEH_FIGURE_{event_name}_{fig.id}", {{ detail: {event_name.replace(' ','')+'__'+fig.id}(cb_obj, {{{','.join(args.keys())}}}) }})
56
+ new CustomEvent("BOKEH_FIGURE_{event_name}_{fig.id}", {{ detail: {event_name.replace(' ', '') + '__' + fig.id}(cb_obj, {{{','.join(args.keys())}}}) }})
53
57
  )
54
58
  """,
55
59
  )
@@ -31,7 +31,7 @@ SETTINGS = {'THEME': light_theme}
31
31
 
32
32
  # We need to set the default theme for plotly so that plotly express when setting traces is able to pick up dara theme colors
33
33
  base_template = pio.templates['plotly']
34
- dara_theme = base_template.layout.update(SETTINGS['THEME']['layout']) # type: ignore
34
+ dara_theme = base_template.layout.update(SETTINGS['THEME']['layout']) # type: ignore
35
35
  dara_template = go.layout.Template(layout=dara_theme)
36
36
  # Set the default theme for plotly
37
37
  pio.templates['dara_theme'] = dara_template
@@ -133,7 +133,6 @@ class Plotly(StyledComponentInstance):
133
133
  events: Optional[List[PlotlyEvent]] = None,
134
134
  **kwargs,
135
135
  ):
136
-
137
136
  if theme is None and figure is not None:
138
137
  figure.update_layout(template=theme if theme is not None else SETTINGS['THEME'])
139
138
 
@@ -21,9 +21,11 @@ from dara.components.plotting.palettes import CategoricalDark10, CategoricalLigh
21
21
  from dara.core.visual.themes import dark, light
22
22
 
23
23
  light_colors = light.Light.colors
24
+ assert light_colors is not None
24
25
  dark_colors = dark.Dark.colors
26
+ assert dark_colors is not None
25
27
 
26
- light_theme = {
28
+ light_theme: Dict[str, Dict[str, Any]] = {
27
29
  'layout': {
28
30
  'paper_bgcolor': 'rgba(255,255,255,0)', # Set the background color of the plot
29
31
  'plot_bgcolor': 'rgba(255,255,255,0)', # Set the background color of the plot area
@@ -81,9 +83,9 @@ light_theme = {
81
83
  },
82
84
  },
83
85
  },
84
- } # type: Dict[str, Dict[str, Any]]
86
+ }
85
87
 
86
- dark_theme = {
88
+ dark_theme: Dict[str, Dict[str, Any]] = {
87
89
  'layout': {
88
90
  'paper_bgcolor': 'rgba(255,255,255,0)', # Set the background color of the plot
89
91
  'plot_bgcolor': 'rgba(255,255,255,0)', # Set the background color of the plot area
@@ -141,4 +143,4 @@ dark_theme = {
141
143
  },
142
144
  },
143
145
  },
144
- } # type: Dict[str, Dict[str, Any]]
146
+ }
@@ -14,6 +14,7 @@ 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
+ # ruff: noqa: F401, F403
17
18
 
18
19
  from dara.components.smart.chat import Chat
19
20
  from dara.components.smart.code_editor import CodeEditor, run_script
@@ -16,7 +16,7 @@ limitations under the License.
16
16
  """
17
17
 
18
18
  import ast
19
- from typing import Any, List, Optional
19
+ from typing import Any, List, Optional, Union
20
20
 
21
21
  DEFAULT_WHITELIST = [
22
22
  # Inbuilts
@@ -63,9 +63,9 @@ class ScriptVisitor(ast.NodeVisitor):
63
63
  self.declared_vars.append(target.id)
64
64
  self.generic_visit(node)
65
65
 
66
- def visit_Attribute(self, attr):
67
- self._check_dunder(attr, attr.attr)
68
- self.generic_visit(attr)
66
+ def visit_Attribute(self, node):
67
+ self._check_dunder(node, node.attr)
68
+ self.generic_visit(node)
69
69
 
70
70
  def visit_FunctionDef(self, node):
71
71
  self._check_dunder(node, node.name)
@@ -106,7 +106,7 @@ class ScriptVisitor(ast.NodeVisitor):
106
106
  raise SyntaxError(f'Imports are not allowed: {node.names}')
107
107
 
108
108
 
109
- def run_script(script: str, injections: dict = {}, whitelist: List[str] = DEFAULT_WHITELIST) -> Any:
109
+ def run_script(script: str, injections: Union[dict, None] = None, whitelist: List[str] = DEFAULT_WHITELIST) -> Any:
110
110
  """
111
111
  Run a given script in a "sandbox".
112
112
  Disallows imports, most globals except whitelisted ones.
@@ -131,13 +131,13 @@ def run_script(script: str, injections: dict = {}, whitelist: List[str] = DEFAUL
131
131
 
132
132
  """
133
133
  # Validate that the script is safe
134
+ if injections is None:
135
+ injections = {}
134
136
  module: ast.Module = ast.parse(script)
135
137
  visitor = ScriptVisitor([*whitelist, *injections.keys()])
136
138
  visitor.visit(module)
137
139
 
138
140
  # Run the script
139
141
  loc: dict = {}
140
- exec(
141
- script, injections, loc
142
- ) # nosec B102 # this is unsafe but we make best effort with the above to make it as safe as possible
143
- return loc.get('return_val', None)
142
+ exec(script, injections, loc) # nosec B102 # this is unsafe but we make best effort with the above to make it as safe as possible
143
+ return loc.get('return_val')
@@ -57,7 +57,7 @@ NO_RESULTS_FOUND = Stack(Text('No results found'))
57
57
  TABLE_ROWS = 5
58
58
 
59
59
 
60
- def increment(ctx: UpdateVariable.Ctx):
60
+ def increment(ctx: UpdateVariable.Ctx): # type: ignore
61
61
  return ctx.inputs.old + 1
62
62
 
63
63
 
@@ -30,11 +30,11 @@ from dara.core.definitions import ComponentInstance, discover
30
30
  from dara.core.interactivity import AnyDataVariable, DerivedVariable, Variable
31
31
 
32
32
 
33
- def toggle_variable(ctx: UpdateVariable.Ctx):
33
+ def toggle_variable(ctx: UpdateVariable.Ctx): # type: ignore
34
34
  return not ctx.inputs.old
35
35
 
36
36
 
37
- def increment(ctx: UpdateVariable.Ctx):
37
+ def increment(ctx: UpdateVariable.Ctx): # type: ignore
38
38
  return ctx.inputs.old + 1
39
39
 
40
40
 
@@ -17,7 +17,7 @@ limitations under the License.
17
17
 
18
18
  import re
19
19
  from datetime import datetime, timezone
20
- from typing import Any, List, Optional, Union
20
+ from typing import Any, List, Optional, Union, cast
21
21
 
22
22
  import numpy
23
23
  from pandas import DataFrame, Series
@@ -83,7 +83,7 @@ def isnumber(*values: Union[str, float]):
83
83
  return True
84
84
 
85
85
 
86
- def apply_range_filter(range_filter: str, column: Series) -> Optional['Series[bool]']:
86
+ def apply_range_filter(range_filter: str, column: Series) -> Optional['Series']:
87
87
  """
88
88
  Apply a 'range' filter on a column
89
89
 
@@ -126,7 +126,7 @@ def apply_range_filter(range_filter: str, column: Series) -> Optional['Series[bo
126
126
  return final_range_filter
127
127
 
128
128
 
129
- def apply_values_filter(values_filter: str, column: Series, col_type: ColumnType) -> Optional['Series[bool]']:
129
+ def apply_values_filter(values_filter: str, column: Series, col_type: ColumnType) -> Optional['Series']:
130
130
  """
131
131
  Apply a 'values' filter on a column
132
132
 
@@ -177,7 +177,7 @@ def parseISO(date: str) -> numpy.datetime64:
177
177
  return numpy.datetime64(d)
178
178
 
179
179
 
180
- def apply_date_filter(from_date: str, to_date: str, column: 'Series[numpy.datetime64]') -> Optional['Series[bool]']:
180
+ def apply_date_filter(from_date: str, to_date: str, column: 'Series') -> Optional['Series']:
181
181
  """
182
182
  Apply a 'from_date' and 'to_date' filters to a column
183
183
 
@@ -189,12 +189,12 @@ def apply_date_filter(from_date: str, to_date: str, column: 'Series[numpy.dateti
189
189
 
190
190
  if from_date != '':
191
191
  from_timestamp = parseISO(from_date)
192
- from_date_filter = column.gt(from_timestamp) # type: ignore
192
+ from_date_filter = column.gt(from_timestamp) # type: ignore
193
193
  final_date_filter = from_date_filter
194
194
 
195
195
  if to_date != '':
196
196
  to_timestamp = parseISO(to_date)
197
- to_date_filter = column.lt(to_timestamp) # type: ignore
197
+ to_date_filter = column.lt(to_timestamp) # type: ignore
198
198
  final_date_filter = final_date_filter & to_date_filter if final_date_filter is not None else to_date_filter
199
199
 
200
200
  return final_date_filter
@@ -212,9 +212,9 @@ def apply_filters(variable_filters: List[FilterInstance], data: DataFrame) -> Da
212
212
  for fil in variable_filters:
213
213
  var = fil['column']
214
214
 
215
- values_filter: Optional['Series[bool]'] = None
216
- range_filter: Optional['Series[bool]'] = None
217
- date_filter: Optional['Series[bool]'] = None
215
+ values_filter: Optional['Series'] = None
216
+ range_filter: Optional['Series'] = None
217
+ date_filter: Optional['Series'] = None
218
218
 
219
219
  if var is None or var.strip() == '':
220
220
  continue
@@ -223,14 +223,14 @@ def apply_filters(variable_filters: List[FilterInstance], data: DataFrame) -> Da
223
223
 
224
224
  # Range filter
225
225
  if fil['range'] != '' and 'range' in ALLOWED_FILTERS[column_type]:
226
- range_filter = apply_range_filter(fil['range'], data[var])
226
+ range_filter = apply_range_filter(fil['range'], cast(Series, data[var]))
227
227
 
228
228
  # Values filter
229
229
  if fil['values'] != '' and 'values' in ALLOWED_FILTERS[column_type]:
230
- values_filter = apply_values_filter(fil['values'], data[var], column_type)
230
+ values_filter = apply_values_filter(fil['values'], cast(Series, data[var]), column_type)
231
231
 
232
232
  if (fil['from_date'] != '' or fil['to_date'] != '') and ('from_date' in ALLOWED_FILTERS[column_type]):
233
- date_filter = apply_date_filter(fil['from_date'], fil['to_date'], data[var])
233
+ date_filter = apply_date_filter(fil['from_date'], fil['to_date'], cast(Series, data[var]))
234
234
 
235
235
  # OR all of the defined filters together
236
236
  final_filter = None
@@ -242,7 +242,7 @@ def apply_filters(variable_filters: List[FilterInstance], data: DataFrame) -> Da
242
242
  if final_filter is not None:
243
243
  output = output[final_filter]
244
244
 
245
- return output
245
+ return cast(DataFrame, output)
246
246
 
247
247
 
248
248
  def get_filter_stats(input_data: DataFrame, output_data: DataFrame, filters: List[FilterInstance]) -> FilterStats:
@@ -15,9 +15,11 @@ See the License for the specific language governing permissions and
15
15
  limitations under the License.
16
16
  """
17
17
 
18
+ from typing import cast
19
+
18
20
  import numpy
19
21
  from bokeh.plotting import figure
20
- from pandas import DataFrame
22
+ from pandas import DataFrame, Series
21
23
  from scipy.stats import gaussian_kde
22
24
 
23
25
  from dara.components.common import Stack, Text
@@ -43,9 +45,9 @@ def _plot_x_numerical(dataset: DataFrame, x: str, **kwargs):
43
45
  sizing_mode='stretch_both',
44
46
  **kwargs,
45
47
  )
46
- p.toolbar.logo = None # type: ignore
48
+ p.toolbar.logo = None # type: ignore
47
49
 
48
- pdf = gaussian_kde(df[x].dropna())
50
+ pdf = gaussian_kde(cast(DataFrame, df[x]).dropna())
49
51
  y = pdf(lin)
50
52
  p.line(
51
53
  lin,
@@ -63,10 +65,10 @@ def _plot_x_categorical(dataset: DataFrame, x: str, **kwargs):
63
65
  df = dataset.copy()
64
66
  df = df[[x]].dropna().astype(str)
65
67
 
66
- values_counts = df[x].value_counts()
68
+ values_counts = cast(Series, df[x]).value_counts()
67
69
 
68
70
  p = figure(
69
- x_range=sorted(list(df[x].unique())),
71
+ x_range=sorted(list(cast(Series, df[x]).unique())),
70
72
  title=f'Histogram - {x}',
71
73
  toolbar_location=None,
72
74
  tools='',
@@ -76,7 +78,7 @@ def _plot_x_categorical(dataset: DataFrame, x: str, **kwargs):
76
78
 
77
79
  p.vbar(x=values_counts.index, top=values_counts.values, width=0.5, color=BLUE)
78
80
 
79
- p.toolbar.logo = None # type: ignore
81
+ p.toolbar.logo = None # type: ignore
80
82
 
81
83
  p.xgrid.grid_line_color = None
82
84
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: dara-components
3
- Version: 1.17.6
3
+ Version: 1.18.1
4
4
  Summary: Components for the Dara Framework
5
5
  Home-page: https://dara.causalens.com/
6
6
  License: Apache-2.0
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
16
16
  Requires-Dist: bokeh (>=3.1.0,<3.2.0)
17
17
  Requires-Dist: cai-causal-graph (>=0.3.6)
18
18
  Requires-Dist: certifi (>=2024.7.4)
19
- Requires-Dist: dara-core (==1.17.6)
19
+ Requires-Dist: dara-core (==1.18.1)
20
20
  Requires-Dist: dill (>=0.3.0,<0.4.0)
21
21
  Requires-Dist: matplotlib (>=2.0.0)
22
22
  Requires-Dist: pandas (>=1.1.0,<3.0.0)
@@ -28,7 +28,7 @@ Description-Content-Type: text/markdown
28
28
 
29
29
  # Dara Components
30
30
 
31
- <img src="https://github.com/causalens/dara/blob/v1.17.6/img/dara_light.svg?raw=true">
31
+ <img src="https://github.com/causalens/dara/blob/v1.18.1/img/dara_light.svg?raw=true">
32
32
 
33
33
  ![Master tests](https://github.com/causalens/dara/actions/workflows/tests.yml/badge.svg?branch=master)
34
34
  [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://www.apache.org/licenses/LICENSE-2.0)
@@ -1,10 +1,10 @@
1
- dara/components/__init__.py,sha256=cZ2I2cKNPiSlzs0C1ZXu3i3kmCrcqgWoHkhl8Jg_e24,1346
2
- dara/components/common/__init__.py,sha256=Nts8bgfKWNYpJnGWXfbh-F9awKDBF4A9SFn-mOMKmTk,3943
1
+ dara/components/__init__.py,sha256=JjN7EAGU-tM7I7YHyKRAuZlcbpJFcVcFaGit5StehDs,1372
2
+ dara/components/common/__init__.py,sha256=mQMUawBq-bLnj08bSfaPdtUd_kQoHmQ651IAMfXbSbk,3968
3
3
  dara/components/common/accordion.py,sha256=dDOTktGpy4lp16OfXWBK8Gr2gD6Njdipke7Ycqk6Hho,9584
4
4
  dara/components/common/anchor.py,sha256=pcQNFG7xnf12jQnGROgyLlvwmvlsVGo8olxQVu3fXMI,2791
5
- dara/components/common/base_component.py,sha256=4AVH2CSeI8zzraji4C1edEtcLAb5cHfMfYpzZEoxnnk,4645
5
+ dara/components/common/base_component.py,sha256=rUFmLbe8DHL8S_ey5h93zuIP62cK26zknWwUF5eqp9I,4619
6
6
  dara/components/common/bullet_list.py,sha256=yk4lFAn6Bzx9UByp27P7ioVidAfsTPl5d4hIkG7MRkQ,1433
7
- dara/components/common/button.py,sha256=Fw60s3zNfT_V2OQtrJT1Nx7n-Miuqe0Q_E7VaN6oEVI,4716
7
+ dara/components/common/button.py,sha256=Qe1gy5aCfZRrk6GzRSPfPsoT9BbB3-HliksK8vv6yo0,4747
8
8
  dara/components/common/button_bar.py,sha256=pQhcNusM5tlYZVDOTxPqyX5__XUZb7qtNBNHmaIGdlI,3842
9
9
  dara/components/common/card.py,sha256=ojH4eoej7ZhhmqWv0CZtSeh5IhU94eakoMdPoIB5IoA,2105
10
10
  dara/components/common/carousel.py,sha256=ef0Dyqmwg1C4nPCvqb5P2jksAp8a7_492YvLl8duApg,5386
@@ -12,17 +12,17 @@ dara/components/common/checkbox_group.py,sha256=7FrAKMfR5FM7HkeexO16q3aL3RlBEIHt
12
12
  dara/components/common/code.py,sha256=SwdZMU-vKvGNfOZPxFSkeHxsMLNkI5Oh1XTA2J0ItGw,2326
13
13
  dara/components/common/component_select_list.py,sha256=1Qf1odxsG7r1x_DURbtOjIHLoHi40LL4xH8pYpzQevw,2652
14
14
  dara/components/common/datepicker.py,sha256=YGPm_EOrYb6ofWHgya0-DkYRWiD2V1Ln2l7N-ZNgyzM,3683
15
- dara/components/common/dropzone.py,sha256=RjjOrMuFyDpfigYhC9TOuYQefVg8eTr-YZSOWwpVrFw,4201
15
+ dara/components/common/dropzone.py,sha256=t2iceH3eun7JzQ9rtoU-L4qi1-NbZ6CO4X23c8aVlnk,4202
16
16
  dara/components/common/form.py,sha256=Cczl5BlOIlLPvHvS_g98RxBvJx9jH17HaCo4DhAEvc8,3882
17
17
  dara/components/common/form_page.py,sha256=6O5JvkxDeEWzzoIhB9xMvSLIiIWsBJvcaT5RSOAKIB0,1890
18
18
  dara/components/common/grid.py,sha256=2x-yDCze8BgGI4FRp6HX5WR7ytK2KWKckBs8W7VhjrM,10243
19
- dara/components/common/heading.py,sha256=kAFmP1JIRkim793kQ3HjQfAKVXlQtk-ldzGSVv-diog,2375
19
+ dara/components/common/heading.py,sha256=U0x9SDd-sg0bS0wVpe7dBI-qScnxQuxqyX-WaBE6PAY,2525
20
20
  dara/components/common/html_raw.py,sha256=-Atn6TejBCDkNQIa89KBOB2h2ntnjolU3HphPuFE6t4,1103
21
21
  dara/components/common/icon.py,sha256=RRKrq63Lp4eADKM4Axl4MpTwjwUTUdfluX3-gULMDkw,1948
22
- dara/components/common/if_cmp.py,sha256=DHJNeaMYnI-ZXNaqg5Gt6mUaLgLKR5dPh4wNPmkI0is,3914
22
+ dara/components/common/if_cmp.py,sha256=--N3rTOyuDgmtL82Y6-WFbEaYXBCiUR7sGHxu0uZGfs,3939
23
23
  dara/components/common/image.py,sha256=ErDZ4Fv0_OzjbuqhNDDL_Nz1Q9Dq4wM7Q5aYJslCghY,2272
24
24
  dara/components/common/input.py,sha256=kfa3RIMmpzcmZuDgRQySGXzdr7LHm-aQfLHLHPFYKCU,2057
25
- dara/components/common/label.py,sha256=lzxc1bbktYwSY_mJXWy58JfWwUZFuQKmlnccZoPCgXY,2529
25
+ dara/components/common/label.py,sha256=1r58lBZVEudLybaEY-GQ4TNVtQrEyy_rzJhDQva29Pc,2528
26
26
  dara/components/common/markdown.py,sha256=4-M_lyj820gzxRisVTA7cCG-91NzWPW2vZbC7qwRmkQ,1706
27
27
  dara/components/common/modal.py,sha256=x47WgB-n2Zq-C_0UhewL4KaAkTnQDT8TW2bSRm6gN2U,1526
28
28
  dara/components/common/overlay.py,sha256=TNf4a77f0FxiOC4sj4HPM8tjLp0r046EDS-jVAtgEFw,1836
@@ -30,37 +30,37 @@ dara/components/common/paragraph.py,sha256=nOw-ocgjVwPj_QP8CmSHs2y3ghStTmOPGlqWx
30
30
  dara/components/common/progress_bar.py,sha256=5hkf63t4__KaN85AlbYrzKQpBzRlvjZ3VmGXRFWQRBY,1921
31
31
  dara/components/common/radio_group.py,sha256=xePEflS_A2svCrpU25OBMMsyeC4nZCn_1y83GJT5Sfc,3761
32
32
  dara/components/common/select.py,sha256=wgRt3TjTi53X2HqlGlsf-yMuvU7aD9r5BcNHddieDr8,6823
33
- dara/components/common/slider.py,sha256=JKgulZ8_RB6Aby-MEhPdQc3Q-qXPU_EH_CgM-2KMQEI,6568
33
+ dara/components/common/slider.py,sha256=VMneJKQMr02dn2Z-_aud2-NcPDxAv9VWLUgdgwr09m4,6527
34
34
  dara/components/common/spacer.py,sha256=ZRSl_fLntnumalaL41FYpBKDxOUgWgndkkLdDLl8KvI,2702
35
- dara/components/common/stack.py,sha256=SyVuWKVg3of4J4ANaHiG6Y7n7Vo8Cciab_F7mM5WepA,5549
35
+ dara/components/common/stack.py,sha256=FLw0IbQpW7l9A6LDS_KPCeQP0J7QKGYhVZ1RhAjBjpE,5562
36
36
  dara/components/common/switch.py,sha256=KjFUFT-1XHyJoJYkJLeEBgUb0fTArsFuWfowniTgl3E,1594
37
37
  dara/components/common/tabbed_card.py,sha256=zftir9hSj_l_dx2dPYis0NWy5q290sdg3Q1Nx8RvFbg,2344
38
- dara/components/common/table.py,sha256=XJh_j4pjwaPHVoSVSn0b1zvvgcWzS6420yj4043YAnA,24640
39
- dara/components/common/text.py,sha256=i7q7YKyL8opz02RLT5zx8_ep47QCqyCZeyuLH_AftEQ,1916
38
+ dara/components/common/table.py,sha256=P-qXaoFHMM69FiMH9T2Yeg0y0ZTx-89_JGj1Ls2_KbQ,24571
39
+ dara/components/common/text.py,sha256=bYgX_IhSLPa-KuWbcCSdrNgAL6MhYQRpCNtV5octUbQ,1990
40
40
  dara/components/common/textarea.py,sha256=F8dmyinylAjjXMhNwfiWInrCFuAnWuCPTsKKiEUkmOw,2106
41
- dara/components/common/time_utils.py,sha256=joJgnYNEX8LxDr-FLd4NMQ8zM-syLMeL-KblL_LZT2o,1826
42
- dara/components/common/tooltip.py,sha256=L09quPT8Vg5YkXE06NVw1pwFprtFafQu6tFp63lmRfE,3283
43
- dara/components/common/utils.py,sha256=viO_hqMK9hx-8N7GZS-pcCv-fAcfBs5c8ZQaXnHLIIE,5489
44
- dara/components/graphs/__init__.py,sha256=diE6xO4VKrzuNi_kjAHmpRpq209BJ0ATjgWMPbmesHY,725
41
+ dara/components/common/time_utils.py,sha256=UbAws5HBptJ-xH-m4QRDDET-9leOQu9WdywmExBuqIc,1746
42
+ dara/components/common/tooltip.py,sha256=asAuario9NHdK_Whry9A2nzy9vZDf4UFwOTG6XIfA50,3284
43
+ dara/components/common/utils.py,sha256=grhO9Mw2y0F57cRg-rTIlMGYAaVmPtfJNXJjBYSj924,5512
44
+ dara/components/graphs/__init__.py,sha256=xN6ibodsLvO_ATXASRgwfzCLraoWqdKuaGovWRaGxtk,750
45
45
  dara/components/graphs/components/__init__.py,sha256=GdWwL5spSsATOU57EmMqOf6t7az1rP5S3Djd0eyL9As,1007
46
- dara/components/graphs/components/base_graph_component.py,sha256=mSD1b2wwj4PUg1fNzlIsJmnjfvVSejPCOLwnkzoCfpM,4430
47
- dara/components/graphs/components/causal_graph_viewer.py,sha256=F482u5GlTObSmQ0WPT_CMm49XmL_O8fZGDSVrTM5CIM,12439
48
- dara/components/graphs/components/edge_encoder.py,sha256=mLOJylm07DtSWQWA4wwC2M_6z-otcQEAEUBPqn6guX0,6929
46
+ dara/components/graphs/components/base_graph_component.py,sha256=-joDvAQ0Ybvj6fiDevGlGNysMlbKpOJlHLbX7iWDbFs,4430
47
+ dara/components/graphs/components/causal_graph_viewer.py,sha256=oQpvW_Vb9xE-gAF7JFOpPU_4kukXSPcZZ7BBLqX3y0Y,12439
48
+ dara/components/graphs/components/edge_encoder.py,sha256=kS5gl7FDy7HAn0pclFGqRifjmr2uUDMaBq-kxy86kYM,6929
49
49
  dara/components/graphs/components/node_hierarchy_builder.py,sha256=OSA0OpEiTlnMDmte5bVq-o4l8iZoH_ADY9fuyHnLMZY,4366
50
- dara/components/graphs/definitions.py,sha256=_IPPPETDsDQXK4dZoQQX1bwcPtrUP55wCdSIubRpCYw,5319
50
+ dara/components/graphs/definitions.py,sha256=M46KV4VSNDnwAcfYoJnx71B_EZIuDAIRG2_mD9LtwOA,5316
51
51
  dara/components/graphs/graph_layout.py,sha256=Qb3zdcpolDQi_hFHAc2wGELUCvyeVfOqTOiVK-8uvW8,13852
52
- dara/components/plotting/__init__.py,sha256=51gAEi68z5lsboABwuPwQ9EKx2OS4dbQIVeopWS57FA,805
52
+ dara/components/plotting/__init__.py,sha256=u-wb5iAJBzDLEiXjaMuFy1rLAP_QzfnOvm1ZqMXsgac,797
53
53
  dara/components/plotting/bokeh/__init__.py,sha256=GpnbgTI-2XWqBDqLbkHQ73eAEth-h_k0nKqP1ixgJ8I,889
54
- dara/components/plotting/bokeh/bokeh.py,sha256=VH0lIt8oHHHZ8K9a8R3lKW2ErbJ3QjUVZwE5pzc0Oyw,3108
54
+ dara/components/plotting/bokeh/bokeh.py,sha256=jNfXkorF3SNJx40RA1MGpJ2Kypx8SEPV6wpF5NDjGP8,3107
55
55
  dara/components/plotting/bokeh/themes.py,sha256=ulL5GfyJ5WXCErMfraBgskyu7GJf-zZxw9WQQDlmsrE,3746
56
- dara/components/plotting/bokeh/utils.py,sha256=HBoybSntm2QNKXCdYS0yDODV3HkHqNvORS1xSm1pT4M,1929
56
+ dara/components/plotting/bokeh/utils.py,sha256=eQ4l3LYY8c2SlbkT6PUbUrjWoj_xwa3iq7O4bIPbEpI,2035
57
57
  dara/components/plotting/matplotlib/__init__.py,sha256=XNvSBKg8ML2IhMm9fJ5-OOHAIX3sGs_q10MaaK2v0EI,681
58
58
  dara/components/plotting/matplotlib/matplotlib.py,sha256=VUeOJZ6bTVrsJezmGqUJdezi6Vp53voB9BBWAGfTtrQ,1851
59
59
  dara/components/plotting/palettes.py,sha256=dAFOLzDsb5Cq-ffhegLsElaJueGzCJ7Px6J7frMe_YY,8001
60
60
  dara/components/plotting/plotly/__init__.py,sha256=vbFmz0BhPw6LktZxtVc4iv5eXRlc-5OqhBKOleUVaBw,835
61
- dara/components/plotting/plotly/plotly.py,sha256=3Id3Xjam4Rpgqzua9AbMaL7DxN-RtcKg1ms0llWriWs,4834
62
- dara/components/plotting/plotly/themes.py,sha256=FLQleyYp-IB3OpumE37N7WP5XO3LFPv3UsWpRnu9CCU,4413
63
- dara/components/smart/__init__.py,sha256=u4MR-88PkcVcF34sjA3BtLTUlEhnjv-2VzMUWWtO5uU,1146
61
+ dara/components/plotting/plotly/plotly.py,sha256=q2xe2RmxDhtQZdmUgfFkIGYiSFj-eIzGFigDwukTHkw,4832
62
+ dara/components/plotting/plotly/themes.py,sha256=i7jpJOfhHVdyJAzTTcDoukUgZNPpH6atXrsZ8s3_dUw,4459
63
+ dara/components/smart/__init__.py,sha256=PzggApMAClCo62aexuZ60MXWJclYfeuXwyZUrYVHOeM,1171
64
64
  dara/components/smart/chat/__init__.py,sha256=1J6s1YYBuDYg7Vft5vhMzkGHp2vjqUWy3BZQB4Es6mM,796
65
65
  dara/components/smart/chat/chat.py,sha256=PecZyXzKTBrnIGGuJNyCdWVu--Ig68CFFIrkbaNciiE,3117
66
66
  dara/components/smart/chat/config.py,sha256=kXm_EkfE7mL-8sseZMGSqbXBTWwdIXozv37v-k-B8fg,590
@@ -68,19 +68,19 @@ dara/components/smart/chat/endpoints.py,sha256=knILdBHrb2zEtL2r6-3OumSPZKdQ_FJLk
68
68
  dara/components/smart/chat/types.py,sha256=hSV6Va-8gueYJpXxbQ2UQeFMP1RBKW4bUcNupXJkYss,1351
69
69
  dara/components/smart/code_editor/__init__.py,sha256=U568YcqDyS8lC2qzf_9TrB62er-UibnbT6IeAiDSaME,749
70
70
  dara/components/smart/code_editor/code_editor.py,sha256=TK8_k1ydWTnXPALujNsG5Eh_xrfWXWyYKq5MVquxpYQ,1281
71
- dara/components/smart/code_editor/util.py,sha256=sAZphgDHXI2Q2crr3qJg0lnLzY9OzuOzW_1e0EX8Rjs,4476
71
+ dara/components/smart/code_editor/util.py,sha256=0Qu5AJVcCzaMaPblsw6BqOopA8DeWn2YPDPOf9CKmDc,4528
72
72
  dara/components/smart/data_slicer/__init__.py,sha256=_lIrZEKjZXxGDxZJ9t5kfeahMB_VbeOJYZxus1TKOyQ,914
73
- dara/components/smart/data_slicer/data_slicer.py,sha256=Hl9nVRgg-2Z0O5uECxiioxT2RikIygDArQXF6XKMj8I,7490
74
- dara/components/smart/data_slicer/data_slicer_modal.py,sha256=t7NywA5DiFiUiUnuFQbTAAVm6PM7Qjd6LGzd9OWA0QE,4120
73
+ dara/components/smart/data_slicer/data_slicer.py,sha256=quLO0_VglaaT7p4VmK5-M-j2Q7mJcek2IrnwPSN7Fsw,7506
74
+ dara/components/smart/data_slicer/data_slicer_modal.py,sha256=Zr8bCVqT5xp9AQS7VBSWRTPGYIkAuOjMuSmQIOnimoo,4152
75
75
  dara/components/smart/data_slicer/extension/data_slicer_filter.py,sha256=JfTzJ1HqS9u1RdmkwBGvoDB6wPKYVMfPAXUlUmysK48,1651
76
76
  dara/components/smart/data_slicer/extension/filter_status_button.py,sha256=02CgqHEBgkZg1E9v9HGrnRYvEiMNhYpajyOwGuPNV1M,1345
77
- dara/components/smart/data_slicer/utils/core.py,sha256=6BrmG-iwQCuwUAKQ-y9zFKLeinnzhXIaUOB58UxCYbc,8656
77
+ dara/components/smart/data_slicer/utils/core.py,sha256=4M_HA8oBzAkHklHgmaJ-qiKA3if37hUe6dB5gse2j1E,8665
78
78
  dara/components/smart/data_slicer/utils/data_preview.py,sha256=OAphjMrm3F76XmJ09X7sZSeOeKqGJFwN5ooo3qcyrG4,1722
79
- dara/components/smart/data_slicer/utils/plotting.py,sha256=JYzdQLXdAD0A8k2W-764xUr7zN0Ri5nf3OQ2Nb_iuiY,3313
79
+ dara/components/smart/data_slicer/utils/plotting.py,sha256=TB00576kbA6y1eRuZBe09UAcZmluY4iJsKmYnXZ3hWQ,3389
80
80
  dara/components/smart/hierarchy.py,sha256=9-QzEtbvP-arejhjsgl4Y5o5KHHzg6H1IGmwrX63450,2905
81
81
  dara/components/umd/dara.components.umd.js,sha256=9jY7pRiap8EWKwkx1j--H-3QAagmTuEEqIPZSHXikQM,18325165
82
82
  dara/components/umd/style.css,sha256=Qm0_kcxXBDoXvvPTc7YCttkl1zMFifdcp-KufTunPNY,162729
83
- dara_components-1.17.6.dist-info/LICENSE,sha256=r9u1w2RvpLMV6YjuXHIKXRBKzia3fx_roPwboGcLqCc,10944
84
- dara_components-1.17.6.dist-info/METADATA,sha256=KGROQ3_u53ST7CVCNu9fQhllJWhma8ktNEWEjPIIvfg,2743
85
- dara_components-1.17.6.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
86
- dara_components-1.17.6.dist-info/RECORD,,
83
+ dara_components-1.18.1.dist-info/LICENSE,sha256=r9u1w2RvpLMV6YjuXHIKXRBKzia3fx_roPwboGcLqCc,10944
84
+ dara_components-1.18.1.dist-info/METADATA,sha256=9k8ZQgdWL8Y94tNglMhQXirLjyNCz0-KvnscgcZD-tc,2743
85
+ dara_components-1.18.1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
86
+ dara_components-1.18.1.dist-info/RECORD,,