exa-py 1.14.11__py3-none-any.whl → 1.14.12__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.

Potentially problematic release.


This version of exa-py might be problematic. Click here for more details.

@@ -1,7 +1,9 @@
1
1
  from .client import WebsetsClient
2
2
  from .imports import ImportsClient
3
+ from .events import EventsClient
3
4
 
4
5
  __all__ = [
5
6
  "WebsetsClient",
6
7
  "ImportsClient",
8
+ "EventsClient",
7
9
  ]
exa_py/websets/client.py CHANGED
@@ -18,6 +18,7 @@ from .enrichments import WebsetEnrichmentsClient
18
18
  from .webhooks import WebsetWebhooksClient
19
19
  from .monitors import MonitorsClient
20
20
  from .imports import ImportsClient
21
+ from .events import EventsClient
21
22
 
22
23
  class WebsetsClient(WebsetsBaseClient):
23
24
  """Client for managing Websets."""
@@ -30,6 +31,7 @@ class WebsetsClient(WebsetsBaseClient):
30
31
  self.webhooks = WebsetWebhooksClient(client)
31
32
  self.monitors = MonitorsClient(client)
32
33
  self.imports = ImportsClient(client)
34
+ self.events = EventsClient(client)
33
35
 
34
36
  def create(self, params: Union[Dict[str, Any], CreateWebsetParameters]) -> Webset:
35
37
  """Create a new Webset.
@@ -0,0 +1,3 @@
1
+ from .client import EventsClient
2
+
3
+ __all__ = ["EventsClient"]
@@ -0,0 +1,106 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import List, Optional, Union
4
+
5
+ from ..types import (
6
+ EventType,
7
+ ListEventsResponse,
8
+ WebsetCreatedEvent,
9
+ WebsetDeletedEvent,
10
+ WebsetIdleEvent,
11
+ WebsetPausedEvent,
12
+ WebsetItemCreatedEvent,
13
+ WebsetItemEnrichedEvent,
14
+ WebsetSearchCreatedEvent,
15
+ WebsetSearchUpdatedEvent,
16
+ WebsetSearchCanceledEvent,
17
+ WebsetSearchCompletedEvent,
18
+ )
19
+ from ..core.base import WebsetsBaseClient
20
+
21
+ # Type alias for all event types
22
+ Event = Union[
23
+ WebsetCreatedEvent,
24
+ WebsetDeletedEvent,
25
+ WebsetIdleEvent,
26
+ WebsetPausedEvent,
27
+ WebsetItemCreatedEvent,
28
+ WebsetItemEnrichedEvent,
29
+ WebsetSearchCreatedEvent,
30
+ WebsetSearchUpdatedEvent,
31
+ WebsetSearchCanceledEvent,
32
+ WebsetSearchCompletedEvent,
33
+ ]
34
+
35
+ class EventsClient(WebsetsBaseClient):
36
+ """Client for managing Events."""
37
+
38
+ def __init__(self, client):
39
+ super().__init__(client)
40
+
41
+ def list(self, *, cursor: Optional[str] = None, limit: Optional[int] = None,
42
+ types: Optional[List[EventType]] = None) -> ListEventsResponse:
43
+ """List all Events.
44
+
45
+ Args:
46
+ cursor (str, optional): The cursor to paginate through the results.
47
+ limit (int, optional): The number of results to return.
48
+ types (List[EventType], optional): The types of events to filter by.
49
+
50
+ Returns:
51
+ ListEventsResponse: List of events.
52
+ """
53
+ params = {}
54
+ if cursor is not None:
55
+ params["cursor"] = cursor
56
+ if limit is not None:
57
+ params["limit"] = limit
58
+ if types is not None:
59
+ # Convert EventType enums to their string values
60
+ params["types"] = [t.value if hasattr(t, 'value') else t for t in types]
61
+
62
+ response = self.request("/v0/events", params=params, method="GET")
63
+ return ListEventsResponse.model_validate(response)
64
+
65
+ def get(self, id: str) -> Event:
66
+ """Get an Event by ID.
67
+
68
+ Args:
69
+ id (str): The ID of the Event.
70
+
71
+ Returns:
72
+ Event: The retrieved event.
73
+ """
74
+ response = self.request(f"/v0/events/{id}", method="GET")
75
+
76
+ # The response should contain a 'type' field that helps us determine
77
+ # which specific event class to use for validation
78
+ event_type = response.get('type')
79
+
80
+ # Map event types to their corresponding classes
81
+ event_type_map = {
82
+ 'webset.created': WebsetCreatedEvent,
83
+ 'webset.deleted': WebsetDeletedEvent,
84
+ 'webset.idle': WebsetIdleEvent,
85
+ 'webset.paused': WebsetPausedEvent,
86
+ 'webset.item.created': WebsetItemCreatedEvent,
87
+ 'webset.item.enriched': WebsetItemEnrichedEvent,
88
+ 'webset.search.created': WebsetSearchCreatedEvent,
89
+ 'webset.search.updated': WebsetSearchUpdatedEvent,
90
+ 'webset.search.canceled': WebsetSearchCanceledEvent,
91
+ 'webset.search.completed': WebsetSearchCompletedEvent,
92
+ }
93
+
94
+ event_class = event_type_map.get(event_type)
95
+ if event_class:
96
+ return event_class.model_validate(response)
97
+ else:
98
+ # Fallback - try each type until one validates
99
+ # This shouldn't happen in normal operation
100
+ for event_class in event_type_map.values():
101
+ try:
102
+ return event_class.model_validate(response)
103
+ except Exception:
104
+ continue
105
+
106
+ raise ValueError(f"Unknown event type: {event_type}")
exa_py/websets/types.py CHANGED
@@ -6,7 +6,7 @@ from __future__ import annotations
6
6
 
7
7
  from datetime import datetime
8
8
  from enum import Enum
9
- from typing import Any, Dict, List, Literal, Optional, Union
9
+ from typing import Any, Dict, List, Literal, Optional, Union, Annotated
10
10
 
11
11
  from pydantic import AnyUrl, Field, PositiveInt, confloat, constr
12
12
  from .core.base import ExaBaseModel
@@ -287,20 +287,21 @@ class ImportSource(Enum):
287
287
 
288
288
 
289
289
  class ListEventsResponse(ExaBaseModel):
290
- data: List[
291
- Union[
292
- WebsetCreatedEvent,
293
- WebsetDeletedEvent,
294
- WebsetIdleEvent,
295
- WebsetPausedEvent,
296
- WebsetItemCreatedEvent,
297
- WebsetItemEnrichedEvent,
298
- WebsetSearchCreatedEvent,
299
- WebsetSearchUpdatedEvent,
300
- WebsetSearchCanceledEvent,
301
- WebsetSearchCompletedEvent,
302
- ]
303
- ] = Field(..., discriminator='type')
290
+ data: List[Annotated[
291
+ Union[
292
+ WebsetCreatedEvent,
293
+ WebsetDeletedEvent,
294
+ WebsetIdleEvent,
295
+ WebsetPausedEvent,
296
+ WebsetItemCreatedEvent,
297
+ WebsetItemEnrichedEvent,
298
+ WebsetSearchCreatedEvent,
299
+ WebsetSearchUpdatedEvent,
300
+ WebsetSearchCanceledEvent,
301
+ WebsetSearchCompletedEvent,
302
+ ],
303
+ Field(discriminator='type')
304
+ ]]
304
305
  """
305
306
  The list of events
306
307
  """
@@ -1440,6 +1441,17 @@ class WebsetItemPersonProperties(ExaBaseModel):
1440
1441
  """
1441
1442
 
1442
1443
 
1444
+ class WebsetItemPersonCompanyPropertiesFields(ExaBaseModel):
1445
+ name: str
1446
+ """
1447
+ The name of the company
1448
+ """
1449
+ location: Optional[str] = None
1450
+ """
1451
+ The location the person is working at the company
1452
+ """
1453
+
1454
+
1443
1455
  class WebsetItemPersonPropertiesFields(ExaBaseModel):
1444
1456
  name: str
1445
1457
  """
@@ -1453,6 +1465,10 @@ class WebsetItemPersonPropertiesFields(ExaBaseModel):
1453
1465
  """
1454
1466
  The current work position of the person
1455
1467
  """
1468
+ company: Optional[WebsetItemPersonCompanyPropertiesFields] = None
1469
+ """
1470
+ The company the person is working at
1471
+ """
1456
1472
  picture_url: Optional[AnyUrl] = Field(None, alias='pictureUrl')
1457
1473
  """
1458
1474
  The URL of the person's picture
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: exa-py
3
- Version: 1.14.11
3
+ Version: 1.14.12
4
4
  Summary: Python SDK for Exa API.
5
5
  Home-page: https://github.com/exa-labs/exa-py
6
6
  Author: Exa
@@ -5,13 +5,15 @@ exa_py/utils.py,sha256=sq1KOajuMWI1lygYeb9MqjXn8yqVyK0BtFZZmTwSaMY,2580
5
5
  exa_py/research/__init__.py,sha256=QeY-j6bP4QP5tF9ytX0IeQhJvd0Wn4cJCD69U8pP7kA,271
6
6
  exa_py/research/client.py,sha256=x9b299ROfbhdMrdto6jZCHGRJE5U5V2fWHsSlnnNkWo,12471
7
7
  exa_py/research/models.py,sha256=j7YgRoMRp2MLgnaij7775x_hJEeV5gksKpfLwmawqxY,3704
8
- exa_py/websets/__init__.py,sha256=6HQWR8_ABPeZx2sHfwGV4QQf1Eh8MRaO-kzoIO_1ua8,126
9
- exa_py/websets/client.py,sha256=nP0XZAEMIFvinb1DJ6gNF-8jCnKMUmBun5wZ9EgeZ0M,4891
10
- exa_py/websets/types.py,sha256=UC41VqvBcUueSqUjxmb0nLb-c7qmScoNkcmdyp9npqY,41736
8
+ exa_py/websets/__init__.py,sha256=x7Dc0MS8raRXA7Ud6alKgnsUmLi6X9GTqfB8kOwC9iQ,179
9
+ exa_py/websets/client.py,sha256=v8Y0p5PosjLkb7EYQ83g3nmoIIHmKaXF7JQVT8K5h2E,4967
10
+ exa_py/websets/types.py,sha256=ykJHPXNiqr2fbRYYprshgBcG9X5IRRwi2mu56g7XCZA,42085
11
11
  exa_py/websets/core/__init__.py,sha256=xOyrFaqtBocMUu321Jpbk7IzIQRNZufSIGJXrKoG-Bg,323
12
12
  exa_py/websets/core/base.py,sha256=thVIeRtlabbvueP0dAni5Nwtl9AWYv1I1Mmyc_jlYO0,4086
13
13
  exa_py/websets/enrichments/__init__.py,sha256=5dJIEKKceUost3RnI6PpCSB3VjUCBzxseEsIXu-ZY-Y,83
14
14
  exa_py/websets/enrichments/client.py,sha256=obUjn4vH6tKBMtHEBVdMzlN8in0Fx3sCP-bXx-Le1zM,2338
15
+ exa_py/websets/events/__init__.py,sha256=aFJ9O5UudtQQzndVmdB96IaM2l07qyM1B_8xKY7rp58,60
16
+ exa_py/websets/events/client.py,sha256=Hzatqp3X-K0ZGe36cjFMgbhnsErcDLdGWQVirhmHjvY,3622
15
17
  exa_py/websets/imports/__init__.py,sha256=iEl-fZZSdcvKaqLgjMES_0RwYn7hZDCMf6BZriCrjgw,64
16
18
  exa_py/websets/imports/client.py,sha256=nJs46hxlSkZm7qjboYHNBuJ62gLmA_Yzr9fc-NDky0Y,6795
17
19
  exa_py/websets/items/__init__.py,sha256=DCWZJVtRmUjnMEkKdb5gW1LT9cHcb-J8lENMnyyBeKU,71
@@ -24,7 +26,7 @@ exa_py/websets/searches/__init__.py,sha256=_0Zx8ES5fFTEL3T8mhLxq_xK2t0JONx6ad6At
24
26
  exa_py/websets/searches/client.py,sha256=X3f7axWGfecmxf-2tBTX0Yf_--xToz1X8ZHbbudEzy0,1790
25
27
  exa_py/websets/webhooks/__init__.py,sha256=iTPBCxFd73z4RifLQMX6iRECx_6pwlI5qscLNjMOUHE,77
26
28
  exa_py/websets/webhooks/client.py,sha256=zsIRMTeJU65yj-zo7Zz-gG02Prtzgcx6utGFSoY4HQQ,4222
27
- exa_py-1.14.11.dist-info/METADATA,sha256=ndNf4lDM1Vz44xlJO29qVVHGl6vvb9ozXiq3L6XOmpw,3719
28
- exa_py-1.14.11.dist-info/WHEEL,sha256=0CuiUZ_p9E4cD6NyLD6UG80LBXYyiSYZOKDm5lp32xk,91
29
- exa_py-1.14.11.dist-info/top_level.txt,sha256=Mfkmscdw9HWR1PtVhU1gAiVo6DHu_tyiVdb89gfZBVI,7
30
- exa_py-1.14.11.dist-info/RECORD,,
29
+ exa_py-1.14.12.dist-info/METADATA,sha256=sbyg90b0KSXgCm2UwwQBm6M5So9-0eh1eFUm4i8Fa_0,3719
30
+ exa_py-1.14.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
31
+ exa_py-1.14.12.dist-info/top_level.txt,sha256=Mfkmscdw9HWR1PtVhU1gAiVo6DHu_tyiVdb89gfZBVI,7
32
+ exa_py-1.14.12.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.3.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5