ingestr 0.13.71__py3-none-any.whl → 0.13.73__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 CHANGED
@@ -1 +1 @@
1
- version = "v0.13.71"
1
+ version = "v0.13.73"
@@ -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.isoformat(),
170
- end_value=end_date.isoformat() if end_date else None,
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 = get_start_date(date_start)
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=10,
205
+ insights_max_async_sleep_seconds=20,
206
206
  )
207
- yield list(map(process_report_item, job.get_result()))
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,
@@ -10,7 +10,7 @@ from dlt.sources import DltResource
10
10
  from .helpers import get_reactions_data, get_rest_pages, get_stargazers
11
11
 
12
12
 
13
- @dlt.source
13
+ @dlt.source(max_table_nesting=0)
14
14
  def github_reactions(
15
15
  owner: str,
16
16
  name: str,
@@ -114,7 +114,7 @@ def github_repo_events(
114
114
  return repo_events
115
115
 
116
116
 
117
- @dlt.source
117
+ @dlt.source(max_table_nesting=0)
118
118
  def github_stargazers(
119
119
  owner: str,
120
120
  name: str,
@@ -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.71
3
+ Version: 0.13.73
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==20.0.0
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=GlvBwB8aV5mufGGW4MafbR067L8Zr8wModuobUsy3Gs,21
5
+ ingestr/src/buildinfo.py,sha256=pp-vE1fEyXfxgbt7NqfxCSd3aCJw-b9na5MCnvRi0-w,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=AJCvlK4M1sIpAAks1K-xsR_uxziIxru74mj572zixhg,6546
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=Ey3fI-SZ08fVMZf5_uCdLku87UuT3bjM8SmesgoSSY8,104292
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=a1A5fO1r_FotoH9UET42tamqo_-ftCm9vBrkm5lpjG0,9579
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=EYqOAPUlhVNxwzjP_CUGjJvAXTq65nJC-v75BfyJKmg,8981
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
@@ -52,7 +54,7 @@ ingestr/src/frankfurter/helpers.py,sha256=SyrkRTDqvKdQxRHTV5kcSeVG3FEnaK5zxHyNyq
52
54
  ingestr/src/freshdesk/__init__.py,sha256=uFQW_cJyymxtHQiYb_xjzZAklc487L0n9GkgHgC7yAI,2618
53
55
  ingestr/src/freshdesk/freshdesk_client.py,sha256=3z5Yc008ADzRcJWtNc00PwjkLzG-RMI8jVIOOyYA-Rw,4088
54
56
  ingestr/src/freshdesk/settings.py,sha256=0Wr_OMnUZcTlry7BmALssLxD2yh686JW4moLNv12Jnw,409
55
- ingestr/src/github/__init__.py,sha256=xVijF-Wi4p88hkVJnKH-oTixismjD3aUcGqGa6Wr4e4,5889
57
+ ingestr/src/github/__init__.py,sha256=CIhOTcn74WEebtkRwslVLaw0LU8S91GVulVykIN01D4,5931
56
58
  ingestr/src/github/helpers.py,sha256=rpv_3HzuOl4PQ-FUeA66pev-pgze9SaE8RUHIPYfZ_A,6759
57
59
  ingestr/src/github/queries.py,sha256=W34C02jUEdjFmOE7f7u9xvYyBNDMfVZAu0JIRZI2mkU,2302
58
60
  ingestr/src/github/settings.py,sha256=N5ahWrDIQ_4IWV9i-hTXxyYduqY9Ym2BTwqsWxcDdJ8,258
@@ -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=PF_6VQnS065Br1UzSIekTVXBu3WtrMQL_v5CfbfaX5Y,63151
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.71.dist-info/METADATA,sha256=YIzmk8sSvhEUF2Yb7VRLRyGJpcigSaJrExacU-QtXlU,15022
151
- ingestr-0.13.71.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
152
- ingestr-0.13.71.dist-info/entry_points.txt,sha256=oPJy0KBnPWYjDtP1k8qwAihcTLHSZokSQvRAw_wtfJM,46
153
- ingestr-0.13.71.dist-info/licenses/LICENSE.md,sha256=cW8wIhn8HFE-KLStDF9jHQ1O_ARWP3kTpk_-eOccL24,1075
154
- ingestr-0.13.71.dist-info/RECORD,,
152
+ ingestr-0.13.73.dist-info/METADATA,sha256=nYpu2rxJCQx28ZDJE7aU-dVM7cCYy4IOIFt3reC8EMU,15022
153
+ ingestr-0.13.73.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
154
+ ingestr-0.13.73.dist-info/entry_points.txt,sha256=oPJy0KBnPWYjDtP1k8qwAihcTLHSZokSQvRAw_wtfJM,46
155
+ ingestr-0.13.73.dist-info/licenses/LICENSE.md,sha256=cW8wIhn8HFE-KLStDF9jHQ1O_ARWP3kTpk_-eOccL24,1075
156
+ ingestr-0.13.73.dist-info/RECORD,,