ingestr 0.13.50__py3-none-any.whl → 0.13.52__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 +19 -2
- ingestr/src/buildinfo.py +1 -1
- ingestr/src/destinations.py +12 -0
- ingestr/src/factory.py +4 -0
- ingestr/src/filters.py +14 -0
- ingestr/src/http_client.py +14 -8
- ingestr/src/solidgate/__init__.py +33 -3
- ingestr/src/solidgate/helpers.py +66 -1
- ingestr/src/stripe_analytics/settings.py +55 -8
- {ingestr-0.13.50.dist-info → ingestr-0.13.52.dist-info}/METADATA +1 -1
- {ingestr-0.13.50.dist-info → ingestr-0.13.52.dist-info}/RECORD +14 -14
- {ingestr-0.13.50.dist-info → ingestr-0.13.52.dist-info}/WHEEL +0 -0
- {ingestr-0.13.50.dist-info → ingestr-0.13.52.dist-info}/entry_points.txt +0 -0
- {ingestr-0.13.50.dist-info → ingestr-0.13.52.dist-info}/licenses/LICENSE.md +0 -0
ingestr/main.py
CHANGED
|
@@ -58,6 +58,7 @@ class LoaderFileFormat(str, Enum):
|
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
class SqlBackend(str, Enum):
|
|
61
|
+
default = "default"
|
|
61
62
|
sqlalchemy = "sqlalchemy"
|
|
62
63
|
pyarrow = "pyarrow"
|
|
63
64
|
connectorx = "connectorx"
|
|
@@ -187,7 +188,7 @@ def ingest(
|
|
|
187
188
|
help="The SQL backend to use",
|
|
188
189
|
envvar=["SQL_BACKEND", "INGESTR_SQL_BACKEND"],
|
|
189
190
|
),
|
|
190
|
-
] = SqlBackend.
|
|
191
|
+
] = SqlBackend.default, # type: ignore
|
|
191
192
|
loader_file_format: Annotated[
|
|
192
193
|
Optional[LoaderFileFormat],
|
|
193
194
|
typer.Option(
|
|
@@ -289,7 +290,11 @@ def ingest(
|
|
|
289
290
|
from ingestr.src.collector.spinner import SpinnerCollector
|
|
290
291
|
from ingestr.src.destinations import AthenaDestination
|
|
291
292
|
from ingestr.src.factory import SourceDestinationFactory
|
|
292
|
-
from ingestr.src.filters import
|
|
293
|
+
from ingestr.src.filters import (
|
|
294
|
+
cast_set_to_list,
|
|
295
|
+
cast_spanner_types,
|
|
296
|
+
handle_mysql_empty_dates,
|
|
297
|
+
)
|
|
293
298
|
from ingestr.src.sources import MongoDbSource
|
|
294
299
|
|
|
295
300
|
def report_errors(run_info: LoadInfo):
|
|
@@ -517,6 +522,15 @@ def ingest(
|
|
|
517
522
|
if interval_end:
|
|
518
523
|
interval_end = interval_end.date() # type: ignore
|
|
519
524
|
|
|
525
|
+
if factory.source_scheme.startswith("spanner"):
|
|
526
|
+
# we tend to use the 'pyarrow' backend in general, however, it has issues with JSON objects, so we override it to 'sqlalchemy' for Spanner.
|
|
527
|
+
if sql_backend.value == SqlBackend.default:
|
|
528
|
+
sql_backend = SqlBackend.sqlalchemy
|
|
529
|
+
|
|
530
|
+
# this allows us to identify the cases where the user does not have a preference, so that for some sources we can override it.
|
|
531
|
+
if sql_backend == SqlBackend.default:
|
|
532
|
+
sql_backend = SqlBackend.pyarrow
|
|
533
|
+
|
|
520
534
|
dlt_source = source.dlt_source(
|
|
521
535
|
uri=source_uri,
|
|
522
536
|
table=source_table,
|
|
@@ -535,6 +549,9 @@ def ingest(
|
|
|
535
549
|
if factory.source_scheme.startswith("mysql"):
|
|
536
550
|
resource.for_each(dlt_source, lambda x: x.add_map(handle_mysql_empty_dates))
|
|
537
551
|
|
|
552
|
+
if factory.source_scheme.startswith("spanner"):
|
|
553
|
+
resource.for_each(dlt_source, lambda x: x.add_map(cast_spanner_types))
|
|
554
|
+
|
|
538
555
|
if yield_limit:
|
|
539
556
|
resource.for_each(dlt_source, lambda x: x.add_limit(yield_limit))
|
|
540
557
|
|
ingestr/src/buildinfo.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
version = "v0.13.
|
|
1
|
+
version = "v0.13.52"
|
ingestr/src/destinations.py
CHANGED
|
@@ -468,3 +468,15 @@ class S3Destination:
|
|
|
468
468
|
|
|
469
469
|
def post_load(self) -> None:
|
|
470
470
|
pass
|
|
471
|
+
|
|
472
|
+
|
|
473
|
+
class SqliteDestination(GenericSqlDestination):
|
|
474
|
+
def dlt_dest(self, uri: str, **kwargs):
|
|
475
|
+
return dlt.destinations.sqlalchemy(credentials=uri)
|
|
476
|
+
|
|
477
|
+
def dlt_run_params(self, uri: str, table: str, **kwargs):
|
|
478
|
+
return {
|
|
479
|
+
#https://dlthub.com/docs/dlt-ecosystem/destinations/sqlalchemy#dataset-files
|
|
480
|
+
"dataset_name": "main",
|
|
481
|
+
"table_name": table,
|
|
482
|
+
}
|
ingestr/src/factory.py
CHANGED
|
@@ -15,6 +15,7 @@ from ingestr.src.destinations import (
|
|
|
15
15
|
RedshiftDestination,
|
|
16
16
|
S3Destination,
|
|
17
17
|
SnowflakeDestination,
|
|
18
|
+
SqliteDestination,
|
|
18
19
|
SynapseDestination,
|
|
19
20
|
)
|
|
20
21
|
from ingestr.src.sources import (
|
|
@@ -54,6 +55,7 @@ from ingestr.src.sources import (
|
|
|
54
55
|
SalesforceSource,
|
|
55
56
|
ShopifySource,
|
|
56
57
|
SlackSource,
|
|
58
|
+
SmartsheetSource,
|
|
57
59
|
SolidgateSource,
|
|
58
60
|
SqlSource,
|
|
59
61
|
StripeAnalyticsSource,
|
|
@@ -161,6 +163,7 @@ class SourceDestinationFactory:
|
|
|
161
163
|
"elasticsearch": ElasticsearchSource,
|
|
162
164
|
"attio": AttioSource,
|
|
163
165
|
"solidgate": SolidgateSource,
|
|
166
|
+
"smartsheet": SmartsheetSource,
|
|
164
167
|
}
|
|
165
168
|
destinations: Dict[str, Type[DestinationProtocol]] = {
|
|
166
169
|
"bigquery": BigQueryDestination,
|
|
@@ -180,6 +183,7 @@ class SourceDestinationFactory:
|
|
|
180
183
|
"clickhouse+native": ClickhouseDestination,
|
|
181
184
|
"clickhouse": ClickhouseDestination,
|
|
182
185
|
"s3": S3Destination,
|
|
186
|
+
"sqlite": SqliteDestination,
|
|
183
187
|
}
|
|
184
188
|
|
|
185
189
|
def __init__(self, source_uri: str, destination_uri: str):
|
ingestr/src/filters.py
CHANGED
|
@@ -7,6 +7,20 @@ def cast_set_to_list(row):
|
|
|
7
7
|
return row
|
|
8
8
|
|
|
9
9
|
|
|
10
|
+
def cast_spanner_types(row):
|
|
11
|
+
if not isinstance(row, dict):
|
|
12
|
+
return row
|
|
13
|
+
|
|
14
|
+
from google.cloud.spanner_v1.data_types import JsonObject
|
|
15
|
+
|
|
16
|
+
for key in row.keys():
|
|
17
|
+
if isinstance(row[key], JsonObject):
|
|
18
|
+
import json
|
|
19
|
+
|
|
20
|
+
row[key] = json.loads(row[key].serialize())
|
|
21
|
+
return row
|
|
22
|
+
|
|
23
|
+
|
|
10
24
|
def handle_mysql_empty_dates(row):
|
|
11
25
|
# MySQL returns empty dates as 0000-00-00, which is not a valid date, we handle them here.
|
|
12
26
|
if not isinstance(row, dict):
|
ingestr/src/http_client.py
CHANGED
|
@@ -2,17 +2,23 @@ import requests
|
|
|
2
2
|
from dlt.sources.helpers.requests import Client
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
def create_client() -> requests.Session:
|
|
5
|
+
def create_client(retry_status_codes: list[int] | None = None) -> requests.Session:
|
|
6
|
+
if retry_status_codes is None:
|
|
7
|
+
retry_status_codes = [502]
|
|
6
8
|
return Client(
|
|
7
9
|
raise_for_status=False,
|
|
8
|
-
retry_condition=
|
|
10
|
+
retry_condition=retry_on_status_code(retry_status_codes),
|
|
9
11
|
request_max_attempts=12,
|
|
12
|
+
request_backoff_factor=10,
|
|
10
13
|
).session
|
|
11
14
|
|
|
12
15
|
|
|
13
|
-
def
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
16
|
+
def retry_on_status_code(retry_status_codes: list[int]):
|
|
17
|
+
def retry_on_limit(
|
|
18
|
+
response: requests.Response | None, exception: BaseException | None
|
|
19
|
+
) -> bool:
|
|
20
|
+
if response is None:
|
|
21
|
+
return False
|
|
22
|
+
return response.status_code in retry_status_codes
|
|
23
|
+
|
|
24
|
+
return retry_on_limit
|
|
@@ -43,7 +43,7 @@ def solidgate_source(
|
|
|
43
43
|
yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
|
|
44
44
|
|
|
45
45
|
@dlt.resource(
|
|
46
|
-
name="
|
|
46
|
+
name="apm_orders",
|
|
47
47
|
write_disposition="merge",
|
|
48
48
|
primary_key="order_id",
|
|
49
49
|
columns={
|
|
@@ -69,7 +69,7 @@ def solidgate_source(
|
|
|
69
69
|
yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
|
|
70
70
|
|
|
71
71
|
@dlt.resource(
|
|
72
|
-
name="
|
|
72
|
+
name="card_orders",
|
|
73
73
|
write_disposition="merge",
|
|
74
74
|
primary_key="order_id",
|
|
75
75
|
columns={
|
|
@@ -94,4 +94,34 @@ def solidgate_source(
|
|
|
94
94
|
start_dt = dateTime.last_value
|
|
95
95
|
yield solidgate_client.fetch_data(path, date_from=start_dt, date_to=end_dt)
|
|
96
96
|
|
|
97
|
-
|
|
97
|
+
@dlt.resource(
|
|
98
|
+
name="financial_entries",
|
|
99
|
+
write_disposition="merge",
|
|
100
|
+
primary_key="id",
|
|
101
|
+
columns={
|
|
102
|
+
"created_at": {"data_type": "timestamp", "partition": True},
|
|
103
|
+
},
|
|
104
|
+
)
|
|
105
|
+
def fetch_financial_entries(
|
|
106
|
+
dateTime=dlt.sources.incremental(
|
|
107
|
+
"created_at",
|
|
108
|
+
initial_value=start_date,
|
|
109
|
+
end_value=end_date,
|
|
110
|
+
range_start="closed",
|
|
111
|
+
range_end="closed",
|
|
112
|
+
),
|
|
113
|
+
):
|
|
114
|
+
if dateTime.end_value is None:
|
|
115
|
+
end_date = pendulum.now(tz="UTC")
|
|
116
|
+
else:
|
|
117
|
+
end_date = dateTime.end_value
|
|
118
|
+
|
|
119
|
+
start_date = dateTime.last_value
|
|
120
|
+
yield solidgate_client.fetch_financial_entry_data(start_date, end_date)
|
|
121
|
+
|
|
122
|
+
return (
|
|
123
|
+
fetch_all_subscriptions,
|
|
124
|
+
fetch_apm_orders,
|
|
125
|
+
fetch_card_orders,
|
|
126
|
+
fetch_financial_entries,
|
|
127
|
+
)
|
ingestr/src/solidgate/helpers.py
CHANGED
|
@@ -2,7 +2,10 @@ import base64
|
|
|
2
2
|
import hashlib
|
|
3
3
|
import hmac
|
|
4
4
|
import json
|
|
5
|
+
import time
|
|
6
|
+
from io import StringIO
|
|
5
7
|
|
|
8
|
+
import pandas as pd # type: ignore
|
|
6
9
|
import pendulum
|
|
7
10
|
|
|
8
11
|
from ingestr.src.http_client import create_client
|
|
@@ -13,7 +16,7 @@ class SolidgateClient:
|
|
|
13
16
|
self.base_url = "https://reports.solidgate.com/api/v1"
|
|
14
17
|
self.public_key = public_key
|
|
15
18
|
self.secret_key = secret_key
|
|
16
|
-
self.client = create_client()
|
|
19
|
+
self.client = create_client(retry_status_codes=[204])
|
|
17
20
|
|
|
18
21
|
def fetch_data(
|
|
19
22
|
self,
|
|
@@ -66,6 +69,68 @@ class SolidgateClient:
|
|
|
66
69
|
if not next_page_iterator or next_page_iterator == "None":
|
|
67
70
|
break
|
|
68
71
|
|
|
72
|
+
def fetch_financial_entry_data(
|
|
73
|
+
self, date_from: pendulum.DateTime, date_to: pendulum.DateTime
|
|
74
|
+
):
|
|
75
|
+
request_payload = {
|
|
76
|
+
"date_from": date_from.format("YYYY-MM-DD HH:mm:ss"),
|
|
77
|
+
"date_to": date_to.format("YYYY-MM-DD HH:mm:ss"),
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
json_string = json.dumps(request_payload)
|
|
81
|
+
signature = self.generateSignature(json_string)
|
|
82
|
+
headers = {
|
|
83
|
+
"merchant": self.public_key,
|
|
84
|
+
"Signature": signature,
|
|
85
|
+
"Content-Type": "application/json",
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
url = f"{self.base_url}/finance/financial_entries"
|
|
89
|
+
post_response = self.client.post(url, headers=headers, json=request_payload)
|
|
90
|
+
post_response.raise_for_status()
|
|
91
|
+
report_url = post_response.json().get("report_url")
|
|
92
|
+
if not report_url:
|
|
93
|
+
return f"Report URL not found in the response: {post_response.json()}", 400
|
|
94
|
+
|
|
95
|
+
# Wait for 5 seconds before attempting to download the report as report may not be immediately available
|
|
96
|
+
time.sleep(5)
|
|
97
|
+
|
|
98
|
+
data = self.public_key + self.public_key
|
|
99
|
+
hmac_hash = hmac.new(
|
|
100
|
+
self.secret_key.encode("utf-8"), data.encode("utf-8"), hashlib.sha512
|
|
101
|
+
).digest()
|
|
102
|
+
signature_get = base64.b64encode(hmac_hash.hex().encode("utf-8")).decode(
|
|
103
|
+
"utf-8"
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
headers_get = {
|
|
107
|
+
"merchant": self.public_key,
|
|
108
|
+
"Signature": signature_get,
|
|
109
|
+
"Content-Type": "application/json",
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
get_response = self.client.get(report_url, headers=headers_get)
|
|
113
|
+
|
|
114
|
+
if get_response.status_code == 200:
|
|
115
|
+
try:
|
|
116
|
+
response_json = json.loads(get_response.content)
|
|
117
|
+
if "error" in response_json:
|
|
118
|
+
raise Exception(f"API Error: {response_json['error']['messages']}")
|
|
119
|
+
except json.JSONDecodeError:
|
|
120
|
+
try:
|
|
121
|
+
csv_data = get_response.content.decode("utf-8")
|
|
122
|
+
df = pd.read_csv(StringIO(csv_data))
|
|
123
|
+
df["created_at"] = df["created_at"].apply(
|
|
124
|
+
lambda x: pendulum.parse(x)
|
|
125
|
+
)
|
|
126
|
+
return df
|
|
127
|
+
except Exception as e:
|
|
128
|
+
raise Exception(f"Error reading CSV: {e}")
|
|
129
|
+
else:
|
|
130
|
+
raise Exception(
|
|
131
|
+
f"Failed to get report. Status code: {get_response.status_code}"
|
|
132
|
+
)
|
|
133
|
+
|
|
69
134
|
def generateSignature(self, json_string):
|
|
70
135
|
data = self.public_key + json_string + self.public_key
|
|
71
136
|
hmac_hash = hmac.new(
|
|
@@ -3,24 +3,71 @@
|
|
|
3
3
|
# the most popular endpoints
|
|
4
4
|
# Full list of the Stripe API endpoints you can find here: https://stripe.com/docs/api.
|
|
5
5
|
ENDPOINTS = {
|
|
6
|
-
"subscription": "Subscription",
|
|
7
6
|
"account": "Account",
|
|
7
|
+
"applepaydomain": "ApplePayDomain",
|
|
8
|
+
"apple_pay_domain": "ApplePayDomain",
|
|
9
|
+
"applicationfee": "ApplicationFee",
|
|
10
|
+
"application_fee": "ApplicationFee",
|
|
11
|
+
"checkoutsession": "CheckoutSession",
|
|
12
|
+
"checkout_session": "CheckoutSession",
|
|
8
13
|
"coupon": "Coupon",
|
|
9
14
|
"customer": "Customer",
|
|
10
|
-
"
|
|
15
|
+
"dispute": "Dispute",
|
|
16
|
+
"paymentintent": "PaymentIntent",
|
|
17
|
+
"payment_intent": "PaymentIntent",
|
|
18
|
+
"paymentlink": "PaymentLink",
|
|
19
|
+
"payment_link": "PaymentLink",
|
|
20
|
+
"paymentmethod": "PaymentMethod",
|
|
21
|
+
"payment_method": "PaymentMethod",
|
|
22
|
+
"paymentmethoddomain": "PaymentMethodDomain",
|
|
23
|
+
"payment_method_domain": "PaymentMethodDomain",
|
|
24
|
+
"payout": "Payout",
|
|
25
|
+
"plan": "Plan",
|
|
11
26
|
"price": "Price",
|
|
27
|
+
"product": "Product",
|
|
28
|
+
"promotioncode": "PromotionCode",
|
|
29
|
+
"promotion_code": "PromotionCode",
|
|
30
|
+
"quote": "Quote",
|
|
31
|
+
"refund": "Refund",
|
|
32
|
+
"review": "Review",
|
|
33
|
+
"setupattempt": "SetupAttempt",
|
|
34
|
+
"setup_attempt": "SetupAttempt",
|
|
35
|
+
"setupintent": "SetupIntent",
|
|
36
|
+
"setup_intent": "SetupIntent",
|
|
12
37
|
"shippingrate": "ShippingRate",
|
|
13
|
-
"
|
|
38
|
+
"shipping_rate": "ShippingRate",
|
|
39
|
+
"subscription": "Subscription",
|
|
14
40
|
"subscriptionitem": "SubscriptionItem",
|
|
15
|
-
"
|
|
41
|
+
"subscription_item": "SubscriptionItem",
|
|
42
|
+
"subscriptionschedule": "SubscriptionSchedule",
|
|
43
|
+
"subscription_schedule": "SubscriptionSchedule",
|
|
44
|
+
"transfer": "Transfer",
|
|
45
|
+
"taxcode": "TaxCode",
|
|
46
|
+
"tax_code": "TaxCode",
|
|
47
|
+
"taxid": "TaxId",
|
|
48
|
+
"tax_id": "TaxId",
|
|
49
|
+
"taxrate": "TaxRate",
|
|
50
|
+
"tax_rate": "TaxRate",
|
|
51
|
+
"topup": "Topup",
|
|
52
|
+
"top_up": "Topup",
|
|
53
|
+
"webhookendpoint": "WebhookEndpoint",
|
|
54
|
+
"webhook_endpoint": "WebhookEndpoint",
|
|
16
55
|
}
|
|
17
56
|
# possible incremental endpoints
|
|
18
57
|
INCREMENTAL_ENDPOINTS = {
|
|
19
|
-
"
|
|
20
|
-
"
|
|
58
|
+
"applicationfee": "ApplicationFee",
|
|
59
|
+
"application_fee": "ApplicationFee",
|
|
21
60
|
"balancetransaction": "BalanceTransaction",
|
|
61
|
+
"balance_transaction": "BalanceTransaction",
|
|
22
62
|
"charge": "Charge",
|
|
23
|
-
"applicationfee": "ApplicationFee",
|
|
24
|
-
"setupattempt": "SetupAttempt",
|
|
25
63
|
"creditnote": "CreditNote",
|
|
64
|
+
"credit_note": "CreditNote",
|
|
65
|
+
"event": "Event",
|
|
66
|
+
"invoice": "Invoice",
|
|
67
|
+
"invoiceitem": "InvoiceItem",
|
|
68
|
+
"invoice_item": "InvoiceItem",
|
|
69
|
+
"invoicelineitem": "InvoiceLineItem",
|
|
70
|
+
"invoice_line_item": "InvoiceLineItem",
|
|
71
|
+
"setupattempt": "SetupAttempt",
|
|
72
|
+
"setup_attempt": "SetupAttempt",
|
|
26
73
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.13.
|
|
3
|
+
Version: 0.13.52
|
|
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
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
ingestr/conftest.py,sha256=Q03FIJIZpLBbpj55cfCHIKEjc1FCvWJhMF2cidUJKQU,1748
|
|
2
|
-
ingestr/main.py,sha256=
|
|
2
|
+
ingestr/main.py,sha256=GkC1hdq8AVGrvolc95zMfjmibI95p2pmFkbgCOVf-Og,26311
|
|
3
3
|
ingestr/src/.gitignore,sha256=8cX1AZTSI0TcdZFGTmS_oyBjpfCzhOEt0DdAo2dFIY8,203
|
|
4
4
|
ingestr/src/blob.py,sha256=onMe5ZHxPXTdcB_s2oGNdMo-XQJ3ajwOsWE9eSTGFmc,1495
|
|
5
|
-
ingestr/src/buildinfo.py,sha256=
|
|
6
|
-
ingestr/src/destinations.py,sha256=
|
|
5
|
+
ingestr/src/buildinfo.py,sha256=qcKqSPI861BBapk7rbcYkc9M_18QQnT44YM1Zr_Sg80,21
|
|
6
|
+
ingestr/src/destinations.py,sha256=axSm0GLM_bKQmWYb74fnHebNktWgtfAyyqdHV-zBOsA,16405
|
|
7
7
|
ingestr/src/errors.py,sha256=Ufs4_DfE77_E3vnA1fOQdi6cmuLVNm7_SbFLkL1XPGk,686
|
|
8
|
-
ingestr/src/factory.py,sha256=
|
|
9
|
-
ingestr/src/filters.py,sha256=
|
|
10
|
-
ingestr/src/http_client.py,sha256=
|
|
8
|
+
ingestr/src/factory.py,sha256=5yrg-XkaixuCkiTz3B7mraE8LaANXtzItenbx8TdPrE,5863
|
|
9
|
+
ingestr/src/filters.py,sha256=LLecXe9QkLFkFLUZ92OXNdcANr1a8edDxrflc2ko_KA,1452
|
|
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
|
|
@@ -109,13 +109,13 @@ ingestr/src/slack/__init__.py,sha256=pyDukxcilqTAe_bBzfWJ8Vxi83S-XEdEFBH2pEgILrM
|
|
|
109
109
|
ingestr/src/slack/helpers.py,sha256=08TLK7vhFvH_uekdLVOLF3bTDe1zgH0QxHObXHzk1a8,6545
|
|
110
110
|
ingestr/src/slack/settings.py,sha256=NhKn4y1zokEa5EmIZ05wtj_-I0GOASXZ5V81M1zXCtY,457
|
|
111
111
|
ingestr/src/smartsheets/__init__.py,sha256=pdzSV7rA0XYD5Xa1u4zb6vziy5iFXIQNROkpJ9oYas0,1623
|
|
112
|
-
ingestr/src/solidgate/__init__.py,sha256=
|
|
113
|
-
ingestr/src/solidgate/helpers.py,sha256=
|
|
112
|
+
ingestr/src/solidgate/__init__.py,sha256=JdaXvAu5QGuf9-FY294vwCQCEmfrqIld9oqbzqCJS3g,3626
|
|
113
|
+
ingestr/src/solidgate/helpers.py,sha256=oePEc9nnvmN3IaKrfJCvyKL79xdGM0-gRTN3-8tY4Fc,4952
|
|
114
114
|
ingestr/src/sql_database/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
115
115
|
ingestr/src/sql_database/callbacks.py,sha256=sEFFmXxAURY3yeBjnawigDtq9LBCvi8HFqG4kLd7tMU,2002
|
|
116
116
|
ingestr/src/stripe_analytics/__init__.py,sha256=FBkZu5op5Z-FceEi4zG7qcAgZfUYJRPMVPPrPMjvmXw,4502
|
|
117
117
|
ingestr/src/stripe_analytics/helpers.py,sha256=iqZOyiGIOhOAhVXXU16DP0hkkTKcTrDu69vAJoTxgEo,1976
|
|
118
|
-
ingestr/src/stripe_analytics/settings.py,sha256=
|
|
118
|
+
ingestr/src/stripe_analytics/settings.py,sha256=ZahhZg3Sq2KnvnDcfSaXO494Csy3tElBDEHnvA1AVmA,2461
|
|
119
119
|
ingestr/src/telemetry/event.py,sha256=W7bs4uVfPakQ5otmiqgqu1l5SqjYx1p87wudnWXckBc,949
|
|
120
120
|
ingestr/src/testdata/fakebqcredentials.json,sha256=scc6TUc963KAbKTLZCfcmqVzbtzDCW1_8JNRnyAXyy8,628
|
|
121
121
|
ingestr/src/tiktok_ads/__init__.py,sha256=aEqCl3dTH6_d43s1jgAeG1UasEls_SlorORulYMwIL8,4590
|
|
@@ -135,8 +135,8 @@ ingestr/testdata/merge_expected.csv,sha256=DReHqWGnQMsf2PBv_Q2pfjsgvikYFnf1zYcQZ
|
|
|
135
135
|
ingestr/testdata/merge_part1.csv,sha256=Pw8Z9IDKcNU0qQHx1z6BUf4rF_-SxKGFOvymCt4OY9I,185
|
|
136
136
|
ingestr/testdata/merge_part2.csv,sha256=T_GiWxA81SN63_tMOIuemcvboEFeAmbKc7xRXvL9esw,287
|
|
137
137
|
ingestr/tests/unit/test_smartsheets.py,sha256=eiC2CCO4iNJcuN36ONvqmEDryCA1bA1REpayHpu42lk,5058
|
|
138
|
-
ingestr-0.13.
|
|
139
|
-
ingestr-0.13.
|
|
140
|
-
ingestr-0.13.
|
|
141
|
-
ingestr-0.13.
|
|
142
|
-
ingestr-0.13.
|
|
138
|
+
ingestr-0.13.52.dist-info/METADATA,sha256=jfSWJ6mE6vPz-5XsIIjqdLxd45-OrOUKbhbwJqiZlSc,13983
|
|
139
|
+
ingestr-0.13.52.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
|
|
140
|
+
ingestr-0.13.52.dist-info/entry_points.txt,sha256=oPJy0KBnPWYjDtP1k8qwAihcTLHSZokSQvRAw_wtfJM,46
|
|
141
|
+
ingestr-0.13.52.dist-info/licenses/LICENSE.md,sha256=cW8wIhn8HFE-KLStDF9jHQ1O_ARWP3kTpk_-eOccL24,1075
|
|
142
|
+
ingestr-0.13.52.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|