linkedapi 1.3.1__tar.gz → 1.3.2__tar.gz

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 (105) hide show
  1. {linkedapi-1.3.1 → linkedapi-1.3.2}/PKG-INFO +1 -1
  2. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/__init__.py +7 -7
  3. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/client.py +9 -9
  4. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/__init__.py +6 -6
  5. linkedapi-1.3.2/linkedapi/operations/accept_invitation.py +12 -0
  6. linkedapi-1.3.2/linkedapi/operations/ignore_invitation.py +12 -0
  7. linkedapi-1.3.2/linkedapi/operations/retrieve_invitations.py +15 -0
  8. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/__init__.py +10 -6
  9. linkedapi-1.3.2/linkedapi/types/connection.py +172 -0
  10. {linkedapi-1.3.1 → linkedapi-1.3.2}/pyproject.toml +1 -1
  11. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_operations.py +84 -12
  12. linkedapi-1.3.1/linkedapi/operations/accept_connection_request.py +0 -12
  13. linkedapi-1.3.1/linkedapi/operations/ignore_connection_request.py +0 -12
  14. linkedapi-1.3.1/linkedapi/operations/retrieve_connection_requests.py +0 -15
  15. linkedapi-1.3.1/linkedapi/types/connection.py +0 -100
  16. {linkedapi-1.3.1 → linkedapi-1.3.2}/.github/workflows/publish.yaml +0 -0
  17. {linkedapi-1.3.1 → linkedapi-1.3.2}/.gitignore +0 -0
  18. {linkedapi-1.3.1 → linkedapi-1.3.2}/LICENSE +0 -0
  19. {linkedapi-1.3.1 → linkedapi-1.3.2}/README.md +0 -0
  20. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/admin/__init__.py +0 -0
  21. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/admin/accounts.py +0 -0
  22. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/admin/admin.py +0 -0
  23. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/admin/http_client.py +0 -0
  24. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/admin/limits.py +0 -0
  25. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/admin/subscription.py +0 -0
  26. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/admin/webhooks.py +0 -0
  27. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/config.py +0 -0
  28. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/core/__init__.py +0 -0
  29. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/core/operation.py +0 -0
  30. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/core/polling.py +0 -0
  31. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/errors.py +0 -0
  32. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/http/__init__.py +0 -0
  33. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/http/base.py +0 -0
  34. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/http/linked_api_http_client.py +0 -0
  35. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/mappers/__init__.py +0 -0
  36. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/mappers/array.py +0 -0
  37. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/mappers/base.py +0 -0
  38. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/mappers/send_message.py +0 -0
  39. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/mappers/simple.py +0 -0
  40. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/mappers/then.py +0 -0
  41. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/mappers/void.py +0 -0
  42. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/check_connection_status.py +0 -0
  43. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/comment_on_post.py +0 -0
  44. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/create_post.py +0 -0
  45. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/custom_workflow.py +0 -0
  46. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/fetch_company.py +0 -0
  47. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/fetch_job.py +0 -0
  48. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/fetch_person.py +0 -0
  49. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/fetch_post.py +0 -0
  50. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/manage_conversation.py +0 -0
  51. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/nv_fetch_company.py +0 -0
  52. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/nv_fetch_person.py +0 -0
  53. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/nv_manage_conversation.py +0 -0
  54. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/nv_search_companies.py +0 -0
  55. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/nv_search_people.py +0 -0
  56. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/nv_send_message.py +0 -0
  57. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/nv_sync_conversation.py +0 -0
  58. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/nv_sync_inbox.py +0 -0
  59. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/react_to_post.py +0 -0
  60. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/remove_connection.py +0 -0
  61. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/retrieve_connections.py +0 -0
  62. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/retrieve_pending_requests.py +0 -0
  63. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/retrieve_performance.py +0 -0
  64. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/retrieve_ssi.py +0 -0
  65. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/search_companies.py +0 -0
  66. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/search_jobs.py +0 -0
  67. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/search_people.py +0 -0
  68. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/send_connection_request.py +0 -0
  69. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/send_message.py +0 -0
  70. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/sync_conversation.py +0 -0
  71. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/sync_inbox.py +0 -0
  72. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/sync_network.py +0 -0
  73. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/operations/withdraw_connection_request.py +0 -0
  74. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/py.typed +0 -0
  75. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/account.py +0 -0
  76. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/admin/__init__.py +0 -0
  77. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/admin/accounts.py +0 -0
  78. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/admin/config.py +0 -0
  79. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/admin/limits.py +0 -0
  80. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/admin/subscription.py +0 -0
  81. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/base.py +0 -0
  82. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/company.py +0 -0
  83. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/jobs.py +0 -0
  84. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/message.py +0 -0
  85. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/network.py +0 -0
  86. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/params.py +0 -0
  87. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/person.py +0 -0
  88. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/post.py +0 -0
  89. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/responses.py +0 -0
  90. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/search_companies.py +0 -0
  91. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/search_people.py +0 -0
  92. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/statistics.py +0 -0
  93. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/webhooks.py +0 -0
  94. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/types/workflow.py +0 -0
  95. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/webhooks/__init__.py +0 -0
  96. {linkedapi-1.3.1 → linkedapi-1.3.2}/linkedapi/webhooks/parse.py +0 -0
  97. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/conftest.py +0 -0
  98. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_admin.py +0 -0
  99. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_direct_methods.py +0 -0
  100. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_errors.py +0 -0
  101. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_http_client.py +0 -0
  102. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_mappers.py +0 -0
  103. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_models.py +0 -0
  104. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_polling.py +0 -0
  105. {linkedapi-1.3.1 → linkedapi-1.3.2}/tests/test_webhooks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: linkedapi
3
- Version: 1.3.1
3
+ Version: 1.3.2
4
4
  Summary: Official synchronous Python SDK for Linked API.
5
5
  Project-URL: Homepage, https://linkedapi.io
6
6
  Project-URL: Repository, https://github.com/Linked-API/linkedapi-python
@@ -29,7 +29,7 @@ from linkedapi.mappers import (
29
29
  VoidWorkflowMapper,
30
30
  )
31
31
  from linkedapi.operations import (
32
- AcceptConnectionRequest,
32
+ AcceptInvitation,
33
33
  CheckConnectionStatus,
34
34
  CommentOnPost,
35
35
  CreatePost,
@@ -42,7 +42,7 @@ from linkedapi.operations import (
42
42
  FetchPersonMapper,
43
43
  FetchPost,
44
44
  FetchPostMapper,
45
- IgnoreConnectionRequest,
45
+ IgnoreInvitation,
46
46
  ManageConversation,
47
47
  NvFetchCompany,
48
48
  NvFetchCompanyMapper,
@@ -56,8 +56,8 @@ from linkedapi.operations import (
56
56
  NvSyncInbox,
57
57
  ReactToPost,
58
58
  RemoveConnection,
59
- RetrieveConnectionRequests,
60
59
  RetrieveConnections,
60
+ RetrieveInvitations,
61
61
  RetrievePendingRequests,
62
62
  RetrievePerformance,
63
63
  RetrieveSSI,
@@ -75,12 +75,12 @@ from linkedapi.types import * # noqa: F403
75
75
  from linkedapi.types import __all__ as _types_all
76
76
  from linkedapi.webhooks import parse_webhook_event
77
77
 
78
- __version__ = "1.2.1"
78
+ __version__ = "1.3.2"
79
79
  PredefinedOperation = Operation
80
80
 
81
81
  __all__ = [
82
82
  *_types_all,
83
- "AcceptConnectionRequest",
83
+ "AcceptInvitation",
84
84
  "AdminAccounts",
85
85
  "AdminHttpClient",
86
86
  "AdminLimits",
@@ -102,7 +102,7 @@ __all__ = [
102
102
  "FetchPost",
103
103
  "FetchPostMapper",
104
104
  "HttpClient",
105
- "IgnoreConnectionRequest",
105
+ "IgnoreInvitation",
106
106
  "LINKED_API_ACTION_ERROR_TYPES",
107
107
  "LINKED_API_ERROR_TYPES",
108
108
  "LinkedApi",
@@ -130,7 +130,7 @@ __all__ = [
130
130
  "ReactToPost",
131
131
  "RemoveConnection",
132
132
  "ResponseMapping",
133
- "RetrieveConnectionRequests",
133
+ "RetrieveInvitations",
134
134
  "RetrieveConnections",
135
135
  "RetrievePendingRequests",
136
136
  "RetrievePerformance",
@@ -8,7 +8,7 @@ from linkedapi.errors import LinkedApiError
8
8
  from linkedapi.http import HttpClient, LinkedApiHttpClient
9
9
  from linkedapi.mappers import MappedResponse
10
10
  from linkedapi.operations import (
11
- AcceptConnectionRequest,
11
+ AcceptInvitation,
12
12
  CheckConnectionStatus,
13
13
  CommentOnPost,
14
14
  CreatePost,
@@ -17,7 +17,7 @@ from linkedapi.operations import (
17
17
  FetchJob,
18
18
  FetchPerson,
19
19
  FetchPost,
20
- IgnoreConnectionRequest,
20
+ IgnoreInvitation,
21
21
  ManageConversation,
22
22
  NvFetchCompany,
23
23
  NvFetchPerson,
@@ -29,8 +29,8 @@ from linkedapi.operations import (
29
29
  NvSyncInbox,
30
30
  ReactToPost,
31
31
  RemoveConnection,
32
- RetrieveConnectionRequests,
33
32
  RetrieveConnections,
33
+ RetrieveInvitations,
34
34
  RetrievePendingRequests,
35
35
  RetrievePerformance,
36
36
  RetrieveSSI,
@@ -74,10 +74,10 @@ class LinkedApi:
74
74
  self.check_connection_status = CheckConnectionStatus(self.http_client)
75
75
  self.send_connection_request = SendConnectionRequest(self.http_client)
76
76
  self.withdraw_connection_request = WithdrawConnectionRequest(self.http_client)
77
- self.accept_connection_request = AcceptConnectionRequest(self.http_client)
78
- self.ignore_connection_request = IgnoreConnectionRequest(self.http_client)
77
+ self.accept_invitation = AcceptInvitation(self.http_client)
78
+ self.ignore_invitation = IgnoreInvitation(self.http_client)
79
79
  self.retrieve_pending_requests = RetrievePendingRequests(self.http_client)
80
- self.retrieve_connection_requests = RetrieveConnectionRequests(self.http_client)
80
+ self.retrieve_invitations = RetrieveInvitations(self.http_client)
81
81
  self.retrieve_connections = RetrieveConnections(self.http_client)
82
82
  self.remove_connection = RemoveConnection(self.http_client)
83
83
  self.search_companies = SearchCompanies(self.http_client)
@@ -111,10 +111,10 @@ class LinkedApi:
111
111
  self.check_connection_status,
112
112
  self.send_connection_request,
113
113
  self.withdraw_connection_request,
114
- self.accept_connection_request,
115
- self.ignore_connection_request,
114
+ self.accept_invitation,
115
+ self.ignore_invitation,
116
116
  self.retrieve_pending_requests,
117
- self.retrieve_connection_requests,
117
+ self.retrieve_invitations,
118
118
  self.retrieve_connections,
119
119
  self.remove_connection,
120
120
  self.search_companies,
@@ -1,4 +1,4 @@
1
- from linkedapi.operations.accept_connection_request import AcceptConnectionRequest
1
+ from linkedapi.operations.accept_invitation import AcceptInvitation
2
2
  from linkedapi.operations.check_connection_status import CheckConnectionStatus
3
3
  from linkedapi.operations.comment_on_post import CommentOnPost
4
4
  from linkedapi.operations.create_post import CreatePost
@@ -7,7 +7,7 @@ from linkedapi.operations.fetch_company import FetchCompany, FetchCompanyMapper
7
7
  from linkedapi.operations.fetch_job import FetchJob, FetchJobMapper
8
8
  from linkedapi.operations.fetch_person import FetchPerson, FetchPersonMapper
9
9
  from linkedapi.operations.fetch_post import FetchPost, FetchPostMapper
10
- from linkedapi.operations.ignore_connection_request import IgnoreConnectionRequest
10
+ from linkedapi.operations.ignore_invitation import IgnoreInvitation
11
11
  from linkedapi.operations.manage_conversation import ManageConversation
12
12
  from linkedapi.operations.nv_fetch_company import NvFetchCompany, NvFetchCompanyMapper
13
13
  from linkedapi.operations.nv_fetch_person import NvFetchPerson, NvFetchPersonMapper
@@ -19,8 +19,8 @@ from linkedapi.operations.nv_sync_conversation import NvSyncConversation
19
19
  from linkedapi.operations.nv_sync_inbox import NvSyncInbox
20
20
  from linkedapi.operations.react_to_post import ReactToPost
21
21
  from linkedapi.operations.remove_connection import RemoveConnection
22
- from linkedapi.operations.retrieve_connection_requests import RetrieveConnectionRequests
23
22
  from linkedapi.operations.retrieve_connections import RetrieveConnections
23
+ from linkedapi.operations.retrieve_invitations import RetrieveInvitations
24
24
  from linkedapi.operations.retrieve_pending_requests import RetrievePendingRequests
25
25
  from linkedapi.operations.retrieve_performance import RetrievePerformance
26
26
  from linkedapi.operations.retrieve_ssi import RetrieveSSI
@@ -35,7 +35,7 @@ from linkedapi.operations.sync_network import SyncNetwork
35
35
  from linkedapi.operations.withdraw_connection_request import WithdrawConnectionRequest
36
36
 
37
37
  __all__ = [
38
- "AcceptConnectionRequest",
38
+ "AcceptInvitation",
39
39
  "CheckConnectionStatus",
40
40
  "CommentOnPost",
41
41
  "CreatePost",
@@ -48,7 +48,7 @@ __all__ = [
48
48
  "FetchPersonMapper",
49
49
  "FetchPost",
50
50
  "FetchPostMapper",
51
- "IgnoreConnectionRequest",
51
+ "IgnoreInvitation",
52
52
  "ManageConversation",
53
53
  "NvFetchCompany",
54
54
  "NvFetchCompanyMapper",
@@ -62,8 +62,8 @@ __all__ = [
62
62
  "NvSyncInbox",
63
63
  "ReactToPost",
64
64
  "RemoveConnection",
65
- "RetrieveConnectionRequests",
66
65
  "RetrieveConnections",
66
+ "RetrieveInvitations",
67
67
  "RetrievePendingRequests",
68
68
  "RetrievePerformance",
69
69
  "RetrieveSSI",
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from linkedapi.core import Operation
4
+ from linkedapi.mappers import VoidWorkflowMapper
5
+ from linkedapi.types import AcceptInvitationParams
6
+
7
+
8
+ class AcceptInvitation(Operation[AcceptInvitationParams, None]):
9
+ """Accept an incoming standard LinkedIn invitation."""
10
+
11
+ operation_name = "acceptInvitation"
12
+ mapper = VoidWorkflowMapper[AcceptInvitationParams]("st.acceptInvitation")
@@ -0,0 +1,12 @@
1
+ from __future__ import annotations
2
+
3
+ from linkedapi.core import Operation
4
+ from linkedapi.mappers import VoidWorkflowMapper
5
+ from linkedapi.types import IgnoreInvitationParams
6
+
7
+
8
+ class IgnoreInvitation(Operation[IgnoreInvitationParams, None]):
9
+ """Ignore an incoming standard LinkedIn invitation."""
10
+
11
+ operation_name = "ignoreInvitation"
12
+ mapper = VoidWorkflowMapper[IgnoreInvitationParams]("st.ignoreInvitation")
@@ -0,0 +1,15 @@
1
+ from __future__ import annotations
2
+
3
+ from linkedapi.core import Operation
4
+ from linkedapi.mappers import ArrayWorkflowMapper
5
+ from linkedapi.types import Invitation
6
+
7
+
8
+ class RetrieveInvitations(Operation[None, list[Invitation]]):
9
+ """Retrieve incoming LinkedIn invitations."""
10
+
11
+ operation_name = "retrieveInvitations"
12
+ mapper = ArrayWorkflowMapper[None, Invitation](
13
+ "st.retrieveInvitations",
14
+ Invitation,
15
+ )
@@ -68,16 +68,18 @@ from linkedapi.types.company import (
68
68
  StCompanyEmployeesRetrievalConfig,
69
69
  )
70
70
  from linkedapi.types.connection import (
71
- AcceptConnectionRequestParams,
71
+ AcceptInvitationParams,
72
72
  CheckConnectionStatusParams,
73
73
  CheckConnectionStatusResult,
74
74
  ConnectionPerson,
75
75
  ConnectionStatus,
76
- IgnoreConnectionRequestParams,
76
+ IgnoreInvitationParams,
77
+ Invitation,
78
+ InvitationTargetParams,
79
+ InvitationType,
77
80
  NvOpenPersonPageParams,
78
81
  NvOpenPersonPageResult,
79
82
  RemoveConnectionParams,
80
- RetrieveConnectionRequestsResult,
81
83
  RetrieveConnectionsFilter,
82
84
  RetrieveConnectionsParams,
83
85
  RetrieveConnectionsResult,
@@ -233,7 +235,7 @@ from linkedapi.types.workflow import (
233
235
  )
234
236
 
235
237
  __all__ = [
236
- "AcceptConnectionRequestParams",
238
+ "AcceptInvitationParams",
237
239
  "AccountInfo",
238
240
  "AccountWebhookEvent",
239
241
  "AccountWebhookEventData",
@@ -290,9 +292,12 @@ __all__ = [
290
292
  "GetConnectionSessionParams",
291
293
  "GetLimitsParams",
292
294
  "GetLimitsUsageParams",
293
- "IgnoreConnectionRequestParams",
295
+ "IgnoreInvitationParams",
294
296
  "InboxMessage",
295
297
  "InboxPollRequest",
298
+ "Invitation",
299
+ "InvitationTargetParams",
300
+ "InvitationType",
296
301
  "Job",
297
302
  "JobCurrency",
298
303
  "JobDatePosted",
@@ -375,7 +380,6 @@ __all__ = [
375
380
  "ReparseAccountInfoResult",
376
381
  "ReplayWebhookDeliveryParams",
377
382
  "ResetLimitsParams",
378
- "RetrieveConnectionRequestsResult",
379
383
  "RetrieveConnectionsFilter",
380
384
  "RetrieveConnectionsParams",
381
385
  "RetrieveConnectionsResult",
@@ -0,0 +1,172 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Literal
4
+
5
+ from pydantic import model_validator
6
+
7
+ from linkedapi.types.base import LinkedApiModel
8
+ from linkedapi.types.params import BaseActionParams, LimitParams
9
+
10
+ ConnectionStatus = Literal["connected", "pending", "incoming", "notConnected"]
11
+ InvitationType = Literal["connect", "companyFollow", "newsletterSubscribe"]
12
+
13
+
14
+ class ConnectionPerson(LinkedApiModel):
15
+ name: str | None = None
16
+ public_url: str | None = None
17
+ headline: str | None = None
18
+ location: str | None = None
19
+ profile_image_url: str | None = None
20
+
21
+
22
+ class SendConnectionRequestParams(BaseActionParams):
23
+ person_url: str
24
+ note: str | None = None
25
+ email: str | None = None
26
+
27
+
28
+ class CheckConnectionStatusParams(BaseActionParams):
29
+ person_url: str
30
+
31
+
32
+ class CheckConnectionStatusResult(LinkedApiModel):
33
+ connection_status: ConnectionStatus | None = None
34
+
35
+
36
+ class WithdrawConnectionRequestParams(BaseActionParams):
37
+ person_url: str
38
+ unfollow: bool | None = None
39
+
40
+
41
+ class RetrievePendingRequestsResult(LinkedApiModel):
42
+ name: str | None = None
43
+ public_url: str | None = None
44
+ headline: str | None = None
45
+ sent_time: str | None = None
46
+
47
+
48
+ class InvitationTargetParams(BaseActionParams):
49
+ invitation_type: InvitationType
50
+ person_url: str | None = None
51
+ company_url: str | None = None
52
+ newsletter_url: str | None = None
53
+
54
+ @model_validator(mode="after")
55
+ def validate_target_url(self) -> InvitationTargetParams:
56
+ target_urls = {
57
+ "connect": self.person_url,
58
+ "companyFollow": self.company_url,
59
+ "newsletterSubscribe": self.newsletter_url,
60
+ }
61
+ if target_urls[self.invitation_type] is None:
62
+ msg = f"{self.invitation_type} invitation requires its matching target URL"
63
+ raise ValueError(msg)
64
+ if sum(url is not None for url in target_urls.values()) != 1:
65
+ msg = "Provide only the target URL that matches invitation_type"
66
+ raise ValueError(msg)
67
+ return self
68
+
69
+
70
+ class AcceptInvitationParams(InvitationTargetParams):
71
+ pass
72
+
73
+
74
+ class IgnoreInvitationParams(InvitationTargetParams):
75
+ pass
76
+
77
+
78
+ class Invitation(LinkedApiModel):
79
+ invitation_type: InvitationType
80
+ name: str
81
+ public_url: str
82
+ headline: str | None = None
83
+ note: str | None = None
84
+ company_url: str | None = None
85
+ company_name: str | None = None
86
+ newsletter_url: str | None = None
87
+ newsletter_name: str | None = None
88
+
89
+ @model_validator(mode="after")
90
+ def validate_type_fields(self) -> Invitation:
91
+ type_fields = {
92
+ "headline",
93
+ "note",
94
+ "company_url",
95
+ "company_name",
96
+ "newsletter_url",
97
+ "newsletter_name",
98
+ }
99
+ required_fields = {
100
+ "connect": {"headline", "note"},
101
+ "companyFollow": {"company_url", "company_name"},
102
+ "newsletterSubscribe": {"newsletter_url", "newsletter_name"},
103
+ }[self.invitation_type]
104
+ missing_fields = required_fields - self.model_fields_set
105
+ if missing_fields:
106
+ msg = (
107
+ f"{self.invitation_type} invitation is missing required fields: "
108
+ f"{', '.join(sorted(missing_fields))}"
109
+ )
110
+ raise ValueError(msg)
111
+
112
+ unexpected_fields = (self.model_fields_set & type_fields) - required_fields
113
+ if unexpected_fields:
114
+ msg = (
115
+ f"{self.invitation_type} invitation contains fields for another type: "
116
+ f"{', '.join(sorted(unexpected_fields))}"
117
+ )
118
+ raise ValueError(msg)
119
+
120
+ target_url = {
121
+ "connect": self.public_url,
122
+ "companyFollow": self.company_url,
123
+ "newsletterSubscribe": self.newsletter_url,
124
+ }[self.invitation_type]
125
+ if target_url is None:
126
+ msg = f"{self.invitation_type} invitation requires a non-null target URL"
127
+ raise ValueError(msg)
128
+ return self
129
+
130
+
131
+ class RetrieveConnectionsFilter(LinkedApiModel):
132
+ first_name: str | None = None
133
+ last_name: str | None = None
134
+ position: str | None = None
135
+ locations: list[str] | None = None
136
+ industries: list[str] | None = None
137
+ current_companies: list[str] | None = None
138
+ previous_companies: list[str] | None = None
139
+ schools: list[str] | None = None
140
+
141
+
142
+ class RetrieveConnectionsParams(LimitParams):
143
+ since: str | None = None
144
+ filter: RetrieveConnectionsFilter | None = None
145
+
146
+
147
+ class RetrieveConnectionsResult(LinkedApiModel):
148
+ name: str | None = None
149
+ public_url: str | None = None
150
+ headline: str | None = None
151
+ location: str | None = None
152
+ connected_at: str | None = None
153
+
154
+
155
+ class RemoveConnectionParams(BaseActionParams):
156
+ person_url: str
157
+
158
+
159
+ class NvOpenPersonPageParams(BaseActionParams):
160
+ person_hashed_url: str
161
+
162
+
163
+ class NvOpenPersonPageResult(LinkedApiModel):
164
+ name: str | None = None
165
+ public_url: str | None = None
166
+ hashed_url: str | None = None
167
+ headline: str | None = None
168
+ location: str | None = None
169
+ country_code: str | None = None
170
+ position: str | None = None
171
+ company_name: str | None = None
172
+ company_hashed_url: str | None = None
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "linkedapi"
7
- version = "1.3.1"
7
+ version = "1.3.2"
8
8
  description = "Official synchronous Python SDK for Linked API."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10"
@@ -1,10 +1,14 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import pytest
3
4
  from conftest import FakeHttpClient
5
+ from pydantic import ValidationError
4
6
 
5
7
  from linkedapi import (
8
+ AcceptInvitationParams,
6
9
  ArrayWorkflowMapper,
7
10
  FetchPersonParams,
11
+ Invitation,
8
12
  LinkedApi,
9
13
  LinkedApiConfig,
10
14
  VoidWorkflowMapper,
@@ -29,10 +33,10 @@ def test_linked_api_exposes_all_predefined_operations() -> None:
29
33
  "send_connection_request",
30
34
  "check_connection_status",
31
35
  "withdraw_connection_request",
32
- "accept_connection_request",
33
- "ignore_connection_request",
36
+ "accept_invitation",
37
+ "ignore_invitation",
34
38
  "retrieve_pending_requests",
35
- "retrieve_connection_requests",
39
+ "retrieve_invitations",
36
40
  "retrieve_connections",
37
41
  "remove_connection",
38
42
  "send_message",
@@ -72,15 +76,12 @@ def test_operation_mappers_match_node_contract() -> None:
72
76
  assert linkedapi.fetch_job.mapper.default_params == {"basicInfo": True}
73
77
  assert isinstance(linkedapi.send_connection_request.mapper, VoidWorkflowMapper)
74
78
  assert linkedapi.send_connection_request.mapper.action_type == "st.sendConnectionRequest"
75
- assert isinstance(linkedapi.accept_connection_request.mapper, VoidWorkflowMapper)
76
- assert linkedapi.accept_connection_request.mapper.action_type == "st.acceptConnectionRequest"
77
- assert isinstance(linkedapi.ignore_connection_request.mapper, VoidWorkflowMapper)
78
- assert linkedapi.ignore_connection_request.mapper.action_type == "st.ignoreConnectionRequest"
79
- assert isinstance(linkedapi.retrieve_connection_requests.mapper, ArrayWorkflowMapper)
80
- assert (
81
- linkedapi.retrieve_connection_requests.mapper.base_action_type
82
- == "st.retrieveConnectionRequests"
83
- )
79
+ assert isinstance(linkedapi.accept_invitation.mapper, VoidWorkflowMapper)
80
+ assert linkedapi.accept_invitation.mapper.action_type == "st.acceptInvitation"
81
+ assert isinstance(linkedapi.ignore_invitation.mapper, VoidWorkflowMapper)
82
+ assert linkedapi.ignore_invitation.mapper.action_type == "st.ignoreInvitation"
83
+ assert isinstance(linkedapi.retrieve_invitations.mapper, ArrayWorkflowMapper)
84
+ assert linkedapi.retrieve_invitations.mapper.base_action_type == "st.retrieveInvitations"
84
85
  assert isinstance(linkedapi.sync_inbox.mapper, VoidWorkflowMapper)
85
86
  assert linkedapi.sync_inbox.mapper.action_type == "st.syncInbox"
86
87
  assert isinstance(linkedapi.nv_sync_inbox.mapper, VoidWorkflowMapper)
@@ -91,6 +92,77 @@ def test_operation_mappers_match_node_contract() -> None:
91
92
  assert linkedapi.nv_manage_conversation.mapper.action_type == "nv.manageConversation"
92
93
 
93
94
 
95
+ def test_invitation_params_require_the_matching_target_url() -> None:
96
+ params = AcceptInvitationParams(
97
+ invitation_type="companyFollow",
98
+ company_url="https://www.linkedin.com/company/example/",
99
+ )
100
+
101
+ assert params.model_dump(by_alias=True, exclude_none=True) == {
102
+ "invitationType": "companyFollow",
103
+ "companyUrl": "https://www.linkedin.com/company/example/",
104
+ }
105
+
106
+ with pytest.raises(ValidationError):
107
+ AcceptInvitationParams(
108
+ invitation_type="newsletterSubscribe",
109
+ person_url="https://www.linkedin.com/in/example/",
110
+ )
111
+
112
+ with pytest.raises(ValidationError):
113
+ AcceptInvitationParams(
114
+ invitation_type="connect",
115
+ person_url="https://www.linkedin.com/in/example/",
116
+ company_url="https://www.linkedin.com/company/example/",
117
+ )
118
+
119
+
120
+ def test_invitation_result_fields_depend_on_type() -> None:
121
+ connect = Invitation.model_validate(
122
+ {
123
+ "invitationType": "connect",
124
+ "name": "Example Person",
125
+ "publicUrl": "https://www.linkedin.com/in/example/",
126
+ "headline": None,
127
+ "note": None,
128
+ }
129
+ )
130
+ assert connect.invitation_type == "connect"
131
+
132
+ company_follow = Invitation.model_validate(
133
+ {
134
+ "invitationType": "companyFollow",
135
+ "name": "Example Person",
136
+ "publicUrl": "https://www.linkedin.com/in/example/",
137
+ "companyUrl": "https://www.linkedin.com/company/example/",
138
+ "companyName": None,
139
+ }
140
+ )
141
+ assert company_follow.company_url == "https://www.linkedin.com/company/example/"
142
+
143
+ with pytest.raises(ValidationError):
144
+ Invitation.model_validate(
145
+ {
146
+ "invitationType": "connect",
147
+ "name": "Example Person",
148
+ "publicUrl": "https://www.linkedin.com/in/example/",
149
+ "headline": None,
150
+ }
151
+ )
152
+
153
+ with pytest.raises(ValidationError):
154
+ Invitation.model_validate(
155
+ {
156
+ "invitationType": "companyFollow",
157
+ "name": "Example Person",
158
+ "publicUrl": "https://www.linkedin.com/in/example/",
159
+ "companyUrl": "https://www.linkedin.com/company/example/",
160
+ "companyName": None,
161
+ "note": None,
162
+ }
163
+ )
164
+
165
+
94
166
  def test_execute_and_result_flow_returns_pydantic_data(
95
167
  fake_http_client: FakeHttpClient,
96
168
  person_data: dict[str, object],
@@ -1,12 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from linkedapi.core import Operation
4
- from linkedapi.mappers import VoidWorkflowMapper
5
- from linkedapi.types import AcceptConnectionRequestParams
6
-
7
-
8
- class AcceptConnectionRequest(Operation[AcceptConnectionRequestParams, None]):
9
- """Accept an incoming standard LinkedIn connection request."""
10
-
11
- operation_name = "acceptConnectionRequest"
12
- mapper = VoidWorkflowMapper[AcceptConnectionRequestParams]("st.acceptConnectionRequest")
@@ -1,12 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from linkedapi.core import Operation
4
- from linkedapi.mappers import VoidWorkflowMapper
5
- from linkedapi.types import IgnoreConnectionRequestParams
6
-
7
-
8
- class IgnoreConnectionRequest(Operation[IgnoreConnectionRequestParams, None]):
9
- """Ignore an incoming standard LinkedIn connection request."""
10
-
11
- operation_name = "ignoreConnectionRequest"
12
- mapper = VoidWorkflowMapper[IgnoreConnectionRequestParams]("st.ignoreConnectionRequest")
@@ -1,15 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from linkedapi.core import Operation
4
- from linkedapi.mappers import ArrayWorkflowMapper
5
- from linkedapi.types import RetrieveConnectionRequestsResult
6
-
7
-
8
- class RetrieveConnectionRequests(Operation[None, list[RetrieveConnectionRequestsResult]]):
9
- """Retrieve incoming standard LinkedIn connection requests."""
10
-
11
- operation_name = "retrieveConnectionRequests"
12
- mapper = ArrayWorkflowMapper[None, RetrieveConnectionRequestsResult](
13
- "st.retrieveConnectionRequests",
14
- RetrieveConnectionRequestsResult,
15
- )
@@ -1,100 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from typing import Literal
4
-
5
- from linkedapi.types.base import LinkedApiModel
6
- from linkedapi.types.params import BaseActionParams, LimitParams
7
-
8
- ConnectionStatus = Literal["connected", "pending", "incoming", "notConnected"]
9
-
10
-
11
- class ConnectionPerson(LinkedApiModel):
12
- name: str | None = None
13
- public_url: str | None = None
14
- headline: str | None = None
15
- location: str | None = None
16
- profile_image_url: str | None = None
17
-
18
-
19
- class SendConnectionRequestParams(BaseActionParams):
20
- person_url: str
21
- note: str | None = None
22
- email: str | None = None
23
-
24
-
25
- class CheckConnectionStatusParams(BaseActionParams):
26
- person_url: str
27
-
28
-
29
- class CheckConnectionStatusResult(LinkedApiModel):
30
- connection_status: ConnectionStatus | None = None
31
-
32
-
33
- class WithdrawConnectionRequestParams(BaseActionParams):
34
- person_url: str
35
- unfollow: bool | None = None
36
-
37
-
38
- class RetrievePendingRequestsResult(LinkedApiModel):
39
- name: str | None = None
40
- public_url: str | None = None
41
- headline: str | None = None
42
- sent_time: str | None = None
43
-
44
-
45
- class AcceptConnectionRequestParams(BaseActionParams):
46
- person_url: str
47
-
48
-
49
- class IgnoreConnectionRequestParams(BaseActionParams):
50
- person_url: str
51
-
52
-
53
- class RetrieveConnectionRequestsResult(LinkedApiModel):
54
- name: str | None = None
55
- public_url: str | None = None
56
- headline: str | None = None
57
-
58
-
59
- class RetrieveConnectionsFilter(LinkedApiModel):
60
- first_name: str | None = None
61
- last_name: str | None = None
62
- position: str | None = None
63
- locations: list[str] | None = None
64
- industries: list[str] | None = None
65
- current_companies: list[str] | None = None
66
- previous_companies: list[str] | None = None
67
- schools: list[str] | None = None
68
-
69
-
70
- class RetrieveConnectionsParams(LimitParams):
71
- since: str | None = None
72
- filter: RetrieveConnectionsFilter | None = None
73
-
74
-
75
- class RetrieveConnectionsResult(LinkedApiModel):
76
- name: str | None = None
77
- public_url: str | None = None
78
- headline: str | None = None
79
- location: str | None = None
80
- connected_at: str | None = None
81
-
82
-
83
- class RemoveConnectionParams(BaseActionParams):
84
- person_url: str
85
-
86
-
87
- class NvOpenPersonPageParams(BaseActionParams):
88
- person_hashed_url: str
89
-
90
-
91
- class NvOpenPersonPageResult(LinkedApiModel):
92
- name: str | None = None
93
- public_url: str | None = None
94
- hashed_url: str | None = None
95
- headline: str | None = None
96
- location: str | None = None
97
- country_code: str | None = None
98
- position: str | None = None
99
- company_name: str | None = None
100
- company_hashed_url: str | None = None
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes