maidr 1.4.0__py3-none-any.whl → 1.4.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.
maidr/__init__.py CHANGED
@@ -1,4 +1,4 @@
1
- __version__ = "1.4.0"
1
+ __version__ = "1.4.1"
2
2
 
3
3
  from .api import close, render, save_html, show, stacked
4
4
  from .core import Maidr
maidr/core/maidr.py CHANGED
@@ -1,6 +1,9 @@
1
1
  from __future__ import annotations
2
2
 
3
3
  from datetime import datetime
4
+ import urllib.request
5
+ import urllib.error
6
+ import json
4
7
 
5
8
  import io
6
9
  import json
@@ -22,6 +25,11 @@ from maidr.core.plot import MaidrPlot
22
25
  from maidr.util.environment import Environment
23
26
  from maidr.util.dedup_utils import deduplicate_smooth_and_line
24
27
 
28
+ # Module-level cache for version to avoid repeated API calls
29
+ _MAIDR_VERSION_CACHE: str | None = None
30
+ _MAIDR_VERSION_CACHE_TIME: float = 0.0
31
+ _MAIDR_CACHE_DURATION = 3600 # Cache for 1 hour
32
+
25
33
 
26
34
  class Maidr:
27
35
  """
@@ -34,6 +42,8 @@ class Maidr:
34
42
  The matplotlib figure associated with this instance.
35
43
  _plots : list[MaidrPlot]
36
44
  A list of MaidrPlot objects which hold additional plot-specific configurations.
45
+ _cached_version : str | None
46
+ Cached version of maidr from npm registry to avoid repeated API calls.
37
47
 
38
48
  Methods
39
49
  -------
@@ -271,20 +281,77 @@ class Maidr:
271
281
  """Generate a unique identifier string using UUID4."""
272
282
  return str(uuid.uuid4())
273
283
 
284
+ @staticmethod
285
+ def _get_latest_maidr_version() -> str:
286
+ """
287
+ Query the npm registry API to get the latest version of maidr with caching.
288
+
289
+ Returns
290
+ -------
291
+ str
292
+ The latest version of maidr from npm registry, or 'latest' as fallback.
293
+ """
294
+ import time
295
+
296
+ global _MAIDR_VERSION_CACHE, _MAIDR_VERSION_CACHE_TIME
297
+
298
+ # Check if version fetching is disabled via environment variable
299
+ if os.getenv("MAIDR_DISABLE_VERSION_FETCH", "").lower() in ("true", "1", "yes"):
300
+ return "latest"
301
+
302
+ current_time = time.time()
303
+
304
+ # Check if we have a valid cached version
305
+ if (
306
+ _MAIDR_VERSION_CACHE is not None
307
+ and current_time - _MAIDR_VERSION_CACHE_TIME < _MAIDR_CACHE_DURATION
308
+ ):
309
+ return _MAIDR_VERSION_CACHE
310
+
311
+ try:
312
+ # Query npm registry API for maidr package
313
+ with urllib.request.urlopen(
314
+ "https://registry.npmjs.org/maidr/latest", timeout=5 # 5 second timeout
315
+ ) as response:
316
+ if response.status == 200:
317
+ data = json.loads(response.read().decode("utf-8"))
318
+ version = data.get("version", "latest")
319
+
320
+ # Cache the successful result
321
+ _MAIDR_VERSION_CACHE = version
322
+ _MAIDR_VERSION_CACHE_TIME = current_time
323
+
324
+ return version
325
+
326
+ except Exception:
327
+ # Any error - just use latest
328
+ pass
329
+
330
+ # Fallback to 'latest' if API call fails
331
+ return "latest"
332
+
333
+ @staticmethod
334
+ def clear_version_cache() -> None:
335
+ """Clear the cached version to force a fresh API call on next request."""
336
+ global _MAIDR_VERSION_CACHE, _MAIDR_VERSION_CACHE_TIME
337
+ _MAIDR_VERSION_CACHE = None
338
+ _MAIDR_VERSION_CACHE_TIME = 0.0
339
+
274
340
  @staticmethod
275
341
  def _inject_plot(plot: HTML, maidr: str, maidr_id, use_iframe: bool = True) -> Tag:
276
342
  """Embed the plot and associated MAIDR scripts into the HTML structure."""
277
- # MAIDR_TS_CDN_URL = "http://localhost:8888/tree/maidr/core/maidr.js" # DEMO URL
278
- MAIDR_TS_CDN_URL = "https://cdn.jsdelivr.net/npm/maidr@latest/dist/maidr.js"
279
- # Append a query parameter (using TIMESTAMP) to bust the cache (so that the latest (non-cached) version is always loaded).
280
- TIMESTAMP = datetime.now().strftime("%Y%m%d%H%M%S")
343
+ # Get the latest version from npm registry
344
+ latest_version = Maidr._get_latest_maidr_version()
345
+ MAIDR_TS_CDN_URL = (
346
+ f"https://cdn.jsdelivr.net/npm/maidr@{latest_version}/dist/maidr.js"
347
+ )
281
348
 
282
349
  script = f"""
283
- if (!document.querySelector('script[src="{MAIDR_TS_CDN_URL}?v={TIMESTAMP}"]'))
350
+ if (!document.querySelector('script[src="{MAIDR_TS_CDN_URL}"]'))
284
351
  {{
285
352
  var script = document.createElement('script');
286
353
  script.type = 'module';
287
- script.src = '{MAIDR_TS_CDN_URL}?v={TIMESTAMP}';
354
+ script.src = '{MAIDR_TS_CDN_URL}';
288
355
  script.addEventListener('load', function() {{
289
356
  window.main();
290
357
  }});
@@ -299,7 +366,7 @@ class Maidr:
299
366
  base_html = tags.div(
300
367
  tags.link(
301
368
  rel="stylesheet",
302
- href="https://cdn.jsdelivr.net/npm/maidr/dist/maidr_style.css",
369
+ href=f"https://cdn.jsdelivr.net/npm/maidr@{latest_version}/dist/maidr_style.css",
303
370
  ),
304
371
  tags.script(script, type="text/javascript"),
305
372
  tags.div(plot),
@@ -1,15 +1,24 @@
1
+ from __future__ import annotations
2
+
1
3
  import matplotlib.dates as mdates
2
4
  import numpy as np
3
5
  from matplotlib.axes import Axes
4
6
  from matplotlib.patches import Rectangle
5
7
 
6
- from maidr.core.enum.plot_type import PlotType
7
- from maidr.core.plot.maidr_plot import MaidrPlot
8
+ from maidr.core.enum import PlotType
9
+ from maidr.core.plot import MaidrPlot
8
10
  from maidr.core.enum.maidr_key import MaidrKey
9
11
  from maidr.util.mplfinance_utils import MplfinanceDataExtractor
10
12
 
11
13
 
12
14
  class CandlestickPlot(MaidrPlot):
15
+ """
16
+ Specialized candlestick plot class for mplfinance OHLC data.
17
+
18
+ This class handles the extraction and processing of candlestick data from mplfinance
19
+ plots, including proper date conversion and data validation.
20
+ """
21
+
13
22
  def __init__(self, axes: list[Axes], **kwargs) -> None:
14
23
  """
15
24
  Initialize the CandlestickPlot.
@@ -93,7 +102,20 @@ class CandlestickPlot(MaidrPlot):
93
102
  return []
94
103
 
95
104
  def _extract_axes_data(self) -> dict:
96
- return {}
105
+ """
106
+ Extract the plot's axes data including labels.
107
+
108
+ Returns
109
+ -------
110
+ dict
111
+ Dictionary containing x and y axis labels.
112
+ """
113
+ x_labels = self.ax.get_xlabel()
114
+ if not x_labels:
115
+ x_labels = self.extract_shared_xlabel(self.ax)
116
+ if not x_labels:
117
+ x_labels = "X"
118
+ return {MaidrKey.X: x_labels, MaidrKey.Y: self.ax.get_ylabel()}
97
119
 
98
120
  def _get_selector(self) -> str:
99
121
  """Return the CSS selector for highlighting candlestick elements in the SVG output."""
@@ -109,9 +131,11 @@ class CandlestickPlot(MaidrPlot):
109
131
 
110
132
  def render(self) -> dict:
111
133
  """Initialize the MAIDR schema dictionary with basic plot information."""
134
+ title = "Candlestick Chart"
135
+
112
136
  maidr_schema = {
113
137
  MaidrKey.TYPE: self.type,
114
- MaidrKey.TITLE: self.ax.get_title(),
138
+ MaidrKey.TITLE: title,
115
139
  MaidrKey.AXES: self._extract_axes_data(),
116
140
  MaidrKey.DATA: self._extract_plot_data(),
117
141
  }
@@ -30,6 +30,11 @@ class MplfinanceBarPlot(
30
30
  self._custom_patches = kwargs.get("_maidr_patches", None)
31
31
  # Store date numbers for volume bars (from mplfinance)
32
32
  self._maidr_date_nums = kwargs.get("_maidr_date_nums", None)
33
+ # Store custom title
34
+
35
+ def set_title(self, title: str) -> None:
36
+ """Set a custom title for this volume bar plot."""
37
+ self._title = title
33
38
 
34
39
  def _extract_plot_data(self) -> list:
35
40
  """Extract data from mplfinance volume patches."""
@@ -113,3 +118,22 @@ class MplfinanceBarPlot(
113
118
  # Use the standard working selector that gets replaced with UUID by Maidr class
114
119
  # This works for both original bar plots and mplfinance volume bars
115
120
  return "g[maidr='true'] > path"
121
+
122
+ def render(self) -> dict:
123
+ """Initialize the MAIDR schema dictionary with basic plot information."""
124
+ from maidr.core.enum.maidr_key import MaidrKey
125
+
126
+ title = "Volume Bar Plot"
127
+
128
+ maidr_schema = {
129
+ MaidrKey.TYPE: self.type,
130
+ MaidrKey.TITLE: title,
131
+ MaidrKey.AXES: self._extract_axes_data(),
132
+ MaidrKey.DATA: self._extract_plot_data(),
133
+ }
134
+
135
+ # Include selector only if the plot supports highlighting.
136
+ if self._support_highlighting:
137
+ maidr_schema[MaidrKey.SELECTOR] = self._get_selector()
138
+
139
+ return maidr_schema
@@ -23,6 +23,7 @@ class MplfinanceLinePlot(MaidrPlot, LineExtractorMixin):
23
23
 
24
24
  def __init__(self, ax: Axes, **kwargs):
25
25
  super().__init__(ax, PlotType.LINE)
26
+ self._line_titles = [] # Store line titles separately
26
27
 
27
28
  def _get_selector(self) -> Union[str, List[str]]:
28
29
  """Return selectors for all lines that have data."""
@@ -47,6 +48,65 @@ class MplfinanceLinePlot(MaidrPlot, LineExtractorMixin):
47
48
 
48
49
  return selectors
49
50
 
51
+ def _extract_axes_data(self) -> dict:
52
+ """
53
+ Extract axis labels for the plot.
54
+
55
+ Returns
56
+ -------
57
+ dict
58
+ Dictionary containing x and y axis labels with custom y-label for moving averages.
59
+ """
60
+ x_labels = self.ax.get_xlabel()
61
+ if not x_labels:
62
+ x_labels = self.extract_shared_xlabel(self.ax)
63
+ if not x_labels:
64
+ x_labels = "Date"
65
+
66
+ # Get the period from the first line for y-axis label
67
+ ma_period = self._extract_moving_average_period()
68
+ y_label = (
69
+ f"{ma_period}-day mav price ($)"
70
+ if ma_period
71
+ else "Moving Average Price ($)"
72
+ )
73
+
74
+ return {MaidrKey.X: x_labels, MaidrKey.Y: y_label}
75
+
76
+ def _extract_moving_average_periods(self) -> List[str]:
77
+ """
78
+ Extract all moving average periods from the _maidr_ma_period attributes set by the mplfinance patch.
79
+
80
+ Returns
81
+ -------
82
+ List[str]
83
+ List of moving average periods (e.g., ["3", "6", "30"]).
84
+ """
85
+ all_lines = self.ax.get_lines()
86
+ periods = []
87
+ for line in all_lines:
88
+ # Get the period that was stored by the mplfinance patch
89
+ ma_period = getattr(line, "_maidr_ma_period", None)
90
+ if ma_period is not None:
91
+ periods.append(str(ma_period))
92
+
93
+ # Remove duplicates and sort
94
+ periods = sorted(list(set(periods)))
95
+
96
+ return periods
97
+
98
+ def _extract_moving_average_period(self) -> str:
99
+ """
100
+ Extract the moving average period from the _maidr_ma_period attribute set by the mplfinance patch.
101
+
102
+ Returns
103
+ -------
104
+ str
105
+ The moving average period (e.g., "3", "6", "30") or empty string if no period found.
106
+ """
107
+ periods = self._extract_moving_average_periods()
108
+ return periods[0] if periods else ""
109
+
50
110
  def _extract_plot_data(self) -> Union[List[List[dict]], None]:
51
111
  """Extract data from mplfinance moving average lines."""
52
112
  data = self._extract_line_data()
@@ -91,6 +151,17 @@ class MplfinanceLinePlot(MaidrPlot, LineExtractorMixin):
91
151
  line.set_gid(unique_gid)
92
152
 
93
153
  label: str = line.get_label() # type: ignore
154
+
155
+ # Get the period for this specific line
156
+ ma_period = getattr(line, "_maidr_ma_period", None)
157
+
158
+ # Create title for this line
159
+ line_title = (
160
+ f"{ma_period}-Day Moving Average Line Plot"
161
+ if ma_period
162
+ else "Moving Average Line Plot"
163
+ )
164
+
94
165
  line_data = []
95
166
 
96
167
  # Check if this line has date numbers from mplfinance
@@ -117,12 +188,22 @@ class MplfinanceLinePlot(MaidrPlot, LineExtractorMixin):
117
188
  point_data = {
118
189
  MaidrKey.X: x_value,
119
190
  MaidrKey.Y: float(y),
120
- MaidrKey.FILL: (label if not label.startswith("_child") else ""),
121
191
  }
122
192
  line_data.append(point_data)
123
193
 
124
194
  if line_data:
125
- all_lines_data.append(line_data)
195
+ # Create line data with title, axes, and points structure
196
+ line_with_metadata = {
197
+ "title": line_title,
198
+ "axes": {
199
+ "x": "Date",
200
+ "y": f"{ma_period}-day mav price ($)"
201
+ if ma_period
202
+ else "Moving Average Price ($)",
203
+ },
204
+ "points": line_data,
205
+ }
206
+ all_lines_data.append(line_with_metadata)
126
207
 
127
208
  return all_lines_data if all_lines_data else None
128
209
 
@@ -144,3 +225,49 @@ class MplfinanceLinePlot(MaidrPlot, LineExtractorMixin):
144
225
  Date string in YYYY-MM-DD format
145
226
  """
146
227
  return MplfinanceDataExtractor._convert_date_num_to_string(x_value)
228
+
229
+ def _extract_line_titles(self) -> List[str]:
230
+ """
231
+ Extract titles for all moving average lines.
232
+
233
+ Returns
234
+ -------
235
+ List[str]
236
+ List of titles for each line.
237
+ """
238
+ all_lines = self.ax.get_lines()
239
+ titles = []
240
+
241
+ for line in all_lines:
242
+ ma_period = getattr(line, "_maidr_ma_period", None)
243
+ title = (
244
+ f"{ma_period}-Day Moving Average Line Plot"
245
+ if ma_period
246
+ else "Moving Average Line Plot"
247
+ )
248
+ titles.append(title)
249
+
250
+ return titles
251
+
252
+ def render(self) -> dict:
253
+ """Initialize the MAIDR schema dictionary with basic plot information."""
254
+ # Use the first line's period for the main title
255
+ ma_period = self._extract_moving_average_period()
256
+ title = (
257
+ f"{ma_period}-Day Moving Averages Line Plot"
258
+ if ma_period
259
+ else "Moving Averages Line Plot"
260
+ )
261
+
262
+ maidr_schema = {
263
+ MaidrKey.TYPE: self.type,
264
+ MaidrKey.TITLE: title,
265
+ MaidrKey.AXES: self._extract_axes_data(),
266
+ MaidrKey.DATA: self._extract_plot_data(),
267
+ }
268
+
269
+ # Include selector only if the plot supports highlighting.
270
+ if self._support_highlighting:
271
+ maidr_schema[MaidrKey.SELECTOR] = self._get_selector()
272
+
273
+ return maidr_schema
maidr/patch/mplfinance.py CHANGED
@@ -8,7 +8,6 @@ from matplotlib.lines import Line2D
8
8
  from maidr.core.enum import PlotType
9
9
  from maidr.patch.common import common
10
10
  from maidr.core.context_manager import ContextManager
11
- from maidr.util.mplfinance_utils import MplfinanceDataExtractor
12
11
 
13
12
 
14
13
  def mplfinance_plot_patch(wrapped, instance, args, kwargs):
@@ -150,6 +149,9 @@ def mplfinance_plot_patch(wrapped, instance, args, kwargs):
150
149
  # Map NaN count to likely moving average period
151
150
  estimated_period = nan_count + 1
152
151
 
152
+ # Store the period directly on the line for easy access
153
+ setattr(line, "_maidr_ma_period", estimated_period)
154
+
153
155
  # Create a better label for the line
154
156
  label = str(line.get_label())
155
157
  if label.startswith("_child"):
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: maidr
3
- Version: 1.4.0
3
+ Version: 1.4.1
4
4
  Summary: Multimodal Access and Interactive Data Representations
5
5
  License: GPL-3.0-or-later
6
6
  Keywords: accessibility,visualization,sonification,braille,tactile,multimodal,data representation,blind,low vision,visual impairments
@@ -1,4 +1,4 @@
1
- maidr/__init__.py,sha256=RJ2I0a9M__hF_MmMmToPHiRV0h8rZUJ_kb7AlMKx-R4,415
1
+ maidr/__init__.py,sha256=rjIWNGJRb5ksabBvZv4Ia2vq3YIhfCUr2sytbDXnV4U,415
2
2
  maidr/api.py,sha256=F43mXWsxc7tHdlZqbRlEWkc-RjJVo_zgxCn3NiLBY58,1764
3
3
  maidr/core/__init__.py,sha256=WgxLpSEYMc4k3OyEOf1shOxfEq0ASzppEIZYmE91ThQ,25
4
4
  maidr/core/context_manager.py,sha256=6cT7ZGOApSpC-SLD2XZWWU_H08i-nfv-JUlzXOtvWYw,3374
@@ -8,19 +8,19 @@ maidr/core/enum/maidr_key.py,sha256=ljG0omqzd8K8Yk213N7i7PXGvG-IOlnE5v7o6RoGJzc,
8
8
  maidr/core/enum/plot_type.py,sha256=7Orx3b_0NdpI_PtVJfLyJPh4qBqYMTsYBBr8VwOtiAM,347
9
9
  maidr/core/enum/smooth_keywords.py,sha256=VlpIX1BaoX8efwIrT72GIptxguTpiPtJvvJUPMoaFSQ,194
10
10
  maidr/core/figure_manager.py,sha256=jXs-Prkeru1Pahj21hjh8BAwXM9ZFUZ3GFfKUfIRX_M,4117
11
- maidr/core/maidr.py,sha256=kpN5axfJnWyaqXvyA1maioPOFh1rqod3XIvhIefcjOs,14225
11
+ maidr/core/maidr.py,sha256=dxoJsvFyqhyv7PFHsYZrGAVnNmyjW0v0eng45cxhrf4,16325
12
12
  maidr/core/plot/__init__.py,sha256=xDIpRGM-4DfaSSL3nKcXrjdMecCHJ6en4K4nA_fPefQ,83
13
13
  maidr/core/plot/barplot.py,sha256=1HfoqyDGKIXkYQnCHN83Ye_faKpNQ3R4wjlbjD5jUyk,2092
14
14
  maidr/core/plot/boxplot.py,sha256=i11GdNuz_c-hilmhydu3ah-bzyVdFoBkNvRi5lpMrrY,9946
15
- maidr/core/plot/candlestick.py,sha256=vT_QL48XAWw-rwFB635faSBfwsS3SYFr3hplndLQOpc,4584
15
+ maidr/core/plot/candlestick.py,sha256=2eLdvZJSIgv9fW918uTn7ROsEGui7H3YaVGGFtqkBIw,5269
16
16
  maidr/core/plot/grouped_barplot.py,sha256=bRcQcvwkF3Q3aZ3PlhbZ6bHI_AfcqdKUMVvlLL94wXM,2078
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=C3xz6uWXYM_mbTq_geb5bP0JdvhcQf6cpfTs78Y6fCM,3852
20
20
  maidr/core/plot/maidr_plot.py,sha256=DN4TTRNt_SCqGa_mbkHrnpCk-eUQm71HoFRqs3bB6xk,3868
21
21
  maidr/core/plot/maidr_plot_factory.py,sha256=NW2iFScswgXbAC9rAOo4iMkAFsjY43DAvFioGr0yzx4,2732
22
- maidr/core/plot/mplfinance_barplot.py,sha256=AU9Y8dzt3mFH_tWoRT9aYU1X32q0N8AvczImleUMiXY,4399
23
- maidr/core/plot/mplfinance_lineplot.py,sha256=D5j8EPsHojmTd1xCZG4Hy0NGBqg9zdLjKdtOdUlMk4k,5233
22
+ maidr/core/plot/mplfinance_barplot.py,sha256=feQlVMGA987EvgFii3V5vH74xGtBMBZhNlulU97vQL8,5184
23
+ maidr/core/plot/mplfinance_lineplot.py,sha256=SVN81tau_IAsj17NZT-UtUEJ8NKBy-WxD1PznZELKHc,9338
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
@@ -36,7 +36,7 @@ maidr/patch/highlight.py,sha256=I1dGFHJAnVd0AHVnMJzk_TE8BC8Uv-I6fTzSrJLU5QM,1155
36
36
  maidr/patch/histogram.py,sha256=k3N0RUf1SQ2402pwbaY5QyS98KnLWvr9glCHQw9NTko,2378
37
37
  maidr/patch/kdeplot.py,sha256=qv-OKzuop2aTrkZgUe2OnLxvV-KMyeXt1Td0_uZeHzE,2338
38
38
  maidr/patch/lineplot.py,sha256=og42V0tWBKCnf6idT3pLsIj3QBvKjg8aUN-k1udPRVw,1901
39
- maidr/patch/mplfinance.py,sha256=GU0ynZVA1hnKMNQIGNY8yQ-gOWdt-0s98ozGT0ayLOA,7890
39
+ maidr/patch/mplfinance.py,sha256=oxRhtKWnC-Fr9EBNS1RF-nKJKCKOPbtg4mseLsP1kMI,7967
40
40
  maidr/patch/regplot.py,sha256=Ciz43C5XZfWK6wtVWrlV0WNz4R__rcgdqVE9OCaXXRk,3236
41
41
  maidr/patch/scatterplot.py,sha256=kln6zZwjVsdQzICalo-RnBOJrx1BnIB2xYUwItHvSNY,525
42
42
  maidr/util/__init__.py,sha256=eRJZfRpDX-n7UoV3JXw_9Lbfu_qNl_D0W1UTvLL-Iv4,81
@@ -51,7 +51,7 @@ maidr/util/regression_line_utils.py,sha256=P8RQLixTby2JLz73XZgNiu96C2Ct3pNe4ENRW
51
51
  maidr/util/svg_utils.py,sha256=2gyzBtNKFHs0utrw1iOlxTmznzivOWQMV2aW8zu2c8E,1442
52
52
  maidr/widget/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
53
53
  maidr/widget/shiny.py,sha256=wrrw2KAIpE_A6CNQGBtNHauR1DjenA_n47qlFXX9_rk,745
54
- maidr-1.4.0.dist-info/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
55
- maidr-1.4.0.dist-info/METADATA,sha256=0N1VB59PGbv3IEBZrkDBYBeNlRoWB1W3HuOdUsXxZNA,2664
56
- maidr-1.4.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
57
- maidr-1.4.0.dist-info/RECORD,,
54
+ maidr-1.4.1.dist-info/LICENSE,sha256=IwGE9guuL-ryRPEKi6wFPI_zOhg7zDZbTYuHbSt_SAk,35823
55
+ maidr-1.4.1.dist-info/METADATA,sha256=rGSOkUIcGPVk2z2SgpfMy1EP_B7m0HgpStq3h1SKdK4,2664
56
+ maidr-1.4.1.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
57
+ maidr-1.4.1.dist-info/RECORD,,
File without changes
File without changes