ingestr 0.13.73__py3-none-any.whl → 0.13.74__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 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
- start_time = datetime.now()
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.73"
1
+ version = "v0.13.74"
@@ -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('day').date(),
171
- end_value=ensure_pendulum_datetime(end_date).end_of('day').date() if end_date else None,
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 = pendulum.instance(date_start.end_value) if date_start.end_value else pendulum.now()
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,
@@ -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, name: str, access_token: Optional[str] = None
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="1970-01-01T00:00:00Z",
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
- yield page
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
@@ -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
- return github_repo_events(owner=owner, name=repo, access_token=access_token)
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,53 @@ 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.netloc
3055
+
3056
+ secure = params.get("secure", ["true"])[0].lower() != "false"
3057
+ scheme = "https" if secure else "http"
3058
+ host_url = f"{scheme}://{host}"
3059
+
3060
+ token = params.get("token")
3061
+ org = params.get("org")
3062
+ bucket = params.get("bucket")
3063
+
3064
+ if not host:
3065
+ raise MissingValueError("host", "InfluxDB")
3066
+ if not token:
3067
+ raise MissingValueError("token", "InfluxDB")
3068
+ if not org:
3069
+ raise MissingValueError("org", "InfluxDB")
3070
+ if not bucket:
3071
+ raise MissingValueError("bucket", "InfluxDB")
3072
+
3073
+ start_date = kwargs.get("interval_start")
3074
+ if start_date is not None:
3075
+ start_date = ensure_pendulum_datetime(start_date)
3076
+ else:
3077
+ start_date = pendulum.datetime(2024, 1, 1).in_tz("UTC")
3078
+
3079
+ end_date = kwargs.get("interval_end")
3080
+ if end_date is not None:
3081
+ end_date = ensure_pendulum_datetime(end_date)
3082
+
3083
+ from ingestr.src.influxdb import influxdb_source
3084
+
3085
+ return influxdb_source(
3086
+ measurement=table,
3087
+ host=host_url,
3088
+ org=org[0],
3089
+ bucket=bucket[0],
3090
+ token=token[0],
3091
+ secure=secure,
3092
+ start_date=start_date,
3093
+ end_date=end_date,
3094
+ ).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(datetime.last_value).in_tz(timezone)
129
- end_date_tz_adjusted = ensure_pendulum_datetime(datetime.end_value).in_tz(timezone)
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.73
3
+ Version: 0.13.74
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=wu4c_4nit3c5v2K1af68DjT2hIfEiCvzQ8EZJxOkJjo,26369
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=pp-vE1fEyXfxgbt7NqfxCSd3aCJw-b9na5MCnvRi0-w,21
5
+ ingestr/src/buildinfo.py,sha256=REjYT43XBfaEjWtVFd52wOGlauYC-dAqxlhyJPuegzE,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=1KvLgnafhD3u9Mbk3QNmKZVgQZsN0g1AwTMvTKNTyVY,6599
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=JGMKeoEHxpiSB64d3ScdukYfr2stfcJtJ6eU3hDoCLc,105432
14
+ ingestr/src/sources.py,sha256=gNmLk6cPEZNXMcbvyhWkFSBI1H5GMcKl92Hdl2OiTRI,107516
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=XgMtHH7yUYxjbTQn7wfIB59Yyk2jTWW40LUtbgHaQ_g,9719
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=GTXWhAmd8Hl1watEp5zEz6geOJudW76QWzSHPROAX28,8307
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=CIhOTcn74WEebtkRwslVLaw0LU8S91GVulVykIN01D4,5931
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=yZRBrBZlofuTvKOs_KQVoH1K60shSeDMyiBYzXYfMT0,5750
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=KFaN_s7VIj9AW6z-4Fcq0PXYcoX7OtKUgrdcHEitvUk,4794
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.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,,
154
+ ingestr-0.13.74.dist-info/METADATA,sha256=HC5ryGau5rsPcoKdY1GViHGjR1iyHsW2GpyTcgs3Nio,15093
155
+ ingestr-0.13.74.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
156
+ ingestr-0.13.74.dist-info/entry_points.txt,sha256=oPJy0KBnPWYjDtP1k8qwAihcTLHSZokSQvRAw_wtfJM,46
157
+ ingestr-0.13.74.dist-info/licenses/LICENSE.md,sha256=cW8wIhn8HFE-KLStDF9jHQ1O_ARWP3kTpk_-eOccL24,1075
158
+ ingestr-0.13.74.dist-info/RECORD,,