winipyside 2.0.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 (52) hide show
  1. winipyside/__init__.py +1 -0
  2. winipyside/dev/__init__.py +1 -0
  3. winipyside/dev/artifacts/__init__.py +1 -0
  4. winipyside/dev/artifacts/builder/__init__.py +1 -0
  5. winipyside/dev/artifacts/builder/builder.py +4 -0
  6. winipyside/dev/artifacts/resources/__init__.py +1 -0
  7. winipyside/dev/artifacts/resources/delete_garbage_can.svg +2 -0
  8. winipyside/dev/artifacts/resources/download_arrow.svg +3 -0
  9. winipyside/dev/artifacts/resources/exit_fullscreen_icon.svg +7 -0
  10. winipyside/dev/artifacts/resources/fullscreen_icon.svg +4 -0
  11. winipyside/dev/artifacts/resources/menu_icon.svg +4 -0
  12. winipyside/dev/artifacts/resources/pause_icon.svg +4 -0
  13. winipyside/dev/artifacts/resources/play_icon.svg +17 -0
  14. winipyside/dev/artifacts/resources/plus_icon.svg +24 -0
  15. winipyside/dev/cli/__init__.py +1 -0
  16. winipyside/dev/cli/subcommands.py +6 -0
  17. winipyside/dev/configs/__init__.py +1 -0
  18. winipyside/dev/configs/configs.py +110 -0
  19. winipyside/dev/tests/__init__.py +1 -0
  20. winipyside/dev/tests/fixtures/__init__.py +1 -0
  21. winipyside/dev/tests/fixtures/fixture.py +7 -0
  22. winipyside/dev/tests/fixtures/scopes/__init__.py +1 -0
  23. winipyside/dev/tests/fixtures/scopes/class_.py +8 -0
  24. winipyside/dev/tests/fixtures/scopes/function.py +8 -0
  25. winipyside/dev/tests/fixtures/scopes/module.py +8 -0
  26. winipyside/dev/tests/fixtures/scopes/package.py +8 -0
  27. winipyside/dev/tests/fixtures/scopes/session.py +8 -0
  28. winipyside/main.py +19 -0
  29. winipyside/py.typed +0 -0
  30. winipyside/src/__init__.py +3 -0
  31. winipyside/src/core/__init__.py +1 -0
  32. winipyside/src/core/py_qiodevice.py +476 -0
  33. winipyside/src/ui/__init__.py +1 -0
  34. winipyside/src/ui/base/__init__.py +1 -0
  35. winipyside/src/ui/base/base.py +188 -0
  36. winipyside/src/ui/pages/__init__.py +1 -0
  37. winipyside/src/ui/pages/base/__init__.py +1 -0
  38. winipyside/src/ui/pages/base/base.py +92 -0
  39. winipyside/src/ui/pages/browser.py +26 -0
  40. winipyside/src/ui/pages/player.py +85 -0
  41. winipyside/src/ui/widgets/__init__.py +1 -0
  42. winipyside/src/ui/widgets/browser.py +243 -0
  43. winipyside/src/ui/widgets/clickable_widget.py +57 -0
  44. winipyside/src/ui/widgets/media_player.py +430 -0
  45. winipyside/src/ui/widgets/notification.py +77 -0
  46. winipyside/src/ui/windows/__init__.py +1 -0
  47. winipyside/src/ui/windows/base/__init__.py +1 -0
  48. winipyside/src/ui/windows/base/base.py +49 -0
  49. winipyside-2.0.1.dist-info/METADATA +284 -0
  50. winipyside-2.0.1.dist-info/RECORD +52 -0
  51. winipyside-2.0.1.dist-info/WHEEL +4 -0
  52. winipyside-2.0.1.dist-info/entry_points.txt +4 -0
@@ -0,0 +1,284 @@
1
+ Metadata-Version: 2.4
2
+ Name: winipyside
3
+ Version: 2.0.1
4
+ Summary: A package for pyside utils
5
+ Author: Winipedia
6
+ Author-email: Winipedia <win.steveker@gmx.de>
7
+ License-Expression: MIT
8
+ Requires-Dist: pyqt-toast-notification
9
+ Requires-Dist: pyside6
10
+ Requires-Dist: winiutils
11
+ Requires-Python: >=3.12, <3.14
12
+ Description-Content-Type: text/markdown
13
+
14
+ # winipyside
15
+
16
+ (This project uses [pyrig](https://github.com/Winipedia/pyrig))
17
+
18
+ A comprehensive PySide6 utilities package providing reusable components for building Qt desktop applications. Features include encrypted file I/O with AES-GCM, a full-featured media player with support for encrypted video playback, an embedded web browser with cookie management, toast notifications, and a modular page-based UI framework. Built with strict type safety and production-ready CI/CD workflows for headless environments.
19
+
20
+ ## Features
21
+
22
+ ### Core (`winipyside.src.core`)
23
+
24
+ **Advanced QIODevice Wrappers for PySide6**
25
+
26
+ - **`PyQIODevice`**: Python-friendly wrapper around Qt's QIODevice with enhanced functionality
27
+ - Provides clean Python interface to all QIODevice methods
28
+ - Seamless integration with PySide6's I/O system
29
+ - Support for sequential and random-access devices
30
+
31
+ - **`PyQFile`**: File-specific wrapper extending PyQIODevice
32
+ - Simplified file operations with Path support
33
+ - Compatible with Qt's media framework
34
+
35
+ - **`EncryptedPyQFile`**: Transparent AES-GCM encrypted file I/O
36
+ - **Chunked encryption** for efficient streaming of large files (64KB cipher chunks)
37
+ - **Position mapping** between encrypted and decrypted data for random access
38
+ - **Authenticated encryption** using AES-GCM with 12-byte nonces and 16-byte tags
39
+ - **Transparent decryption** - works seamlessly with Qt's QMediaPlayer for encrypted video playback
40
+ - Static methods for standalone encryption/decryption operations
41
+ - Secure random nonce generation per chunk
42
+ - Associated authenticated data (AAD) for additional security
43
+
44
+ **Use Cases:**
45
+ - Play encrypted media files without temporary decryption
46
+ - Secure file storage with transparent access
47
+ - Streaming large encrypted files with minimal memory overhead
48
+
49
+ **Example:**
50
+
51
+ ```python
52
+ from pathlib import Path
53
+ from cryptography.hazmat.primitives.ciphers.aead import AESGCM
54
+ from PySide6.QtCore import QUrl, QIODevice
55
+ from PySide6.QtMultimedia import QMediaPlayer, QAudioOutput
56
+ from winipyside.src.core.py_qiodevice import EncryptedPyQFile, PyQFile
57
+
58
+ # Generate or load your encryption key
59
+ key = AESGCM.generate_key(bit_length=256)
60
+ aes_gcm = AESGCM(key)
61
+
62
+ # Play an encrypted video file
63
+ video_path = Path("encrypted_video.mp4")
64
+ encrypted_file = EncryptedPyQFile(video_path, aes_gcm)
65
+ encrypted_file.open(QIODevice.OpenModeFlag.ReadOnly)
66
+
67
+ # Use with QMediaPlayer - decryption happens transparently
68
+ player = QMediaPlayer()
69
+ player.setAudioOutput(QAudioOutput())
70
+ player.setSourceDevice(encrypted_file, QUrl.fromLocalFile(video_path))
71
+ player.play()
72
+
73
+ # Or use PyQFile for regular (unencrypted) files
74
+ regular_file = PyQFile(Path("video.mp4"))
75
+ regular_file.open(QIODevice.OpenModeFlag.ReadOnly)
76
+ player.setSourceDevice(regular_file, QUrl.fromLocalFile("video.mp4"))
77
+ ```
78
+
79
+ ### UI Base (`winipyside.src.ui.base`)
80
+
81
+ **Foundation Framework for Qt Applications**
82
+
83
+ - **`Base`**: Abstract base class for all UI components with lifecycle management
84
+ - **Lifecycle hooks**: `base_setup()`, `pre_setup()`, `setup()`, `post_setup()`
85
+ - **Custom metaclass** (`QABCLoggingMeta`) combining ABC and Qt's metaclass for proper inheritance
86
+ - **Dynamic subclass discovery**: Automatically find and instantiate UI components
87
+ - **Page navigation**: Built-in methods for switching between pages in stacked layouts
88
+ - **SVG icon support**: Easy loading of SVG icons from resources
89
+ - **Display name generation**: Automatic human-readable names from class names
90
+
91
+ **Example:**
92
+
93
+ ```python
94
+ from winipyside.src.ui.base.base import Base
95
+ from PySide6.QtWidgets import QWidget
96
+
97
+ class MyCustomWidget(Base, QWidget):
98
+ def base_setup(self) -> None:
99
+ # Initialize Qt components
100
+ pass
101
+
102
+ def pre_setup(self) -> None:
103
+ # Setup before main initialization
104
+ pass
105
+
106
+ def setup(self) -> None:
107
+ # Main setup logic
108
+ self.setWindowTitle(self.get_display_name()) # "My Custom Widget"
109
+
110
+ def post_setup(self) -> None:
111
+ # Finalization after setup
112
+ pass
113
+
114
+ # Discover all subclasses in your package
115
+ all_widgets = MyCustomWidget.get_subclasses()
116
+ ```
117
+
118
+ ### UI Widgets (`winipyside.src.ui.widgets`)
119
+
120
+ **Ready-to-Use Qt Widgets**
121
+
122
+ - **`Notification`**: Toast notification system using pyqttoast
123
+ - **Auto-positioning**: Top-middle of screen
124
+ - **Smart text truncation**: Automatically fits text to window width
125
+ - **Customizable icons**: Information, warning, error, success
126
+ - **Duration control**: Configurable display time
127
+
128
+ - **`ClickableWidget` / `ClickableVideoWidget`**: Click-enabled widgets
129
+ - **Signal emission**: Emits `clicked` signal on left mouse button press
130
+ - **Video widget variant**: Clickable QVideoWidget for media applications
131
+
132
+ - **`Browser`**: Full-featured embedded web browser
133
+ - **Navigation controls**: Back, forward, address bar, go button
134
+ - **Cookie management**: Automatic cookie tracking and conversion
135
+ - **QNetworkCookie ↔ http.cookiejar.Cookie conversion**: Bridge Qt and Python cookie formats
136
+ - **Domain-based cookie access**: Retrieve cookies by domain
137
+ - **Auto-updates address bar**: Reflects current URL
138
+
139
+ - **`MediaPlayer`**: Comprehensive media player widget
140
+ - **Playback controls**: Play/pause, speed adjustment (0.2x-5x), volume slider
141
+ - **Progress control**: Seekable progress bar with throttled updates
142
+ - **Fullscreen support**: Toggle fullscreen with automatic widget hiding
143
+ - **Encrypted playback**: Native support for `EncryptedPyQFile`
144
+ - **Clickable video**: Click to toggle control visibility
145
+ - **Position resumption**: Resume playback from specific positions
146
+ - **Smart resource management**: Proper cleanup of IO devices
147
+
148
+ **Example:**
149
+
150
+ ```python
151
+ from winipyside.src.ui.widgets.notification import Notification
152
+ from winipyside.src.ui.widgets.media_player import MediaPlayer
153
+ from winipyside.src.ui.widgets.browser import Browser
154
+ from pyqttoast import ToastIcon
155
+ from PySide6.QtWidgets import QVBoxLayout
156
+ from pathlib import Path
157
+
158
+ # Show a notification
159
+ Notification(
160
+ title="Download Complete",
161
+ text="Your file has been downloaded successfully",
162
+ icon=ToastIcon.SUCCESS,
163
+ duration=5000
164
+ )
165
+
166
+ # Create a media player
167
+ layout = QVBoxLayout()
168
+ player = MediaPlayer(layout)
169
+ player.play_file(Path("video.mp4"))
170
+
171
+ # Or play encrypted file
172
+ from cryptography.hazmat.primitives.ciphers.aead import AESGCM
173
+ key = AESGCM.generate_key(bit_length=256)
174
+ aes_gcm = AESGCM(key)
175
+ player.play_encrypted_file(Path("encrypted.mp4"), aes_gcm)
176
+
177
+ # Create a browser
178
+ browser = Browser(layout)
179
+ # Cookies are automatically tracked
180
+ cookies = browser.get_domain_http_cookies("example.com")
181
+ ```
182
+
183
+ ### UI Pages (`winipyside.src.ui.pages`)
184
+
185
+ **Page Components for Stacked Navigation**
186
+
187
+ - **`pages.base.Base`**: Base page class for application pages
188
+ - **Menu dropdown**: Automatic navigation menu to all pages
189
+ - **Page switching**: Built-in methods to navigate between pages
190
+ - **Layout management**: Pre-configured vertical and horizontal layouts
191
+ - **Window integration**: Automatic registration with parent window
192
+
193
+ - **`Player`**: Media player page
194
+ - **Abstract playback method**: Customizable `start_playback()` for your use case
195
+ - **Integrated MediaPlayer widget**: Full media player functionality
196
+ - **Encrypted file support**: Play encrypted videos with `play_encrypted_file()`
197
+ - **Auto page switching**: Automatically switches to player page on playback
198
+
199
+ - **`Browser`**: Web browser page
200
+ - **Embedded browser widget**: Full web browsing capability
201
+ - **Cookie access**: Retrieve cookies from browsing sessions
202
+
203
+ **Example:**
204
+
205
+ ```python
206
+ from winipyside.src.ui.pages.player import Player
207
+ from winipyside.src.ui.pages.browser import Browser
208
+ from winipyside.src.ui.windows.base.base import Base as BaseWindow
209
+ from pathlib import Path
210
+
211
+ class MyPlayerPage(Player):
212
+ def start_playback(self, path: Path, position: int = 0) -> None:
213
+ # Custom playback logic
214
+ self.play_file(path, position)
215
+
216
+ class MyWindow(BaseWindow):
217
+ @classmethod
218
+ def get_all_page_classes(cls):
219
+ return [MyPlayerPage, Browser]
220
+
221
+ @classmethod
222
+ def get_start_page_cls(cls):
223
+ return Browser
224
+
225
+ def pre_setup(self) -> None:
226
+ pass
227
+
228
+ def setup(self) -> None:
229
+ pass
230
+
231
+ def post_setup(self) -> None:
232
+ pass
233
+
234
+ # Pages automatically get menu navigation between each other
235
+ ```
236
+
237
+ ### UI Windows (`winipyside.src.ui.windows`)
238
+
239
+ **Main Window Framework**
240
+
241
+ - **`windows.base.Base`**: Base window class (QMainWindow)
242
+ - **QStackedWidget integration**: Automatic page stacking and switching
243
+ - **Abstract page configuration**: Define pages via `get_all_page_classes()`
244
+ - **Start page selection**: Set initial page with `get_start_page_cls()`
245
+ - **Automatic page creation**: Pages are instantiated and added automatically
246
+ - **Window title**: Auto-generated from class name
247
+
248
+ **Example:**
249
+
250
+ ```python
251
+ from winipyside.src.ui.windows.base.base import Base as BaseWindow
252
+ from winipyside.src.ui.pages.player import Player
253
+ from winipyside.src.ui.pages.browser import Browser
254
+ from PySide6.QtWidgets import QApplication
255
+
256
+ class MyApp(BaseWindow):
257
+ @classmethod
258
+ def get_all_page_classes(cls):
259
+ return [Player, Browser]
260
+
261
+ @classmethod
262
+ def get_start_page_cls(cls):
263
+ return Browser
264
+
265
+ def pre_setup(self) -> None:
266
+ # Setup before pages are created
267
+ pass
268
+
269
+ def setup(self) -> None:
270
+ # Main window setup
271
+ self.resize(1280, 720)
272
+
273
+ def post_setup(self) -> None:
274
+ # Finalization
275
+ pass
276
+
277
+ # Run the application
278
+ app = QApplication([])
279
+ window = MyApp()
280
+ window.show()
281
+ app.exec()
282
+ ```
283
+
284
+
@@ -0,0 +1,52 @@
1
+ winipyside/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
2
+ winipyside/dev/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
3
+ winipyside/dev/artifacts/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
4
+ winipyside/dev/artifacts/builder/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
5
+ winipyside/dev/artifacts/builder/builder.py,sha256=DdbLRMGQQdPgtYu8DSOZrw8Ukz5EmStSq4etgShh6_I,96
6
+ winipyside/dev/artifacts/resources/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
7
+ winipyside/dev/artifacts/resources/delete_garbage_can.svg,sha256=UxEEh46w1JD4VViUBx-Ahaq5_ZR4zOjfeJn5_aM8114,318
8
+ winipyside/dev/artifacts/resources/download_arrow.svg,sha256=8g_cBwKFHyoeSmaLMXcGwIHT4_rZDDtDGm35E0PkniE,242
9
+ winipyside/dev/artifacts/resources/exit_fullscreen_icon.svg,sha256=sZSexEjab82zhAK3JRtOWH19aAFa1GhuGLChDz9wFFc,523
10
+ winipyside/dev/artifacts/resources/fullscreen_icon.svg,sha256=mm2n6WvaSu0OqiQSAw0QPNwzXpPLaF53_XAklUfQQPo,406
11
+ winipyside/dev/artifacts/resources/menu_icon.svg,sha256=pA1Z_x5gDkhYLQA0dL0l_8uBP-e6mKLcEOYwlhURUv4,344
12
+ winipyside/dev/artifacts/resources/pause_icon.svg,sha256=z-Cj3DOI0rwRbWCOhaiHtDQYM4s6OgkCBVcdip77rQE,179
13
+ winipyside/dev/artifacts/resources/play_icon.svg,sha256=7gx1EWZnyu1pA6WboAfVH3OGcp_uYPpT1syqHe-jaGE,953
14
+ winipyside/dev/artifacts/resources/plus_icon.svg,sha256=1ucedu8ucLI7LMNsfNN2GYiwNUe8-ViNBcanDwzTqHc,552
15
+ winipyside/dev/cli/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
16
+ winipyside/dev/cli/subcommands.py,sha256=iurWZwJwEKAfGpfjkn1YOhnRbIruCB4ouE-8R_Lh3JY,228
17
+ winipyside/dev/configs/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
18
+ winipyside/dev/configs/configs.py,sha256=0J9bicIbKHVCpwd812fLJqTqM-h_nTdTc9u4fJtr5Kg,3404
19
+ winipyside/dev/tests/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
20
+ winipyside/dev/tests/fixtures/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
21
+ winipyside/dev/tests/fixtures/fixture.py,sha256=fA8GaETQ0foL1CEqvmxf6ab2Wz-_CxxI-ttkj8CUmok,263
22
+ winipyside/dev/tests/fixtures/scopes/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
23
+ winipyside/dev/tests/fixtures/scopes/class_.py,sha256=ZuI8_LEGy8SiutoygpgQq5_ojjlJRP-fNxDuhEzLj7M,417
24
+ winipyside/dev/tests/fixtures/scopes/function.py,sha256=2ehbrDhtw581pKmvY0KvuDkPCma8E19TyZboOb80L2I,428
25
+ winipyside/dev/tests/fixtures/scopes/module.py,sha256=OwdimjLzNMnsFT2th3OW5ZKP2YzjelC2NJ6jhSPrMMo,420
26
+ winipyside/dev/tests/fixtures/scopes/package.py,sha256=yTDD_7UcWdml7uahvIQ4XQKVeVl-TqAAFtbe9t9VG9c,424
27
+ winipyside/dev/tests/fixtures/scopes/session.py,sha256=MSN62vUCdpSPWBl9wYrEWu4qAmqwyINscgat2Rocp9M,423
28
+ winipyside/main.py,sha256=-w752ghb91kXeuIO1rvOiN_nGypBpQqLCJxVqMBP82c,409
29
+ winipyside/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ winipyside/src/__init__.py,sha256=4h5GWbLSKlFjaNIUbEAiX1wambPOxlE50TWTJnHGs3s,43
31
+ winipyside/src/core/__init__.py,sha256=ymA82gqpwH4kISijecxTUN0J8GCbmkuIGTxq_vCNnnI,44
32
+ winipyside/src/core/py_qiodevice.py,sha256=5onTJAE4Q328ACXrubZ2RsBO_PdJm0rXV6ZgqnzV4aU,15313
33
+ winipyside/src/ui/__init__.py,sha256=f_Zr5JydpAkNrScLEFXOFvFNfvCKM39kQw_jq9-trFA,42
34
+ winipyside/src/ui/base/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
35
+ winipyside/src/ui/base/base.py,sha256=57_UJq8wJHXB-0_lNDo_oMhFEpOztHKaoEvRq2uQPlE,5759
36
+ winipyside/src/ui/pages/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
37
+ winipyside/src/ui/pages/base/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
38
+ winipyside/src/ui/pages/base/base.py,sha256=GKRVhvFVk6ofrBx9-Q353ItkVdHpakZuz5FqihVb5eg,2932
39
+ winipyside/src/ui/pages/browser.py,sha256=YM5kCB-rBdQ_fKGb77tOJIjn9VRIyFdMNyhSeZIcaRM,792
40
+ winipyside/src/ui/pages/player.py,sha256=CXUrganoWW_IHXXe3o7fjAYfZ_1xWW2FtbnhW0pIyfQ,2705
41
+ winipyside/src/ui/widgets/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
42
+ winipyside/src/ui/widgets/browser.py,sha256=KFuICHUTX_8w5DfgJ3IbTu6ipuiuo-mTJku5tg-qSz0,8171
43
+ winipyside/src/ui/widgets/clickable_widget.py,sha256=yMph7whLS6Bw65gf56LHdkZg-JzjWHUnSh3WW3IK25U,1722
44
+ winipyside/src/ui/widgets/media_player.py,sha256=hIklO-1x4ry2L5TpaeyUtiE7FAfyvZ09gBT4R1kckBc,15752
45
+ winipyside/src/ui/widgets/notification.py,sha256=UOm8ZaeWXkqtQtMqjsJ58noB5yOl-X_fId9PioabTug,2492
46
+ winipyside/src/ui/windows/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
47
+ winipyside/src/ui/windows/base/__init__.py,sha256=XHsbmjiaGom-KX-S3leCY9cJD3aP9p_0X6xYMcdkHBU,23
48
+ winipyside/src/ui/windows/base/base.py,sha256=PuHBZlcKe7BGqu3hvkNi2BrE5kO3Z7-_JsKH7W6kV9E,1374
49
+ winipyside-2.0.1.dist-info/WHEEL,sha256=3id4o64OvRm9dUknh3mMJNcfoTRK08ua5cU6DFyVy-4,79
50
+ winipyside-2.0.1.dist-info/entry_points.txt,sha256=UHdZ1NF5NTI221PhwsZi4P-U1q7uIVozqStA-sw0it0,97
51
+ winipyside-2.0.1.dist-info/METADATA,sha256=qkB-WZnjhbolxFdMMbuKbbUujXKg3QcgAq89s5P8r2M,9896
52
+ winipyside-2.0.1.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: uv 0.9.13
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+ winipedia-pyside = pyrig.dev.cli.cli:main
3
+ winipyside = pyrig.dev.cli.cli:main
4
+