karrio-server-events 2025.5rc1__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 (44) hide show
  1. karrio/server/events/__init__.py +3 -0
  2. karrio/server/events/admin.py +3 -0
  3. karrio/server/events/apps.py +11 -0
  4. karrio/server/events/filters.py +63 -0
  5. karrio/server/events/migrations/0001_initial.py +65 -0
  6. karrio/server/events/migrations/0002_event.py +39 -0
  7. karrio/server/events/migrations/0003_auto_20220303_1210.py +25 -0
  8. karrio/server/events/migrations/0004_custom_migration_2022_4.py +41 -0
  9. karrio/server/events/migrations/0005_event_event_object_idx.py +18 -0
  10. karrio/server/events/migrations/0006_webhook_events_alter_event_data.py +85 -0
  11. karrio/server/events/migrations/0007_auto_20221130_0255.py +30 -0
  12. karrio/server/events/migrations/0008_alter_event_type.py +18 -0
  13. karrio/server/events/migrations/0009_alter_webhook_enabled_events.py +45 -0
  14. karrio/server/events/migrations/__init__.py +0 -0
  15. karrio/server/events/models.py +83 -0
  16. karrio/server/events/router.py +3 -0
  17. karrio/server/events/serializers/__init__.py +1 -0
  18. karrio/server/events/serializers/base.py +63 -0
  19. karrio/server/events/serializers/event.py +9 -0
  20. karrio/server/events/serializers/webhook.py +27 -0
  21. karrio/server/events/signals.py +138 -0
  22. karrio/server/events/task_definitions/__init__.py +1 -0
  23. karrio/server/events/task_definitions/base/__init__.py +64 -0
  24. karrio/server/events/task_definitions/base/archiving.py +58 -0
  25. karrio/server/events/task_definitions/base/tracking.py +227 -0
  26. karrio/server/events/task_definitions/base/webhook.py +116 -0
  27. karrio/server/events/tasks.py +20 -0
  28. karrio/server/events/tests/__init__.py +7 -0
  29. karrio/server/events/tests/test_events.py +138 -0
  30. karrio/server/events/tests/test_tracking_tasks.py +345 -0
  31. karrio/server/events/tests/test_webhooks.py +132 -0
  32. karrio/server/events/tests.py +3 -0
  33. karrio/server/events/urls.py +10 -0
  34. karrio/server/events/views/__init__.py +2 -0
  35. karrio/server/events/views/webhooks.py +173 -0
  36. karrio/server/graph/schemas/__init__.py +1 -0
  37. karrio/server/graph/schemas/events/__init__.py +47 -0
  38. karrio/server/graph/schemas/events/inputs.py +43 -0
  39. karrio/server/graph/schemas/events/mutations.py +56 -0
  40. karrio/server/graph/schemas/events/types.py +79 -0
  41. karrio_server_events-2025.5rc1.dist-info/METADATA +28 -0
  42. karrio_server_events-2025.5rc1.dist-info/RECORD +44 -0
  43. karrio_server_events-2025.5rc1.dist-info/WHEEL +5 -0
  44. karrio_server_events-2025.5rc1.dist-info/top_level.txt +2 -0
@@ -0,0 +1,173 @@
1
+ import logging
2
+
3
+ from django.urls import path
4
+ from rest_framework.request import Request
5
+ from rest_framework.response import Response
6
+ from rest_framework import status, serializers
7
+ from rest_framework.pagination import LimitOffsetPagination
8
+
9
+ import karrio.server.openapi as openapi
10
+ from karrio.server.core.views.api import GenericAPIView, APIView
11
+ from karrio.server.serializers import PaginatedResult, PlainDictField
12
+ from karrio.server.core.serializers import Operation, ErrorResponse
13
+ from karrio.server.events.serializers.webhook import (
14
+ WebhookData,
15
+ Webhook,
16
+ WebhookSerializer,
17
+ )
18
+ from karrio.server.events.task_definitions.base.webhook import notify_subscribers
19
+ from karrio.server.events.router import router
20
+ from karrio.server.events import models
21
+
22
+
23
+ logger = logging.getLogger(__name__)
24
+ ENDPOINT_ID = "$$$$$$$" # This endpoint id is used to make operation ids unique make sure not to duplicate
25
+ Webhooks = PaginatedResult("WebhookList", Webhook)
26
+
27
+
28
+ class WebhookTestRequest(serializers.Serializer):
29
+ payload = PlainDictField(required=True)
30
+
31
+
32
+ class WebhookList(GenericAPIView):
33
+ pagination_class = LimitOffsetPagination
34
+ default_limit = 20
35
+ serializer_class = Webhooks
36
+
37
+ @openapi.extend_schema(
38
+ tags=["Webhooks"],
39
+ operation_id=f"{ENDPOINT_ID}list",
40
+ extensions={"x-operationId": "listWebhooks"},
41
+ summary="List all webhooks",
42
+ responses={
43
+ 200: Webhooks(),
44
+ 404: ErrorResponse(),
45
+ 500: ErrorResponse(),
46
+ },
47
+ )
48
+ def get(self, request: Request):
49
+ """
50
+ Retrieve all webhooks.
51
+ """
52
+ webhooks = models.Webhook.access_by(request)
53
+ response = self.paginate_queryset(Webhook(webhooks, many=True).data)
54
+ return self.get_paginated_response(response)
55
+
56
+ @openapi.extend_schema(
57
+ tags=["Webhooks"],
58
+ operation_id=f"{ENDPOINT_ID}create",
59
+ extensions={"x-operationId": "createWebhook"},
60
+ summary="Create a webhook",
61
+ request=WebhookData(),
62
+ responses={
63
+ 201: Webhook(),
64
+ 400: ErrorResponse(),
65
+ 500: ErrorResponse(),
66
+ },
67
+ )
68
+ def post(self, request: Request):
69
+ """Create a new webhook."""
70
+ webhook = (
71
+ WebhookSerializer.map(data=request.data, context=request).save().instance
72
+ )
73
+
74
+ return Response(Webhook(webhook).data, status=status.HTTP_201_CREATED)
75
+
76
+
77
+ class WebhookDetails(APIView):
78
+
79
+ @openapi.extend_schema(
80
+ tags=["Webhooks"],
81
+ operation_id=f"{ENDPOINT_ID}retrieve",
82
+ extensions={"x-operationId": "retrieveWebhook"},
83
+ summary="Retrieve a webhook",
84
+ responses={
85
+ 201: Webhook(),
86
+ 404: ErrorResponse(),
87
+ 500: ErrorResponse(),
88
+ },
89
+ )
90
+ def get(self, request: Request, pk: str):
91
+ """
92
+ Retrieve a webhook.
93
+ """
94
+ webhook = models.Webhook.access_by(request).get(pk=pk)
95
+ return Response(Webhook(webhook).data)
96
+
97
+ @openapi.extend_schema(
98
+ tags=["Webhooks"],
99
+ operation_id=f"{ENDPOINT_ID}update",
100
+ extensions={"x-operationId": "updateWebhook"},
101
+ summary="Update a webhook",
102
+ request=WebhookData(),
103
+ responses={
104
+ 200: Webhook(),
105
+ 404: ErrorResponse(),
106
+ 400: ErrorResponse(),
107
+ 500: ErrorResponse(),
108
+ },
109
+ )
110
+ def patch(self, request: Request, pk: str):
111
+ """
112
+ update a webhook.
113
+ """
114
+ webhook = models.Webhook.access_by(request).get(pk=pk)
115
+
116
+ WebhookSerializer.map(webhook, data=request.data).save()
117
+ return Response(Webhook(webhook).data)
118
+
119
+ @openapi.extend_schema(
120
+ tags=["Webhooks"],
121
+ operation_id=f"{ENDPOINT_ID}remove",
122
+ extensions={"x-operationId": "removeWebhook"},
123
+ summary="Remove a webhook",
124
+ responses={
125
+ 200: Operation(),
126
+ 404: ErrorResponse(),
127
+ 500: ErrorResponse(),
128
+ },
129
+ )
130
+ def delete(self, request: Request, pk: str):
131
+ """
132
+ Remove a webhook.
133
+ """
134
+ webhook = models.Webhook.access_by(request).get(pk=pk)
135
+
136
+ webhook.delete(keep_parents=True)
137
+
138
+ return Response(Webhook(webhook).data)
139
+
140
+
141
+ class WebhookTest(APIView):
142
+
143
+ @openapi.extend_schema(
144
+ tags=["Webhooks"],
145
+ operation_id=f"{ENDPOINT_ID}test",
146
+ extensions={"x-operationId": "testWebhook"},
147
+ summary="Test a webhook",
148
+ request=WebhookTestRequest(),
149
+ responses={
150
+ 200: Operation(),
151
+ 400: ErrorResponse(),
152
+ 500: ErrorResponse(),
153
+ },
154
+ )
155
+ def post(self, request: Request, pk: str):
156
+ """
157
+ test a webhook.
158
+ """
159
+ webhook = models.Webhook.access_by(request).get(pk=pk)
160
+
161
+ notification, *_ = notify_subscribers([webhook], request.data)
162
+ _, response = notification
163
+ serializer = Operation(dict(operation="Test Webhook", success=response.ok))
164
+ return Response(serializer.data)
165
+
166
+
167
+ router.urls.append(path("webhooks", WebhookList.as_view(), name="webhook-list"))
168
+ router.urls.append(
169
+ path("webhooks/<str:pk>", WebhookDetails.as_view(), name="webhook-details")
170
+ )
171
+ router.urls.append(
172
+ path("webhooks/<str:pk>/test", WebhookTest.as_view(), name="webhook-test")
173
+ )
@@ -0,0 +1 @@
1
+ __path__ = __import__('pkgutil').extend_path(__path__, __name__) # type: ignore
@@ -0,0 +1,47 @@
1
+ import strawberry
2
+ from strawberry.types import Info
3
+
4
+ import karrio.server.graph.utils as utils
5
+ import karrio.server.graph.schemas.base as base
6
+ import karrio.server.graph.schemas.events.mutations as mutations
7
+ import karrio.server.graph.schemas.events.inputs as inputs
8
+ import karrio.server.graph.schemas.events.types as types
9
+ import karrio.server.events.models as models
10
+
11
+ extra_types: list = []
12
+
13
+
14
+ @strawberry.type
15
+ class Query:
16
+ webhook: types.WebhookType = strawberry.field(resolver=types.WebhookType.resolve)
17
+ webhooks: utils.Connection[types.WebhookType] = strawberry.field(
18
+ resolver=types.WebhookType.resolve_list
19
+ )
20
+
21
+ event: types.EventType = strawberry.field(resolver=types.EventType.resolve)
22
+ events: utils.Connection[types.EventType] = strawberry.field(
23
+ resolver=types.EventType.resolve_list
24
+ )
25
+
26
+
27
+ @strawberry.type
28
+ class Mutation:
29
+ @strawberry.mutation
30
+ def create_webhook(
31
+ self, info: Info, input: inputs.CreateWebhookMutationInput
32
+ ) -> mutations.CreateWebhookMutation:
33
+ return mutations.CreateWebhookMutation.mutate(info, **input.to_dict())
34
+
35
+ @strawberry.mutation
36
+ def update_webhook(
37
+ self, info: Info, input: inputs.UpdateWebhookMutationInput
38
+ ) -> mutations.UpdateWebhookMutation:
39
+ return mutations.UpdateWebhookMutation.mutate(info, **input.to_dict())
40
+
41
+ @strawberry.mutation
42
+ def delete_webhook(
43
+ self, info: Info, input: base.inputs.DeleteMutationInput
44
+ ) -> base.mutations.DeleteMutation:
45
+ return base.mutations.DeleteMutation.mutate(
46
+ info, model=models.Webhook, **input.to_dict()
47
+ )
@@ -0,0 +1,43 @@
1
+ import datetime
2
+ import typing
3
+ import strawberry
4
+
5
+ import karrio.server.graph.utils as utils
6
+ import karrio.server.events.serializers as serializers
7
+
8
+ EventStatusEnum: typing.Any = strawberry.enum(serializers.EventTypes)
9
+
10
+
11
+ @strawberry.input
12
+ class CreateWebhookMutationInput(utils.BaseInput):
13
+ url: str
14
+ enabled_events: typing.List[EventStatusEnum]
15
+ description: typing.Optional[str] = strawberry.UNSET
16
+ disabled: typing.Optional[bool] = False
17
+
18
+
19
+ @strawberry.input
20
+ class WebhookFilter(utils.Paginated):
21
+ url: typing.Optional[str] = strawberry.UNSET
22
+ disabled: typing.Optional[bool] = strawberry.UNSET
23
+ test_mode: typing.Optional[bool] = strawberry.UNSET
24
+ events: typing.Optional[typing.List[EventStatusEnum]] = strawberry.UNSET
25
+ date_after: typing.Optional[datetime.datetime] = strawberry.UNSET
26
+ date_before: typing.Optional[datetime.datetime] = strawberry.UNSET
27
+
28
+
29
+ @strawberry.input
30
+ class UpdateWebhookMutationInput(utils.BaseInput):
31
+ id: str
32
+ url: typing.Optional[str] = strawberry.UNSET
33
+ enabled_events: typing.List[EventStatusEnum] = strawberry.UNSET
34
+ description: typing.Optional[str] = strawberry.UNSET
35
+ disabled: typing.Optional[bool] = strawberry.UNSET
36
+
37
+
38
+ @strawberry.input
39
+ class EventFilter(utils.Paginated):
40
+ entity_id: typing.Optional[str] = strawberry.UNSET
41
+ type: typing.Optional[typing.List[EventStatusEnum]] = strawberry.UNSET
42
+ date_after: typing.Optional[datetime.datetime] = strawberry.UNSET
43
+ date_before: typing.Optional[datetime.datetime] = strawberry.UNSET
@@ -0,0 +1,56 @@
1
+ import typing
2
+ import strawberry
3
+ from strawberry.types import Info
4
+
5
+ import karrio.server.graph.utils as utils
6
+ import karrio.server.graph.schemas.events.types as types
7
+ import karrio.server.graph.schemas.events.inputs as inputs
8
+ import karrio.server.events.serializers.webhook as serializers
9
+ import karrio.server.events.models as models
10
+
11
+
12
+ @strawberry.type
13
+ class CreateWebhookMutation(utils.BaseMutation):
14
+ webhook: typing.Optional[types.WebhookType] = None
15
+
16
+ @staticmethod
17
+ @utils.authentication_required
18
+ @utils.authorization_required(["manage_webhooks"])
19
+ def mutate(
20
+ info: Info, **input: inputs.CreateWebhookMutationInput
21
+ ) -> "CreateWebhookMutation":
22
+ serializer = serializers.WebhookSerializer(
23
+ data=input,
24
+ context=info.context.request,
25
+ )
26
+ serializer.is_valid(raise_exception=True)
27
+
28
+ return CreateWebhookMutation(webhook=serializer.save()) # type:ignore
29
+
30
+
31
+ @strawberry.type
32
+ class UpdateWebhookMutation(utils.BaseMutation):
33
+ webhook: typing.Optional[types.WebhookType] = None
34
+
35
+ @staticmethod
36
+ @utils.authentication_required
37
+ @utils.authorization_required(["manage_webhooks"])
38
+ def mutate(
39
+ info: Info, **input: inputs.UpdateWebhookMutationInput
40
+ ) -> "UpdateWebhookMutation":
41
+ id = input.get("id")
42
+ webhook = models.Webhook.access_by(info.context.request).get(id=id)
43
+
44
+ serializer = serializers.WebhookSerializer(
45
+ webhook,
46
+ data=input,
47
+ partial=True,
48
+ context=info.context.request,
49
+ )
50
+ serializer.is_valid(raise_exception=True)
51
+ serializer.save()
52
+
53
+ # refetch the shipment to get the updated state with signals processed
54
+ update = models.Webhook.access_by(info.context.request).get(id=id)
55
+
56
+ return UpdateWebhookMutation(webhook=update) # type:ignore
@@ -0,0 +1,79 @@
1
+ import typing
2
+ import datetime
3
+ import strawberry
4
+
5
+ import karrio.lib as lib
6
+ import karrio.server.graph.utils as utils
7
+ import karrio.server.graph.schemas.base.types as base
8
+ import karrio.server.graph.schemas.events.inputs as inputs
9
+ import karrio.server.events.models as models
10
+ import karrio.server.events.filters as filters
11
+
12
+
13
+ @strawberry.type
14
+ class WebhookType:
15
+ object_type: str
16
+ id: str
17
+ url: typing.Optional[str]
18
+ secret: typing.Optional[str]
19
+ disabled: typing.Optional[bool]
20
+ test_mode: typing.Optional[bool]
21
+ description: typing.Optional[str]
22
+ enabled_events: typing.List[inputs.EventStatusEnum]
23
+ last_event_at: typing.Optional[datetime.datetime]
24
+ created_at: typing.Optional[datetime.datetime]
25
+ updated_at: typing.Optional[datetime.datetime]
26
+ created_by: typing.Optional[base.UserType]
27
+
28
+ @staticmethod
29
+ @utils.authentication_required
30
+ def resolve(info, id: str) -> typing.Optional["WebhookType"]:
31
+ return models.Webhook.access_by(info.context.request).filter(id=id).first()
32
+
33
+ @staticmethod
34
+ @utils.authentication_required
35
+ def resolve_list(
36
+ info,
37
+ filter: typing.Optional[inputs.WebhookFilter] = strawberry.UNSET,
38
+ ) -> utils.Connection["WebhookType"]:
39
+ _filter = filter if filter is not strawberry.UNSET else inputs.WebhookFilter()
40
+ queryset = filters.WebhookFilter(
41
+ _filter.to_dict(), models.Webhook.access_by(info.context.request)
42
+ ).qs
43
+ return utils.paginated_connection(queryset, **_filter.pagination())
44
+
45
+
46
+ @strawberry.type
47
+ class EventType:
48
+ object_type: str
49
+ id: str
50
+ test_mode: typing.Optional[bool]
51
+ pending_webhooks: typing.Optional[int]
52
+ type: typing.Optional[inputs.EventStatusEnum]
53
+ created_at: typing.Optional[datetime.datetime]
54
+ updated_at: typing.Optional[datetime.datetime]
55
+ created_by: typing.Optional[base.UserType]
56
+
57
+ @strawberry.field
58
+ def data(self: models.Event) -> typing.Optional[utils.JSON]:
59
+ try:
60
+ return lib.to_dict(self.data)
61
+ except:
62
+ return self.data
63
+
64
+ @staticmethod
65
+ @utils.authentication_required
66
+ def resolve(info, id: str) -> typing.Optional["EventType"]:
67
+ return models.Event.access_by(info.context.request).filter(id=id).first()
68
+
69
+ @staticmethod
70
+ @utils.authentication_required
71
+ def resolve_list(
72
+ info,
73
+ filter: typing.Optional[inputs.EventFilter] = strawberry.UNSET,
74
+ ) -> utils.Connection["EventType"]:
75
+ _filter = filter if filter is not strawberry.UNSET else inputs.EventFilter()
76
+ queryset = filters.EventFilter(
77
+ _filter.to_dict(), models.Event.access_by(info.context.request)
78
+ ).qs
79
+ return utils.paginated_connection(queryset, **_filter.pagination())
@@ -0,0 +1,28 @@
1
+ Metadata-Version: 2.4
2
+ Name: karrio_server_events
3
+ Version: 2025.5rc1
4
+ Summary: Multi-carrier shipping API Events module
5
+ Author-email: karrio <hello@karrio.io>
6
+ License-Expression: Apache-2.0
7
+ Project-URL: Homepage, https://github.com/karrioapi/karrio
8
+ Classifier: Programming Language :: Python :: 3
9
+ Requires-Python: >=3.11
10
+ Description-Content-Type: text/markdown
11
+ Requires-Dist: karrio_server_core
12
+ Requires-Dist: huey
13
+
14
+ # karrio.server.events
15
+
16
+ This package is a module of the [karrio](https://pypi.org/project/karrio.server) universal shipping API.
17
+
18
+ ## Requirements
19
+
20
+ `Python 3.11+`
21
+
22
+ ## Installation
23
+
24
+ ```bash
25
+ pip install karrio.server.events
26
+ ```
27
+
28
+ Check the [karrio docs](https://docs.karrio.io) to get started.
@@ -0,0 +1,44 @@
1
+ karrio/server/events/__init__.py,sha256=tvia3JfJUbr8axL76i0ic308Q0623SVKOyg0FXP3hBA,144
2
+ karrio/server/events/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63
3
+ karrio/server/events/apps.py,sha256=DIV8JdPB_3hD4DwhcQTevhph3PaceMkFSEGM1lOcdVY,301
4
+ karrio/server/events/filters.py,sha256=vMeY42IsoFl482-yX1BI17sw-9x9euOnzTl-860W3sg,2230
5
+ karrio/server/events/models.py,sha256=Ze4ITStRy_eb7qtujYbq7IISxvo7V2SKcmdCQ4fQO2I,2439
6
+ karrio/server/events/router.py,sha256=IBUR7rfBkdEHQzWxYOPcVSM8NBp3fte9G6Q5BVTUNNw,95
7
+ karrio/server/events/signals.py,sha256=gQ1FHwd-LXpg9OcV0inaqNBxSkqQVaztOgCOFNbo7I8,4549
8
+ karrio/server/events/tasks.py,sha256=RVLJ2cNEQnT-3bUoitw9C_ST6g7tlLyzuJvu8omLOHc,712
9
+ karrio/server/events/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
10
+ karrio/server/events/urls.py,sha256=oLTTzDWPhEFfK93EvzHTDRxqkw8Fr3iXneDXwFUkvcU,217
11
+ karrio/server/events/migrations/0001_initial.py,sha256=c_HS1Pt89fnDgc839eh2VGBN4mvICBGWH5OUC5Xsz8k,2212
12
+ karrio/server/events/migrations/0002_event.py,sha256=2f4SCoJcRXhPQRelH3EVRgpN77J0UmAW5yAtvvk42nc,1620
13
+ karrio/server/events/migrations/0003_auto_20220303_1210.py,sha256=aOqf2v9w1DgfDKTWWkP94EDFhL7pg_LjeNEIl7-XdPw,813
14
+ karrio/server/events/migrations/0004_custom_migration_2022_4.py,sha256=PjOvHs363wqVuYegVbDScEiw_iX9PHvg9fkviJaxcCI,1305
15
+ karrio/server/events/migrations/0005_event_event_object_idx.py,sha256=UsDbq4z4n7wY4QyehzLy_9NP6GCejCqZAF9uizeh6Ng,513
16
+ karrio/server/events/migrations/0006_webhook_events_alter_event_data.py,sha256=NJsoOUOEtarDO-7LCnrh8nxKmjyhe_mw-RhSIKDlYC0,2880
17
+ karrio/server/events/migrations/0007_auto_20221130_0255.py,sha256=o5tkTj6vzrqpOyX6mXAYS3GOYlDRMkMY4tcPxzOzvOc,780
18
+ karrio/server/events/migrations/0008_alter_event_type.py,sha256=DhUAI-yG_ugEv4f9oigdhn1lH_6A2nV8GyS-N63cmdQ,397
19
+ karrio/server/events/migrations/0009_alter_webhook_enabled_events.py,sha256=0bhn3Ab_4cW2Zjptw7yfKJT1iTnsrBl_7goCCquNzcQ,1825
20
+ karrio/server/events/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ karrio/server/events/serializers/__init__.py,sha256=S5KJONM1VFbB_Wyl__F2YbdSV7R_5RPNFos0ERkfDko,52
22
+ karrio/server/events/serializers/base.py,sha256=Civqqod7X2u8wUfQpx7NejFpQfqQD8UWjztSOX4iWzg,2158
23
+ karrio/server/events/serializers/event.py,sha256=dKYqldfSEjKMY7uB1rBFfEfSZ_dfEp8EPxbkBBSWzcc,289
24
+ karrio/server/events/serializers/webhook.py,sha256=Ri5JS1SXpSsPUvQH989T_7Amu1p46y5TP54MEEhK8j8,889
25
+ karrio/server/events/task_definitions/__init__.py,sha256=bpT73UG7mZL_JjEqMwbYx6q69jA8J5Jcoul1LcDokhA,81
26
+ karrio/server/events/task_definitions/base/__init__.py,sha256=3vP52gFdCo9hctLRKnYvEi9iz1UK8GL_a47Nw44h3Nc,1834
27
+ karrio/server/events/task_definitions/base/archiving.py,sha256=flbcxmD1pKlzCrYvekbwJ7Dvz4TaLdudAAsWH8JAjzI,2257
28
+ karrio/server/events/task_definitions/base/tracking.py,sha256=UL7-z1nVp3Scz-Nm6xuJB8S6obfaiHd-IyBXXIcrwOo,8533
29
+ karrio/server/events/task_definitions/base/webhook.py,sha256=NgXMJw_55pwZ5z4bu49VUekFNkUJ_cwvs01PNnLxhI4,3506
30
+ karrio/server/events/tests/__init__.py,sha256=5szv9hDvu0R0jtm3XWktY19rCaE8bZ2LdjRm4oJ0pYA,220
31
+ karrio/server/events/tests/test_events.py,sha256=Fxi1hv_lyuRJw5Y_ydywhq5P3akpxet4mFMFSiHU96c,4066
32
+ karrio/server/events/tests/test_tracking_tasks.py,sha256=oOPdjhVax4SzTgBwKxySosgWOX6ZJ2Y-cYvXp3kj0lw,12114
33
+ karrio/server/events/tests/test_webhooks.py,sha256=5Ts3RG_DQ5x0mnWRgTLOX-7FjSAEHXCvT913Sm7FLNM,3860
34
+ karrio/server/events/views/__init__.py,sha256=Y4hfjd_YSOHj6L7oH41bssVW8rXI_l4vD_IthfNuJ2o,90
35
+ karrio/server/events/views/webhooks.py,sha256=191DjXCoSTM_9AA-Kw-JxQ2TYQ6uYOQMrIDv11ZeTo0,5300
36
+ karrio/server/graph/schemas/__init__.py,sha256=iOEMwnlORWezdO8-2vxBIPSR37D7JGjluZ8f55vzxls,81
37
+ karrio/server/graph/schemas/events/__init__.py,sha256=Yg1rWew5DgSb_OnLy8n7qqwPLfVcZ1xm0_VzqP04rlE,1620
38
+ karrio/server/graph/schemas/events/inputs.py,sha256=Mgy9qCUrbL-sMI5dNXsnbW8K5_PnGKM13brzZrc5OWk,1526
39
+ karrio/server/graph/schemas/events/mutations.py,sha256=930g2D5TnAEgEjfEfLml1Q9OGCyxe2D592BhzSGDQAQ,1862
40
+ karrio/server/graph/schemas/events/types.py,sha256=TPlrDwQV4LZXu-1t4gFl_eYayU39THmgYT3uv7VXnnw,2759
41
+ karrio_server_events-2025.5rc1.dist-info/METADATA,sha256=jAONHcC5Qr-q3W4Qvxrm9f6J4KCeXuFU7kDeHsQcU8Y,704
42
+ karrio_server_events-2025.5rc1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
43
+ karrio_server_events-2025.5rc1.dist-info/top_level.txt,sha256=D1D7x8R3cTfjF_15mfiO7wCQ5QMtuM4x8GaPr7z5i78,12
44
+ karrio_server_events-2025.5rc1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ dist
2
+ karrio