interactive-figure 0.3.3__py3-none-any.whl → 0.3.5__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.5"
@@ -1,326 +1,318 @@
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, default "auto".
19
+ hide_toolbar : bool, optional
20
+ whether to hide the toolbar, 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
+
66
+ def draw():
67
+ """Draw contents of the figure."""
68
+ _check_exists()
69
+
70
+ canvas = _state.fig.canvas
71
+ # Mark canvas for a draw.
72
+ canvas.draw_idle()
73
+ # Force update the GUI. This is when the drawing actually happens
74
+ # in the backend.
75
+ canvas.flush_events()
76
+
77
+
78
+ def clear(hide_labels=False, set_limits=True):
79
+ """Reset contents and layout of the figure.
80
+
81
+ Parameters
82
+ ----------
83
+ set_limits : bool, optional
84
+ set the Axes limits to [0, 100].
85
+ hide_labels : bool, optional
86
+ remove all labels from the figure.
87
+ """
88
+ _check_exists()
89
+
90
+ ax = _state.ax
91
+ ax.clear()
92
+
93
+ if set_limits:
94
+ ax.set_xlim([0, 100])
95
+ ax.set_ylim([0, 100])
96
+
97
+ if hide_labels:
98
+ ax.set_xticks([])
99
+ ax.set_yticks([])
100
+
101
+
102
+ def toggle_fullscreen():
103
+ """Toggle fullscreen."""
104
+ _check_exists()
105
+
106
+ _state.figure.canvas.manager.full_screen_toggle()
107
+
108
+
109
+ def close():
110
+ """Close the figure."""
111
+ _check_exists()
112
+
113
+ plt.close(_state.fig)
114
+
115
+ _state_reset_fig()
116
+ _state_reset_press()
117
+
118
+ print("Successfully closed the interactive figure.")
119
+
120
+
121
+ def wait_for_interaction(timeout=-1):
122
+ """Wait for interaction.
123
+
124
+ Optionally use a timeout in seconds.
125
+
126
+ Parameters
127
+ ----------
128
+ timeout : int, optional
129
+ Timeout in seconds when waiting for input.
130
+
131
+ Returns
132
+ -------
133
+ bool | None
134
+ - True if a key was pressed.
135
+ - False if a mouse button was pressed.
136
+ - None if no input was given within the timeout.
137
+ """
138
+ _check_exists()
139
+
140
+ # Reimplementation of:
141
+ # figure.Figure.waitforbuttonpress()
142
+ # _blocking_input.blocking_input_loop()
143
+ # but without show() to prevent redrawing the figure.
144
+
145
+ # Contains the event that was registered.
146
+ event = None
147
+
148
+ # Handler to stop blocking event loop.
149
+ def simple_handler(ev):
150
+ nonlocal event
151
+ event = ev
152
+ _state.fig.canvas.stop_event_loop()
153
+
154
+ # Connect event handlers and save callback ids.
155
+ callback_ids = [
156
+ _state.fig.canvas.mpl_connect(name, simple_handler) for name in ["button_press_event", "key_press_event"]
157
+ ]
158
+ try:
159
+ # Start a blocking event loop.
160
+ _state.fig.canvas.start_event_loop(timeout=timeout)
161
+ finally:
162
+ # Disconnect handlers.
163
+ for callback_id in callback_ids:
164
+ _state.fig.canvas.mpl_disconnect(callback_id)
165
+
166
+ interaction_type = None if event is None else event.name == "key_press_event"
167
+
168
+ if interaction_type is None:
169
+ # No button was pressed, so reset the state.
170
+ _state_reset_press()
171
+
172
+ return interaction_type
173
+
174
+
175
+ def get_last_key_press():
176
+ """Get the last key press in lowercase.
177
+
178
+ Returns
179
+ -------
180
+ str | None
181
+ The last key that was pressed.
182
+ """
183
+ _check_exists()
184
+
185
+ key_string = _state.last_keypress
186
+
187
+ if key_string is None:
188
+ return None
189
+ else:
190
+ return key_string.lower()
191
+
192
+
193
+ def get_last_mouse_press():
194
+ """Get the ID of the last mouse press.
195
+
196
+ Returns
197
+ -------
198
+ int | None
199
+ The identifier of the last mouse button that was pressed.
200
+ """
201
+ _check_exists()
202
+
203
+ mouse_button = _state.last_mousepress
204
+
205
+ if mouse_button is None:
206
+ return None
207
+ else:
208
+ return mouse_button.value
209
+
210
+
211
+ def get_last_mouse_pos():
212
+ """Get the last mouse position.
213
+
214
+ Returns
215
+ -------
216
+ (x: float, y: float) | (None, None)
217
+ The last registered mouse position after any interaction.
218
+ """
219
+ _check_exists()
220
+
221
+ return (_state.last_mouse_x, _state.last_mouse_y)
222
+
223
+
224
+ def wait(timeout):
225
+ """Freeze for the given number of seconds.
226
+
227
+ During this period it is not possible to interact
228
+ with the figure. For sub-second timeouts use time.wait() instead.
229
+
230
+ Parameters
231
+ ----------
232
+ timeout : float
233
+ Number of seconds to wait for.
234
+ """
235
+ _check_exists()
236
+
237
+ _state.fig.canvas.start_event_loop(timeout=timeout)
238
+ # No button was pressed, so reset the state.
239
+ _state_reset_press()
240
+
241
+
242
+ # HIDDEN METHODS
243
+
244
+
245
+ def _get_state():
246
+ """Get all state information of the interactive figure.
247
+
248
+ Returns
249
+ -------
250
+ SimpleNamespace
251
+ Namespace with figure state information
252
+ """
253
+ return _state
254
+
255
+
256
+ def _check_exists():
257
+ """Check if the interactive figure exists.
258
+
259
+ Raises
260
+ ------
261
+ RuntimeError
262
+ If the figure is not available
263
+ """
264
+ if _state.fig is None:
265
+ raise RuntimeError("Error: the interactive figure is not available.")
266
+
267
+
268
+ def _state_reset_fig():
269
+ """Reset figure information."""
270
+ _state.fig = None
271
+ _state.ax = None
272
+
273
+
274
+ def _state_reset_press():
275
+ """Reset last registered press information."""
276
+ _state.last_keypress = None
277
+ _state.last_mousepress = None
278
+ _state.last_mouse_x = None
279
+ _state.last_mouse_y = None
280
+
281
+
282
+ def _key_press_handler(event):
283
+ """Register key and mouse coordinates on press.
284
+
285
+ Parameters
286
+ ----------
287
+ event
288
+ The event object that was generated internally
289
+ """
290
+ _state.last_keypress = event.key
291
+ _state.last_mousepress = None
292
+ _state.last_mouse_x = event.xdata
293
+ _state.last_mouse_y = event.ydata
294
+
295
+
296
+ def _button_press_handler(event):
297
+ """Register key, mouse button and mouse coordinates on press.
298
+
299
+ Parameters
300
+ ----------
301
+ event
302
+ The event object that was generated internally
303
+ """
304
+ _state.last_keypress = event.key
305
+ _state.last_mousepress = event.button
306
+ _state.last_mouse_x = event.xdata
307
+ _state.last_mouse_y = event.ydata
308
+
309
+
310
+ # Namespace to track the internal state of the interactive figure.
311
+ _state = SimpleNamespace(
312
+ fig=None,
313
+ ax=None,
314
+ last_keypress=None,
315
+ last_mousepress=None,
316
+ last_mouse_x=None,
317
+ last_mouse_y=None,
318
+ )
@@ -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.5
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,8 +60,12 @@ 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
66
+
67
+ # Publish
68
+ hatch publish
79
69
  ```
80
70
 
81
71
  ## Links
@@ -0,0 +1,7 @@
1
+ interactive_figure/__about__.py,sha256=hu_23GWCWpKjdw97-0y_O7JlxUWN4apUKOL4q5xXd7Q,23
2
+ interactive_figure/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ interactive_figure/interactive_figure.py,sha256=hvQX5OACBYoz5EK9Wd3aOZm6I79ia6PGg69CtkPl_Mo,8410
4
+ interactive_figure-0.3.5.dist-info/METADATA,sha256=WYQ6OrtTdjiUS3npBEhymGvE5Fc2Pc7PxLBPGCYr-4U,2438
5
+ interactive_figure-0.3.5.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
6
+ interactive_figure-0.3.5.dist-info/licenses/LICENSE.txt,sha256=R6IpPdPKA5nLHPKRXIhlFHLE59dMUtve0qeXhZPr0Hk,1043
7
+ interactive_figure-0.3.5.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,,