python-libei 0.6.0__py3-none-any.whl → 0.6.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.
- libei/__init__.py +1 -1
- libei/_capi/libei.py +5 -3
- libei/_capi/libeis.py +6 -4
- libei/_capi/loader.py +34 -1
- libei/portal.py +7 -6
- {python_libei-0.6.0.dist-info → python_libei-0.6.1.dist-info}/METADATA +38 -20
- python_libei-0.6.1.dist-info/RECORD +17 -0
- python_libei-0.6.0.dist-info/RECORD +0 -17
- {python_libei-0.6.0.dist-info → python_libei-0.6.1.dist-info}/WHEEL +0 -0
- {python_libei-0.6.0.dist-info → python_libei-0.6.1.dist-info}/licenses/LICENSE +0 -0
- {python_libei-0.6.0.dist-info → python_libei-0.6.1.dist-info}/top_level.txt +0 -0
libei/__init__.py
CHANGED
libei/_capi/libei.py
CHANGED
|
@@ -128,7 +128,7 @@ event_scroll_get_discrete_dy = lib.function(
|
|
|
128
128
|
event_touch_get_id = lib.function("ei_event_touch_get_id", (c_void_p,), c_uint32)
|
|
129
129
|
event_touch_get_x = lib.function("ei_event_touch_get_x", (c_void_p,), c_double)
|
|
130
130
|
event_touch_get_y = lib.function("ei_event_touch_get_y", (c_void_p,), c_double)
|
|
131
|
-
event_touch_get_is_cancel = lib.function(
|
|
131
|
+
event_touch_get_is_cancel = lib.function( # libei 1.4+
|
|
132
132
|
"ei_event_touch_get_is_cancel", (c_void_p,), c_bool
|
|
133
133
|
)
|
|
134
134
|
event_text_get_utf8 = lib.function( # libei 1.6+
|
|
@@ -141,7 +141,9 @@ event_text_get_keysym_is_press = lib.function( # libei 1.6+
|
|
|
141
141
|
"ei_event_text_get_keysym_is_press", (c_void_p,), c_bool
|
|
142
142
|
)
|
|
143
143
|
# Borrowed reference -- the event still owns it, so wrap() rather than adopt().
|
|
144
|
-
event_pong_get_ping = lib.function(
|
|
144
|
+
event_pong_get_ping = lib.function( # libei 1.4+
|
|
145
|
+
"ei_event_pong_get_ping", (c_void_p,), c_void_p
|
|
146
|
+
)
|
|
145
147
|
|
|
146
148
|
device_ref = lib.function("ei_device_ref", (c_void_p,), c_void_p)
|
|
147
149
|
device_unref = lib.function("ei_device_unref", (c_void_p,), c_void_p)
|
|
@@ -236,7 +238,7 @@ touch_get_device = lib.function("ei_touch_get_device", (c_void_p,), c_void_p)
|
|
|
236
238
|
touch_down = lib.function("ei_touch_down", (c_void_p, c_double, c_double), None)
|
|
237
239
|
touch_motion = lib.function("ei_touch_motion", (c_void_p, c_double, c_double), None)
|
|
238
240
|
touch_up = lib.function("ei_touch_up", (c_void_p,), None)
|
|
239
|
-
touch_cancel = lib.function("ei_touch_cancel", (c_void_p,), None)
|
|
241
|
+
touch_cancel = lib.function("ei_touch_cancel", (c_void_p,), None) # libei 1.4+
|
|
240
242
|
|
|
241
243
|
# ei_new_ping() returns an owned reference; ei_ping() then triggers the round
|
|
242
244
|
# trip that comes back as an EI_EVENT_PONG.
|
libei/_capi/libeis.py
CHANGED
|
@@ -104,7 +104,7 @@ event_scroll_get_discrete_dy = lib.function(
|
|
|
104
104
|
event_touch_get_id = lib.function("eis_event_touch_get_id", (c_void_p,), c_uint32)
|
|
105
105
|
event_touch_get_x = lib.function("eis_event_touch_get_x", (c_void_p,), c_double)
|
|
106
106
|
event_touch_get_y = lib.function("eis_event_touch_get_y", (c_void_p,), c_double)
|
|
107
|
-
event_touch_get_is_cancel = lib.function(
|
|
107
|
+
event_touch_get_is_cancel = lib.function( # libei 1.4+
|
|
108
108
|
"eis_event_touch_get_is_cancel", (c_void_p,), c_bool
|
|
109
109
|
)
|
|
110
110
|
event_text_get_utf8 = lib.function( # libei 1.6+
|
|
@@ -117,14 +117,16 @@ event_text_get_keysym_is_press = lib.function( # libei 1.6+
|
|
|
117
117
|
"eis_event_text_get_keysym_is_press", (c_void_p,), c_bool
|
|
118
118
|
)
|
|
119
119
|
# Borrowed reference -- the event still owns it, so wrap() rather than adopt().
|
|
120
|
-
event_pong_get_ping = lib.function(
|
|
120
|
+
event_pong_get_ping = lib.function( # libei 1.4+
|
|
121
|
+
"eis_event_pong_get_ping", (c_void_p,), c_void_p
|
|
122
|
+
)
|
|
121
123
|
|
|
122
124
|
client_ref = lib.function("eis_client_ref", (c_void_p,), c_void_p)
|
|
123
125
|
client_unref = lib.function("eis_client_unref", (c_void_p,), c_void_p)
|
|
124
126
|
client_is_sender = lib.function("eis_client_is_sender", (c_void_p,), c_bool)
|
|
125
127
|
# pid_t, i.e. a 32-bit signed int on Linux. Socket backend only, and
|
|
126
128
|
# negative errno on failure.
|
|
127
|
-
backend_socket_get_client_pid = lib.function(
|
|
129
|
+
backend_socket_get_client_pid = lib.function( # libei 1.5+
|
|
128
130
|
"eis_backend_socket_get_client_pid", (c_void_p,), c_int32
|
|
129
131
|
)
|
|
130
132
|
client_get_name = lib.function("eis_client_get_name", (c_void_p,), c_char_p)
|
|
@@ -277,7 +279,7 @@ touch_get_device = lib.function("eis_touch_get_device", (c_void_p,), c_void_p)
|
|
|
277
279
|
touch_down = lib.function("eis_touch_down", (c_void_p, c_double, c_double), None)
|
|
278
280
|
touch_motion = lib.function("eis_touch_motion", (c_void_p, c_double, c_double), None)
|
|
279
281
|
touch_up = lib.function("eis_touch_up", (c_void_p,), None)
|
|
280
|
-
touch_cancel = lib.function("eis_touch_cancel", (c_void_p,), None)
|
|
282
|
+
touch_cancel = lib.function("eis_touch_cancel", (c_void_p,), None) # libei 1.4+
|
|
281
283
|
|
|
282
284
|
ping = lib.function("eis_ping", (c_void_p,), None) # libei 1.4+
|
|
283
285
|
ping_get_id = lib.function("eis_ping_get_id", (c_void_p,), c_uint64) # libei 1.4+
|
libei/_capi/loader.py
CHANGED
|
@@ -30,6 +30,7 @@ class LazyLibrary:
|
|
|
30
30
|
self._lib: ctypes.CDLL | None = None
|
|
31
31
|
self._load_error: OSError | None = None
|
|
32
32
|
self._lock = threading.Lock()
|
|
33
|
+
self._declared: dict[str, tuple[tuple[type, ...], type | None]] = {}
|
|
33
34
|
|
|
34
35
|
def _ensure_loaded(self) -> ctypes.CDLL:
|
|
35
36
|
"""Return the opened library, opening it on first call.
|
|
@@ -75,6 +76,21 @@ class LazyLibrary:
|
|
|
75
76
|
return False
|
|
76
77
|
return True
|
|
77
78
|
|
|
79
|
+
@property
|
|
80
|
+
def soname(self) -> str:
|
|
81
|
+
"""The shared library this binds, as it is passed to ``dlopen``."""
|
|
82
|
+
return self._soname
|
|
83
|
+
|
|
84
|
+
@property
|
|
85
|
+
def declared(self) -> dict[str, tuple[tuple[type, ...], type | None]]:
|
|
86
|
+
"""Every function bound so far: C name -> (argtypes, restype).
|
|
87
|
+
|
|
88
|
+
Read by the ABI tests, which compare it with the library's exports and
|
|
89
|
+
with the upstream headers. Declaring a binding records it here and does
|
|
90
|
+
nothing else -- the library is still not opened until a call.
|
|
91
|
+
"""
|
|
92
|
+
return dict(self._declared)
|
|
93
|
+
|
|
78
94
|
def function(
|
|
79
95
|
self,
|
|
80
96
|
name: str,
|
|
@@ -94,6 +110,7 @@ class LazyLibrary:
|
|
|
94
110
|
# the dict is chosen only because "absent from the dict" already
|
|
95
111
|
# means "not resolved yet", with no None sentinel to confuse with a
|
|
96
112
|
# legitimately-None value.
|
|
113
|
+
self._declared[name] = (tuple(argtypes), restype)
|
|
97
114
|
cache: dict[str, Any] = {}
|
|
98
115
|
|
|
99
116
|
def call(*args: Any) -> Any:
|
|
@@ -113,7 +130,23 @@ class LazyLibrary:
|
|
|
113
130
|
bound.argtypes = list(argtypes)
|
|
114
131
|
bound.restype = restype
|
|
115
132
|
cache["f"] = bound
|
|
116
|
-
|
|
133
|
+
try:
|
|
134
|
+
return bound(*args)
|
|
135
|
+
except ctypes.ArgumentError:
|
|
136
|
+
# ctypes turns *any* exception raised while converting an
|
|
137
|
+
# argument into an ArgumentError carrying only its text -- no
|
|
138
|
+
# __cause__, no __context__. For a released object that loses
|
|
139
|
+
# the RuntimeError its ``_as_parameter_`` raised, so a caller
|
|
140
|
+
# catching RuntimeError (as documented) would miss it. Ask the
|
|
141
|
+
# arguments again and re-raise the real one.
|
|
142
|
+
for arg in args:
|
|
143
|
+
try:
|
|
144
|
+
arg._as_parameter_ # noqa: B018 - evaluated for its error
|
|
145
|
+
except RuntimeError as released:
|
|
146
|
+
raise released from None
|
|
147
|
+
except AttributeError:
|
|
148
|
+
continue
|
|
149
|
+
raise
|
|
117
150
|
|
|
118
151
|
call.__name__ = name
|
|
119
152
|
return call
|
libei/portal.py
CHANGED
|
@@ -1176,12 +1176,13 @@ class InputCaptureSession:
|
|
|
1176
1176
|
about, and this cannot release on a caller's behalf during cleanup
|
|
1177
1177
|
without risking racing a capture that only just started.
|
|
1178
1178
|
|
|
1179
|
-
**
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
the
|
|
1183
|
-
|
|
1184
|
-
|
|
1179
|
+
**Only half live-tested.** The negotiation -- consent dialog, EIS fd,
|
|
1180
|
+
zones, ``Session.Close()`` -- was run against a real GNOME session on
|
|
1181
|
+
libei's own hand-verification terms (see
|
|
1182
|
+
``docs/developers/verification.md``); the *capture* half never has been,
|
|
1183
|
+
because verifying it means a developer accepting that their pointer will
|
|
1184
|
+
be diverted away from their own desktop for the length of the test -- not
|
|
1185
|
+
something to trigger without asking first, unlike everything else here. Designed
|
|
1185
1186
|
against ``/usr/share/dbus-1/interfaces/org.freedesktop.portal.
|
|
1186
1187
|
InputCapture.xml`` (the shipped portal spec, not the header alone) and
|
|
1187
1188
|
unit-tested against a fake connection reproducing that spec's documented
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: python-libei
|
|
3
|
-
Version: 0.6.
|
|
4
|
-
Summary: Inject and
|
|
3
|
+
Version: 0.6.1
|
|
4
|
+
Summary: Inject, receive and capture input on Wayland from Python: ctypes bindings for libei, libeis and liboeffis, plus the RemoteDesktop and InputCapture portals
|
|
5
5
|
Author: Dennis K. Paulsen
|
|
6
6
|
License-Expression: MIT
|
|
7
7
|
Project-URL: homepage, https://github.com/ctrondlp/python-libei
|
|
8
8
|
Project-URL: repository, https://github.com/ctrondlp/python-libei
|
|
9
9
|
Project-URL: issues, https://github.com/ctrondlp/python-libei/issues
|
|
10
|
+
Project-URL: documentation, https://github.com/ctrondlp/python-libei/tree/main/docs
|
|
11
|
+
Project-URL: pyguitest, https://github.com/ctrondlp/pyguitest
|
|
10
12
|
Project-URL: changelog, https://github.com/ctrondlp/python-libei/blob/main/CHANGELOG.md
|
|
11
|
-
Keywords: wayland,libei,libeis,liboeffis,input,input-emulation,emulated-input,portal,xdg-desktop-portal,remote-desktop,automation,gui-testing,accessibility,ctypes
|
|
13
|
+
Keywords: wayland,libei,libeis,liboeffis,input,input-emulation,emulated-input,input-capture,eis,portal,xdg-desktop-portal,remote-desktop,automation,gui-testing,accessibility,ctypes
|
|
12
14
|
Classifier: Development Status :: 4 - Beta
|
|
13
15
|
Classifier: Intended Audience :: Developers
|
|
14
16
|
Classifier: Operating System :: POSIX :: BSD :: FreeBSD
|
|
15
17
|
Classifier: Operating System :: POSIX :: Linux
|
|
18
|
+
Classifier: Operating System :: POSIX
|
|
16
19
|
Classifier: Programming Language :: Python :: 3
|
|
17
20
|
Classifier: Programming Language :: Python :: 3 :: Only
|
|
18
21
|
Classifier: Programming Language :: Python :: 3.10
|
|
@@ -53,8 +56,11 @@ device.start_emulating().pointer_motion(5, 0).frame().stop_emulating()
|
|
|
53
56
|
```
|
|
54
57
|
|
|
55
58
|
**The one concept:** events queue up, and **`frame()` is what sends them** as
|
|
56
|
-
one logical hardware event. Forget it and
|
|
57
|
-
warning, no movement.
|
|
59
|
+
one logical hardware event. Forget it and the motion is usually lost — no
|
|
60
|
+
exception, no warning, no movement. (Ending the chain with `stop_emulating()`
|
|
61
|
+
makes libei frame the queue for you, but it logs an error-level `Bug:` line
|
|
62
|
+
when it does; see [Things that will bite you](#things-that-will-bite-you).) Fill
|
|
63
|
+
the package, then post it.
|
|
58
64
|
|
|
59
65
|
New here? [docs/getting-started.md](docs/getting-started.md) is install
|
|
60
66
|
through a first real pointer motion, in five minutes.
|
|
@@ -96,8 +102,8 @@ than a widget-tree back door:
|
|
|
96
102
|
|
|
97
103
|
## Which API do I need?
|
|
98
104
|
|
|
99
|
-
|
|
100
|
-
to get permission, then `ei` to inject.
|
|
105
|
+
Four modules (`ei`, `eis`, `oeffis`, `portal`), and most callers need exactly
|
|
106
|
+
two of them: `oeffis` or `portal` to get permission, then `ei` to inject.
|
|
101
107
|
|
|
102
108
|
| You want to… | Use | Notes |
|
|
103
109
|
| --- | --- | --- |
|
|
@@ -105,6 +111,7 @@ to get permission, then `ei` to inject.
|
|
|
105
111
|
| **Consume input** from a compositor | `libei.ei` → `Receiver` | Compositor-side or input-capture code; same connection dance |
|
|
106
112
|
| **Get permission**, simply | `libei.oeffis` | One call, pollable fd, no dependencies. The consent dialog appears on **every** run |
|
|
107
113
|
| **Get permission**, and not be asked again | `libei.portal` | Same handshake over D-Bus directly, with `persist_mode` / `restore_token`. Needs PyGObject |
|
|
114
|
+
| **Capture the user's real input** | `libei.portal` → `InputCaptureSession` | The read direction, through the InputCapture portal: once the compositor decides to, the user's pointer and keyboard are diverted to you over EIS. Exclusive while active, so hold it briefly. Only its negotiation half has been run against a real desktop — see [verification](docs/developers/verification.md) |
|
|
108
115
|
| **Be the server**, for tests or a compositor | `libei.eis` | Drives your client code with no real compositor and no consent dialog |
|
|
109
116
|
|
|
110
117
|
Each module has `is_available()`. `ei` and `eis` share the shapes around them:
|
|
@@ -143,8 +150,9 @@ because a skimming reader could otherwise take them as supported. 1.6.0's own
|
|
|
143
150
|
`enum ei_device_capability` stops at `TEXT`, and its `enum ei_event_type`
|
|
144
151
|
stops at `EI_EVENT_TEXT_UTF8` — so the swipe/pinch/hold/stylus members of
|
|
145
152
|
`EventType` cannot arrive either. The values here match upstream `main`
|
|
146
|
-
exactly, so they are ready for whatever release adds them. The
|
|
147
|
-
|
|
153
|
+
exactly, so they are ready for whatever release adds them. The gesture
|
|
154
|
+
and stylus functions `main` adds -- 46 in libei and 51 in libeis against
|
|
155
|
+
1.6.0's headers, counted 2026-09-30 -- are deliberately not bound:
|
|
148
156
|
nothing that ships today exports them, so nothing here could be verified
|
|
149
157
|
against a real library, which is the bar every other binding in this package
|
|
150
158
|
was held to.
|
|
@@ -166,7 +174,7 @@ and why, is in
|
|
|
166
174
|
|
|
167
175
|
## Status
|
|
168
176
|
|
|
169
|
-
Beta (`0.6.
|
|
177
|
+
Beta (`0.6.1`), published on [PyPI](https://pypi.org/project/python-libei/)
|
|
170
178
|
since `0.1.0`, and **the API is not frozen** — expect renames before 1.0.
|
|
171
179
|
|
|
172
180
|
The injection path is exercised end to end against the real libraries by the
|
|
@@ -207,9 +215,13 @@ Exactly what was run, when, and against which versions:
|
|
|
207
215
|
- libei 1.0.0 or newer for the core: connecting, binding a seat, and
|
|
208
216
|
sending pointer, button, keyboard, scroll and touch input all use symbols
|
|
209
217
|
that have existed with a stable signature since 1.0.0, and upstream keeps
|
|
210
|
-
API/ABI back-compatible within the 1.x series.
|
|
211
|
-
|
|
212
|
-
the injection path passes the full suite with
|
|
218
|
+
API/ABI back-compatible within the 1.x series. The suite has been run
|
|
219
|
+
against 1.2.1 (Ubuntu 24.04, in CI) and 1.6.0 -- the latter on Fedora 44 and
|
|
220
|
+
45 and FreeBSD 15, where the injection path passes the full suite with
|
|
221
|
+
nothing skipped. Every binding's name, argument types and return type, and
|
|
222
|
+
every enum value, is also checked against the upstream headers of 1.0.0,
|
|
223
|
+
1.2.1, 1.4.0, 1.5.0 and 1.6.0 (`tests/test_abi.py`), which is the only
|
|
224
|
+
coverage 1.0.0, 1.4.0 and 1.5.0 have had.
|
|
213
225
|
|
|
214
226
|
Newer libei buys you more, per feature:
|
|
215
227
|
|
|
@@ -367,8 +379,12 @@ All four, with working code:
|
|
|
367
379
|
soon as the loop moves on, and using it afterwards raises `RuntimeError`.
|
|
368
380
|
Objects you pull *off* an event (`event.device`, `event.seat`) are safe to
|
|
369
381
|
keep — copy out `event.pointer_event` and friends rather than the event.
|
|
370
|
-
- **`frame()` or
|
|
371
|
-
them
|
|
382
|
+
- **`frame()` or the input is lost.** Events queue up until a `frame()` commits
|
|
383
|
+
them, and queued events that are never framed are dropped without an
|
|
384
|
+
exception or a log line. The one exception is a chain that ends in
|
|
385
|
+
`stop_emulating()`: libei frames what is queued, delivers it, and logs
|
|
386
|
+
`Bug: ei_device_stop_emulating: missing call to ei_device_frame()` at error
|
|
387
|
+
level. Measured against libei 1.2.1 and 1.6.0; don't rely on it.
|
|
372
388
|
- **`bind()` needs at least one capability.** Binding an empty set sends
|
|
373
389
|
nothing, so the device you are waiting for never arrives; this raises
|
|
374
390
|
`ValueError` rather than hanging.
|
|
@@ -377,20 +393,22 @@ All four, with working code:
|
|
|
377
393
|
- **One seat can resume several devices.** Bind both `POINTER` and
|
|
378
394
|
`POINTER_ABSOLUTE` and GNOME gives you two, relative first. Taking
|
|
379
395
|
whichever resumes first is a coin flip — select on `device.capabilities`
|
|
380
|
-
instead. Sending an event the device lacks the capability for is
|
|
381
|
-
|
|
396
|
+
instead. Sending an event the device lacks the capability for is dropped with
|
|
397
|
+
no exception — libei only logs an error-level `Bug: ... device is not a
|
|
398
|
+
keyboard` line — which makes this look like the injection simply not working.
|
|
382
399
|
- **Read the accessor that matches the event type.** `event.key_event` on a
|
|
383
400
|
`POINTER_MOTION` event raises `TypeError` naming both types. libei itself
|
|
384
401
|
would have returned `KeyEvent(key=0, is_press=False)` — a real-looking
|
|
385
|
-
value —
|
|
386
|
-
`event_type` first. `TOUCH_UP` has its own `touch_up_event`, since it
|
|
402
|
+
value — and raised nothing, only logging a `Bug:` line at error level, so
|
|
403
|
+
branch on `event_type` first. `TOUCH_UP` has its own `touch_up_event`, since it
|
|
387
404
|
carries no coordinates.
|
|
388
405
|
- **`GESTURES` and `STYLUS` are not in any released libei.** They match
|
|
389
406
|
upstream `main` and are here ready for it, but 1.6.0's capability enum
|
|
390
407
|
stops at `TEXT`. Binding them against a shipping library silently does
|
|
391
408
|
nothing — no error, no device, no events.
|
|
392
409
|
|
|
393
|
-
Nearly all of these fail
|
|
410
|
+
Nearly all of these fail without raising — some only log an error-level `Bug:`
|
|
411
|
+
line, some not even that — which is why
|
|
394
412
|
[docs/troubleshooting.md](docs/troubleshooting.md) is a checklist rather than
|
|
395
413
|
a list of error messages. Start there when nothing happens.
|
|
396
414
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
libei/__init__.py,sha256=OP-aoBP8bXNhL8q3gXxVL4FtWLhVyaBlmoQEInBdhp4,1858
|
|
2
|
+
libei/_cobject.py,sha256=XjbUNJpZ87jAyPWh6dmRslk6cMy831oMRFhWmfjLDFo,13344
|
|
3
|
+
libei/ei.py,sha256=W4akKc_BNVfL0FroSXLGD1Z_L3OmYjZT5QDHNnEtMP8,49367
|
|
4
|
+
libei/eis.py,sha256=X_umAaAAbAMC9d2RdnMReeJZI61WsnKz3cySY5YrGr0,45841
|
|
5
|
+
libei/oeffis.py,sha256=gJHR90s9VhQrgkjWUMDx-lxZ8qKxkttnqbx_xo-7oxs,10035
|
|
6
|
+
libei/portal.py,sha256=XC_FsKueIpcmAPZ4TDXJgFhucJNeMEO2byTJHG3GMmI,69756
|
|
7
|
+
libei/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
+
libei/_capi/__init__.py,sha256=raISSWSV9hAcE92DcLCz-vUb1IPcsmxRZaS-iAoQJBE,211
|
|
9
|
+
libei/_capi/libei.py,sha256=qsccHa_komCxtvPYi6AobszhFbEG2qA8QYJJVr8SaGM,11356
|
|
10
|
+
libei/_capi/libeis.py,sha256=C_Uh7DwNncFC8A4wuMhviAj5C_TUmKHtLJYq0Qhhz1E,13142
|
|
11
|
+
libei/_capi/liboeffis.py,sha256=V8jdmJm3qOQUzzNiCAXt4Jr2JY11Y4-w6NIfIxbxGI4,1218
|
|
12
|
+
libei/_capi/loader.py,sha256=xW67uk35ckgeFaheDGrHC05ZM5w_cxBGvX5lG_GUSu8,6625
|
|
13
|
+
python_libei-0.6.1.dist-info/licenses/LICENSE,sha256=l6xbMU6Y-JZDzmBciBj-J5t6h6jNg_Bcyp4bHxDepqU,1074
|
|
14
|
+
python_libei-0.6.1.dist-info/METADATA,sha256=nV9GTh7ArlrDPXyPTt4fGHJiPP22J9bmA2e8v-mDgp0,22728
|
|
15
|
+
python_libei-0.6.1.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
16
|
+
python_libei-0.6.1.dist-info/top_level.txt,sha256=_DQXzGjDsUBENI_cNkiOxPB4xi8coCbQS1lq18FMudQ,6
|
|
17
|
+
python_libei-0.6.1.dist-info/RECORD,,
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
libei/__init__.py,sha256=ypdFYwFMulRHAB3iYKc2NfCvMRvAq9TUFuwQN9b3PWw,1858
|
|
2
|
-
libei/_cobject.py,sha256=XjbUNJpZ87jAyPWh6dmRslk6cMy831oMRFhWmfjLDFo,13344
|
|
3
|
-
libei/ei.py,sha256=W4akKc_BNVfL0FroSXLGD1Z_L3OmYjZT5QDHNnEtMP8,49367
|
|
4
|
-
libei/eis.py,sha256=X_umAaAAbAMC9d2RdnMReeJZI61WsnKz3cySY5YrGr0,45841
|
|
5
|
-
libei/oeffis.py,sha256=gJHR90s9VhQrgkjWUMDx-lxZ8qKxkttnqbx_xo-7oxs,10035
|
|
6
|
-
libei/portal.py,sha256=eTYzNkA_65VaUlbSkATiXmOA8c6_uUDle2c2lUgZZHY,69698
|
|
7
|
-
libei/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
8
|
-
libei/_capi/__init__.py,sha256=raISSWSV9hAcE92DcLCz-vUb1IPcsmxRZaS-iAoQJBE,211
|
|
9
|
-
libei/_capi/libei.py,sha256=gpp42bhqPonhVD2zmFWCl4rdk_lm4XvD_7W2Rw5RsuI,11308
|
|
10
|
-
libei/_capi/libeis.py,sha256=jQR0Z0YN9qa71mAcSJ__-UaoF8PsVsBs8OXwjfqstFk,13080
|
|
11
|
-
libei/_capi/liboeffis.py,sha256=V8jdmJm3qOQUzzNiCAXt4Jr2JY11Y4-w6NIfIxbxGI4,1218
|
|
12
|
-
libei/_capi/loader.py,sha256=QD1xQJo05q4eSWhOCRpAWOlzHD5fcnHtI6yQyy4rKs0,5052
|
|
13
|
-
python_libei-0.6.0.dist-info/licenses/LICENSE,sha256=l6xbMU6Y-JZDzmBciBj-J5t6h6jNg_Bcyp4bHxDepqU,1074
|
|
14
|
-
python_libei-0.6.0.dist-info/METADATA,sha256=NC7ygbrH78TjzREhLvF7-FSz8kNgf8tPE21NZQiykp4,20963
|
|
15
|
-
python_libei-0.6.0.dist-info/WHEEL,sha256=YVMoNqKzERt-wjUZwJ33xBGAwnFl-4cqbYkTtWa4itE,91
|
|
16
|
-
python_libei-0.6.0.dist-info/top_level.txt,sha256=_DQXzGjDsUBENI_cNkiOxPB4xi8coCbQS1lq18FMudQ,6
|
|
17
|
-
python_libei-0.6.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|