slidge 0.2.7.post1__py3-none-any.whl → 0.2.9__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.
@@ -0,0 +1,52 @@
1
+ from functools import lru_cache
2
+
3
+ JID_ESCAPE_SEQUENCES = {
4
+ "\\20",
5
+ "\\22",
6
+ "\\26",
7
+ "\\27",
8
+ "\\2f",
9
+ "\\3a",
10
+ "\\3c",
11
+ "\\3e",
12
+ "\\40",
13
+ "\\5c",
14
+ }
15
+
16
+
17
+ JID_UNESCAPE_TRANSFORMATIONS = {
18
+ "\\20": " ",
19
+ "\\22": '"',
20
+ "\\26": "&",
21
+ "\\27": "'",
22
+ "\\2f": "/",
23
+ "\\3a": ":",
24
+ "\\3c": "<",
25
+ "\\3e": ">",
26
+ "\\40": "@",
27
+ "\\5c": "\\",
28
+ }
29
+
30
+
31
+ @lru_cache(1000)
32
+ def unescape_node(node: str):
33
+ """Unescape a local portion of a JID."""
34
+ unescaped = []
35
+ seq = ""
36
+ for i, char in enumerate(node):
37
+ if char == "\\":
38
+ seq = node[i : i + 3]
39
+ if seq not in JID_ESCAPE_SEQUENCES:
40
+ seq = ""
41
+ if seq:
42
+ if len(seq) == 3:
43
+ unescaped.append(JID_UNESCAPE_TRANSFORMATIONS.get(seq, char))
44
+
45
+ # Pop character off the escape sequence, and ignore it
46
+ seq = seq[1:]
47
+ else:
48
+ unescaped.append(char)
49
+ return "".join(unescaped)
50
+
51
+
52
+ ESCAPE_TABLE = "".maketrans({v: k for k, v in JID_UNESCAPE_TRANSFORMATIONS.items()})
slidge/util/types.py CHANGED
@@ -21,7 +21,7 @@ from typing import (
21
21
  )
22
22
 
23
23
  from slixmpp import Message, Presence
24
- from slixmpp.types import PresenceShows, PresenceTypes
24
+ from slixmpp.types import PresenceShows, PresenceTypes, ResourceDict
25
25
 
26
26
  if TYPE_CHECKING:
27
27
  from ..contact import LegacyContact
@@ -155,12 +155,6 @@ class MucType(IntEnum):
155
155
  PseudoPresenceShow = Union[PresenceShows, Literal[""]]
156
156
 
157
157
 
158
- class ResourceDict(TypedDict):
159
- show: PseudoPresenceShow
160
- status: str
161
- priority: int
162
-
163
-
164
158
  MessageOrPresenceTypeVar = TypeVar(
165
159
  "MessageOrPresenceTypeVar", bound=Union[Message, Presence]
166
160
  )
slidge/util/util.py CHANGED
@@ -218,19 +218,6 @@ class SlidgeLogger(logging.Logger):
218
218
  log = logging.getLogger(__name__)
219
219
 
220
220
 
221
- def get_version() -> str:
222
- try:
223
- git = subprocess.check_output(
224
- ["git", "rev-parse", "HEAD"],
225
- stderr=subprocess.DEVNULL,
226
- cwd=Path(__file__).parent,
227
- ).decode()
228
- except (FileNotFoundError, subprocess.CalledProcessError):
229
- return "NO_VERSION"
230
- else:
231
- return "git-" + git[:10]
232
-
233
-
234
221
  def merge_resources(resources: dict[str, ResourceDict]) -> Optional[ResourceDict]:
235
222
  if len(resources) == 0:
236
223
  return None
@@ -0,0 +1,134 @@
1
+ Metadata-Version: 2.4
2
+ Name: slidge
3
+ Version: 0.2.9
4
+ Summary: XMPP bridging framework
5
+ Author-email: Nicolas Cedilnik <nicoco@nicoco.fr>
6
+ License-Expression: AGPL-3.0-or-later
7
+ Project-URL: Homepage, https://codeberg.org/slidge/
8
+ Project-URL: Issues, https://codeberg.org/slidge/slidge/issues
9
+ Project-URL: Repository, https://codeberg.org/slidge/slidge/
10
+ Project-URL: Chat room, https://conference.nicoco.fr:5281/muc_log/slidge/
11
+ Project-URL: Documentation, https://slidge.im/docs/slidge/main
12
+ Project-URL: changelog, https://codeberg.org/slidge/slidge/releases
13
+ Keywords: xmpp,gateway,bridge,instant messaging
14
+ Classifier: Topic :: Internet :: XMPP
15
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
16
+ Requires-Python: >=3.11
17
+ Description-Content-Type: text/markdown
18
+ License-File: LICENSE
19
+ Requires-Dist: aiohttp[speedups]<4,>=3.11.11
20
+ Requires-Dist: alembic<2,>=1.14.0
21
+ Requires-Dist: configargparse<2,>=1.7
22
+ Requires-Dist: defusedxml>=0.7.1
23
+ Requires-Dist: pillow<12,>=11.0.0
24
+ Requires-Dist: python-magic<0.5,>=0.4.27
25
+ Requires-Dist: qrcode<9,>=8.0
26
+ Requires-Dist: slixmpp<2,>=1.9.0
27
+ Requires-Dist: sqlalchemy<3,>=2
28
+ Requires-Dist: thumbhash>=0.1.2
29
+ Dynamic: license-file
30
+
31
+ ![Slidge logo](https://codeberg.org/slidge/slidge/raw/branch/main/dev/assets/slidge-color-small.png)
32
+
33
+ [![Chat](https://conference.nicoco.fr:5281/muc_badge/slidge@conference.nicoco.fr)](https://conference.nicoco.fr:5281/muc_log/slidge/)
34
+
35
+
36
+ [![woodpecker CI status](https://ci.codeberg.org/api/badges/14027/status.svg)](https://ci.codeberg.org/repos/14027)
37
+ [![coverage](https://slidge.im/coverage/main/coverage.svg)](https://slidge.im/coverage/main)
38
+
39
+ [![pypi version](https://badge.fury.io/py/slidge.svg)](https://pypi.org/project/slidge/)
40
+ [![debian unstable version](https://badges.debian.net/badges/debian/unstable/python3-slidge/version.svg)](https://packages.debian.org/unstable/python3-slidge)
41
+
42
+ Slidge is an XMPP (puppeteer) gateway library in python.
43
+ It makes
44
+ [writing gateways to other chat networks](https://slidge.im/docs/slidge/main/dev/tutorial.html)
45
+ (*legacy modules*) as frictionless as possible.
46
+ It supports fancy IM features, such as
47
+ [(emoji) reactions](https://xmpp.org/extensions/xep-0444.html),
48
+ [replies](https://xmpp.org/extensions/xep-0461.html), and
49
+ [retractions](https://xmpp.org/extensions/xep-0424.html).
50
+ The full list of supported XEPs in on [xmpp.org](https://xmpp.org/software/slidge/).
51
+
52
+ Status
53
+ ------
54
+
55
+ Slidge is **beta**-grade software. It support groups and 1:1 chats.
56
+ Try slidge and give us some
57
+ feedback, through the [MUC](xmpp:slidge@conference.nicoco.fr?join) or the
58
+ [issue tracker](https://codeberg.org/slidge/slidge/issues).
59
+ Don't be shy!
60
+
61
+ Usage
62
+ -----
63
+
64
+ A minimal (and fictional!) slidge-powered "legacy module" looks like this:
65
+
66
+ ```python
67
+ from cool_chat_lib import CoolClient
68
+ from slidge import BaseGateway, BaseSession
69
+ from slidge.contact import LegacyContact
70
+ from slidge.group import LegacyMUC
71
+ from slidge.db import GatewayUser
72
+
73
+
74
+ class Gateway(BaseGateway):
75
+ # Various aspects of the gateway component are configured as class
76
+ # attributes of the concrete Gateway class
77
+ COMPONENT_NAME = "Gateway to the super duper chat network"
78
+
79
+
80
+ class Session(BaseSession):
81
+ def __init__(self, user: GatewayUser):
82
+ super().__init__(user)
83
+ self.legacy_client = CoolClient(
84
+ login=user.legacy_module_data["username"],
85
+ password=user.legacy_module_data["password"],
86
+ )
87
+
88
+ async def on_text(self, chat: LegacyContact | LegacyMUC, text: str, **kwargs):
89
+ """
90
+ Triggered when the slidge user sends an XMPP message through the gateway
91
+ """
92
+ self.legacy_client.send_message(text=text, destination=chat.legacy_id)
93
+ ```
94
+
95
+ There's more in [the tutorial](https://slidge.im/docs/slidge/main/dev/tutorial.html)!
96
+
97
+ Installation
98
+ ------------
99
+
100
+ ⚠️ Slidge is a lib for gateway developers, if you are an XMPP server admin and
101
+ want to install gateways on your server, you are looking for a
102
+ [slidge-based gateway](https://codeberg.org/explore/repos?q=slidge&topic=1).
103
+ or the
104
+ [slidge-debian](https://git.sr.ht/~nicoco/slidge-debian)
105
+ bundle.
106
+
107
+ Slidge is available on
108
+ [codeberg](https://codeberg.org/slidge/-/packages) (python packages and containers)
109
+ and [pypi](https://pypi.org/project/slidge/).
110
+ Refer to [the docs](https://slidge.im/docs/slidge/main/admin/install.html) for details.
111
+
112
+ About privacy
113
+ -------------
114
+
115
+ Slidge (and most if not all XMPP gateway that I know of) will break
116
+ end-to-end encryption, or more precisely one of the 'ends' become the
117
+ gateway itself. If privacy is a major concern for you, my advice would
118
+ be to:
119
+
120
+ - use XMPP + OMEMO
121
+ - self-host your gateways
122
+ - have your gateways hosted by someone you know AFK and trust
123
+
124
+ Related projects
125
+ ----------------
126
+
127
+ - [Spectrum](https://www.spectrum.im/)
128
+ - [telegabber](https://dev.narayana.im/narayana/telegabber)
129
+ - [biboumi](https://biboumi.louiz.org/)
130
+ - [Bifröst](https://github.com/matrix-org/matrix-bifrost)
131
+ - [Mautrix](https://github.com/mautrix)
132
+ - [matterbridge](https://github.com/42wim/matterbridge)
133
+
134
+ Thank you, [Trung](https://trung.fun/), for the slidge logo!
@@ -1,32 +1,31 @@
1
- slidge/__init__.py,sha256=S0tUjqpZlzsr8G4Y_1Xt-KCYB07qaknTB0OwHU8k29U,1587
1
+ slidge/__init__.py,sha256=36BNw5mWk_MWxlPMzNCJpspoou05hFaL-eQp-JwE3JU,1793
2
2
  slidge/__main__.py,sha256=ydjUklOoavS4YlGfjRX_8BQN2DaSbaXPMi47RkOgcFI,37
3
- slidge/__version__.py,sha256=YqyM_EHsXFkwZV5VZzv4sDVA0ded8PwCU6hR4voKt1o,171
4
- slidge/main.py,sha256=vMJzhvUxbeuIXuHxXXs6lm_ShBjXiS9B5Li5Ge4vWPo,6238
3
+ slidge/main.py,sha256=kusTX-W9cYo1I1TLqHEag20-TPsjFeF5BO2jC8y2Mt4,6223
5
4
  slidge/migration.py,sha256=4BJmPIRB56_WIhRTqBFIIBXuvnhhBjjOMl4CE7jY6oc,1541
6
5
  slidge/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
6
  slidge/command/__init__.py,sha256=UYf1mjCYbZ5G7PIgaFTWSQRAzEJkQ6dTH8Fu_e_XnO0,613
8
7
  slidge/command/adhoc.py,sha256=bYLXcYJjbqPE9nBhrEQevqYFh9AS7Ei3m1vTZBIggrc,10557
9
- slidge/command/admin.py,sha256=TYrzgCIhjcTIwl1IUaFlUd3D98SPyao10gB20zo8b3Q,6187
8
+ slidge/command/admin.py,sha256=DYN9yADZo2hKV0t20K2qnFPJHU98eKsaZTOqi1zdMys,6165
10
9
  slidge/command/base.py,sha256=EDcEl5dJcooSmLarXI2fmBq6QtU7h-7MOM3DDsxXmTU,13447
11
10
  slidge/command/categories.py,sha256=vF0KGDV9sEn8TNkcMoDRw-u3gEyNHSXghOU2JRHQtKs,351
12
11
  slidge/command/chat_command.py,sha256=z-4qp03rK7kCh3_kEozDViwkDg_hVjHvRCiYYJxedBQ,11153
13
12
  slidge/command/register.py,sha256=BduDI31Kx8CbWWEdjybimTA5Wcfhn-Jkt8sSPsySCpo,6724
14
13
  slidge/command/user.py,sha256=fLh5d7XTSXicj6g0I80F5n6BFaA20PaYoXFkfDOR4zA,12303
15
14
  slidge/contact/__init__.py,sha256=WMMaHk7UW7YT9EH2LtPdkU0bHQaOp4ikBhbBQskmoc8,191
16
- slidge/contact/contact.py,sha256=ITcjW_3VMdVEHQfqxscpIULnofZBJ841wvnYwOvk1Tc,22934
17
- slidge/contact/roster.py,sha256=x3speGdHbZ-VTLoQLQW4s53rBeBvW87W8ZibCCZSLDA,10300
15
+ slidge/contact/contact.py,sha256=CLWuNLvWuODi1mlT6MFGx9s3y8yGPM8ZEsH-Ih6QEn8,22929
16
+ slidge/contact/roster.py,sha256=19EYyX-usuevMob9AgnQmSt6APdE5MxMroHOYmVYt-w,10205
18
17
  slidge/core/__init__.py,sha256=RG7Jj5JCJERjhqJ31lOLYV-7bH_oblClQD1KF9LsTXo,68
19
18
  slidge/core/config.py,sha256=OjJfpXJaDhMxRB-vYA0cqkSf0fwMt-HMThM8GS1htCg,7964
20
- slidge/core/gateway.py,sha256=qdvLGh5GF823mACVw5j1WLYMzsSmeGpmQFuWvz5Z9AU,37028
19
+ slidge/core/gateway.py,sha256=tBaI8ZTGEOeojgSny1rfec9w8MF24Buce8KL5oes984,37492
21
20
  slidge/core/pubsub.py,sha256=BoeYE__ptmRAn4x55Hn_6JWRA4nM-XJgDemG5Cy5kN4,11959
22
- slidge/core/session.py,sha256=Y6psOKm_lv4q7yXARiLuijvSebuS64NjqSNF1WARtHM,28439
21
+ slidge/core/session.py,sha256=Ie1a6bpUCC_HFvm98S-t03WG5JlOFG0SwbmGB2l9ZTc,28439
23
22
  slidge/core/dispatcher/__init__.py,sha256=1EXcjXietUKlxEqdrCWCV3xZ3q_DSsjHoqWrPMbtYao,84
24
23
  slidge/core/dispatcher/caps.py,sha256=vzCAXo_bhALuLEpJWtyJTzVfWx96g1AsWD8_wkoDl0Y,2028
25
24
  slidge/core/dispatcher/disco.py,sha256=j56VY9NIFzwPEWFKQQZ7YIqS9GdD-ZaF_K8a2L-JvRk,2006
26
25
  slidge/core/dispatcher/presence.py,sha256=X4i-JjQ423gXiveJH7sjdwW_67rJiSYS7jIvkm1XsJg,6421
27
26
  slidge/core/dispatcher/registration.py,sha256=Xmbw9NF3LUppCOa3XzreopdKDitZnwl_5HE-kds74n8,3155
28
27
  slidge/core/dispatcher/search.py,sha256=9cGj0wwvyYlP_Yk440Y12sgo4Y1p-JWUDSJP5Zxch0M,3296
29
- slidge/core/dispatcher/session_dispatcher.py,sha256=vNaOJpHKGTzIyQJX457IvhbooKFN5JR3HA7XW0AArFI,2868
28
+ slidge/core/dispatcher/session_dispatcher.py,sha256=Gzq2IPThhzQ0_mCVKPCNHypIXgL-WnZalTyLMjUX9Hs,3148
30
29
  slidge/core/dispatcher/util.py,sha256=YtXyVxM3orE7aYWs-GbJumtLTI63OpaQY_t4FMTjoZo,5754
31
30
  slidge/core/dispatcher/vcard.py,sha256=Rmx-wCz6Lps0mXCO48HppNQlS3GOgMuzuw9hZYBdlVU,5130
32
31
  slidge/core/dispatcher/message/__init__.py,sha256=vpDGOc_U9XvkUU_ws9n9-5M2NPJ87XGTVpuIxM7Z99k,223
@@ -47,7 +46,7 @@ slidge/core/mixins/db.py,sha256=5Qpegd7D8e5TLXLLINYcf_DuVdN-7wNmsfztUuFYPcU,442
47
46
  slidge/core/mixins/disco.py,sha256=jk3Z1B6zTuisHv8VKNRJodIo0ee5btYHh2ZrlflPj_Q,3670
48
47
  slidge/core/mixins/lock.py,sha256=Vf1rrkbyNbSprr38WGfZiMgTB7AdbqH8ppFHY8N2yXE,975
49
48
  slidge/core/mixins/message.py,sha256=X8Ka8j0nOnBcecYE_YuK8_J7MeO5-R0TIZw4X8c7R3Y,7846
50
- slidge/core/mixins/message_maker.py,sha256=TcCutHi0sIwL6beJNkN7XyR0aDIbA0xZyxd2Gc9ulG4,6022
49
+ slidge/core/mixins/message_maker.py,sha256=_sa0YWyxnvI0DcPgoh6h1CxLbYF73Ezw1LRZN2CNRTM,6025
51
50
  slidge/core/mixins/message_text.py,sha256=pCY4tezEuwB2ZuUyUi72i4v9AJkxp_SWF1jrFsn94Ns,8096
52
51
  slidge/core/mixins/presence.py,sha256=yywo6KAw8C7GaZSMrSMuioNfhW08MrnobHt8XbHd0q8,7891
53
52
  slidge/core/mixins/recipient.py,sha256=b0uFnpym-hOFgYxGjXT1xQcZ4YRbDSBftPcNWLzSwEI,1336
@@ -55,7 +54,7 @@ slidge/db/__init__.py,sha256=EBDH1JSEhgqYcli2Bw11CRC749wJk8AOucgBzmhDSvU,105
55
54
  slidge/db/avatar.py,sha256=z5e72STv8PdN6zkNyKlLqF7NFxHwCa6IjwgFpzu5ghE,8033
56
55
  slidge/db/meta.py,sha256=v1Jf-npZ28QwdGpsLQWLBHEbEP3-jnPrygRg05tJ_Iw,1831
57
56
  slidge/db/models.py,sha256=MSVNW04x05qfxahvjCYRDFjfFP-XXp-lOHnK5IqFCXw,14046
58
- slidge/db/store.py,sha256=ETk6oUUEz8-YUFGCh7nspSJH7dFOj8qeIWLQhX4nOH8,47051
57
+ slidge/db/store.py,sha256=AjbeYAbhd_7KHS094vTEPiuecu_ntIAlpyzsrCIjHHE,47155
59
58
  slidge/db/alembic/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
60
59
  slidge/db/alembic/env.py,sha256=hsBlRNs0zF5diSHGRSa8Fi3qRVQDA2rJdR41AEIdvxc,1642
61
60
  slidge/db/alembic/script.py.mako,sha256=MEqL-2qATlST9TAOeYgscMn1uy6HUS9NFvDgl93dMj8,635
@@ -78,11 +77,11 @@ slidge/db/alembic/versions/b64b1a793483_add_source_and_legacy_id_for_archived_.p
78
77
  slidge/db/alembic/versions/c4a8ec35a0e8_per_room_user_nick.py,sha256=jjQmlRv6nqdm5q6LbwVpSUSkTBj1c76Hiq8e8q77q3g,933
79
78
  slidge/db/alembic/versions/e91195719c2c_store_users_avatars_persistently.py,sha256=8Ga3VFgKrzMs_-B8OPtfP-0rey_MFaDg-QGtSbaft3o,640
80
79
  slidge/group/__init__.py,sha256=yFt7cHqeaKIMN6f9ZyhhspOcJJvBtLedGv-iICG7lto,258
81
- slidge/group/archive.py,sha256=IPqklzo0UN3lPHckfsKW9c4nl3m_9XGY4u0eehrhe8k,5281
82
- slidge/group/bookmarks.py,sha256=AvFL34bEX6n3OP1Np309T5hrLK9GnjkjdyLJ3uiLZyc,6616
83
- slidge/group/participant.py,sha256=cUuyJRGq8AIHrwtubje5cyb5hHY2hGLtGboBju4SI0c,17781
84
- slidge/group/room.py,sha256=IilOT_Z5P-gh0lo5KLFc054z6sOrxJQ6MvjPmLKXiRs,49011
85
- slidge/slixfix/__init__.py,sha256=Og6_EAuWst6paWmDiGqeqQH6Iof6V8Vkr5pyYisgjsw,4282
80
+ slidge/group/archive.py,sha256=AUzVtXlHiCreyY3jp1XMt0G7LDNm-qOU-4CEPQ89ics,5445
81
+ slidge/group/bookmarks.py,sha256=uGw_XtF0nloZ7rhNLdKM0nNZZb5C6SBfTsLyZryxjxY,6592
82
+ slidge/group/participant.py,sha256=h9Cz4liCWzCaysvDk4wr8-zHvLOyIoM3vvQWzHCdpFE,17690
83
+ slidge/group/room.py,sha256=C0CYhn3EuqjQnGLia9A3_mmkGfc_gDmd-PMESggupFo,49164
84
+ slidge/slixfix/__init__.py,sha256=opamnCRI89KtCY2jfUrzij423hROgMF_Jw8Rrv1i0pw,2515
86
85
  slidge/slixfix/delivery_receipt.py,sha256=3bWdZH3-X3CZJXmnI_TpjkTUUK-EY4Ktm78lW0-40fc,1366
87
86
  slidge/slixfix/roster.py,sha256=KvDjh9q7pqaZf69H93okfib13cc95uVZUJ6rzpqmDaU,1704
88
87
  slidge/slixfix/link_preview/__init__.py,sha256=TDPTSEH5FQxgGpQpQIde-D72AHg-6YVWG-tOj4KpKmU,290
@@ -98,17 +97,16 @@ slidge/slixfix/xep_0153/__init__.py,sha256=hsEldnLuzvcp0NqSscxPV7FJl-6GFP372vlDg
98
97
  slidge/slixfix/xep_0153/vcard_avatar.py,sha256=py-qzj1jmmzsM4GCTKLRW7cAdAmSVjodp6q0r5B0RqQ,458
99
98
  slidge/slixfix/xep_0292/__init__.py,sha256=_MvS9wGra6ig3P_dPAVlCPDJkiOFvUWGjaRsHj1woUg,98
100
99
  slidge/slixfix/xep_0292/vcard4.py,sha256=jL-TOW3eG2QXLduSLNq03L8HoUNmvy8kTZI5ojvo6GE,358
101
- slidge/slixfix/xep_0492/__init__.py,sha256=kjWVeX3SG_2ohHx0fuMh1gmM2G57Bl6SRo7Mfv6sglA,161
102
- slidge/slixfix/xep_0492/notify.py,sha256=8EPSdU3rTzWkHNm8oFr0tK2PmMJ6hBAIr88GoOmHTuQ,340
103
- slidge/slixfix/xep_0492/stanza.py,sha256=TlwyAHozA6zu32QoBb6M12xqWR-ytT0F9XVFqZkd4d4,2895
104
100
  slidge/util/__init__.py,sha256=BELovoTMPcPPGz3D48esBr8A4BRRHXTvavfgnArBgEc,301
105
101
  slidge/util/archive_msg.py,sha256=xXAR0BI5r3d6KKWjae9594izCOv6iI03z2WLuTecNw8,1724
106
102
  slidge/util/conf.py,sha256=1j2OnOsCBar1tOObErhXR5RC3Vl3faliOZ1U8J3My58,6613
103
+ slidge/util/jid_escaping.py,sha256=pWJTrB6-M923a_rEE-nxPmiDTOx9UCMa8UgE7JbLC0c,1066
107
104
  slidge/util/test.py,sha256=l1VHBsw5Uzk2t7wtkfb9kWvtehcYhw1t_d567JAJFKA,14135
108
- slidge/util/types.py,sha256=R_xfS5mRL0XUJIoDpnaAkZlTOoLPerduXBFftaVwIAI,5489
109
- slidge/util/util.py,sha256=IfyYLkujW6Pk0kvHpfkpQwejFDHSe5oR4_bczEUnhjs,9678
110
- slidge-0.2.7.post1.dist-info/METADATA,sha256=CcOFxjaCZ1GrafYEpCTCvMn9MhMhxUskPYASuVtWtYc,44851
111
- slidge-0.2.7.post1.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
112
- slidge-0.2.7.post1.dist-info/entry_points.txt,sha256=py3_x834fFJ2TEzPd18Wt2DnysdAfuVqJ5zzBrXbAZs,44
113
- slidge-0.2.7.post1.dist-info/top_level.txt,sha256=2LRjDYHaGZ5ieCMF8xy58JIiabRMzX-MGMbCZwfE17c,7
114
- slidge-0.2.7.post1.dist-info/RECORD,,
105
+ slidge/util/types.py,sha256=5j0G22hhsh3PNhtpJaz2DVt5XINJznZjz0hqewPZoFo,5407
106
+ slidge/util/util.py,sha256=ZkQltO6JmfqZc9T-86XI6gAsZx9BLdF0CCurnxPRNRc,9329
107
+ slidge-0.2.9.dist-info/licenses/LICENSE,sha256=DZak_2itbUtvHzD3E7GNUYSRK6jdOJ-GqncQ2weavLA,34523
108
+ slidge-0.2.9.dist-info/METADATA,sha256=tmqEtywN5eD_3DDDeh4nPQIvp51Uc7d8wRgKibuh-QE,5102
109
+ slidge-0.2.9.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
110
+ slidge-0.2.9.dist-info/entry_points.txt,sha256=py3_x834fFJ2TEzPd18Wt2DnysdAfuVqJ5zzBrXbAZs,44
111
+ slidge-0.2.9.dist-info/top_level.txt,sha256=2LRjDYHaGZ5ieCMF8xy58JIiabRMzX-MGMbCZwfE17c,7
112
+ slidge-0.2.9.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5