interactive-figure 0.3.3__py3-none-any.whl → 0.3.4__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.

Potentially problematic release.


This version of interactive-figure might be problematic. Click here for more details.

@@ -1 +1 @@
1
- __version__ = "0.3.3"
1
+ __version__ = "0.3.4"
@@ -1,326 +1,312 @@
1
- """
2
- This module provides functions to create and interact with a Matplotlib figure.
3
-
4
- The figure registers mouse presses, keyboard input and the location of the mouse
5
- after any input. The user has fine-grained control over when to wait for input
6
- and when to draw the contents of the figure.
7
-
8
- Source: https://github.com/teuncm/interactive-figure
9
- """
10
-
11
- import matplotlib.pyplot as plt
12
- from types import SimpleNamespace
13
-
14
-
15
- def create(aspect_ratio="auto", hide_toolbar=False, **kwargs):
16
- """Create the interactive figure.
17
-
18
- Parameters
19
- ----------
20
- aspect_ratio : str, optional
21
- aspect ratio of the Axes, by default "auto"
22
- hide_toolbar : bool, optional
23
- whether to hide the toolbar, by default False
24
-
25
- remaining arguments will be sent to the figure upon creation
26
-
27
- Raises
28
- ------
29
- RuntimeError
30
- if multiple interactive figures are created.
31
- """
32
- if _state.fig is None:
33
- if hide_toolbar:
34
- plt.rcParams["toolbar"] = "None"
35
-
36
- # Disable interactive mode for explicit control over drawing. See:
37
- # https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.isinteractive.html#matplotlib.pyplot.isinteractive
38
- plt.ioff()
39
-
40
- _state.fig = fig = plt.figure(**kwargs)
41
- fig.canvas.manager.set_window_title("Interactive Figure")
42
- # Create drawable axis.
43
- _state.ax = ax = plt.gca()
44
- ax.set_aspect(aspect_ratio)
45
-
46
- # Show figure but allow the main thread to continue.
47
- plt.show(block=False)
48
-
49
- # Reset plot state and draw to obtain focus.
50
- clear()
51
- draw()
52
-
53
- # Add our custom event handlers. For handlers, see:
54
- # https://matplotlib.org/stable/api/backend_bases_api.html#matplotlib.backend_bases.FigureCanvasBase.mpl_connect
55
- # For general interaction handling, see:
56
- # https://matplotlib.org/stable/users/explain/figure/interactive_guide.html
57
- # For mouse buttons, see:
58
- # https://matplotlib.org/stable/api/backend_bases_api.html#matplotlib.backend_bases.MouseButton
59
- fig.canvas.mpl_disconnect(fig.canvas.manager.key_press_handler_id)
60
- fig.canvas.mpl_disconnect(fig.canvas.manager.button_press_handler_id)
61
- fig.canvas.mpl_connect("key_press_event", _key_press_handler)
62
- fig.canvas.mpl_connect("button_press_event", _button_press_handler)
63
-
64
- print("Successfully created the interactive figure.")
65
- else:
66
- raise RuntimeError("Error: you cannot create multiple interactive figures.")
67
-
68
-
69
- def toggle_fullscreen():
70
- """Toggle fullscreen."""
71
- _check_exists()
72
-
73
- _state.figure.canvas.manager.full_screen_toggle()
74
-
75
-
76
- def clear(hide_labels=False, set_limits=True):
77
- """Reset contents and layout of the figure. *set_limits* will set the Axes limits to
78
- [0, 100]. *hide_labels* will remove all labels."""
79
- _check_exists()
80
-
81
- ax = _state.ax
82
- ax.clear()
83
-
84
- if set_limits:
85
- ax.set_xlim([0, 100])
86
- ax.set_ylim([0, 100])
87
-
88
- if hide_labels:
89
- ax.set_xticks([])
90
- ax.set_yticks([])
91
-
92
-
93
- def wait(timeout):
94
- """Timeout for the given number of seconds. During this period it is
95
- not possible to interact with the figure. For sub-second timeouts use
96
- time.wait() instead.
97
-
98
- Parameters
99
- ----------
100
- timeout : float
101
- Number of seconds to wait for
102
- """
103
- _check_exists()
104
-
105
- _state.fig.canvas.start_event_loop(timeout=timeout)
106
- # No button was pressed, so reset the state.
107
- _state_reset_press()
108
-
109
-
110
- def wait_for_interaction(timeout=-1):
111
- """Wait for interaction with the interactive figure. Optionally
112
- use a timeout in seconds.
113
-
114
- Parameters
115
- ----------
116
- timeout : int, optional
117
- Timeout in seconds when waiting for input.
118
-
119
- Returns
120
- -------
121
- bool | None
122
- - True if a key was pressed.
123
- - False if a mouse button was pressed.
124
- - None if no input was given within the timeout.
125
- """
126
- _check_exists()
127
-
128
- # Reimplementation of:
129
- # figure.Figure.waitforbuttonpress()
130
- # _blocking_input.blocking_input_loop()
131
- # but without show() to prevent redrawing the figure.
132
-
133
- # Contains the event that was registered.
134
- event = None
135
-
136
- # Handler to stop blocking event loop.
137
- def simple_handler(ev):
138
- nonlocal event
139
- event = ev
140
- _state.fig.canvas.stop_event_loop()
141
-
142
- # Connect event handlers and save callback ids.
143
- callback_ids = [
144
- _state.fig.canvas.mpl_connect(name, simple_handler) for name in ["button_press_event", "key_press_event"]
145
- ]
146
- try:
147
- # Start a blocking event loop.
148
- _state.fig.canvas.start_event_loop(timeout=timeout)
149
- finally:
150
- # Disconnect handlers.
151
- for callback_id in callback_ids:
152
- _state.fig.canvas.mpl_disconnect(callback_id)
153
-
154
- interaction_type = None if event is None else event.name == "key_press_event"
155
-
156
- if interaction_type is None:
157
- # No button was pressed, so reset the state.
158
- _state_reset_press()
159
-
160
- return interaction_type
161
-
162
-
163
- def draw():
164
- """Draw the figure."""
165
- _check_exists()
166
-
167
- canvas = _state.fig.canvas
168
- # Mark canvas for a draw.
169
- canvas.draw_idle()
170
- # Force update the GUI. This is when the drawing actually happens
171
- # in the backend.
172
- canvas.flush_events()
173
-
174
-
175
- def close():
176
- """Close the figure."""
177
- _check_exists()
178
-
179
- plt.close(_state.fig)
180
-
181
- _state_reset_fig()
182
- _state_reset_press()
183
-
184
- print("Successfully closed the interactive figure.")
185
-
186
-
187
- def gcf():
188
- """Get figure object of interactive figure.
189
-
190
- Returns
191
- -------
192
- Figure handler
193
- """
194
- return _state.fig
195
-
196
-
197
- def gca():
198
- """Get Axes object of interactive figure.
199
-
200
- Returns
201
- -------
202
- Axes handler
203
- """
204
- return _state.ax
205
-
206
-
207
- def get_last_key_press():
208
- """Get the last keypress and convert it to lowercase.
209
-
210
- Returns
211
- -------
212
- str | None
213
- The last key that was pressed
214
- """
215
- key_string = _state.last_keypress
216
-
217
- if key_string is None:
218
- return None
219
- else:
220
- return key_string.lower()
221
-
222
-
223
- def get_last_mouse_press():
224
- """Get the last mousepress and convert it to an integer value.
225
-
226
- Returns
227
- -------
228
- int | None
229
- The identifier of the last mouse button that was pressed
230
- """
231
- mouse_button = _state.last_mousepress
232
-
233
- if mouse_button is None:
234
- return None
235
- else:
236
- return mouse_button.value
237
-
238
-
239
- def get_last_mouse_pos():
240
- """Get the last mouse position.
241
-
242
- Returns
243
- -------
244
- (x: float, y: float) | (None, None)
245
- The last registered mouse position after any interaction
246
- """
247
- return (_state.last_mouse_x, _state.last_mouse_y)
248
-
249
-
250
- # PRIVATE METHODS
251
-
252
-
253
- def _get_state():
254
- """Get all state information of the interactive figure.
255
-
256
- Returns
257
- -------
258
- SimpleNamespace
259
- Namespace with figure state information
260
- """
261
- return _state
262
-
263
-
264
- def _check_exists():
265
- """Check if the interactive figure exists.
266
-
267
- Raises
268
- ------
269
- RuntimeError
270
- If the figure is not available
271
- """
272
- if _state.fig is None:
273
- raise RuntimeError("Error: the interactive figure is not available.")
274
-
275
-
276
- def _state_reset_fig():
277
- """Reset figure information."""
278
- _state.fig = None
279
- _state.ax = None
280
-
281
-
282
- def _state_reset_press():
283
- """Reset last registered press information."""
284
- _state.last_keypress = None
285
- _state.last_mousepress = None
286
- _state.last_mouse_x = None
287
- _state.last_mouse_y = None
288
-
289
-
290
- def _key_press_handler(event):
291
- """Register key and mouse coordinates on press.
292
-
293
- Parameters
294
- ----------
295
- event
296
- The event object that was generated internally
297
- """
298
- _state.last_keypress = event.key
299
- _state.last_mousepress = None
300
- _state.last_mouse_x = event.xdata
301
- _state.last_mouse_y = event.ydata
302
-
303
-
304
- def _button_press_handler(event):
305
- """Register key, mouse button and mouse coordinates on press.
306
-
307
- Parameters
308
- ----------
309
- event
310
- The event object that was generated internally
311
- """
312
- _state.last_keypress = event.key
313
- _state.last_mousepress = event.button
314
- _state.last_mouse_x = event.xdata
315
- _state.last_mouse_y = event.ydata
316
-
317
-
318
- # Namespace to track the internal state of the interactive figure.
319
- _state = SimpleNamespace(
320
- fig=None,
321
- ax=None,
322
- last_keypress=None,
323
- last_mousepress=None,
324
- last_mouse_x=None,
325
- last_mouse_y=None,
326
- )
1
+ """
2
+ This module provides functions to create and interact with a Matplotlib figure. The figure registers mouse presses, keyboard input and the location of the mouse
3
+ after any input.
4
+
5
+ Source: https://github.com/teuncm/interactive-figure
6
+ """
7
+
8
+ import matplotlib.pyplot as plt
9
+ from types import SimpleNamespace
10
+
11
+
12
+ def create(aspect_ratio="auto", hide_toolbar=False, **kwargs):
13
+ """Create the interactive figure.
14
+
15
+ Parameters
16
+ ----------
17
+ aspect_ratio : str, optional
18
+ aspect ratio of the Axes, by default "auto"
19
+ hide_toolbar : bool, optional
20
+ whether to hide the toolbar, by default False
21
+
22
+ remaining arguments will be sent to the figure upon creation
23
+
24
+ Raises
25
+ ------
26
+ RuntimeError
27
+ if multiple interactive figures are created.
28
+ """
29
+ if _state.fig is None:
30
+ if hide_toolbar:
31
+ plt.rcParams["toolbar"] = "None"
32
+
33
+ # Disable interactive mode for explicit control over drawing. See:
34
+ # https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.isinteractive.html#matplotlib.pyplot.isinteractive
35
+ plt.ioff()
36
+
37
+ _state.fig = fig = plt.figure(**kwargs)
38
+ fig.canvas.manager.set_window_title("Interactive Figure")
39
+ # Create drawable axis.
40
+ _state.ax = ax = plt.gca()
41
+ ax.set_aspect(aspect_ratio)
42
+
43
+ # Show figure but allow the main thread to continue.
44
+ plt.show(block=False)
45
+
46
+ # Reset plot state and draw to obtain focus.
47
+ clear()
48
+ draw()
49
+
50
+ # Add our custom event handlers. For handlers, see:
51
+ # https://matplotlib.org/stable/api/backend_bases_api.html#matplotlib.backend_bases.FigureCanvasBase.mpl_connect
52
+ # For general interaction handling, see:
53
+ # https://matplotlib.org/stable/users/explain/figure/interactive_guide.html
54
+ # For mouse buttons, see:
55
+ # https://matplotlib.org/stable/api/backend_bases_api.html#matplotlib.backend_bases.MouseButton
56
+ fig.canvas.mpl_disconnect(fig.canvas.manager.key_press_handler_id)
57
+ fig.canvas.mpl_disconnect(fig.canvas.manager.button_press_handler_id)
58
+ fig.canvas.mpl_connect("key_press_event", _key_press_handler)
59
+ fig.canvas.mpl_connect("button_press_event", _button_press_handler)
60
+
61
+ print("Successfully created the interactive figure.")
62
+ else:
63
+ raise RuntimeError("Error: you cannot create multiple interactive figures.")
64
+
65
+ def draw():
66
+ """Draw contents of the figure."""
67
+ _check_exists()
68
+
69
+ canvas = _state.fig.canvas
70
+ # Mark canvas for a draw.
71
+ canvas.draw_idle()
72
+ # Force update the GUI. This is when the drawing actually happens
73
+ # in the backend.
74
+ canvas.flush_events()
75
+
76
+
77
+ def clear(hide_labels=False, set_limits=True):
78
+ """Reset contents and layout of the figure.
79
+
80
+ *set_limits* will set the Axes limits to
81
+ [0, 100]. *hide_labels* will remove all labels."""
82
+ _check_exists()
83
+
84
+ ax = _state.ax
85
+ ax.clear()
86
+
87
+ if set_limits:
88
+ ax.set_xlim([0, 100])
89
+ ax.set_ylim([0, 100])
90
+
91
+ if hide_labels:
92
+ ax.set_xticks([])
93
+ ax.set_yticks([])
94
+
95
+
96
+ def toggle_fullscreen():
97
+ """Toggle fullscreen."""
98
+ _check_exists()
99
+
100
+ _state.figure.canvas.manager.full_screen_toggle()
101
+
102
+
103
+ def close():
104
+ """Close the figure."""
105
+ _check_exists()
106
+
107
+ plt.close(_state.fig)
108
+
109
+ _state_reset_fig()
110
+ _state_reset_press()
111
+
112
+ print("Successfully closed the interactive figure.")
113
+
114
+
115
+ def wait_for_interaction(timeout=-1):
116
+ """Wait for interaction.
117
+
118
+ Optionally use a timeout in seconds.
119
+
120
+ Parameters
121
+ ----------
122
+ timeout : int, optional
123
+ Timeout in seconds when waiting for input.
124
+
125
+ Returns
126
+ -------
127
+ bool | None
128
+ - True if a key was pressed.
129
+ - False if a mouse button was pressed.
130
+ - None if no input was given within the timeout.
131
+ """
132
+ _check_exists()
133
+
134
+ # Reimplementation of:
135
+ # figure.Figure.waitforbuttonpress()
136
+ # _blocking_input.blocking_input_loop()
137
+ # but without show() to prevent redrawing the figure.
138
+
139
+ # Contains the event that was registered.
140
+ event = None
141
+
142
+ # Handler to stop blocking event loop.
143
+ def simple_handler(ev):
144
+ nonlocal event
145
+ event = ev
146
+ _state.fig.canvas.stop_event_loop()
147
+
148
+ # Connect event handlers and save callback ids.
149
+ callback_ids = [
150
+ _state.fig.canvas.mpl_connect(name, simple_handler) for name in ["button_press_event", "key_press_event"]
151
+ ]
152
+ try:
153
+ # Start a blocking event loop.
154
+ _state.fig.canvas.start_event_loop(timeout=timeout)
155
+ finally:
156
+ # Disconnect handlers.
157
+ for callback_id in callback_ids:
158
+ _state.fig.canvas.mpl_disconnect(callback_id)
159
+
160
+ interaction_type = None if event is None else event.name == "key_press_event"
161
+
162
+ if interaction_type is None:
163
+ # No button was pressed, so reset the state.
164
+ _state_reset_press()
165
+
166
+ return interaction_type
167
+
168
+
169
+ def get_last_key_press():
170
+ """Get the last key press in lowercase.
171
+
172
+ Returns
173
+ -------
174
+ str | None
175
+ The last key that was pressed
176
+ """
177
+ _check_exists()
178
+
179
+ key_string = _state.last_keypress
180
+
181
+ if key_string is None:
182
+ return None
183
+ else:
184
+ return key_string.lower()
185
+
186
+
187
+ def get_last_mouse_press():
188
+ """Get the ID of the last mouse press.
189
+
190
+ Returns
191
+ -------
192
+ int | None
193
+ The identifier of the last mouse button that was pressed
194
+ """
195
+ _check_exists()
196
+
197
+ mouse_button = _state.last_mousepress
198
+
199
+ if mouse_button is None:
200
+ return None
201
+ else:
202
+ return mouse_button.value
203
+
204
+
205
+ def get_last_mouse_pos():
206
+ """Get the last mouse position.
207
+
208
+ Returns
209
+ -------
210
+ (x: float, y: float) | (None, None)
211
+ The last registered mouse position after any interaction
212
+ """
213
+ _check_exists()
214
+
215
+ return (_state.last_mouse_x, _state.last_mouse_y)
216
+
217
+
218
+ def wait(timeout):
219
+ """Freeze for the given number of seconds.
220
+
221
+ During this period it is not possible to interact
222
+ with the figure. For sub-second timeouts use time.wait() instead.
223
+
224
+ Parameters
225
+ ----------
226
+ timeout : float
227
+ Number of seconds to wait for
228
+ """
229
+ _check_exists()
230
+
231
+ _state.fig.canvas.start_event_loop(timeout=timeout)
232
+ # No button was pressed, so reset the state.
233
+ _state_reset_press()
234
+
235
+
236
+ # PRIVATE METHODS
237
+
238
+
239
+ def _get_state():
240
+ """Get all state information of the interactive figure.
241
+
242
+ Returns
243
+ -------
244
+ SimpleNamespace
245
+ Namespace with figure state information
246
+ """
247
+ return _state
248
+
249
+
250
+ def _check_exists():
251
+ """Check if the interactive figure exists.
252
+
253
+ Raises
254
+ ------
255
+ RuntimeError
256
+ If the figure is not available
257
+ """
258
+ if _state.fig is None:
259
+ raise RuntimeError("Error: the interactive figure is not available.")
260
+
261
+
262
+ def _state_reset_fig():
263
+ """Reset figure information."""
264
+ _state.fig = None
265
+ _state.ax = None
266
+
267
+
268
+ def _state_reset_press():
269
+ """Reset last registered press information."""
270
+ _state.last_keypress = None
271
+ _state.last_mousepress = None
272
+ _state.last_mouse_x = None
273
+ _state.last_mouse_y = None
274
+
275
+
276
+ def _key_press_handler(event):
277
+ """Register key and mouse coordinates on press.
278
+
279
+ Parameters
280
+ ----------
281
+ event
282
+ The event object that was generated internally
283
+ """
284
+ _state.last_keypress = event.key
285
+ _state.last_mousepress = None
286
+ _state.last_mouse_x = event.xdata
287
+ _state.last_mouse_y = event.ydata
288
+
289
+
290
+ def _button_press_handler(event):
291
+ """Register key, mouse button and mouse coordinates on press.
292
+
293
+ Parameters
294
+ ----------
295
+ event
296
+ The event object that was generated internally
297
+ """
298
+ _state.last_keypress = event.key
299
+ _state.last_mousepress = event.button
300
+ _state.last_mouse_x = event.xdata
301
+ _state.last_mouse_y = event.ydata
302
+
303
+
304
+ # Namespace to track the internal state of the interactive figure.
305
+ _state = SimpleNamespace(
306
+ fig=None,
307
+ ax=None,
308
+ last_keypress=None,
309
+ last_mousepress=None,
310
+ last_mouse_x=None,
311
+ last_mouse_y=None,
312
+ )
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.3
2
2
  Name: interactive-figure
3
- Version: 0.3.3
3
+ Version: 0.3.4
4
4
  Summary: Create interactive Matplotlib figures!
5
5
  Project-URL: Documentation, https://teuncm.github.io/interactive-figure/autoapi/interactive_figure/interactive_figure/index.html
6
6
  Project-URL: Issues, https://github.com/teuncm/interactive-figure/issues
@@ -38,29 +38,15 @@ pip install interactive-figure
38
38
  from interactive_figure import interactive_figure
39
39
 
40
40
  interactive_figure.create()
41
- # Stall until user input is received.
41
+ # Wait until user input is received.
42
42
  interactive_figure.wait_for_interaction()
43
- key = interactive_figure.get_last_keypress()
43
+ key = interactive_figure.get_last_key_press()
44
44
  print(f"Pressed key: {key}")
45
45
  interactive_figure.close()
46
46
  ```
47
47
 
48
48
  Demos can be found in the *demo* folder on GitHub.
49
49
 
50
- ## Functionality
51
-
52
- #### User interaction
53
- - Capture key presses, button presses and mouse location
54
-
55
- #### Figure control
56
- - Create
57
- - Toggle fullscreen
58
- - Clear
59
- - Wait
60
- - Wait for interaction (optionally timeout)
61
- - Draw
62
- - Close
63
-
64
50
  ## Limitations
65
51
 
66
52
  - Waiting for user input will not work in Jupyter Notebooks and the interactive interpreter due to the way Matplotlib handles events.
@@ -74,6 +60,7 @@ pipx install hatch
74
60
  hatch shell
75
61
 
76
62
  # Build
63
+ hatch version fix
77
64
  hatch build -c
78
65
  ./generate_docs.sh
79
66
  ```
@@ -0,0 +1,7 @@
1
+ interactive_figure/__about__.py,sha256=EVh84K2XkED4bsPB10qR4q6SCbIp-6LdYq5IuJweVoo,23
2
+ interactive_figure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ interactive_figure/interactive_figure.py,sha256=l3AWVe6oQePBCcv3kGb5qEV_qxHWiuZeXyrxd5OlZTk,8318
4
+ interactive_figure-0.3.4.dist-info/METADATA,sha256=Yx_G-2KYRrZ0IcVf1ZO1zewjlEZG66a02eVbOJJAQvQ,2413
5
+ interactive_figure-0.3.4.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
6
+ interactive_figure-0.3.4.dist-info/licenses/LICENSE.txt,sha256=R6IpPdPKA5nLHPKRXIhlFHLE59dMUtve0qeXhZPr0Hk,1043
7
+ interactive_figure-0.3.4.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.18.0
2
+ Generator: hatchling 1.25.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -1,7 +1,7 @@
1
- MIT License
2
-
3
- Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
-
5
- The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
-
7
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
1
+ MIT License
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -1,7 +0,0 @@
1
- interactive_figure/__about__.py,sha256=8KcCYTXH99C2-gCLuPILJvtT9YftRWJsartIx6TQ2ZY,22
2
- interactive_figure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- interactive_figure/interactive_figure.py,sha256=rc73FSaCdyErSDnJ8xdPiSWzROCOhjLnv-Ex2QGO4ZU,8357
4
- interactive_figure-0.3.3.dist-info/METADATA,sha256=G0OtQklXD3z93CoEDZrGSJrsSkWU20uDnxFXJYdKimA,2617
5
- interactive_figure-0.3.3.dist-info/WHEEL,sha256=9QBuHhg6FNW7lppboF2vKVbCGTVzsFykgRQjjlajrhA,87
6
- interactive_figure-0.3.3.dist-info/licenses/LICENSE.txt,sha256=WvwiBQtt_VVnf6szbVDxrAuRc6U6TLa7mbnvJSWzMGw,1036
7
- interactive_figure-0.3.3.dist-info/RECORD,,