ingestr 0.13.71__py3-none-any.whl → 0.13.72__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/src/buildinfo.py +1 -1
- ingestr/src/clickup/__init__.py +85 -0
- ingestr/src/clickup/helpers.py +47 -0
- ingestr/src/facebook_ads/__init__.py +9 -8
- ingestr/src/facebook_ads/helpers.py +11 -31
- ingestr/src/factory.py +2 -0
- ingestr/src/shopify/__init__.py +0 -16
- ingestr/src/sources.py +35 -0
- {ingestr-0.13.71.dist-info → ingestr-0.13.72.dist-info}/METADATA +2 -2
- {ingestr-0.13.71.dist-info → ingestr-0.13.72.dist-info}/RECORD +13 -11
- {ingestr-0.13.71.dist-info → ingestr-0.13.72.dist-info}/WHEEL +0 -0
- {ingestr-0.13.71.dist-info → ingestr-0.13.72.dist-info}/entry_points.txt +0 -0
- {ingestr-0.13.71.dist-info → ingestr-0.13.72.dist-info}/licenses/LICENSE.md +0 -0
ingestr/src/buildinfo.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
version = "v0.13.
|
1
|
+
version = "v0.13.72"
|
@@ -0,0 +1,85 @@
|
|
1
|
+
"""Simple ClickUp source."""
|
2
|
+
|
3
|
+
from datetime import datetime
|
4
|
+
from typing import Iterable
|
5
|
+
|
6
|
+
import dlt
|
7
|
+
import pendulum
|
8
|
+
from dlt.common.time import ensure_pendulum_datetime
|
9
|
+
from dlt.sources import DltResource
|
10
|
+
|
11
|
+
from .helpers import ClickupClient
|
12
|
+
|
13
|
+
|
14
|
+
@dlt.source(max_table_nesting=0)
|
15
|
+
def clickup_source(
|
16
|
+
api_token: str = dlt.secrets.value,
|
17
|
+
start_date: datetime = None,
|
18
|
+
end_date: datetime = None,
|
19
|
+
) -> Iterable[DltResource]:
|
20
|
+
client = ClickupClient(api_token)
|
21
|
+
|
22
|
+
@dlt.resource(
|
23
|
+
name="user",
|
24
|
+
primary_key="id",
|
25
|
+
write_disposition="merge",
|
26
|
+
)
|
27
|
+
def user() -> Iterable[dict]:
|
28
|
+
data = client.get("/user")
|
29
|
+
yield data["user"]
|
30
|
+
|
31
|
+
@dlt.resource(name="teams", primary_key="id", write_disposition="merge")
|
32
|
+
def teams() -> Iterable[dict]:
|
33
|
+
for team in client.get_teams():
|
34
|
+
yield team
|
35
|
+
|
36
|
+
@dlt.resource(name="spaces", primary_key="id", write_disposition="merge")
|
37
|
+
def spaces() -> Iterable[dict]:
|
38
|
+
for space in client.get_spaces():
|
39
|
+
yield space
|
40
|
+
|
41
|
+
@dlt.resource(name="lists", write_disposition="merge", primary_key="id")
|
42
|
+
def lists() -> Iterable[dict]:
|
43
|
+
for list in client.get_lists():
|
44
|
+
yield list
|
45
|
+
|
46
|
+
@dlt.resource(
|
47
|
+
name="tasks",
|
48
|
+
write_disposition="merge",
|
49
|
+
primary_key="id",
|
50
|
+
columns={"date_updated": {"data_type": "timestamp"}},
|
51
|
+
)
|
52
|
+
def tasks(
|
53
|
+
date_updated: dlt.sources.incremental[str] = dlt.sources.incremental(
|
54
|
+
"date_updated",
|
55
|
+
initial_value=ensure_pendulum_datetime(start_date).in_timezone("UTC"),
|
56
|
+
range_end="closed",
|
57
|
+
range_start="closed",
|
58
|
+
),
|
59
|
+
) -> Iterable[dict]:
|
60
|
+
if date_updated.last_value:
|
61
|
+
start = ensure_pendulum_datetime(date_updated.last_value).in_timezone("UTC")
|
62
|
+
else:
|
63
|
+
start = ensure_pendulum_datetime(start_date).in_timezone("UTC")
|
64
|
+
|
65
|
+
if date_updated.end_value is None:
|
66
|
+
end = pendulum.now("UTC")
|
67
|
+
else:
|
68
|
+
end = date_updated.end_value.in_timezone("UTC")
|
69
|
+
|
70
|
+
for list_obj in client.get_lists():
|
71
|
+
for task in client.paginated(
|
72
|
+
f"/list/{list_obj['id']}/task", "tasks", {"page_size": 100}
|
73
|
+
):
|
74
|
+
task_dt = ensure_pendulum_datetime(int(task["date_updated"]) / 1000)
|
75
|
+
if task_dt >= start and task_dt <= end:
|
76
|
+
task["date_updated"] = task_dt
|
77
|
+
yield task
|
78
|
+
|
79
|
+
return (
|
80
|
+
user,
|
81
|
+
teams,
|
82
|
+
spaces,
|
83
|
+
lists,
|
84
|
+
tasks,
|
85
|
+
)
|
@@ -0,0 +1,47 @@
|
|
1
|
+
from typing import Iterable, Optional
|
2
|
+
|
3
|
+
from ..http_client import create_client
|
4
|
+
|
5
|
+
|
6
|
+
class ClickupClient:
|
7
|
+
def __init__(self, api_token: str):
|
8
|
+
self.session = create_client()
|
9
|
+
self.base_url = "https://api.clickup.com/api/v2"
|
10
|
+
self.headers = {"Authorization": api_token}
|
11
|
+
|
12
|
+
def get(self, endpoint: str, params: Optional[dict] = None) -> dict:
|
13
|
+
url = f"{self.base_url}{endpoint}"
|
14
|
+
resp = self.session.get(url, headers=self.headers, params=params or {})
|
15
|
+
resp.raise_for_status()
|
16
|
+
return resp.json()
|
17
|
+
|
18
|
+
def paginated(
|
19
|
+
self, endpoint: str, key: str, params: Optional[dict] = None
|
20
|
+
) -> Iterable[dict]:
|
21
|
+
page = 0
|
22
|
+
params = params or {}
|
23
|
+
while True:
|
24
|
+
params["page"] = page
|
25
|
+
data = self.get(endpoint, params)
|
26
|
+
items = data.get(key, data)
|
27
|
+
if not items:
|
28
|
+
break
|
29
|
+
for item in items:
|
30
|
+
yield item
|
31
|
+
if data.get("last_page") or len(items) < params.get("page_size", 100):
|
32
|
+
break
|
33
|
+
page += 1
|
34
|
+
|
35
|
+
def get_teams(self):
|
36
|
+
data = self.get("/team")
|
37
|
+
return data.get("teams", [])
|
38
|
+
|
39
|
+
def get_spaces(self):
|
40
|
+
for team in self.get_teams():
|
41
|
+
for space in self.paginated(f"/team/{team['id']}/space", "spaces"):
|
42
|
+
yield space
|
43
|
+
|
44
|
+
def get_lists(self):
|
45
|
+
for space in self.get_spaces():
|
46
|
+
for lst in self.paginated(f"/space/{space['id']}/list", "lists"):
|
47
|
+
yield lst
|
@@ -1,5 +1,6 @@
|
|
1
1
|
"""Loads campaigns, ads sets, ads, leads and insight data from Facebook Marketing API"""
|
2
2
|
|
3
|
+
from datetime import datetime
|
3
4
|
from typing import Iterator, Sequence
|
4
5
|
|
5
6
|
import dlt
|
@@ -7,12 +8,12 @@ from dlt.common import pendulum
|
|
7
8
|
from dlt.common.typing import TDataItems
|
8
9
|
from dlt.sources import DltResource
|
9
10
|
from facebook_business.adobjects.ad import Ad
|
11
|
+
from dlt.common.time import ensure_pendulum_datetime
|
10
12
|
|
11
13
|
from .helpers import (
|
12
14
|
execute_job,
|
13
15
|
get_ads_account,
|
14
16
|
get_data_chunked,
|
15
|
-
get_start_date,
|
16
17
|
process_report_item,
|
17
18
|
)
|
18
19
|
from .settings import (
|
@@ -166,15 +167,14 @@ def facebook_insights_source(
|
|
166
167
|
def facebook_insights(
|
167
168
|
date_start: dlt.sources.incremental[str] = dlt.sources.incremental(
|
168
169
|
"date_start",
|
169
|
-
initial_value=start_date.
|
170
|
-
end_value=end_date.
|
170
|
+
initial_value=ensure_pendulum_datetime(start_date).start_of('day').date(),
|
171
|
+
end_value=ensure_pendulum_datetime(end_date).end_of('day').date() if end_date else None,
|
171
172
|
range_end="closed",
|
172
173
|
range_start="closed",
|
173
|
-
lag=attribution_window_days_lag * 24 * 60 * 60, # Convert days to seconds
|
174
174
|
),
|
175
175
|
) -> Iterator[TDataItems]:
|
176
|
-
start_date =
|
177
|
-
end_date = pendulum.now()
|
176
|
+
start_date = date_start.last_value
|
177
|
+
end_date = pendulum.instance(date_start.end_value) if date_start.end_value else pendulum.now()
|
178
178
|
|
179
179
|
while start_date <= end_date:
|
180
180
|
query = {
|
@@ -202,9 +202,10 @@ def facebook_insights_source(
|
|
202
202
|
}
|
203
203
|
job = execute_job(
|
204
204
|
account.get_insights(params=query, is_async=True),
|
205
|
-
insights_max_async_sleep_seconds=
|
205
|
+
insights_max_async_sleep_seconds=20,
|
206
206
|
)
|
207
|
-
|
207
|
+
output = list(map(process_report_item, job.get_result()))
|
208
|
+
yield output
|
208
209
|
start_date = start_date.add(days=time_increment_days)
|
209
210
|
|
210
211
|
return facebook_insights
|
@@ -3,6 +3,7 @@
|
|
3
3
|
import functools
|
4
4
|
import itertools
|
5
5
|
import time
|
6
|
+
from datetime import datetime
|
6
7
|
from typing import Any, Iterator, Sequence
|
7
8
|
|
8
9
|
import dlt
|
@@ -23,43 +24,17 @@ from facebook_business.api import FacebookResponse
|
|
23
24
|
|
24
25
|
from .exceptions import InsightsJobTimeout
|
25
26
|
from .settings import (
|
26
|
-
FACEBOOK_INSIGHTS_RETENTION_PERIOD,
|
27
27
|
INSIGHTS_PRIMARY_KEY,
|
28
28
|
TFbMethod,
|
29
29
|
)
|
30
30
|
|
31
31
|
|
32
|
-
def get_start_date(
|
33
|
-
incremental_start_date: dlt.sources.incremental[str],
|
34
|
-
) -> pendulum.DateTime:
|
35
|
-
"""
|
36
|
-
Get the start date for incremental loading of Facebook Insights data.
|
37
|
-
"""
|
38
|
-
start_date: pendulum.DateTime = ensure_pendulum_datetime(
|
39
|
-
incremental_start_date.start_value
|
40
|
-
)
|
41
|
-
|
42
|
-
# facebook forgets insights so trim the lag and warn
|
43
|
-
min_start_date = pendulum.today().subtract(
|
44
|
-
months=FACEBOOK_INSIGHTS_RETENTION_PERIOD
|
45
|
-
)
|
46
|
-
if start_date < min_start_date:
|
47
|
-
logger.warning(
|
48
|
-
"%s: Start date is earlier than %s months ago, using %s instead. "
|
49
|
-
"For more information, see https://www.facebook.com/business/help/1695754927158071?id=354406972049255",
|
50
|
-
"facebook_insights",
|
51
|
-
FACEBOOK_INSIGHTS_RETENTION_PERIOD,
|
52
|
-
min_start_date,
|
53
|
-
)
|
54
|
-
start_date = min_start_date
|
55
|
-
incremental_start_date.start_value = min_start_date
|
56
|
-
|
57
|
-
# lag the incremental start date by attribution window lag
|
58
|
-
incremental_start_date.start_value = start_date.isoformat()
|
59
|
-
return start_date
|
60
|
-
|
61
|
-
|
62
32
|
def process_report_item(item: AbstractObject) -> DictStrAny:
|
33
|
+
if "date_start" in item:
|
34
|
+
item["date_start"] = datetime.strptime(item["date_start"], "%Y-%m-%d").date()
|
35
|
+
if "date_stop" in item:
|
36
|
+
item["date_stop"] = datetime.strptime(item["date_stop"], "%Y-%m-%d").date()
|
37
|
+
|
63
38
|
d: DictStrAny = item.export_all_data()
|
64
39
|
for pki in INSIGHTS_PRIMARY_KEY:
|
65
40
|
if pki not in d:
|
@@ -138,15 +113,20 @@ def execute_job(
|
|
138
113
|
time_start = time.time()
|
139
114
|
sleep_time = 3
|
140
115
|
while status != "Job Completed":
|
116
|
+
print("-----")
|
117
|
+
print("waiting for job to finish")
|
141
118
|
duration = time.time() - time_start
|
142
119
|
job = job.api_get()
|
143
120
|
status = job["async_status"]
|
144
121
|
percent_complete = job["async_percent_completion"]
|
122
|
+
print("async_status", status)
|
123
|
+
print("percent_complete", percent_complete)
|
145
124
|
|
146
125
|
job_id = job["id"]
|
147
126
|
logger.info("%s, %d%% done", status, percent_complete)
|
148
127
|
|
149
128
|
if status == "Job Completed":
|
129
|
+
print("job completed")
|
150
130
|
return job
|
151
131
|
|
152
132
|
if duration > insights_max_wait_to_start_seconds and percent_complete == 0:
|
ingestr/src/factory.py
CHANGED
@@ -32,6 +32,7 @@ from ingestr.src.sources import (
|
|
32
32
|
AsanaSource,
|
33
33
|
AttioSource,
|
34
34
|
ChessSource,
|
35
|
+
ClickupSource,
|
35
36
|
DynamoDBSource,
|
36
37
|
ElasticsearchSource,
|
37
38
|
FacebookAdsSource,
|
@@ -185,6 +186,7 @@ class SourceDestinationFactory:
|
|
185
186
|
"sftp": SFTPSource,
|
186
187
|
"pinterest": PinterestSource,
|
187
188
|
"zoom": ZoomSource,
|
189
|
+
"clickup": ClickupSource,
|
188
190
|
}
|
189
191
|
destinations: Dict[str, Type[DestinationProtocol]] = {
|
190
192
|
"bigquery": BigQueryDestination,
|
ingestr/src/shopify/__init__.py
CHANGED
@@ -1690,16 +1690,6 @@ query discountNodes($after: String, $query: String, $first: Int) {
|
|
1690
1690
|
"nullable": True,
|
1691
1691
|
"description": "The category of the product from Shopify's Standard Product Taxonomy.",
|
1692
1692
|
},
|
1693
|
-
"combinedListing": {
|
1694
|
-
"data_type": "json",
|
1695
|
-
"nullable": True,
|
1696
|
-
"description": "A special product type that combines separate products into a single product listing.",
|
1697
|
-
},
|
1698
|
-
"combinedListingRole": {
|
1699
|
-
"data_type": "json",
|
1700
|
-
"nullable": True,
|
1701
|
-
"description": "The role of the product in a combined listing.",
|
1702
|
-
},
|
1703
1693
|
"compareAtPriceRange": {
|
1704
1694
|
"data_type": "json",
|
1705
1695
|
"nullable": True,
|
@@ -1841,12 +1831,6 @@ query products($after: String, $query: String, $first: Int) {
|
|
1841
1831
|
category {
|
1842
1832
|
id
|
1843
1833
|
}
|
1844
|
-
combinedListing {
|
1845
|
-
parentProduct {
|
1846
|
-
id
|
1847
|
-
}
|
1848
|
-
}
|
1849
|
-
combinedListingRole
|
1850
1834
|
compareAtPriceRange {
|
1851
1835
|
maxVariantCompareAtPrice {
|
1852
1836
|
amount
|
ingestr/src/sources.py
CHANGED
@@ -2144,6 +2144,41 @@ class LinkedInAdsSource:
|
|
2144
2144
|
).with_resources("custom_reports")
|
2145
2145
|
|
2146
2146
|
|
2147
|
+
class ClickupSource:
|
2148
|
+
def handles_incrementality(self) -> bool:
|
2149
|
+
return True
|
2150
|
+
|
2151
|
+
def dlt_source(self, uri: str, table: str, **kwargs):
|
2152
|
+
parsed_uri = urlparse(uri)
|
2153
|
+
params = parse_qs(parsed_uri.query)
|
2154
|
+
api_token = params.get("api_token")
|
2155
|
+
|
2156
|
+
if api_token is None:
|
2157
|
+
raise MissingValueError("api_token", "ClickUp")
|
2158
|
+
|
2159
|
+
interval_start = kwargs.get("interval_start")
|
2160
|
+
interval_end = kwargs.get("interval_end")
|
2161
|
+
start_date = (
|
2162
|
+
ensure_pendulum_datetime(interval_start).in_timezone("UTC")
|
2163
|
+
if interval_start
|
2164
|
+
else pendulum.datetime(2020, 1, 1, tz="UTC")
|
2165
|
+
)
|
2166
|
+
end_date = (
|
2167
|
+
ensure_pendulum_datetime(interval_end).in_timezone("UTC")
|
2168
|
+
if interval_end
|
2169
|
+
else None
|
2170
|
+
)
|
2171
|
+
|
2172
|
+
from ingestr.src.clickup import clickup_source
|
2173
|
+
|
2174
|
+
if table not in {"user", "teams", "lists", "tasks", "spaces"}:
|
2175
|
+
raise UnsupportedResourceError(table, "ClickUp")
|
2176
|
+
|
2177
|
+
return clickup_source(
|
2178
|
+
api_token=api_token[0], start_date=start_date, end_date=end_date
|
2179
|
+
).with_resources(table)
|
2180
|
+
|
2181
|
+
|
2147
2182
|
class AppLovinSource:
|
2148
2183
|
def handles_incrementality(self) -> bool:
|
2149
2184
|
return True
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: ingestr
|
3
|
-
Version: 0.13.
|
3
|
+
Version: 0.13.72
|
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
|
@@ -57,7 +57,7 @@ Requires-Dist: elastic-transport==8.17.1
|
|
57
57
|
Requires-Dist: elasticsearch==8.10.1
|
58
58
|
Requires-Dist: enum-compat==0.0.3
|
59
59
|
Requires-Dist: et-xmlfile==2.0.0
|
60
|
-
Requires-Dist: facebook-business==
|
60
|
+
Requires-Dist: facebook-business==23.0.0
|
61
61
|
Requires-Dist: filelock==3.17.0
|
62
62
|
Requires-Dist: flatten-json==0.1.14
|
63
63
|
Requires-Dist: frozenlist==1.5.0
|
@@ -2,16 +2,16 @@ ingestr/conftest.py,sha256=OE2yxeTCosS9CUFVuqNypm-2ftYvVBeeq7egm3878cI,1981
|
|
2
2
|
ingestr/main.py,sha256=wu4c_4nit3c5v2K1af68DjT2hIfEiCvzQ8EZJxOkJjo,26369
|
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=Q_2qBKQATu1ZnDC7ngQFF9xlVk18EMm2xq8oZc-HJzI,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=1KvLgnafhD3u9Mbk3QNmKZVgQZsN0g1AwTMvTKNTyVY,6599
|
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=JGMKeoEHxpiSB64d3ScdukYfr2stfcJtJ6eU3hDoCLc,105432
|
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
|
@@ -36,12 +36,14 @@ ingestr/src/attio/helpers.py,sha256=fCySmG5E6Iyh3Nm9a-HGbHNedxPH_2_otXYMTQsCibw,
|
|
36
36
|
ingestr/src/chess/__init__.py,sha256=y0Q8aKBigeKf3N7wuB_gadMQjVJzBPUT8Jhp1ObEWjk,6812
|
37
37
|
ingestr/src/chess/helpers.py,sha256=v1HTImOMjAF7AzZUPDIuHu00e7ut0o5y1kWcVYo4QZw,549
|
38
38
|
ingestr/src/chess/settings.py,sha256=p0RlCGgtXUacPDEvZmwzSWmzX0Apj1riwfz-nrMK89k,158
|
39
|
+
ingestr/src/clickup/__init__.py,sha256=uvfAqNturT4bMvU4NS3E8BdL6nvDFzNuh7bMlih8HJk,2547
|
40
|
+
ingestr/src/clickup/helpers.py,sha256=RzDKMUAHccuDhocIQ2ToBXfCERo8CBJqA3t-IPltBCE,1519
|
39
41
|
ingestr/src/collector/spinner.py,sha256=_ZUqF5MI43hVIULdjF5s5mrAZbhEFXaiWirQmrv3Yk4,1201
|
40
42
|
ingestr/src/dynamodb/__init__.py,sha256=swhxkeYBbJ35jn1IghCtvYWT2BM33KynVCh_oR4z28A,2264
|
41
43
|
ingestr/src/elasticsearch/__init__.py,sha256=m-q93HgUmTwGDUwHOjHawstWL06TC3WIX3H05szybrY,2556
|
42
|
-
ingestr/src/facebook_ads/__init__.py,sha256=
|
44
|
+
ingestr/src/facebook_ads/__init__.py,sha256=XgMtHH7yUYxjbTQn7wfIB59Yyk2jTWW40LUtbgHaQ_g,9719
|
43
45
|
ingestr/src/facebook_ads/exceptions.py,sha256=4Nlbc0Mv3i5g-9AoyT-n1PIa8IDi3VCTfEAzholx4Wc,115
|
44
|
-
ingestr/src/facebook_ads/helpers.py,sha256=
|
46
|
+
ingestr/src/facebook_ads/helpers.py,sha256=GTXWhAmd8Hl1watEp5zEz6geOJudW76QWzSHPROAX28,8307
|
45
47
|
ingestr/src/facebook_ads/settings.py,sha256=Bsic8RcmH-NfEZ7r_NGospTCmwISK9XaMT5y2NZirtg,4938
|
46
48
|
ingestr/src/facebook_ads/utils.py,sha256=ES2ylPoW3j3fjp6OMUgp21n1cG1OktXsmWWMk5vBW_I,1590
|
47
49
|
ingestr/src/filesystem/__init__.py,sha256=zkIwbRr0ir0EUdniI25p2zGiVc-7M9EmR351AjNb0eA,4163
|
@@ -109,7 +111,7 @@ ingestr/src/pipedrive/helpers/pages.py,sha256=Klpjw2OnMuhzit3PpiHKsfzGcJ3rQPSQBl
|
|
109
111
|
ingestr/src/quickbooks/__init__.py,sha256=cZUuVCOTGPHTscRj6i0DytO63_fWF-4ieMxoU4PcyTg,3727
|
110
112
|
ingestr/src/salesforce/__init__.py,sha256=2hik5pRrxVODdDTlUEMoyccNC07zozjnxkMHcjMT1qA,4558
|
111
113
|
ingestr/src/salesforce/helpers.py,sha256=QTdazBt-qRTBbCQMZnyclIaDQFmBixBy_RDKD00Lt-8,2492
|
112
|
-
ingestr/src/shopify/__init__.py,sha256=
|
114
|
+
ingestr/src/shopify/__init__.py,sha256=dp6Ybk5LIKA5suzVt923v5LzHz5rMUuDfhjTNPqSjAc,62603
|
113
115
|
ingestr/src/shopify/exceptions.py,sha256=BhV3lIVWeBt8Eh4CWGW_REFJpGCzvW6-62yZrBWa3nQ,50
|
114
116
|
ingestr/src/shopify/helpers.py,sha256=NfHD6lWXe88ybR0ri-FCQuh2Vf8l5WG0a0FVjmdoSC4,6296
|
115
117
|
ingestr/src/shopify/settings.py,sha256=StY0EPr7wFJ7KzRRDN4TKxV0_gkIS1wPj2eR4AYSsDk,141
|
@@ -147,8 +149,8 @@ ingestr/testdata/merge_expected.csv,sha256=DReHqWGnQMsf2PBv_Q2pfjsgvikYFnf1zYcQZ
|
|
147
149
|
ingestr/testdata/merge_part1.csv,sha256=Pw8Z9IDKcNU0qQHx1z6BUf4rF_-SxKGFOvymCt4OY9I,185
|
148
150
|
ingestr/testdata/merge_part2.csv,sha256=T_GiWxA81SN63_tMOIuemcvboEFeAmbKc7xRXvL9esw,287
|
149
151
|
ingestr/tests/unit/test_smartsheets.py,sha256=eiC2CCO4iNJcuN36ONvqmEDryCA1bA1REpayHpu42lk,5058
|
150
|
-
ingestr-0.13.
|
151
|
-
ingestr-0.13.
|
152
|
-
ingestr-0.13.
|
153
|
-
ingestr-0.13.
|
154
|
-
ingestr-0.13.
|
152
|
+
ingestr-0.13.72.dist-info/METADATA,sha256=kEtaSQua4Y3lfRvnxaVv8AdbAuZMRMU-5RIg1IDHlDY,15022
|
153
|
+
ingestr-0.13.72.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
154
|
+
ingestr-0.13.72.dist-info/entry_points.txt,sha256=oPJy0KBnPWYjDtP1k8qwAihcTLHSZokSQvRAw_wtfJM,46
|
155
|
+
ingestr-0.13.72.dist-info/licenses/LICENSE.md,sha256=cW8wIhn8HFE-KLStDF9jHQ1O_ARWP3kTpk_-eOccL24,1075
|
156
|
+
ingestr-0.13.72.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|