maidr 1.9.0__py3-none-any.whl → 1.11.0__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.
@@ -0,0 +1,83 @@
1
+ """
2
+ Mixin for extracting format configuration from matplotlib axes.
3
+
4
+ This module provides a mixin class that can be used by plot classes
5
+ to extract axis formatting information for the MAIDR schema.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ from typing import Any, Dict, Optional
11
+
12
+ from matplotlib.axes import Axes
13
+
14
+ from maidr.util.format_config import extract_axis_format
15
+
16
+
17
+ class FormatExtractorMixin:
18
+ """
19
+ Mixin class for extracting format configuration from axes.
20
+
21
+ This mixin provides methods to detect and extract formatting
22
+ configurations from matplotlib axis formatters, which can then
23
+ be included in the MAIDR schema.
24
+
25
+ Examples
26
+ --------
27
+ >>> class MyPlot(MaidrPlot, FormatExtractorMixin):
28
+ ... def render(self):
29
+ ... schema = super().render()
30
+ ... format_config = self.extract_format(self.ax)
31
+ ... if format_config:
32
+ ... schema["format"] = format_config
33
+ ... return schema
34
+ """
35
+
36
+ @staticmethod
37
+ def extract_format(ax: Axes) -> Optional[Dict[str, Dict[str, Any]]]:
38
+ """
39
+ Extract format configuration from an axes object.
40
+
41
+ This method detects matplotlib formatters applied to the x and y axes
42
+ and converts them to MAIDR-compatible format configurations.
43
+
44
+ Parameters
45
+ ----------
46
+ ax : Axes
47
+ The matplotlib Axes object to extract formats from.
48
+
49
+ Returns
50
+ -------
51
+ Dict[str, Dict[str, Any]] or None
52
+ Dictionary with 'x' and/or 'y' keys containing format configurations,
53
+ or None if no formats could be detected.
54
+
55
+ Notes
56
+ -----
57
+ Supported formatter types:
58
+ - StrMethodFormatter: Detected by parsing format string
59
+ - PercentFormatter: Detected as percent type
60
+ - ScalarFormatter: Detected for scientific notation
61
+ - FormatStrFormatter: Detected by parsing old-style format string
62
+
63
+ Format detection examples:
64
+ - "${x:,.2f}" -> {"type": "currency", "currency": "USD", "decimals": 2}
65
+ - "{x:.1%}" -> {"type": "percent", "decimals": 1}
66
+ - "{x:.2e}" -> {"type": "scientific", "decimals": 2}
67
+
68
+ Examples
69
+ --------
70
+ >>> from matplotlib import pyplot as plt
71
+ >>> fig, ax = plt.subplots()
72
+ >>> ax.yaxis.set_major_formatter('${x:,.2f}')
73
+ >>> format_config = FormatExtractorMixin.extract_format(ax)
74
+ >>> format_config
75
+ {'y': {'type': 'currency', 'decimals': 2, 'currency': 'USD'}}
76
+ """
77
+ if ax is None:
78
+ return None
79
+
80
+ format_config = extract_axis_format(ax)
81
+
82
+ # Return None if no formats were detected
83
+ return format_config if format_config else None
@@ -2,11 +2,10 @@
2
2
  Utility functions for handling mplfinance-specific data extraction and processing.
3
3
  """
4
4
 
5
+ import re
5
6
  import matplotlib.dates as mdates
6
- import numpy as np
7
7
  from matplotlib.patches import Rectangle
8
- from typing import List, Optional, Tuple, Any, Union
9
- import pandas as pd
8
+ from typing import List, Optional
10
9
 
11
10
 
12
11
  class MplfinanceDataExtractor:
@@ -58,229 +57,6 @@ class MplfinanceDataExtractor:
58
57
 
59
58
  return formatted_data
60
59
 
61
- @staticmethod
62
- def extract_candlestick_data(
63
- body_collection: Any,
64
- wick_collection: Any,
65
- date_nums: Optional[List[float]] = None,
66
- original_data: Optional[Union[pd.DataFrame, pd.Series, dict]] = None,
67
- ) -> List[dict]:
68
- """
69
- Extract candlestick data from mplfinance collections.
70
-
71
- Parameters
72
- ----------
73
- body_collection : Any
74
- PolyCollection containing candlestick bodies
75
- wick_collection : Any
76
- LineCollection containing candlestick wicks
77
- date_nums : Optional[List[float]], default=None
78
- List of matplotlib date numbers corresponding to the candles
79
- original_data : Optional[Union[pd.DataFrame, pd.Series, dict]], default=None
80
- Original DataFrame/Series/dict with OHLC data for accurate bull/bear classification
81
-
82
- Returns
83
- -------
84
- List[dict]
85
- List of dictionaries with OHLC data
86
- """
87
- if not body_collection or not hasattr(body_collection, "get_paths"):
88
- return []
89
-
90
- candles = []
91
- paths = body_collection.get_paths()
92
-
93
- for i, path in enumerate(paths):
94
- if len(path.vertices) >= 4:
95
- # Extract rectangle coordinates from the path
96
- vertices = path.vertices
97
- x_coords = vertices[:, 0]
98
- y_coords = vertices[:, 1]
99
-
100
- x_min, x_max = x_coords.min(), x_coords.max()
101
- y_min, y_max = y_coords.min(), y_coords.max()
102
-
103
- # Use date mapping if available
104
- if date_nums is not None and i < len(date_nums):
105
- date_num = date_nums[i]
106
- date_str = MplfinanceDataExtractor._convert_date_num_to_string(
107
- date_num
108
- )
109
- else:
110
- x_center = (x_min + x_max) / 2
111
- date_str = MplfinanceDataExtractor._convert_date_num_to_string(
112
- x_center
113
- )
114
-
115
- # Determine if this is an up or down candle using original data
116
- is_up = MplfinanceDataExtractor._determine_bull_bear_from_data(
117
- original_data, i, date_str
118
- )
119
-
120
- # Extract OHLC values
121
- (
122
- open_val,
123
- close_val,
124
- ) = MplfinanceDataExtractor._extract_ohlc_from_rectangle(
125
- y_min, y_max, is_up
126
- )
127
-
128
- # Estimate high and low (these would normally come from wick data)
129
- high_val = y_max + (y_max - y_min) * 0.1
130
- low_val = y_min - (y_max - y_min) * 0.1
131
-
132
- candle_data = {
133
- "value": date_str,
134
- "open": round(open_val, 2),
135
- "high": round(high_val, 2),
136
- "low": round(low_val, 2),
137
- "close": round(close_val, 2),
138
- "volume": 0, # Volume is handled separately
139
- }
140
-
141
- candles.append(candle_data)
142
-
143
- return candles
144
-
145
- @staticmethod
146
- def extract_rectangle_candlestick_data(
147
- body_rectangles: List[Rectangle],
148
- date_nums: Optional[List[float]] = None,
149
- original_data: Optional[Union[pd.DataFrame, pd.Series, dict]] = None,
150
- ) -> List[dict]:
151
- """
152
- Extract candlestick data from Rectangle patches (original_flavor).
153
-
154
- Parameters
155
- ----------
156
- body_rectangles : List[Rectangle]
157
- List of Rectangle patches representing candlestick bodies
158
- date_nums : Optional[List[float]], default=None
159
- List of matplotlib date numbers corresponding to the candles
160
- original_data : Optional[Union[pd.DataFrame, pd.Series, dict]], default=None
161
- Original DataFrame/Series/dict with OHLC data for accurate bull/bear classification
162
-
163
- Returns
164
- -------
165
- List[dict]
166
- List of dictionaries with OHLC data
167
- """
168
- if not body_rectangles:
169
- return []
170
-
171
- candles = []
172
-
173
- # Sort rectangles by x-coordinate
174
- body_rectangles.sort(key=lambda r: r.get_x())
175
-
176
- for i, rect in enumerate(body_rectangles):
177
- x_left = rect.get_x()
178
- width = rect.get_width()
179
- x_center_num = x_left + width / 2.0
180
-
181
- # Convert x coordinate to date
182
- if date_nums is not None and i < len(date_nums):
183
- date_str = MplfinanceDataExtractor._convert_date_num_to_string(
184
- date_nums[i]
185
- )
186
- else:
187
- date_str = MplfinanceDataExtractor._convert_date_num_to_string(
188
- x_center_num
189
- )
190
-
191
- y_bottom = rect.get_y()
192
- height = rect.get_height()
193
-
194
- # Determine if this is an up or down candle using original data
195
- is_up_candle = MplfinanceDataExtractor._determine_bull_bear_from_data(
196
- original_data, i, date_str
197
- )
198
-
199
- # Extract OHLC values from rectangle
200
- (
201
- open_price,
202
- close_price,
203
- ) = MplfinanceDataExtractor._extract_ohlc_from_rectangle(
204
- y_bottom, y_bottom + height, is_up_candle
205
- )
206
-
207
- # Estimate high and low
208
- high_price = max(open_price, close_price) + height * 0.1
209
- low_price = min(open_price, close_price) - height * 0.1
210
-
211
- # Ensure all values are valid numbers
212
- open_price = float(open_price) if not np.isnan(open_price) else 0.0
213
- high_price = float(high_price) if not np.isnan(high_price) else 0.0
214
- low_price = float(low_price) if not np.isnan(low_price) else 0.0
215
- close_price = float(close_price) if not np.isnan(close_price) else 0.0
216
-
217
- candle_data = {
218
- "value": date_str,
219
- "open": round(open_price, 2),
220
- "high": round(high_price, 2),
221
- "low": round(low_price, 2),
222
- "close": round(close_price, 2),
223
- "volume": 0,
224
- }
225
-
226
- candles.append(candle_data)
227
-
228
- return candles
229
-
230
- @staticmethod
231
- def _determine_bull_bear_from_data(
232
- original_data: Optional[Union[pd.DataFrame, pd.Series, dict]],
233
- index: int,
234
- date_str: str,
235
- ) -> bool:
236
- """
237
- Determine if a candle is bullish (up) or bearish (down) using original OHLC data.
238
-
239
- This is the most robust method as it uses the actual data rather than colors.
240
-
241
- Parameters
242
- ----------
243
- original_data : Optional[Union[pd.DataFrame, pd.Series, dict]]
244
- Original DataFrame/Series/dict with OHLC data
245
- index : int
246
- Index of the candle
247
- date_str : str
248
- Date string for the candle
249
-
250
- Returns
251
- -------
252
- bool
253
- True if bullish (close > open), False if bearish (close < open)
254
- """
255
- # Default to bullish if no data available
256
- if original_data is None:
257
- return True
258
-
259
- try:
260
- # Try to access the original data
261
- if hasattr(original_data, "iloc"):
262
- # It's a pandas DataFrame/Series
263
- if index < len(original_data):
264
- row = original_data.iloc[index]
265
- if "Close" in row and "Open" in row:
266
- is_bullish = row["Close"] > row["Open"]
267
- return is_bullish
268
-
269
- elif hasattr(original_data, "__getitem__"):
270
- # It's a dictionary or similar
271
- if "Close" in original_data and "Open" in original_data:
272
- closes = original_data["Close"]
273
- opens = original_data["Open"]
274
- if index < len(closes) and index < len(opens):
275
- is_bullish = closes[index] > opens[index]
276
- return is_bullish
277
-
278
- except (KeyError, IndexError, AttributeError):
279
- pass
280
-
281
- # Fallback to bullish if data access fails
282
- return True # Default to bullish
283
-
284
60
  @staticmethod
285
61
  def clean_axis_label(label: str) -> str:
286
62
  """
@@ -299,8 +75,6 @@ class MplfinanceDataExtractor:
299
75
  if not label or not isinstance(label, str):
300
76
  return label
301
77
 
302
- import re
303
-
304
78
  # Removes LaTeX-like scientific notation, e.g., "$10^{6}$"
305
79
  cleaned_label = re.sub(r"\s*\$.*?\$", "", label).strip()
306
80
  return cleaned_label if cleaned_label else label
@@ -318,7 +92,7 @@ class MplfinanceDataExtractor:
318
92
  Returns
319
93
  -------
320
94
  str
321
- Date string in YYYY-MM-DD format or fallback index
95
+ Date string representation (e.g., "2024-01-15 00:00:00") or fallback index
322
96
  """
323
97
  try:
324
98
  # Check if this looks like a matplotlib date number (typically > 700000)
@@ -326,14 +100,14 @@ class MplfinanceDataExtractor:
326
100
  date_dt = mdates.num2date(date_num)
327
101
  if hasattr(date_dt, "replace"):
328
102
  date_dt = date_dt.replace(tzinfo=None)
329
- return date_dt.strftime("%Y-%m-%d")
103
+ return str(date_dt)
330
104
  elif date_num > 1000:
331
105
  # Try converting as if it's a pandas timestamp
332
106
  try:
333
107
  import pandas as pd
334
108
 
335
109
  date_dt = pd.to_datetime(date_num, unit="D")
336
- return date_dt.strftime("%Y-%m-%d")
110
+ return str(date_dt)
337
111
  except (ValueError, TypeError):
338
112
  pass
339
113
  except (ValueError, TypeError, OverflowError):
@@ -341,75 +115,3 @@ class MplfinanceDataExtractor:
341
115
 
342
116
  # Fallback to index-based date string
343
117
  return f"date_{int(date_num):03d}"
344
-
345
- @staticmethod
346
- def convert_x_to_date(x_center_num: float, axes: Optional[List] = None) -> str:
347
- """
348
- Convert matplotlib x-coordinate to date string.
349
-
350
- Parameters
351
- ----------
352
- x_center_num : float
353
- X-coordinate value to convert
354
- axes : Optional[List], optional
355
- List of matplotlib axes to help with date conversion
356
-
357
- Returns
358
- -------
359
- str
360
- Date string in YYYY-MM-DD format or fallback
361
- """
362
- # First, try to get the actual dates from the axes x-axis data
363
- if axes and len(axes) > 0:
364
- ax = axes[0]
365
- try:
366
- # Get x-axis ticks which might contain the actual dates
367
- x_ticks = ax.get_xticks()
368
-
369
- # If we have x-axis ticks and they look like dates (large numbers), use them
370
- if len(x_ticks) > 0 and x_ticks[0] > 1000:
371
- # Find the closest tick to our x_center_num
372
- tick_index = int(round(x_center_num))
373
- if 0 <= tick_index < len(x_ticks):
374
- actual_date_num = x_ticks[tick_index]
375
-
376
- # Convert the actual date number
377
- if actual_date_num > 700000:
378
- date_dt = mdates.num2date(actual_date_num)
379
- if hasattr(date_dt, "replace"):
380
- date_dt = date_dt.replace(tzinfo=None)
381
- date_str = date_dt.strftime("%Y-%m-%d")
382
- return date_str
383
- except Exception:
384
- pass
385
-
386
- # Use the utility class for date conversion
387
- return MplfinanceDataExtractor._convert_date_num_to_string(x_center_num)
388
-
389
- @staticmethod
390
- def _extract_ohlc_from_rectangle(
391
- y_min: float, y_max: float, is_up: bool
392
- ) -> Tuple[float, float]:
393
- """
394
- Extract open and close values from rectangle bounds.
395
-
396
- Parameters
397
- ----------
398
- y_min : float
399
- Minimum y value of rectangle
400
- y_max : float
401
- Maximum y value of rectangle
402
- is_up : bool
403
- Whether this is an up candle
404
-
405
- Returns
406
- -------
407
- Tuple[float, float]
408
- (open_price, close_price)
409
- """
410
- if is_up:
411
- # Up candle: open at bottom, close at top
412
- return y_min, y_max
413
- else:
414
- # Down candle: open at top, close at bottom
415
- return y_max, y_min
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maidr
3
- Version: 1.9.0
3
+ Version: 1.11.0
4
4
  Summary: Multimodal Access and Interactive Data Representations
5
5
  Project-URL: Homepage, https://xability.github.io/py-maidr
6
6
  Project-URL: Repository, https://github.com/xability/py-maidr
@@ -1,4 +1,4 @@
1
- maidr/__init__.py,sha256=szUjuM4cnGyzipfrIxpyZV841yhHjMmIcP7yXHq7kq8,415
1
+ maidr/__init__.py,sha256=F_rKqEP7cG3G5_iKehrmY967FA1fiwdVXlibD7MotpM,416
2
2
  maidr/api.py,sha256=WK7jfQttuPeF1q45RuF_wTciYyiFY6SyjfZVSOVkiUs,4316
3
3
  maidr/core/__init__.py,sha256=WgxLpSEYMc4k3OyEOf1shOxfEq0ASzppEIZYmE91ThQ,25
4
4
  maidr/core/context_manager.py,sha256=6cT7ZGOApSpC-SLD2XZWWU_H08i-nfv-JUlzXOtvWYw,3374
@@ -6,21 +6,21 @@ maidr/core/figure_manager.py,sha256=t-lhe4jj2gsF5-8VUBUZOPlDutKjm_AZ8xXWJU2pFRc,
6
6
  maidr/core/maidr.py,sha256=Ye2C8tQPY1o8gfURiTyDPMWFoRT0toZOOCugKAz4uQU,22370
7
7
  maidr/core/enum/__init__.py,sha256=9ee78L0dlxEx4ulUGVlD-J23UcUZmrGu0rXms54up3c,93
8
8
  maidr/core/enum/library.py,sha256=e8ujT_L-McJWfoVJd1ty9K_2bwITnf1j0GPLsnAcHes,104
9
- maidr/core/enum/maidr_key.py,sha256=ljG0omqzd8K8Yk213N7i7PXGvG-IOlnE5v7o6RoGJzc,795
9
+ maidr/core/enum/maidr_key.py,sha256=qO8dsRuMqiGmBHygSLRcu-wvfhch_3nY0PUvFBZkLH4,817
10
10
  maidr/core/enum/plot_type.py,sha256=7Orx3b_0NdpI_PtVJfLyJPh4qBqYMTsYBBr8VwOtiAM,347
11
11
  maidr/core/enum/smooth_keywords.py,sha256=z2kVZZ-mETWWh5reWu_hj9WkJD6WFj7_2-6s1e4C1JE,236
12
12
  maidr/core/plot/__init__.py,sha256=xDIpRGM-4DfaSSL3nKcXrjdMecCHJ6en4K4nA_fPefQ,83
13
13
  maidr/core/plot/barplot.py,sha256=0hBgp__putezvxXc9G3qmaktmAzze3cN8pQMD9iqktE,2116
14
14
  maidr/core/plot/boxplot.py,sha256=i11GdNuz_c-hilmhydu3ah-bzyVdFoBkNvRi5lpMrrY,9946
15
- maidr/core/plot/candlestick.py,sha256=ofvlUwtzaaopvv6VjNDf1IZODbu1UkMHsi1zdvcG-Yo,10120
15
+ maidr/core/plot/candlestick.py,sha256=r_x3KVLNn6wFX7wYsRUFEp_rNTEjhbAkLk55kX2tIso,8170
16
16
  maidr/core/plot/grouped_barplot.py,sha256=odZ52Pl22nb9cWKD3NGsZsyFDxXdBDAEcbOj66HKp9I,4063
17
17
  maidr/core/plot/heatmap.py,sha256=yMS-31tS2GW4peds9LtZesMxmmTV_YfqYO5M_t5KasQ,2521
18
18
  maidr/core/plot/histogram.py,sha256=QV5W-6ZJQQcZsrM91JJBX-ONktJzH7yg_et5_bBPfQQ,1525
19
19
  maidr/core/plot/lineplot.py,sha256=uoJpGkJB3IJSDJTwH6ECxLyXGdarsVQNULELp5NncWg,4522
20
- maidr/core/plot/maidr_plot.py,sha256=heotWue1IzMOXnpoHVCqKSW88Sfep1IuuP4MBarpSek,4231
20
+ maidr/core/plot/maidr_plot.py,sha256=_Jt0ILyUaMP68kX35Fgd16FcsizUAy52Y54YfVm2bEs,4580
21
21
  maidr/core/plot/maidr_plot_factory.py,sha256=NW2iFScswgXbAC9rAOo4iMkAFsjY43DAvFioGr0yzx4,2732
22
- maidr/core/plot/mplfinance_barplot.py,sha256=zhTp2i6BH0xn7vQvGTotKgu2HbzlKT4p6zA5CVUUHHc,5673
23
- maidr/core/plot/mplfinance_lineplot.py,sha256=pIbsusnQg1_GrstVVHfMw-t9yipWJowa9ZvGsiVV6l8,7329
22
+ maidr/core/plot/mplfinance_barplot.py,sha256=WSr5OPK05SEDK1VCjMeCb2vNWJgMcz2c8TTbTZqow7U,5944
23
+ maidr/core/plot/mplfinance_lineplot.py,sha256=bE6NHuUYzym_yG7WvjMTIDKOiiqSe67KvCtYHjLhPJ8,7600
24
24
  maidr/core/plot/regplot.py,sha256=b7u6bGTz1IxKahplNUrfwIr_OGSwMJ2BuLgFAVjL0s0,2744
25
25
  maidr/core/plot/scatterplot.py,sha256=o0i0uS-wXK9ZrENxneoHbh3-u-2goRONp19Yu9QLsaY,1257
26
26
  maidr/exception/__init__.py,sha256=PzaXoYBhyZxMDcJkuxJugDx7jZeseI0El6LpxIwXyG4,46
@@ -40,19 +40,21 @@ maidr/patch/mplfinance.py,sha256=ySD32onanoMgdQkV6XlSAbVd_BQuLWuEQtpkYSEDSzA,949
40
40
  maidr/patch/regplot.py,sha256=k86ekd0E4XJ_L1u85zObuDnxuXlM83z7tKtyXRTj2rI,3240
41
41
  maidr/patch/scatterplot.py,sha256=kln6zZwjVsdQzICalo-RnBOJrx1BnIB2xYUwItHvSNY,525
42
42
  maidr/util/__init__.py,sha256=eRJZfRpDX-n7UoV3JXw_9Lbfu_qNl_D0W1UTvLL-Iv4,81
43
- maidr/util/datetime_conversion.py,sha256=AQ8qShbEkLVo13TUkOOmtOLnOvaI05Vh5oWhgchvXSA,14478
43
+ maidr/util/datetime_conversion.py,sha256=7L8gYw3Fb7oL1swiMRpXgFO06U473vbnJ81Bexnyb2o,14043
44
44
  maidr/util/dedup_utils.py,sha256=RpgPL5p-3oULUHaTCZJaQKhPHfyPkvBLHMt8lAGpJ5A,438
45
45
  maidr/util/environment.py,sha256=C4VMyB16mqzrFxpJdxFdm40M0IZojxh60UX80680jgo,9403
46
- maidr/util/mplfinance_utils.py,sha256=OZe5Y7gzjdjve9DViioQvGZYTdZvz8obvN3oHElQFZw,14418
46
+ maidr/util/format_config.py,sha256=mU4BEZJ05FFYTk8mbDQrjADLn486Blb7_eKZQZORvYA,23438
47
+ maidr/util/mplfinance_utils.py,sha256=00YEjrCUbigZZL1j9jzOTamNnwfy5ZZmXJj65AhgNbw,3662
47
48
  maidr/util/plot_detection.py,sha256=bgLHoDcHSRwOiyKzUK3EqGwdAIhF44ocHW5ox6xYGZw,3883
48
49
  maidr/util/regression_line_utils.py,sha256=yFKr-H0whT_su2YVZwNksBLp5EC5s77sr6HUFgNcsyY,2329
49
50
  maidr/util/svg_utils.py,sha256=2gyzBtNKFHs0utrw1iOlxTmznzivOWQMV2aW8zu2c8E,1442
50
- maidr/util/mixin/__init__.py,sha256=aGJZNhtWh77yIVPc7ipIZm1OajigjMtCWYKPuDWTC-c,217
51
+ maidr/util/mixin/__init__.py,sha256=f_70pOT9tAUm8KXjoU2TJcTNXCTlDBsfPsDuxV101j4,492
51
52
  maidr/util/mixin/extractor_mixin.py,sha256=j2Rv2vh_gqqcxLV1ka3xsPaPAfWsX94CtKIW2FgPLnI,6937
53
+ maidr/util/mixin/format_extractor_mixin.py,sha256=jBmZ8JflDOC3Co-tKC2yka0viZawyI-zKNZijQPU8_Y,2726
52
54
  maidr/util/mixin/merger_mixin.py,sha256=V0qLw_6DUB7X6CQ3BCMpsCQX_ZuwAhoSTm_E4xAJFKM,712
53
55
  maidr/widget/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
56
  maidr/widget/shiny.py,sha256=wrrw2KAIpE_A6CNQGBtNHauR1DjenA_n47qlFXX9_rk,745
55
- maidr-1.9.0.dist-info/METADATA,sha256=EK0mJx_hRNjiVvAnGcph7sBceEbiQrgvioGFPcw8-EY,3154
56
- maidr-1.9.0.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
57
- maidr-1.9.0.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
58
- maidr-1.9.0.dist-info/RECORD,,
57
+ maidr-1.11.0.dist-info/METADATA,sha256=kriH4WLxxakBNSpLxHNk_nvPdqMXbw4JuK8aejvP9-4,3155
58
+ maidr-1.11.0.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
59
+ maidr-1.11.0.dist-info/licenses/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
60
+ maidr-1.11.0.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.27.0
2
+ Generator: hatchling 1.28.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any