ingestr 0.13.73__py3-none-any.whl → 0.13.75__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.
- ingestr/main.py +7 -1
- ingestr/src/buildinfo.py +1 -1
- ingestr/src/facebook_ads/__init__.py +10 -5
- ingestr/src/facebook_ads/helpers.py +1 -3
- ingestr/src/factory.py +2 -0
- ingestr/src/github/__init__.py +36 -3
- ingestr/src/influxdb/__init__.py +45 -0
- ingestr/src/influxdb/client.py +34 -0
- ingestr/src/solidgate/helpers.py +2 -3
- ingestr/src/sources.py +72 -1
- ingestr/src/tiktok_ads/__init__.py +6 -2
- {ingestr-0.13.73.dist-info → ingestr-0.13.75.dist-info}/METADATA +3 -1
- {ingestr-0.13.73.dist-info → ingestr-0.13.75.dist-info}/RECORD +16 -14
- {ingestr-0.13.73.dist-info → ingestr-0.13.75.dist-info}/WHEEL +0 -0
- {ingestr-0.13.73.dist-info → ingestr-0.13.75.dist-info}/entry_points.txt +0 -0
- {ingestr-0.13.73.dist-info → ingestr-0.13.75.dist-info}/licenses/LICENSE.md +0 -0
ingestr/main.py
CHANGED
@@ -506,6 +506,7 @@ def ingest(
|
|
506
506
|
|
507
507
|
if factory.source_scheme == "sqlite":
|
508
508
|
source_table = "main." + source_table.split(".")[-1]
|
509
|
+
|
509
510
|
|
510
511
|
if (
|
511
512
|
incremental_key
|
@@ -596,8 +597,13 @@ def ingest(
|
|
596
597
|
if incremental_strategy != IncrementalStrategy.none:
|
597
598
|
write_disposition = incremental_strategy.value
|
598
599
|
|
599
|
-
|
600
|
+
if factory.source_scheme == "influxdb":
|
601
|
+
if primary_key:
|
602
|
+
write_disposition = "merge"
|
603
|
+
|
600
604
|
|
605
|
+
start_time = datetime.now()
|
606
|
+
|
601
607
|
run_info: LoadInfo = pipeline.run(
|
602
608
|
dlt_source,
|
603
609
|
**destination.dlt_run_params(
|
ingestr/src/buildinfo.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
version = "v0.13.
|
1
|
+
version = "v0.13.75"
|
@@ -1,14 +1,13 @@
|
|
1
1
|
"""Loads campaigns, ads sets, ads, leads and insight data from Facebook Marketing API"""
|
2
2
|
|
3
|
-
from datetime import datetime
|
4
3
|
from typing import Iterator, Sequence
|
5
4
|
|
6
5
|
import dlt
|
7
6
|
from dlt.common import pendulum
|
7
|
+
from dlt.common.time import ensure_pendulum_datetime
|
8
8
|
from dlt.common.typing import TDataItems
|
9
9
|
from dlt.sources import DltResource
|
10
10
|
from facebook_business.adobjects.ad import Ad
|
11
|
-
from dlt.common.time import ensure_pendulum_datetime
|
12
11
|
|
13
12
|
from .helpers import (
|
14
13
|
execute_job,
|
@@ -167,14 +166,20 @@ def facebook_insights_source(
|
|
167
166
|
def facebook_insights(
|
168
167
|
date_start: dlt.sources.incremental[str] = dlt.sources.incremental(
|
169
168
|
"date_start",
|
170
|
-
initial_value=ensure_pendulum_datetime(start_date).start_of(
|
171
|
-
end_value=ensure_pendulum_datetime(end_date).end_of(
|
169
|
+
initial_value=ensure_pendulum_datetime(start_date).start_of("day").date(),
|
170
|
+
end_value=ensure_pendulum_datetime(end_date).end_of("day").date()
|
171
|
+
if end_date
|
172
|
+
else None,
|
172
173
|
range_end="closed",
|
173
174
|
range_start="closed",
|
174
175
|
),
|
175
176
|
) -> Iterator[TDataItems]:
|
176
177
|
start_date = date_start.last_value
|
177
|
-
end_date =
|
178
|
+
end_date = (
|
179
|
+
pendulum.instance(date_start.end_value)
|
180
|
+
if date_start.end_value
|
181
|
+
else pendulum.now()
|
182
|
+
)
|
178
183
|
|
179
184
|
while start_date <= end_date:
|
180
185
|
query = {
|
@@ -6,12 +6,10 @@ import time
|
|
6
6
|
from datetime import datetime
|
7
7
|
from typing import Any, Iterator, Sequence
|
8
8
|
|
9
|
-
import dlt
|
10
9
|
import humanize
|
11
10
|
import pendulum
|
12
11
|
from dlt.common import logger
|
13
12
|
from dlt.common.configuration.inject import with_config
|
14
|
-
from dlt.common.time import ensure_pendulum_datetime
|
15
13
|
from dlt.common.typing import DictStrAny, TDataItem, TDataItems
|
16
14
|
from dlt.sources.helpers import requests
|
17
15
|
from dlt.sources.helpers.requests import Client
|
@@ -34,7 +32,7 @@ def process_report_item(item: AbstractObject) -> DictStrAny:
|
|
34
32
|
item["date_start"] = datetime.strptime(item["date_start"], "%Y-%m-%d").date()
|
35
33
|
if "date_stop" in item:
|
36
34
|
item["date_stop"] = datetime.strptime(item["date_stop"], "%Y-%m-%d").date()
|
37
|
-
|
35
|
+
|
38
36
|
d: DictStrAny = item.export_all_data()
|
39
37
|
for pki in INSIGHTS_PRIMARY_KEY:
|
40
38
|
if pki not in d:
|
ingestr/src/factory.py
CHANGED
@@ -45,6 +45,7 @@ from ingestr.src.sources import (
|
|
45
45
|
GoogleSheetsSource,
|
46
46
|
GorgiasSource,
|
47
47
|
HubspotSource,
|
48
|
+
InfluxDBSource,
|
48
49
|
IsocPulseSource,
|
49
50
|
KafkaSource,
|
50
51
|
KinesisSource,
|
@@ -187,6 +188,7 @@ class SourceDestinationFactory:
|
|
187
188
|
"pinterest": PinterestSource,
|
188
189
|
"zoom": ZoomSource,
|
189
190
|
"clickup": ClickupSource,
|
191
|
+
"influxdb": InfluxDBSource,
|
190
192
|
}
|
191
193
|
destinations: Dict[str, Type[DestinationProtocol]] = {
|
192
194
|
"bigquery": BigQueryDestination,
|
ingestr/src/github/__init__.py
CHANGED
@@ -4,6 +4,7 @@ import urllib.parse
|
|
4
4
|
from typing import Iterator, Optional, Sequence
|
5
5
|
|
6
6
|
import dlt
|
7
|
+
import pendulum
|
7
8
|
from dlt.common.typing import TDataItems
|
8
9
|
from dlt.sources import DltResource
|
9
10
|
|
@@ -67,7 +68,11 @@ def github_reactions(
|
|
67
68
|
|
68
69
|
@dlt.source(max_table_nesting=0)
|
69
70
|
def github_repo_events(
|
70
|
-
owner: str,
|
71
|
+
owner: str,
|
72
|
+
name: str,
|
73
|
+
access_token: str,
|
74
|
+
start_date: pendulum.DateTime,
|
75
|
+
end_date: pendulum.DateTime,
|
71
76
|
) -> DltResource:
|
72
77
|
"""Gets events for repository `name` with owner `owner` incrementally.
|
73
78
|
|
@@ -90,7 +95,8 @@ def github_repo_events(
|
|
90
95
|
def repo_events(
|
91
96
|
last_created_at: dlt.sources.incremental[str] = dlt.sources.incremental(
|
92
97
|
"created_at",
|
93
|
-
initial_value=
|
98
|
+
initial_value=start_date.isoformat(),
|
99
|
+
end_value=end_date.isoformat(),
|
94
100
|
last_value_func=max,
|
95
101
|
range_end="closed",
|
96
102
|
range_start="closed",
|
@@ -100,8 +106,35 @@ def github_repo_events(
|
|
100
106
|
f"/repos/{urllib.parse.quote(owner)}/{urllib.parse.quote(name)}/events"
|
101
107
|
)
|
102
108
|
|
109
|
+
# Get the date range from the incremental state
|
110
|
+
start_filter = pendulum.parse(
|
111
|
+
last_created_at.last_value or last_created_at.initial_value
|
112
|
+
)
|
113
|
+
end_filter = (
|
114
|
+
pendulum.parse(last_created_at.end_value)
|
115
|
+
if last_created_at.end_value
|
116
|
+
else None
|
117
|
+
)
|
118
|
+
|
103
119
|
for page in get_rest_pages(access_token, repos_path + "?per_page=100"):
|
104
|
-
|
120
|
+
# Filter events by date range
|
121
|
+
filtered_events = []
|
122
|
+
for event in page:
|
123
|
+
event_date = pendulum.parse(event["created_at"])
|
124
|
+
|
125
|
+
# Check if event is within the date range
|
126
|
+
if event_date >= start_filter:
|
127
|
+
if end_filter is None or event_date <= end_filter:
|
128
|
+
filtered_events.append(event)
|
129
|
+
elif event_date > end_filter:
|
130
|
+
# Skip events that are newer than our end date
|
131
|
+
continue
|
132
|
+
else:
|
133
|
+
# Events are ordered by date desc, so if we hit an older event, we can stop
|
134
|
+
break
|
135
|
+
|
136
|
+
if filtered_events:
|
137
|
+
yield filtered_events
|
105
138
|
|
106
139
|
# stop requesting pages if the last element was already older than initial value
|
107
140
|
# note: incremental will skip those items anyway, we just do not want to use the api limits
|
@@ -0,0 +1,45 @@
|
|
1
|
+
from typing import Iterable
|
2
|
+
|
3
|
+
import dlt
|
4
|
+
import pendulum
|
5
|
+
from dlt.common.typing import TDataItem
|
6
|
+
from dlt.sources import DltResource
|
7
|
+
|
8
|
+
from .client import InfluxClient
|
9
|
+
|
10
|
+
@dlt.source(max_table_nesting=0)
|
11
|
+
def influxdb_source(
|
12
|
+
measurement: str,
|
13
|
+
host: str,
|
14
|
+
org: str,
|
15
|
+
bucket: str,
|
16
|
+
token: str = dlt.secrets.value,
|
17
|
+
secure: bool = True,
|
18
|
+
start_date: pendulum.DateTime = pendulum.datetime(2024, 1, 1),
|
19
|
+
end_date: pendulum.DateTime | None = None,
|
20
|
+
) -> Iterable[DltResource]:
|
21
|
+
client = InfluxClient(
|
22
|
+
url=host, token=token, org=org, bucket=bucket, verify_ssl=secure
|
23
|
+
)
|
24
|
+
|
25
|
+
@dlt.resource(name=measurement)
|
26
|
+
def fetch_table(
|
27
|
+
timestamp=dlt.sources.incremental(
|
28
|
+
"time",
|
29
|
+
initial_value=start_date,
|
30
|
+
end_value=end_date,
|
31
|
+
range_start="closed",
|
32
|
+
range_end="closed",
|
33
|
+
),
|
34
|
+
) -> Iterable[TDataItem]:
|
35
|
+
if timestamp.last_value is None:
|
36
|
+
start = start_date.isoformat()
|
37
|
+
else:
|
38
|
+
start = timestamp.last_value.isoformat()
|
39
|
+
if timestamp.end_value is None:
|
40
|
+
end = pendulum.now().isoformat()
|
41
|
+
else:
|
42
|
+
end = timestamp.end_value.isoformat()
|
43
|
+
yield from client.fetch_measurement(measurement, start, end)
|
44
|
+
|
45
|
+
return fetch_table
|
@@ -0,0 +1,34 @@
|
|
1
|
+
from typing import Any, Dict, Iterable
|
2
|
+
|
3
|
+
from influxdb_client import InfluxDBClient # type: ignore
|
4
|
+
|
5
|
+
|
6
|
+
class InfluxClient:
|
7
|
+
def __init__(
|
8
|
+
self, url: str, token: str, org: str, bucket: str, verify_ssl: bool = True
|
9
|
+
) -> None:
|
10
|
+
self.client = InfluxDBClient(
|
11
|
+
url=url, token=token, org=org, verify_ssl=verify_ssl
|
12
|
+
)
|
13
|
+
self.bucket = bucket
|
14
|
+
|
15
|
+
def fetch_measurement(
|
16
|
+
self, measurement: str, start: str, end: str | None = None
|
17
|
+
) -> Iterable[Dict[str, Any]]:
|
18
|
+
query = f'from(bucket: "{self.bucket}") |> range(start: {start}'
|
19
|
+
if end:
|
20
|
+
query += f", stop: {end}"
|
21
|
+
query += f') |> filter(fn: (r) => r["_measurement"] == "{measurement}")'
|
22
|
+
query_api = self.client.query_api()
|
23
|
+
|
24
|
+
for record in query_api.query_stream(query):
|
25
|
+
cleaned_record = {}
|
26
|
+
exclude_keys = {"result", "table", "_start", "_stop"}
|
27
|
+
for key, value in record.values.items():
|
28
|
+
if key in exclude_keys:
|
29
|
+
continue
|
30
|
+
if key.startswith("_"):
|
31
|
+
cleaned_record[key[1:]] = value
|
32
|
+
else:
|
33
|
+
cleaned_record[key] = value
|
34
|
+
yield cleaned_record
|
ingestr/src/solidgate/helpers.py
CHANGED
@@ -6,7 +6,6 @@ import json
|
|
6
6
|
import time
|
7
7
|
from io import StringIO
|
8
8
|
|
9
|
-
import pandas as pd # type: ignore
|
10
9
|
import pendulum
|
11
10
|
|
12
11
|
from ingestr.src.http_client import create_client
|
@@ -132,9 +131,9 @@ class SolidgateClient:
|
|
132
131
|
else:
|
133
132
|
row["created_at"] = None
|
134
133
|
|
135
|
-
row2 = {k: v for k, v in row.items() if v !=
|
134
|
+
row2 = {k: v for k, v in row.items() if v != ""}
|
136
135
|
rows.append(row2)
|
137
|
-
|
136
|
+
|
138
137
|
return rows
|
139
138
|
except Exception as e:
|
140
139
|
raise Exception(f"Error reading CSV: {e}")
|
ingestr/src/sources.py
CHANGED
@@ -1814,7 +1814,23 @@ class GitHubSource:
|
|
1814
1814
|
owner=owner, name=repo, access_token=access_token
|
1815
1815
|
).with_resources(table)
|
1816
1816
|
elif table == "repo_events":
|
1817
|
-
|
1817
|
+
start_date = kwargs.get("interval_start") or pendulum.now().subtract(
|
1818
|
+
days=30
|
1819
|
+
)
|
1820
|
+
end_date = kwargs.get("interval_end") or pendulum.now()
|
1821
|
+
|
1822
|
+
if isinstance(start_date, str):
|
1823
|
+
start_date = pendulum.parse(start_date)
|
1824
|
+
if isinstance(end_date, str):
|
1825
|
+
end_date = pendulum.parse(end_date)
|
1826
|
+
|
1827
|
+
return github_repo_events(
|
1828
|
+
owner=owner,
|
1829
|
+
name=repo,
|
1830
|
+
access_token=access_token,
|
1831
|
+
start_date=start_date,
|
1832
|
+
end_date=end_date,
|
1833
|
+
)
|
1818
1834
|
elif table == "stargazers":
|
1819
1835
|
return github_stargazers(owner=owner, name=repo, access_token=access_token)
|
1820
1836
|
else:
|
@@ -3026,3 +3042,58 @@ class ZoomSource:
|
|
3026
3042
|
start_date=start_date,
|
3027
3043
|
end_date=end_date,
|
3028
3044
|
).with_resources(table)
|
3045
|
+
|
3046
|
+
|
3047
|
+
class InfluxDBSource:
|
3048
|
+
def handles_incrementality(self) -> bool:
|
3049
|
+
return True
|
3050
|
+
|
3051
|
+
def dlt_source(self, uri: str, table: str, **kwargs):
|
3052
|
+
parsed_uri = urlparse(uri)
|
3053
|
+
params = parse_qs(parsed_uri.query)
|
3054
|
+
host = parsed_uri.hostname
|
3055
|
+
port = parsed_uri.port
|
3056
|
+
|
3057
|
+
secure = params.get("secure", ["true"])[0].lower() != "false"
|
3058
|
+
scheme = "https" if secure else "http"
|
3059
|
+
|
3060
|
+
if port:
|
3061
|
+
host_url = f"{scheme}://{host}:{port}"
|
3062
|
+
else:
|
3063
|
+
host_url = f"{scheme}://{host}"
|
3064
|
+
|
3065
|
+
token = params.get("token")
|
3066
|
+
org = params.get("org")
|
3067
|
+
bucket = params.get("bucket")
|
3068
|
+
|
3069
|
+
if not host:
|
3070
|
+
raise MissingValueError("host", "InfluxDB")
|
3071
|
+
if not token:
|
3072
|
+
raise MissingValueError("token", "InfluxDB")
|
3073
|
+
if not org:
|
3074
|
+
raise MissingValueError("org", "InfluxDB")
|
3075
|
+
if not bucket:
|
3076
|
+
raise MissingValueError("bucket", "InfluxDB")
|
3077
|
+
|
3078
|
+
start_date = kwargs.get("interval_start")
|
3079
|
+
if start_date is not None:
|
3080
|
+
start_date = ensure_pendulum_datetime(start_date)
|
3081
|
+
else:
|
3082
|
+
start_date = pendulum.datetime(2024, 1, 1).in_tz("UTC")
|
3083
|
+
|
3084
|
+
end_date = kwargs.get("interval_end")
|
3085
|
+
if end_date is not None:
|
3086
|
+
end_date = ensure_pendulum_datetime(end_date)
|
3087
|
+
|
3088
|
+
from ingestr.src.influxdb import influxdb_source
|
3089
|
+
|
3090
|
+
return influxdb_source(
|
3091
|
+
measurement=table,
|
3092
|
+
host=host_url,
|
3093
|
+
org=org[0],
|
3094
|
+
bucket=bucket[0],
|
3095
|
+
token=token[0],
|
3096
|
+
secure=secure,
|
3097
|
+
start_date=start_date,
|
3098
|
+
end_date=end_date,
|
3099
|
+
).with_resources(table)
|
@@ -125,8 +125,12 @@ def tiktok_source(
|
|
125
125
|
end_date_tz_adjusted = end_date.in_tz(timezone)
|
126
126
|
|
127
127
|
if datetime is not None:
|
128
|
-
start_date_tz_adjusted = ensure_pendulum_datetime(
|
129
|
-
|
128
|
+
start_date_tz_adjusted = ensure_pendulum_datetime(
|
129
|
+
datetime.last_value
|
130
|
+
).in_tz(timezone)
|
131
|
+
end_date_tz_adjusted = ensure_pendulum_datetime(datetime.end_value).in_tz(
|
132
|
+
timezone
|
133
|
+
)
|
130
134
|
|
131
135
|
list_of_interval = find_intervals(
|
132
136
|
current_date=start_date_tz_adjusted,
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ingestr
|
3
|
-
Version: 0.13.
|
3
|
+
Version: 0.13.75
|
4
4
|
Summary: ingestr is a command-line application that ingests data from various sources and stores them in any database.
|
5
5
|
Project-URL: Homepage, https://github.com/bruin-data/ingestr
|
6
6
|
Project-URL: Issues, https://github.com/bruin-data/ingestr/issues
|
@@ -96,6 +96,7 @@ Requires-Dist: ibm-db-sa==0.4.1
|
|
96
96
|
Requires-Dist: ibm-db==3.2.6
|
97
97
|
Requires-Dist: idna==3.10
|
98
98
|
Requires-Dist: inflection==0.5.1
|
99
|
+
Requires-Dist: influxdb-client==1.41.0
|
99
100
|
Requires-Dist: intuit-oauth==1.2.4
|
100
101
|
Requires-Dist: isodate==0.7.2
|
101
102
|
Requires-Dist: jmespath==1.0.1
|
@@ -156,6 +157,7 @@ Requires-Dist: python-quickbooks==0.9.2
|
|
156
157
|
Requires-Dist: pytz==2025.1
|
157
158
|
Requires-Dist: pyyaml==6.0.2
|
158
159
|
Requires-Dist: rauth==0.7.3
|
160
|
+
Requires-Dist: reactivex==4.0.4
|
159
161
|
Requires-Dist: requests-file==2.1.0
|
160
162
|
Requires-Dist: requests-oauthlib==1.3.1
|
161
163
|
Requires-Dist: requests-toolbelt==1.0.0
|
@@ -1,17 +1,17 @@
|
|
1
1
|
ingestr/conftest.py,sha256=OE2yxeTCosS9CUFVuqNypm-2ftYvVBeeq7egm3878cI,1981
|
2
|
-
ingestr/main.py,sha256=
|
2
|
+
ingestr/main.py,sha256=QsNVrz5_NgRUkvfExnd-2E02TGmWivPuop5hYinVAjM,26513
|
3
3
|
ingestr/src/.gitignore,sha256=8cX1AZTSI0TcdZFGTmS_oyBjpfCzhOEt0DdAo2dFIY8,203
|
4
4
|
ingestr/src/blob.py,sha256=UUWMjHUuoR9xP1XZQ6UANQmnMVyDx3d0X4-2FQC271I,2138
|
5
|
-
ingestr/src/buildinfo.py,sha256=
|
5
|
+
ingestr/src/buildinfo.py,sha256=YC47ahfhDy6r-O7ID976SFjmSs8Wy8KQ_lFS_lYE-hg,21
|
6
6
|
ingestr/src/destinations.py,sha256=ivTPio0zzqLRx22i597pxZHMNClz-XvYSyCaCPuGd8g,22248
|
7
7
|
ingestr/src/errors.py,sha256=Ufs4_DfE77_E3vnA1fOQdi6cmuLVNm7_SbFLkL1XPGk,686
|
8
|
-
ingestr/src/factory.py,sha256=
|
8
|
+
ingestr/src/factory.py,sha256=q_rSi4gYMfxnGvzhytPRAgC08N40nqDISvXwl7i-E_M,6655
|
9
9
|
ingestr/src/filters.py,sha256=LLecXe9QkLFkFLUZ92OXNdcANr1a8edDxrflc2ko_KA,1452
|
10
10
|
ingestr/src/http_client.py,sha256=bxqsk6nJNXCo-79gW04B53DQO-yr25vaSsqP0AKtjx4,732
|
11
11
|
ingestr/src/loader.py,sha256=9NaWAyfkXdqAZSS-N72Iwo36Lbx4PyqIfaaH1dNdkFs,1712
|
12
12
|
ingestr/src/partition.py,sha256=BrIP6wFJvyR7Nus_3ElnfxknUXeCipK_E_bB8kZowfc,969
|
13
13
|
ingestr/src/resource.py,sha256=ZqmZxFQVGlF8rFPhBiUB08HES0yoTj8sZ--jKfaaVps,1164
|
14
|
-
ingestr/src/sources.py,sha256=
|
14
|
+
ingestr/src/sources.py,sha256=Lj6G_dubjx6O6N-JzHlmWtgVWBUCfIQlKOmmI4PDji8,107644
|
15
15
|
ingestr/src/table_definition.py,sha256=REbAbqdlmUMUuRh8nEQRreWjPVOQ5ZcfqGkScKdCrmk,390
|
16
16
|
ingestr/src/time.py,sha256=H_Fk2J4ShXyUM-EMY7MqCLZQhlnZMZvO952bmZPc4yE,254
|
17
17
|
ingestr/src/version.py,sha256=J_2xgZ0mKlvuHcjdKCx2nlioneLH0I47JiU_Slr_Nwc,189
|
@@ -41,9 +41,9 @@ ingestr/src/clickup/helpers.py,sha256=RzDKMUAHccuDhocIQ2ToBXfCERo8CBJqA3t-IPltBC
|
|
41
41
|
ingestr/src/collector/spinner.py,sha256=_ZUqF5MI43hVIULdjF5s5mrAZbhEFXaiWirQmrv3Yk4,1201
|
42
42
|
ingestr/src/dynamodb/__init__.py,sha256=swhxkeYBbJ35jn1IghCtvYWT2BM33KynVCh_oR4z28A,2264
|
43
43
|
ingestr/src/elasticsearch/__init__.py,sha256=m-q93HgUmTwGDUwHOjHawstWL06TC3WIX3H05szybrY,2556
|
44
|
-
ingestr/src/facebook_ads/__init__.py,sha256=
|
44
|
+
ingestr/src/facebook_ads/__init__.py,sha256=Lwo53pZ7KLoFfRKz35PaETZwG5gknHZPh5-li_wzEbE,9761
|
45
45
|
ingestr/src/facebook_ads/exceptions.py,sha256=4Nlbc0Mv3i5g-9AoyT-n1PIa8IDi3VCTfEAzholx4Wc,115
|
46
|
-
ingestr/src/facebook_ads/helpers.py,sha256=
|
46
|
+
ingestr/src/facebook_ads/helpers.py,sha256=NshS21can1xhRKQzg_o-c6qSxWoC3NnE3FwgJxUnygE,8239
|
47
47
|
ingestr/src/facebook_ads/settings.py,sha256=Bsic8RcmH-NfEZ7r_NGospTCmwISK9XaMT5y2NZirtg,4938
|
48
48
|
ingestr/src/facebook_ads/utils.py,sha256=ES2ylPoW3j3fjp6OMUgp21n1cG1OktXsmWWMk5vBW_I,1590
|
49
49
|
ingestr/src/filesystem/__init__.py,sha256=zkIwbRr0ir0EUdniI25p2zGiVc-7M9EmR351AjNb0eA,4163
|
@@ -54,7 +54,7 @@ ingestr/src/frankfurter/helpers.py,sha256=SyrkRTDqvKdQxRHTV5kcSeVG3FEnaK5zxHyNyq
|
|
54
54
|
ingestr/src/freshdesk/__init__.py,sha256=uFQW_cJyymxtHQiYb_xjzZAklc487L0n9GkgHgC7yAI,2618
|
55
55
|
ingestr/src/freshdesk/freshdesk_client.py,sha256=3z5Yc008ADzRcJWtNc00PwjkLzG-RMI8jVIOOyYA-Rw,4088
|
56
56
|
ingestr/src/freshdesk/settings.py,sha256=0Wr_OMnUZcTlry7BmALssLxD2yh686JW4moLNv12Jnw,409
|
57
|
-
ingestr/src/github/__init__.py,sha256=
|
57
|
+
ingestr/src/github/__init__.py,sha256=YmC8qIhm0Fw5QC6eG1JuqWSHuyC-kp77S7zeWGaPPto,7127
|
58
58
|
ingestr/src/github/helpers.py,sha256=rpv_3HzuOl4PQ-FUeA66pev-pgze9SaE8RUHIPYfZ_A,6759
|
59
59
|
ingestr/src/github/queries.py,sha256=W34C02jUEdjFmOE7f7u9xvYyBNDMfVZAu0JIRZI2mkU,2302
|
60
60
|
ingestr/src/github/settings.py,sha256=N5ahWrDIQ_4IWV9i-hTXxyYduqY9Ym2BTwqsWxcDdJ8,258
|
@@ -75,6 +75,8 @@ ingestr/src/gorgias/helpers.py,sha256=DamuijnvhGY9hysQO4txrVMf4izkGbh5qfBKImdOIN
|
|
75
75
|
ingestr/src/hubspot/__init__.py,sha256=wqHefhc_YRI5dNFCcpvH-UUilNThE49sbGouSBiHYsw,11776
|
76
76
|
ingestr/src/hubspot/helpers.py,sha256=k2b-lhxqBNKHoOSHoHegFSsk8xxjjGA0I04V0XyX2b4,7883
|
77
77
|
ingestr/src/hubspot/settings.py,sha256=i73MkSiJfRLMFLfiJgYdhp-rhymHTfoqFzZ4uOJdFJM,2456
|
78
|
+
ingestr/src/influxdb/__init__.py,sha256=sj_K4ShXECp6cW4xVVv2kCwQCFtTYD0dC9LOAEqFoVI,1289
|
79
|
+
ingestr/src/influxdb/client.py,sha256=hCxSNREAWWEvvAV3RQbKaWp2-e_7EE8xmVRjTwLFEFo,1230
|
78
80
|
ingestr/src/isoc_pulse/__init__.py,sha256=9b4eN4faatpiwTuRNPuYcEt1hEFDEjua9XhfakUigBk,4648
|
79
81
|
ingestr/src/kafka/__init__.py,sha256=QUHsGmdv5_E-3z0GDHXvbk39puwuGDBsyYSDhvbA89E,3595
|
80
82
|
ingestr/src/kafka/helpers.py,sha256=V9WcVn3PKnEpggArHda4vnAcaV8VDuh__dSmRviJb5Y,7502
|
@@ -120,7 +122,7 @@ ingestr/src/slack/helpers.py,sha256=08TLK7vhFvH_uekdLVOLF3bTDe1zgH0QxHObXHzk1a8,
|
|
120
122
|
ingestr/src/slack/settings.py,sha256=NhKn4y1zokEa5EmIZ05wtj_-I0GOASXZ5V81M1zXCtY,457
|
121
123
|
ingestr/src/smartsheets/__init__.py,sha256=pdzSV7rA0XYD5Xa1u4zb6vziy5iFXIQNROkpJ9oYas0,1623
|
122
124
|
ingestr/src/solidgate/__init__.py,sha256=Ts83j-JSnFsFuF4tDhVOfZKg7H0-bIpfn3kg1ZOR58A,8003
|
123
|
-
ingestr/src/solidgate/helpers.py,sha256=
|
125
|
+
ingestr/src/solidgate/helpers.py,sha256=mAsW_1hpD7ab3Y2vw8fxHi4yD3aT1geLdIYZ7ycyxBc,5690
|
124
126
|
ingestr/src/sql_database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
125
127
|
ingestr/src/sql_database/callbacks.py,sha256=sEFFmXxAURY3yeBjnawigDtq9LBCvi8HFqG4kLd7tMU,2002
|
126
128
|
ingestr/src/stripe_analytics/__init__.py,sha256=mK8dGKAlMPVqGE9gG30XfbvOvgVD0yWhNpt-D3iavDY,6385
|
@@ -128,7 +130,7 @@ ingestr/src/stripe_analytics/helpers.py,sha256=KGtRcSrhKEqzJ3AWpgDV2o4cuBFaIwu2G
|
|
128
130
|
ingestr/src/stripe_analytics/settings.py,sha256=xt1-ljwP4nLTNUa8l3KwFbtK8FtQHgHpzGF5uPKfRsw,2246
|
129
131
|
ingestr/src/telemetry/event.py,sha256=W7bs4uVfPakQ5otmiqgqu1l5SqjYx1p87wudnWXckBc,949
|
130
132
|
ingestr/src/testdata/fakebqcredentials.json,sha256=scc6TUc963KAbKTLZCfcmqVzbtzDCW1_8JNRnyAXyy8,628
|
131
|
-
ingestr/src/tiktok_ads/__init__.py,sha256=
|
133
|
+
ingestr/src/tiktok_ads/__init__.py,sha256=_upvSv79uktELTzg78VavYgQftfhp4YM6OXfpkm7r3A,4854
|
132
134
|
ingestr/src/tiktok_ads/tiktok_helpers.py,sha256=jmWHvZzN1Vt_PWrJkgq5a2wIwon-OBEzXoZx0jEy-74,3905
|
133
135
|
ingestr/src/trustpilot/__init__.py,sha256=ofhjep4qRPIi8q41qc97QVex8UbWF-Fd7gUsqeQlQX8,1279
|
134
136
|
ingestr/src/trustpilot/client.py,sha256=zKYt5C7nrR83Id0KN49EPmtml8MEtlSPlAosEFU3VXY,1616
|
@@ -149,8 +151,8 @@ ingestr/testdata/merge_expected.csv,sha256=DReHqWGnQMsf2PBv_Q2pfjsgvikYFnf1zYcQZ
|
|
149
151
|
ingestr/testdata/merge_part1.csv,sha256=Pw8Z9IDKcNU0qQHx1z6BUf4rF_-SxKGFOvymCt4OY9I,185
|
150
152
|
ingestr/testdata/merge_part2.csv,sha256=T_GiWxA81SN63_tMOIuemcvboEFeAmbKc7xRXvL9esw,287
|
151
153
|
ingestr/tests/unit/test_smartsheets.py,sha256=eiC2CCO4iNJcuN36ONvqmEDryCA1bA1REpayHpu42lk,5058
|
152
|
-
ingestr-0.13.
|
153
|
-
ingestr-0.13.
|
154
|
-
ingestr-0.13.
|
155
|
-
ingestr-0.13.
|
156
|
-
ingestr-0.13.
|
154
|
+
ingestr-0.13.75.dist-info/METADATA,sha256=QFv-opDKJQ6lQkrSHN23_FM2-Lwiue1bbavMPc_ghe0,15093
|
155
|
+
ingestr-0.13.75.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
156
|
+
ingestr-0.13.75.dist-info/entry_points.txt,sha256=oPJy0KBnPWYjDtP1k8qwAihcTLHSZokSQvRAw_wtfJM,46
|
157
|
+
ingestr-0.13.75.dist-info/licenses/LICENSE.md,sha256=cW8wIhn8HFE-KLStDF9jHQ1O_ARWP3kTpk_-eOccL24,1075
|
158
|
+
ingestr-0.13.75.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|