ingestr 0.13.75__py3-none-any.whl → 0.14.98__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 ingestr might be problematic. Click here for more details.
- ingestr/main.py +22 -3
- ingestr/src/adjust/__init__.py +4 -4
- ingestr/src/allium/__init__.py +128 -0
- ingestr/src/anthropic/__init__.py +277 -0
- ingestr/src/anthropic/helpers.py +525 -0
- ingestr/src/appstore/__init__.py +1 -0
- ingestr/src/asana_source/__init__.py +1 -1
- ingestr/src/buildinfo.py +1 -1
- ingestr/src/chess/__init__.py +1 -1
- ingestr/src/couchbase_source/__init__.py +118 -0
- ingestr/src/couchbase_source/helpers.py +135 -0
- ingestr/src/cursor/__init__.py +83 -0
- ingestr/src/cursor/helpers.py +188 -0
- ingestr/src/destinations.py +169 -1
- ingestr/src/docebo/__init__.py +589 -0
- ingestr/src/docebo/client.py +435 -0
- ingestr/src/docebo/helpers.py +97 -0
- ingestr/src/elasticsearch/helpers.py +138 -0
- ingestr/src/errors.py +8 -0
- ingestr/src/facebook_ads/__init__.py +26 -23
- ingestr/src/facebook_ads/helpers.py +47 -1
- ingestr/src/factory.py +48 -0
- ingestr/src/filesystem/__init__.py +8 -3
- ingestr/src/filters.py +9 -0
- ingestr/src/fluxx/__init__.py +9906 -0
- ingestr/src/fluxx/helpers.py +209 -0
- ingestr/src/frankfurter/__init__.py +157 -163
- ingestr/src/frankfurter/helpers.py +3 -3
- ingestr/src/freshdesk/__init__.py +25 -8
- ingestr/src/freshdesk/freshdesk_client.py +40 -5
- ingestr/src/fundraiseup/__init__.py +49 -0
- ingestr/src/fundraiseup/client.py +81 -0
- ingestr/src/github/__init__.py +6 -4
- ingestr/src/google_analytics/__init__.py +1 -1
- ingestr/src/hostaway/__init__.py +302 -0
- ingestr/src/hostaway/client.py +288 -0
- ingestr/src/http/__init__.py +35 -0
- ingestr/src/http/readers.py +114 -0
- ingestr/src/hubspot/__init__.py +6 -12
- ingestr/src/influxdb/__init__.py +1 -0
- ingestr/src/intercom/__init__.py +142 -0
- ingestr/src/intercom/helpers.py +674 -0
- ingestr/src/intercom/settings.py +279 -0
- ingestr/src/jira_source/__init__.py +340 -0
- ingestr/src/jira_source/helpers.py +439 -0
- ingestr/src/jira_source/settings.py +170 -0
- ingestr/src/klaviyo/__init__.py +5 -5
- ingestr/src/linear/__init__.py +553 -116
- ingestr/src/linear/helpers.py +77 -38
- ingestr/src/mailchimp/__init__.py +126 -0
- ingestr/src/mailchimp/helpers.py +226 -0
- ingestr/src/mailchimp/settings.py +164 -0
- ingestr/src/masking.py +344 -0
- ingestr/src/monday/__init__.py +246 -0
- ingestr/src/monday/helpers.py +392 -0
- ingestr/src/monday/settings.py +328 -0
- ingestr/src/mongodb/__init__.py +5 -2
- ingestr/src/mongodb/helpers.py +384 -10
- ingestr/src/plusvibeai/__init__.py +335 -0
- ingestr/src/plusvibeai/helpers.py +544 -0
- ingestr/src/plusvibeai/settings.py +252 -0
- ingestr/src/revenuecat/__init__.py +83 -0
- ingestr/src/revenuecat/helpers.py +237 -0
- ingestr/src/salesforce/__init__.py +15 -8
- ingestr/src/shopify/__init__.py +1 -1
- ingestr/src/smartsheets/__init__.py +33 -5
- ingestr/src/socrata_source/__init__.py +83 -0
- ingestr/src/socrata_source/helpers.py +85 -0
- ingestr/src/socrata_source/settings.py +8 -0
- ingestr/src/sources.py +1418 -54
- ingestr/src/stripe_analytics/__init__.py +2 -19
- ingestr/src/wise/__init__.py +68 -0
- ingestr/src/wise/client.py +63 -0
- ingestr/tests/unit/test_smartsheets.py +6 -9
- {ingestr-0.13.75.dist-info → ingestr-0.14.98.dist-info}/METADATA +24 -12
- {ingestr-0.13.75.dist-info → ingestr-0.14.98.dist-info}/RECORD +79 -37
- {ingestr-0.13.75.dist-info → ingestr-0.14.98.dist-info}/WHEEL +0 -0
- {ingestr-0.13.75.dist-info → ingestr-0.14.98.dist-info}/entry_points.txt +0 -0
- {ingestr-0.13.75.dist-info → ingestr-0.14.98.dist-info}/licenses/LICENSE.md +0 -0
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"""
|
|
2
|
+
This source provides data extraction from PlusVibeAI via the REST API.
|
|
3
|
+
|
|
4
|
+
It defines functions to fetch data from different parts of PlusVibeAI including
|
|
5
|
+
campaigns and other marketing analytics data.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from typing import Any, Iterable, Optional
|
|
9
|
+
|
|
10
|
+
import dlt
|
|
11
|
+
from dlt.common.typing import TDataItem
|
|
12
|
+
|
|
13
|
+
from .helpers import get_client
|
|
14
|
+
from .settings import DEFAULT_PAGE_SIZE, DEFAULT_START_DATE
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@dlt.source
|
|
18
|
+
def plusvibeai_source() -> Any:
|
|
19
|
+
"""
|
|
20
|
+
The main function that runs all the other functions to fetch data from PlusVibeAI.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
Sequence[DltResource]: A sequence of DltResource objects containing the fetched data.
|
|
24
|
+
"""
|
|
25
|
+
return [
|
|
26
|
+
campaigns,
|
|
27
|
+
leads,
|
|
28
|
+
email_accounts,
|
|
29
|
+
emails,
|
|
30
|
+
blocklist,
|
|
31
|
+
webhooks,
|
|
32
|
+
tags,
|
|
33
|
+
]
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dlt.resource(
|
|
37
|
+
write_disposition="merge",
|
|
38
|
+
primary_key="id",
|
|
39
|
+
max_table_nesting=0, # Keep nested objects (schedule, sequences) as JSON columns
|
|
40
|
+
)
|
|
41
|
+
def campaigns(
|
|
42
|
+
api_key: str = dlt.secrets.value,
|
|
43
|
+
workspace_id: str = dlt.secrets.value,
|
|
44
|
+
base_url: str = "https://api.plusvibe.ai",
|
|
45
|
+
max_results: Optional[int] = None,
|
|
46
|
+
updated: dlt.sources.incremental[str] = dlt.sources.incremental(
|
|
47
|
+
"modified_at", # PlusVibeAI uses modified_at for updates
|
|
48
|
+
initial_value=DEFAULT_START_DATE,
|
|
49
|
+
range_end="closed",
|
|
50
|
+
range_start="closed",
|
|
51
|
+
),
|
|
52
|
+
) -> Iterable[TDataItem]:
|
|
53
|
+
"""
|
|
54
|
+
Fetches campaigns from PlusVibeAI.
|
|
55
|
+
|
|
56
|
+
Args:
|
|
57
|
+
api_key (str): API key for authentication (get from https://app.plusvibe.ai/v2/settings/api-access/)
|
|
58
|
+
workspace_id (str): Workspace ID to access
|
|
59
|
+
base_url (str): PlusVibeAI API base URL
|
|
60
|
+
max_results (int): Maximum number of results to return
|
|
61
|
+
updated (str): The date from which to fetch updated campaigns
|
|
62
|
+
|
|
63
|
+
Yields:
|
|
64
|
+
dict: The campaign data with nested objects (schedule, sequences, etc.) as JSON.
|
|
65
|
+
"""
|
|
66
|
+
client = get_client(api_key, workspace_id, base_url)
|
|
67
|
+
|
|
68
|
+
for campaign in client.get_campaigns(
|
|
69
|
+
page_size=DEFAULT_PAGE_SIZE, max_results=max_results
|
|
70
|
+
):
|
|
71
|
+
# Apply incremental filter if needed
|
|
72
|
+
if updated.start_value:
|
|
73
|
+
campaign_updated = campaign.get("modified_at")
|
|
74
|
+
if campaign_updated and campaign_updated < updated.start_value:
|
|
75
|
+
continue
|
|
76
|
+
|
|
77
|
+
yield campaign
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
@dlt.resource(
|
|
81
|
+
write_disposition="merge",
|
|
82
|
+
primary_key="_id",
|
|
83
|
+
max_table_nesting=0,
|
|
84
|
+
)
|
|
85
|
+
def leads(
|
|
86
|
+
api_key: str = dlt.secrets.value,
|
|
87
|
+
workspace_id: str = dlt.secrets.value,
|
|
88
|
+
base_url: str = "https://api.plusvibe.ai",
|
|
89
|
+
max_results: Optional[int] = None,
|
|
90
|
+
updated: dlt.sources.incremental[str] = dlt.sources.incremental(
|
|
91
|
+
"modified_at",
|
|
92
|
+
initial_value=DEFAULT_START_DATE,
|
|
93
|
+
range_end="closed",
|
|
94
|
+
range_start="closed",
|
|
95
|
+
),
|
|
96
|
+
) -> Iterable[TDataItem]:
|
|
97
|
+
"""
|
|
98
|
+
Fetches leads from PlusVibeAI.
|
|
99
|
+
|
|
100
|
+
Args:
|
|
101
|
+
api_key (str): API key for authentication
|
|
102
|
+
workspace_id (str): Workspace ID to access
|
|
103
|
+
base_url (str): PlusVibeAI API base URL
|
|
104
|
+
max_results (int): Maximum number of results to return
|
|
105
|
+
updated (str): The date from which to fetch updated leads
|
|
106
|
+
|
|
107
|
+
Yields:
|
|
108
|
+
dict: The lead data.
|
|
109
|
+
"""
|
|
110
|
+
client = get_client(api_key, workspace_id, base_url)
|
|
111
|
+
|
|
112
|
+
for lead in client.get_leads(page_size=DEFAULT_PAGE_SIZE, max_results=max_results):
|
|
113
|
+
# Apply incremental filter if needed
|
|
114
|
+
if updated.start_value:
|
|
115
|
+
lead_updated = lead.get("modified_at")
|
|
116
|
+
if lead_updated and lead_updated < updated.start_value:
|
|
117
|
+
continue
|
|
118
|
+
|
|
119
|
+
yield lead
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
@dlt.resource(
|
|
123
|
+
write_disposition="merge",
|
|
124
|
+
primary_key="_id",
|
|
125
|
+
max_table_nesting=0,
|
|
126
|
+
)
|
|
127
|
+
def email_accounts(
|
|
128
|
+
api_key: str = dlt.secrets.value,
|
|
129
|
+
workspace_id: str = dlt.secrets.value,
|
|
130
|
+
base_url: str = "https://api.plusvibe.ai",
|
|
131
|
+
max_results: Optional[int] = None,
|
|
132
|
+
updated: dlt.sources.incremental[str] = dlt.sources.incremental(
|
|
133
|
+
"timestamp_updated",
|
|
134
|
+
initial_value=DEFAULT_START_DATE,
|
|
135
|
+
range_end="closed",
|
|
136
|
+
range_start="closed",
|
|
137
|
+
),
|
|
138
|
+
) -> Iterable[TDataItem]:
|
|
139
|
+
"""
|
|
140
|
+
Fetches email accounts from PlusVibeAI.
|
|
141
|
+
|
|
142
|
+
Args:
|
|
143
|
+
api_key (str): API key for authentication
|
|
144
|
+
workspace_id (str): Workspace ID to access
|
|
145
|
+
base_url (str): PlusVibeAI API base URL
|
|
146
|
+
max_results (int): Maximum number of results to return
|
|
147
|
+
updated (str): The date from which to fetch updated email accounts
|
|
148
|
+
|
|
149
|
+
Yields:
|
|
150
|
+
dict: The email account data.
|
|
151
|
+
"""
|
|
152
|
+
client = get_client(api_key, workspace_id, base_url)
|
|
153
|
+
|
|
154
|
+
for account in client.get_email_accounts(
|
|
155
|
+
page_size=DEFAULT_PAGE_SIZE, max_results=max_results
|
|
156
|
+
):
|
|
157
|
+
# Apply incremental filter if needed
|
|
158
|
+
if updated.start_value:
|
|
159
|
+
account_updated = account.get("timestamp_updated")
|
|
160
|
+
if account_updated and account_updated < updated.start_value:
|
|
161
|
+
continue
|
|
162
|
+
|
|
163
|
+
yield account
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
@dlt.resource(
|
|
167
|
+
write_disposition="merge",
|
|
168
|
+
primary_key="id",
|
|
169
|
+
max_table_nesting=0,
|
|
170
|
+
)
|
|
171
|
+
def emails(
|
|
172
|
+
api_key: str = dlt.secrets.value,
|
|
173
|
+
workspace_id: str = dlt.secrets.value,
|
|
174
|
+
base_url: str = "https://api.plusvibe.ai",
|
|
175
|
+
max_results: Optional[int] = None,
|
|
176
|
+
updated: dlt.sources.incremental[str] = dlt.sources.incremental(
|
|
177
|
+
"timestamp_created",
|
|
178
|
+
initial_value=DEFAULT_START_DATE,
|
|
179
|
+
range_end="closed",
|
|
180
|
+
range_start="closed",
|
|
181
|
+
),
|
|
182
|
+
) -> Iterable[TDataItem]:
|
|
183
|
+
"""
|
|
184
|
+
Fetches emails from PlusVibeAI.
|
|
185
|
+
|
|
186
|
+
Args:
|
|
187
|
+
api_key (str): API key for authentication
|
|
188
|
+
workspace_id (str): Workspace ID to access
|
|
189
|
+
base_url (str): PlusVibeAI API base URL
|
|
190
|
+
max_results (int): Maximum number of results to return
|
|
191
|
+
updated (str): The date from which to fetch emails
|
|
192
|
+
|
|
193
|
+
Yields:
|
|
194
|
+
dict: The email data.
|
|
195
|
+
"""
|
|
196
|
+
client = get_client(api_key, workspace_id, base_url)
|
|
197
|
+
|
|
198
|
+
for email in client.get_emails(max_results=max_results):
|
|
199
|
+
# Apply incremental filter if needed
|
|
200
|
+
if updated.start_value:
|
|
201
|
+
email_created = email.get("timestamp_created")
|
|
202
|
+
if email_created and email_created < updated.start_value:
|
|
203
|
+
continue
|
|
204
|
+
|
|
205
|
+
yield email
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
@dlt.resource(
|
|
209
|
+
write_disposition="merge",
|
|
210
|
+
primary_key="_id",
|
|
211
|
+
max_table_nesting=0,
|
|
212
|
+
)
|
|
213
|
+
def blocklist(
|
|
214
|
+
api_key: str = dlt.secrets.value,
|
|
215
|
+
workspace_id: str = dlt.secrets.value,
|
|
216
|
+
base_url: str = "https://api.plusvibe.ai",
|
|
217
|
+
max_results: Optional[int] = None,
|
|
218
|
+
updated: dlt.sources.incremental[str] = dlt.sources.incremental(
|
|
219
|
+
"created_at",
|
|
220
|
+
initial_value=DEFAULT_START_DATE,
|
|
221
|
+
range_end="closed",
|
|
222
|
+
range_start="closed",
|
|
223
|
+
),
|
|
224
|
+
) -> Iterable[TDataItem]:
|
|
225
|
+
"""
|
|
226
|
+
Fetches blocklist entries from PlusVibeAI.
|
|
227
|
+
|
|
228
|
+
Args:
|
|
229
|
+
api_key (str): API key for authentication
|
|
230
|
+
workspace_id (str): Workspace ID to access
|
|
231
|
+
base_url (str): PlusVibeAI API base URL
|
|
232
|
+
max_results (int): Maximum number of results to return
|
|
233
|
+
updated (str): The date from which to fetch blocklist entries
|
|
234
|
+
|
|
235
|
+
Yields:
|
|
236
|
+
dict: The blocklist entry data.
|
|
237
|
+
"""
|
|
238
|
+
client = get_client(api_key, workspace_id, base_url)
|
|
239
|
+
|
|
240
|
+
for entry in client.get_blocklist(
|
|
241
|
+
page_size=DEFAULT_PAGE_SIZE, max_results=max_results
|
|
242
|
+
):
|
|
243
|
+
# Apply incremental filter if needed
|
|
244
|
+
if updated.start_value:
|
|
245
|
+
entry_created = entry.get("created_at")
|
|
246
|
+
if entry_created and entry_created < updated.start_value:
|
|
247
|
+
continue
|
|
248
|
+
|
|
249
|
+
yield entry
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
@dlt.resource(
|
|
253
|
+
write_disposition="merge",
|
|
254
|
+
primary_key="_id",
|
|
255
|
+
max_table_nesting=0,
|
|
256
|
+
)
|
|
257
|
+
def webhooks(
|
|
258
|
+
api_key: str = dlt.secrets.value,
|
|
259
|
+
workspace_id: str = dlt.secrets.value,
|
|
260
|
+
base_url: str = "https://api.plusvibe.ai",
|
|
261
|
+
max_results: Optional[int] = None,
|
|
262
|
+
updated: dlt.sources.incremental[str] = dlt.sources.incremental(
|
|
263
|
+
"modified_at",
|
|
264
|
+
initial_value=DEFAULT_START_DATE,
|
|
265
|
+
range_end="closed",
|
|
266
|
+
range_start="closed",
|
|
267
|
+
),
|
|
268
|
+
) -> Iterable[TDataItem]:
|
|
269
|
+
"""
|
|
270
|
+
Fetches webhooks from PlusVibeAI.
|
|
271
|
+
|
|
272
|
+
Args:
|
|
273
|
+
api_key (str): API key for authentication
|
|
274
|
+
workspace_id (str): Workspace ID to access
|
|
275
|
+
base_url (str): PlusVibeAI API base URL
|
|
276
|
+
max_results (int): Maximum number of results to return
|
|
277
|
+
updated (str): The date from which to fetch updated webhooks
|
|
278
|
+
|
|
279
|
+
Yields:
|
|
280
|
+
dict: The webhook data.
|
|
281
|
+
"""
|
|
282
|
+
client = get_client(api_key, workspace_id, base_url)
|
|
283
|
+
|
|
284
|
+
for webhook in client.get_webhooks(
|
|
285
|
+
page_size=DEFAULT_PAGE_SIZE, max_results=max_results
|
|
286
|
+
):
|
|
287
|
+
# Apply incremental filter if needed
|
|
288
|
+
if updated.start_value:
|
|
289
|
+
webhook_updated = webhook.get("modified_at")
|
|
290
|
+
if webhook_updated and webhook_updated < updated.start_value:
|
|
291
|
+
continue
|
|
292
|
+
|
|
293
|
+
yield webhook
|
|
294
|
+
|
|
295
|
+
|
|
296
|
+
@dlt.resource(
|
|
297
|
+
write_disposition="merge",
|
|
298
|
+
primary_key="_id",
|
|
299
|
+
max_table_nesting=0,
|
|
300
|
+
)
|
|
301
|
+
def tags(
|
|
302
|
+
api_key: str = dlt.secrets.value,
|
|
303
|
+
workspace_id: str = dlt.secrets.value,
|
|
304
|
+
base_url: str = "https://api.plusvibe.ai",
|
|
305
|
+
max_results: Optional[int] = None,
|
|
306
|
+
updated: dlt.sources.incremental[str] = dlt.sources.incremental(
|
|
307
|
+
"modified_at",
|
|
308
|
+
initial_value=DEFAULT_START_DATE,
|
|
309
|
+
range_end="closed",
|
|
310
|
+
range_start="closed",
|
|
311
|
+
),
|
|
312
|
+
) -> Iterable[TDataItem]:
|
|
313
|
+
"""
|
|
314
|
+
Fetches tags from PlusVibeAI.
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
api_key (str): API key for authentication
|
|
318
|
+
workspace_id (str): Workspace ID to access
|
|
319
|
+
base_url (str): PlusVibeAI API base URL
|
|
320
|
+
max_results (int): Maximum number of results to return
|
|
321
|
+
updated (str): The date from which to fetch updated tags
|
|
322
|
+
|
|
323
|
+
Yields:
|
|
324
|
+
dict: The tag data.
|
|
325
|
+
"""
|
|
326
|
+
client = get_client(api_key, workspace_id, base_url)
|
|
327
|
+
|
|
328
|
+
for tag in client.get_tags(page_size=DEFAULT_PAGE_SIZE, max_results=max_results):
|
|
329
|
+
# Apply incremental filter if needed
|
|
330
|
+
if updated.start_value:
|
|
331
|
+
tag_updated = tag.get("modified_at")
|
|
332
|
+
if tag_updated and tag_updated < updated.start_value:
|
|
333
|
+
continue
|
|
334
|
+
|
|
335
|
+
yield tag
|