mpt-extension-sdk 4.5.0__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 (53) hide show
  1. mpt_extension_sdk/__init__.py +0 -0
  2. mpt_extension_sdk/airtable/__init__.py +0 -0
  3. mpt_extension_sdk/airtable/wrap_http_error.py +45 -0
  4. mpt_extension_sdk/constants.py +11 -0
  5. mpt_extension_sdk/core/__init__.py +0 -0
  6. mpt_extension_sdk/core/events/__init__.py +0 -0
  7. mpt_extension_sdk/core/events/dataclasses.py +16 -0
  8. mpt_extension_sdk/core/events/registry.py +56 -0
  9. mpt_extension_sdk/core/extension.py +12 -0
  10. mpt_extension_sdk/core/security.py +50 -0
  11. mpt_extension_sdk/core/utils.py +17 -0
  12. mpt_extension_sdk/flows/__init__.py +0 -0
  13. mpt_extension_sdk/flows/context.py +39 -0
  14. mpt_extension_sdk/flows/pipeline.py +51 -0
  15. mpt_extension_sdk/key_vault/__init__.py +0 -0
  16. mpt_extension_sdk/key_vault/base.py +110 -0
  17. mpt_extension_sdk/mpt_http/__init__.py +0 -0
  18. mpt_extension_sdk/mpt_http/base.py +43 -0
  19. mpt_extension_sdk/mpt_http/mpt.py +530 -0
  20. mpt_extension_sdk/mpt_http/utils.py +2 -0
  21. mpt_extension_sdk/mpt_http/wrap_http_error.py +68 -0
  22. mpt_extension_sdk/runtime/__init__.py +10 -0
  23. mpt_extension_sdk/runtime/commands/__init__.py +0 -0
  24. mpt_extension_sdk/runtime/commands/django.py +42 -0
  25. mpt_extension_sdk/runtime/commands/run.py +44 -0
  26. mpt_extension_sdk/runtime/djapp/__init__.py +0 -0
  27. mpt_extension_sdk/runtime/djapp/apps.py +46 -0
  28. mpt_extension_sdk/runtime/djapp/conf/__init__.py +12 -0
  29. mpt_extension_sdk/runtime/djapp/conf/default.py +225 -0
  30. mpt_extension_sdk/runtime/djapp/conf/urls.py +9 -0
  31. mpt_extension_sdk/runtime/djapp/management/__init__.py +0 -0
  32. mpt_extension_sdk/runtime/djapp/management/commands/__init__.py +0 -0
  33. mpt_extension_sdk/runtime/djapp/management/commands/consume_events.py +38 -0
  34. mpt_extension_sdk/runtime/djapp/middleware.py +21 -0
  35. mpt_extension_sdk/runtime/events/__init__.py +0 -0
  36. mpt_extension_sdk/runtime/events/dispatcher.py +83 -0
  37. mpt_extension_sdk/runtime/events/producers.py +108 -0
  38. mpt_extension_sdk/runtime/events/utils.py +85 -0
  39. mpt_extension_sdk/runtime/initializer.py +62 -0
  40. mpt_extension_sdk/runtime/logging.py +36 -0
  41. mpt_extension_sdk/runtime/master.py +136 -0
  42. mpt_extension_sdk/runtime/swoext.py +69 -0
  43. mpt_extension_sdk/runtime/tracer.py +18 -0
  44. mpt_extension_sdk/runtime/utils.py +148 -0
  45. mpt_extension_sdk/runtime/workers.py +90 -0
  46. mpt_extension_sdk/swo_rql/__init__.py +5 -0
  47. mpt_extension_sdk/swo_rql/constants.py +7 -0
  48. mpt_extension_sdk/swo_rql/query_builder.py +392 -0
  49. mpt_extension_sdk-4.5.0.dist-info/METADATA +45 -0
  50. mpt_extension_sdk-4.5.0.dist-info/RECORD +53 -0
  51. mpt_extension_sdk-4.5.0.dist-info/WHEEL +4 -0
  52. mpt_extension_sdk-4.5.0.dist-info/entry_points.txt +6 -0
  53. mpt_extension_sdk-4.5.0.dist-info/licenses/LICENSE +201 -0
@@ -0,0 +1,392 @@
1
+ from mpt_extension_sdk.swo_rql import constants
2
+
3
+
4
+ def parse_kwargs(query_dict):
5
+ query = []
6
+ for lookup, value in query_dict.items():
7
+ tokens = lookup.split("__")
8
+ if len(tokens) == 1:
9
+ # field=value
10
+ field = tokens[0]
11
+ value = rql_encode("eq", value)
12
+ query.append(f"eq({field},{value})")
13
+ continue
14
+ op = tokens[-1]
15
+ if op not in constants.KEYWORDS:
16
+ # field__nested=value
17
+ field = ".".join(tokens)
18
+ value = rql_encode("eq", value)
19
+ query.append(f"eq({field},{value})")
20
+ continue
21
+ field = ".".join(tokens[:-1])
22
+ if op in constants.COMP or op in constants.SEARCH:
23
+ value = rql_encode(op, value)
24
+ query.append(f"{op}({field},{value})")
25
+ continue
26
+ if op in constants.LIST:
27
+ value = rql_encode(op, value)
28
+ query.append(f"{op}({field},({value}))")
29
+ continue
30
+
31
+ cmpop = "eq" if value is True else "ne"
32
+ expr = "null()" if op == constants.NULL else "empty()"
33
+ query.append(f"{cmpop}({field},{expr})")
34
+
35
+ return query
36
+
37
+
38
+ def rql_encode(op, value):
39
+ from datetime import date, datetime
40
+ from decimal import Decimal
41
+
42
+ if op not in constants.LIST:
43
+ if isinstance(value, str):
44
+ return value
45
+ if isinstance(value, bool):
46
+ return "true" if value else "false"
47
+ if isinstance(value, int | float | Decimal):
48
+ return str(value)
49
+ if isinstance(value, date | datetime):
50
+ return value.isoformat()
51
+ if op in constants.LIST and isinstance(value, list | tuple):
52
+ return ",".join(value)
53
+ raise TypeError(f"the `{op}` operator doesn't support the {type(value)} type.")
54
+
55
+
56
+ class RQLQuery:
57
+ """
58
+ Helper class to construct complex RQL queries.
59
+
60
+ Usage:
61
+
62
+ ```py3
63
+ rql = R(field='value', field2__in=('v1', 'v2'), field3__empty=True)
64
+ ```
65
+ !!! note
66
+ All the lookups expressed as keyword arguments are combined together with a logical `and`.
67
+
68
+
69
+ Using the ``n`` method:
70
+
71
+ ```py3
72
+ rql = (
73
+ R().n('field').eq('value')
74
+ & R().n('field2').anyof(('v1', 'v2'))
75
+ & R().n('field3').empty(True)
76
+ )
77
+ ```
78
+
79
+ The previous query can be expressed in a more concise form like:
80
+
81
+ ```py3
82
+ rql = R().field.eq('value') & R().field2.anyof(('v1', 'v2')) & r.field3.empty(True)
83
+ ```
84
+
85
+ ```py3
86
+ rql = R("field").eq("value")
87
+ ```
88
+
89
+ The R object support the bitwise operators `&`, `|` and `~`.
90
+
91
+ Nested fields can be expressed using dot notation:
92
+
93
+ ```py3
94
+ rql = R().n('nested.field').eq('value')
95
+ ```
96
+
97
+ or
98
+
99
+ ```py3
100
+ rql = R().nested.field.eq('value')
101
+ ```
102
+ """
103
+
104
+ AND = "and"
105
+ OR = "or"
106
+ EXPRESSION = "expr"
107
+
108
+ def __init__(
109
+ self,
110
+ _field=None,
111
+ *,
112
+ _op=EXPRESSION,
113
+ _children=None,
114
+ _negated=False,
115
+ _expr=None,
116
+ **kwargs,
117
+ ):
118
+ self.op = _op
119
+ self.children = _children or []
120
+ self.negated = _negated
121
+ self.expr = _expr
122
+ self._path = []
123
+ self._field = None
124
+ if _field:
125
+ self.n(_field)
126
+ if len(kwargs) == 1:
127
+ self.op = self.EXPRESSION
128
+ self.expr = parse_kwargs(kwargs)[0]
129
+ if len(kwargs) > 1:
130
+ self.op = self.AND
131
+ for token in parse_kwargs(kwargs):
132
+ self.children.append(RQLQuery(_expr=token))
133
+
134
+ def __len__(self):
135
+ if self.op == self.EXPRESSION:
136
+ if self.expr:
137
+ return 1
138
+ return 0
139
+ return len(self.children)
140
+
141
+ def __bool__(self):
142
+ return bool(self.children) or bool(self.expr)
143
+
144
+ def __eq__(self, other):
145
+ return (
146
+ self.op == other.op
147
+ and self.children == other.children
148
+ and self.negated == other.negated
149
+ and self.expr == other.expr
150
+ )
151
+
152
+ def __hash__(self):
153
+ return hash(
154
+ (
155
+ self.op,
156
+ self.expr,
157
+ self.negated,
158
+ *(hash(value) for value in self.children),
159
+ ),
160
+ )
161
+
162
+ def __repr__(self):
163
+ if self.op == self.EXPRESSION:
164
+ return f"<R({self.op}) {self.expr}>"
165
+ return f"<R({self.op})>"
166
+
167
+ def __and__(self, other):
168
+ return self._join(other, self.AND)
169
+
170
+ def __or__(self, other):
171
+ return self._join(other, self.OR)
172
+
173
+ def __invert__(self):
174
+ query = RQLQuery(_op=self.AND, _expr=self.expr, _negated=True)
175
+ query._append(self)
176
+ return query
177
+
178
+ def __getattr__(self, name):
179
+ return self.n(name)
180
+
181
+ def __str__(self):
182
+ return self._to_string(self)
183
+
184
+ def n(self, name):
185
+ """
186
+ Set the current field for this `R` object.
187
+
188
+ Args:
189
+ name (str): Name of the field.
190
+ """
191
+ if self._field:
192
+ raise AttributeError("Already evaluated")
193
+
194
+ self._path.extend(name.split("."))
195
+ return self
196
+
197
+ def ne(self, value):
198
+ """
199
+ Apply the `ne` operator to the field this `R` object refers to.
200
+
201
+ Args:
202
+ value (str): The value to which compare the field.
203
+ """
204
+ return self._bin("ne", value)
205
+
206
+ def eq(self, value):
207
+ """
208
+ Apply the `eq` operator to the field this `R` object refers to.
209
+
210
+ Args:
211
+ value (str): The value to which compare the field.
212
+ """
213
+ return self._bin("eq", value)
214
+
215
+ def lt(self, value):
216
+ """
217
+ Apply the `lt` operator to the field this `R` object refers to.
218
+
219
+ Args:
220
+ value (str): The value to which compare the field.
221
+ """
222
+ return self._bin("lt", value)
223
+
224
+ def le(self, value):
225
+ """
226
+ Apply the `le` operator to the field this `R` object refers to.
227
+
228
+ Args:
229
+ value (str): The value to which compare the field.
230
+ """
231
+ return self._bin("le", value)
232
+
233
+ def gt(self, value):
234
+ """
235
+ Apply the `gt` operator to the field this `R` object refers to.
236
+
237
+ Args:
238
+ value (str): The value to which compare the field.
239
+ """
240
+ return self._bin("gt", value)
241
+
242
+ def ge(self, value):
243
+ """
244
+ Apply the `ge` operator to the field this `R` object refers to.
245
+
246
+ Args:
247
+ value (str): The value to which compare the field.
248
+ """
249
+ return self._bin("ge", value)
250
+
251
+ def out(self, value: list[str]):
252
+ """
253
+ Apply the `out` operator to the field this `R` object refers to.
254
+
255
+ Args:
256
+ value (list[str]): The list of values to which compare the field.
257
+ """
258
+ return self._list("out", value)
259
+
260
+ def in_(self, value):
261
+ return self._list("in", value)
262
+
263
+ def oneof(self, value: list[str]):
264
+ """
265
+ Apply the `in` operator to the field this `R` object refers to.
266
+
267
+ Args:
268
+ value (list[str]): The list of values to which compare the field.
269
+ """
270
+ return self._list("in", value)
271
+
272
+ def null(self, value: list[str]):
273
+ """
274
+ Apply the `null` operator to the field this `R` object refers to.
275
+
276
+ Args:
277
+ value (list[str]): The value to which compare the field.
278
+ """
279
+ return self._bool("null", value)
280
+
281
+ def empty(self, value: bool = True):
282
+ """
283
+ Apply the `empty` operator to the field this `R` object refers to.
284
+
285
+ Usage: `R().field.empty()
286
+
287
+ For not empty: `R().field.empty(False)` or `R().field.not_empty()`
288
+ """
289
+ return self._bool("empty", value)
290
+
291
+ def not_empty(self):
292
+ """
293
+ Apply the `not_empty` operator to the field this `R` object refers to.
294
+ """
295
+ query = self._bool("empty", False)
296
+ return query
297
+
298
+ def like(self, value: list[str]):
299
+ """
300
+ Apply the `like` operator to the field this `R` object refers to.
301
+
302
+ Args:
303
+ value (list[str]): The value to which compare the field.
304
+ """
305
+ return self._bin("like", value)
306
+
307
+ def ilike(self, value: list[str]):
308
+ """
309
+ Apply the `ilike` operator to the field this `R` object refers to.
310
+
311
+ Args:
312
+ value (list[str]): The value to which compare the field.
313
+ """
314
+ return self._bin("ilike", value)
315
+
316
+ def _bin(self, op, value):
317
+ self._field = ".".join(self._path)
318
+ value = rql_encode(op, value)
319
+ self.expr = f"{op}({self._field},{value})"
320
+ return self
321
+
322
+ def _list(self, op, value):
323
+ self._field = ".".join(self._path)
324
+ value = rql_encode(op, value)
325
+ self.expr = f"{op}({self._field},({value}))"
326
+ return self
327
+
328
+ def _bool(self, expr, value):
329
+ self._field = ".".join(self._path)
330
+ if bool(value) is False:
331
+ self.expr = f"ne({self._field},{expr}())"
332
+ return self
333
+ self.expr = f"eq({self._field},{expr}())"
334
+ return self
335
+
336
+ def _to_string(self, query):
337
+ tokens = []
338
+ if query.expr:
339
+ if query.negated:
340
+ return f"not({query.expr})"
341
+ return query.expr
342
+ for c in query.children:
343
+ if c.expr:
344
+ if c.negated:
345
+ tokens.append(f"not({c.expr})")
346
+ else:
347
+ tokens.append(c.expr)
348
+ continue
349
+ tokens.append(self._to_string(c))
350
+
351
+ if not tokens:
352
+ return ""
353
+
354
+ if query.negated:
355
+ return f'not({query.op}({",".join(tokens)}))'
356
+ return f'{query.op}({",".join(tokens)})'
357
+
358
+ def _copy(self, other):
359
+ return RQLQuery(
360
+ _op=other.op,
361
+ _children=other.children[:],
362
+ _expr=other.expr,
363
+ )
364
+
365
+ def _join(self, other, op):
366
+ if self == other:
367
+ return self._copy(self)
368
+ if not other:
369
+ return self._copy(self)
370
+ if not self:
371
+ return self._copy(other)
372
+
373
+ query = RQLQuery(_op=op)
374
+ query._append(self)
375
+ query._append(other)
376
+ return query
377
+
378
+ def _append(self, other):
379
+ if other in self.children:
380
+ return other
381
+
382
+ if (
383
+ other.op == self.op or (len(other) == 1 and other.op != self.EXPRESSION)
384
+ ) and not other.negated:
385
+ self.children.extend(other.children)
386
+ return self
387
+
388
+ self.children.append(other)
389
+ return self
390
+
391
+
392
+ R = RQLQuery
@@ -0,0 +1,45 @@
1
+ Metadata-Version: 2.4
2
+ Name: mpt-extension-sdk
3
+ Version: 4.5.0
4
+ Summary: Extensions SDK for SoftwareONE Marketplace Platform
5
+ License: Apache-2.0
6
+ License-File: LICENSE
7
+ Author: SoftwareOne AG
8
+ Requires-Python: >=3.12,<4
9
+ Classifier: License :: OSI Approved :: Apache Software License
10
+ Classifier: Programming Language :: Python :: 3
11
+ Classifier: Programming Language :: Python :: 3.12
12
+ Classifier: Programming Language :: Python :: 3.13
13
+ Classifier: Programming Language :: Python :: 3.14
14
+ Requires-Dist: azure-identity (>=1.21.0,<2.0.0)
15
+ Requires-Dist: azure-keyvault-secrets (>=4.9.0,<5.0.0)
16
+ Requires-Dist: azure-monitor-opentelemetry-exporter (==1.0.0b25)
17
+ Requires-Dist: click (==8.1.*)
18
+ Requires-Dist: debugpy (==1.8.*)
19
+ Requires-Dist: django (==4.2.*)
20
+ Requires-Dist: django-ninja (==1.1.*)
21
+ Requires-Dist: gunicorn (==23.0.*)
22
+ Requires-Dist: jinja2 (==3.1.*)
23
+ Requires-Dist: markdown-it-py (==3.0.*)
24
+ Requires-Dist: openpyxl (==3.1.*)
25
+ Requires-Dist: opentelemetry-api (==1.30.*)
26
+ Requires-Dist: opentelemetry-instrumentation-django (==0.51b0)
27
+ Requires-Dist: opentelemetry-instrumentation-logging (==0.51b0)
28
+ Requires-Dist: opentelemetry-instrumentation-requests (==0.51b0)
29
+ Requires-Dist: opentelemetry-sdk (==1.30.*)
30
+ Requires-Dist: phonenumbers (==8.13.*)
31
+ Requires-Dist: pyairtable (==2.3.*)
32
+ Requires-Dist: pyfiglet (==1.0.*)
33
+ Requires-Dist: pyjwt (==2.8.*)
34
+ Requires-Dist: pymsteams (==0.2.*)
35
+ Requires-Dist: regex (>=2024.7.24,<2025.0.0)
36
+ Requires-Dist: requests (==2.32.*)
37
+ Requires-Dist: rich (==13.7.*)
38
+ Requires-Dist: types-openpyxl (==3.1.*)
39
+ Requires-Dist: typing-extensions (==4.14.*)
40
+ Requires-Dist: watchfiles (==0.21.*)
41
+ Description-Content-Type: text/markdown
42
+
43
+ # swo-extension-sdk
44
+ SDK for SoftwareONE python extensions
45
+
@@ -0,0 +1,53 @@
1
+ mpt_extension_sdk/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ mpt_extension_sdk/airtable/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
+ mpt_extension_sdk/airtable/wrap_http_error.py,sha256=Shiy4uwpdpgkevooLjhpe1grhgJRj7cV6lUMMCQKogc,1263
4
+ mpt_extension_sdk/constants.py,sha256=rlO7WRImnzrb41zlkjka25CQQtEYid-0iGaupg_pk_k,485
5
+ mpt_extension_sdk/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ mpt_extension_sdk/core/events/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
+ mpt_extension_sdk/core/events/dataclasses.py,sha256=wBxjEmjzIwpSH4trpCQKYQPNzONBAgr8eQzTr3ulzkA,469
8
+ mpt_extension_sdk/core/events/registry.py,sha256=RbiAem_FZk4W137xTILm0hRav46pII1dgXxVriBDxOo,1268
9
+ mpt_extension_sdk/core/extension.py,sha256=s0QE2s99RMywfKQRZrYqOdWxELQvlFFVZMwm0xo2hhw,266
10
+ mpt_extension_sdk/core/security.py,sha256=0eCed1cmaNK1rCpgnsN9zw6wzr4m_Qb9aKxscO0uyYk,1419
11
+ mpt_extension_sdk/core/utils.py,sha256=LsvciwlVBJCBbd7L1rIWrTo_8Fi-W_SkL6IEezKUb4s,362
12
+ mpt_extension_sdk/flows/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
13
+ mpt_extension_sdk/flows/context.py,sha256=J_U9nTtY89mUvrcOqdgpk-21F8f6YENSmjxgpVK6XWs,964
14
+ mpt_extension_sdk/flows/pipeline.py,sha256=3BO5X3jvuYnRTWrXRzImjVCVOCut8dSvkT2LZwfpaZk,1374
15
+ mpt_extension_sdk/key_vault/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ mpt_extension_sdk/key_vault/base.py,sha256=RVG_Wiq-MrPyngJ4gfUd8oxoh1LUop1SvtCM2xdlx8M,3361
17
+ mpt_extension_sdk/mpt_http/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
+ mpt_extension_sdk/mpt_http/base.py,sha256=3qgo9BW-uTRAbex26urMvLZU0fwnYnBprDRIJCHvTOk,1284
19
+ mpt_extension_sdk/mpt_http/mpt.py,sha256=4o1nVuQF_KfHD9svmb0B9yPjyVC-L_Jg8et8qL5AXpE,16040
20
+ mpt_extension_sdk/mpt_http/utils.py,sha256=3wJTT84CXYGjZw6FksNDX8tIHijkL3Wcmld9r6Iz0xc,95
21
+ mpt_extension_sdk/mpt_http/wrap_http_error.py,sha256=j8K6Ddx7NiM-FPRMQi25vuULAW8LXxzZ4EwuIJufxis,1801
22
+ mpt_extension_sdk/runtime/__init__.py,sha256=PQSAz9qvXHbxrn4KvuXSHB8y-A4Jpgbm6ZV-wPiNPyw,194
23
+ mpt_extension_sdk/runtime/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
+ mpt_extension_sdk/runtime/commands/django.py,sha256=j0UC9WKhaTi-sxwV4F-ZF3SE-657-Ucu_jEG0mIzJU4,1229
25
+ mpt_extension_sdk/runtime/commands/run.py,sha256=j-2eI4JJj4VNgVmES5tqKe1Pe2aKWgYchhpvT8Koq7Q,1146
26
+ mpt_extension_sdk/runtime/djapp/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
27
+ mpt_extension_sdk/runtime/djapp/apps.py,sha256=YA1G5HaRqFBS-0DfYQuFpMgzUCYpu5T8x5LEC6MwI_M,1398
28
+ mpt_extension_sdk/runtime/djapp/conf/__init__.py,sha256=_sHo76rGeXSTH8bW3pacyGFfNYSln8oLRwOSstYOmco,350
29
+ mpt_extension_sdk/runtime/djapp/conf/default.py,sha256=9eAB_hRnkok2I7E1NjYHs3x8ifrVc4_ihosm37Qq7Zo,6405
30
+ mpt_extension_sdk/runtime/djapp/conf/urls.py,sha256=g-h1vzwDgCGLliSE2BDjb1eRJevZxZ7ehJrqSis12So,309
31
+ mpt_extension_sdk/runtime/djapp/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ mpt_extension_sdk/runtime/djapp/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ mpt_extension_sdk/runtime/djapp/management/commands/consume_events.py,sha256=BVb4sgKI2Ep759bDcOH5Qm1xJEewc5-bNt_snspV2ck,1229
34
+ mpt_extension_sdk/runtime/djapp/middleware.py,sha256=oAA5khXW6xeUjnOV63pNCF4D7QFVD6PayIa_489KRmg,555
35
+ mpt_extension_sdk/runtime/events/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
+ mpt_extension_sdk/runtime/events/dispatcher.py,sha256=ZMswk50vGGfUgKeQ2Cc3k9wtrm63z0OH7EtlKCkWQYM,3008
37
+ mpt_extension_sdk/runtime/events/producers.py,sha256=lsHFfBxL5czZEAqZEyaIDZ-l8Q1T5_OhH5BGiXqw4Bk,3597
38
+ mpt_extension_sdk/runtime/events/utils.py,sha256=bxFo-iQUqEJDqcIotC88Ty3Xt0K2FyYjA9UMWFEyMKI,2663
39
+ mpt_extension_sdk/runtime/initializer.py,sha256=V8fubCULUJlvCBkYhJM52GUNoHNWVI-siaecmZv3kzk,2154
40
+ mpt_extension_sdk/runtime/logging.py,sha256=wJ6KyvnuvMZELI1Hd0fYbuHr7YiP3GIXFBvvSdmd7nQ,885
41
+ mpt_extension_sdk/runtime/master.py,sha256=ALbtAsb6ubhWcEpAXpzHSZixYXZ3Qfdf2ttOLb04nlc,4536
42
+ mpt_extension_sdk/runtime/swoext.py,sha256=LS0YZXwQsHDaYjalDGfYQi5cAL3aKQhphf3chrNmNBk,1665
43
+ mpt_extension_sdk/runtime/tracer.py,sha256=Mvt1BKBdSvb4FlOcjUDhIKEXmiYETrFGgHdhOQwEr7g,415
44
+ mpt_extension_sdk/runtime/utils.py,sha256=FWMsGCTPxgKPX8lbCpfCu-ZWuJCqnXZHVbt9bUHVJX4,4505
45
+ mpt_extension_sdk/runtime/workers.py,sha256=8KdI6neBEiMcc0zha8toCsZutvK2BhEXxb8NdTMrNO4,2677
46
+ mpt_extension_sdk/swo_rql/__init__.py,sha256=QrvRDYhpK-Pd3OF-U2aMeazuKm_kbvXwLRIjd9Mm6ok,104
47
+ mpt_extension_sdk/swo_rql/constants.py,sha256=39BZ78OzdU_dIQtoy-Z_5utXqEXRweIFvM9Zfxg9j5M,171
48
+ mpt_extension_sdk/swo_rql/query_builder.py,sha256=XAoMYV1jaAouYjpqrh8nMaDNzD0as-BhMx8rsvdeZ0k,10500
49
+ mpt_extension_sdk-4.5.0.dist-info/METADATA,sha256=rpA1rtC1fk0Y6Y6MxLBKEUpb9FBIq4zxLzkZ1lyFzxw,1708
50
+ mpt_extension_sdk-4.5.0.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
51
+ mpt_extension_sdk-4.5.0.dist-info/entry_points.txt,sha256=8uZQihFseK4Kp5XWHl9EDYneg-CLS8BFO-ygp0h34nc,143
52
+ mpt_extension_sdk-4.5.0.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
53
+ mpt_extension_sdk-4.5.0.dist-info/RECORD,,
@@ -0,0 +1,4 @@
1
+ Wheel-Version: 1.0
2
+ Generator: poetry-core 2.2.1
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
@@ -0,0 +1,6 @@
1
+ [console_scripts]
2
+ swoext=mpt_extension_sdk.runtime.swoext:main
3
+
4
+ [swo.mpt.sdk]
5
+ app_config=mpt_extension_sdk.runtime.djapp.apps:ExtensionConfig
6
+