ingestr 0.5.1__py3-none-any.whl → 0.6.1__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 +16 -3
- ingestr/main_test.py +287 -7
- ingestr/src/destinations.py +1 -1
- ingestr/src/factory.py +9 -0
- ingestr/src/gorgias/__init__.py +587 -0
- ingestr/src/gorgias/helpers.py +149 -0
- ingestr/src/gorgias/helpers_test.py +45 -0
- ingestr/src/shopify/__init__.py +227 -0
- ingestr/src/shopify/exceptions.py +2 -0
- ingestr/src/shopify/helpers.py +147 -0
- ingestr/src/shopify/settings.py +5 -0
- ingestr/src/sources.py +133 -3
- ingestr/src/version.py +1 -1
- ingestr/testdata/create_replace.csv +21 -0
- ingestr/testdata/delete_insert_expected.csv +6 -0
- ingestr/testdata/delete_insert_part1.csv +5 -0
- ingestr/testdata/delete_insert_part2.csv +6 -0
- ingestr/testdata/merge_expected.csv +5 -0
- ingestr/testdata/merge_part1.csv +4 -0
- ingestr/testdata/merge_part2.csv +5 -0
- {ingestr-0.5.1.dist-info → ingestr-0.6.1.dist-info}/METADATA +8 -2
- {ingestr-0.5.1.dist-info → ingestr-0.6.1.dist-info}/RECORD +25 -16
- {ingestr-0.5.1.dist-info → ingestr-0.6.1.dist-info}/WHEEL +1 -1
- ingestr/testdata/test_append.db +0 -0
- ingestr/testdata/test_create_replace.db +0 -0
- ingestr/testdata/test_delete_insert_with_timerange.db +0 -0
- ingestr/testdata/test_delete_insert_without_primary_key.db +0 -0
- ingestr/testdata/test_merge_with_primary_key.db +0 -0
- {ingestr-0.5.1.dist-info → ingestr-0.6.1.dist-info}/entry_points.txt +0 -0
- {ingestr-0.5.1.dist-info → ingestr-0.6.1.dist-info}/licenses/LICENSE.md +0 -0
ingestr/src/sources.py
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import base64
|
|
2
2
|
import csv
|
|
3
3
|
import json
|
|
4
|
-
from typing import Callable
|
|
4
|
+
from typing import Any, Callable, Optional
|
|
5
5
|
from urllib.parse import parse_qs, urlparse
|
|
6
6
|
|
|
7
7
|
import dlt
|
|
8
8
|
|
|
9
9
|
from ingestr.src.google_sheets import google_spreadsheet
|
|
10
|
+
from ingestr.src.gorgias import gorgias_source
|
|
10
11
|
from ingestr.src.mongodb import mongodb_collection
|
|
11
12
|
from ingestr.src.notion import notion_databases
|
|
13
|
+
from ingestr.src.shopify import shopify_source
|
|
12
14
|
from ingestr.src.sql_database import sql_table
|
|
13
15
|
|
|
14
16
|
|
|
@@ -18,6 +20,9 @@ class SqlSource:
|
|
|
18
20
|
def __init__(self, table_builder=sql_table) -> None:
|
|
19
21
|
self.table_builder = table_builder
|
|
20
22
|
|
|
23
|
+
def handles_incrementality(self) -> bool:
|
|
24
|
+
return False
|
|
25
|
+
|
|
21
26
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
22
27
|
table_fields = table.split(".")
|
|
23
28
|
if len(table_fields) != 2:
|
|
@@ -56,6 +61,9 @@ class MongoDbSource:
|
|
|
56
61
|
def __init__(self, table_builder=mongodb_collection) -> None:
|
|
57
62
|
self.table_builder = table_builder
|
|
58
63
|
|
|
64
|
+
def handles_incrementality(self) -> bool:
|
|
65
|
+
return False
|
|
66
|
+
|
|
59
67
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
60
68
|
table_fields = table.split(".")
|
|
61
69
|
if len(table_fields) != 2:
|
|
@@ -84,18 +92,43 @@ class MongoDbSource:
|
|
|
84
92
|
|
|
85
93
|
|
|
86
94
|
class LocalCsvSource:
|
|
95
|
+
def handles_incrementality(self) -> bool:
|
|
96
|
+
return False
|
|
97
|
+
|
|
87
98
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
88
|
-
def csv_file(
|
|
99
|
+
def csv_file(
|
|
100
|
+
incremental: Optional[dlt.sources.incremental[Any]] = None,
|
|
101
|
+
):
|
|
89
102
|
file_path = uri.split("://")[1]
|
|
90
103
|
myFile = open(file_path, "r")
|
|
91
104
|
reader = csv.DictReader(myFile)
|
|
92
|
-
|
|
105
|
+
if not reader.fieldnames:
|
|
106
|
+
raise RuntimeError(
|
|
107
|
+
"failed to extract headers from the CSV, are you sure the given file contains a header row?"
|
|
108
|
+
)
|
|
109
|
+
|
|
110
|
+
incremental_key = kwargs.get("incremental_key")
|
|
111
|
+
if incremental_key and incremental_key not in reader.fieldnames:
|
|
112
|
+
raise ValueError(
|
|
113
|
+
f"incremental_key '{incremental_key}' not found in the CSV file"
|
|
114
|
+
)
|
|
93
115
|
|
|
94
116
|
page_size = 1000
|
|
95
117
|
page = []
|
|
96
118
|
current_items = 0
|
|
97
119
|
for dictionary in reader:
|
|
98
120
|
if current_items < page_size:
|
|
121
|
+
if incremental_key and incremental and incremental.start_value:
|
|
122
|
+
inc_value = dictionary.get(incremental_key)
|
|
123
|
+
if inc_value is None:
|
|
124
|
+
raise ValueError(
|
|
125
|
+
f"incremental_key '{incremental_key}' not found in the CSV file"
|
|
126
|
+
)
|
|
127
|
+
|
|
128
|
+
print("BURAYA GELLDIII")
|
|
129
|
+
if inc_value < incremental.start_value:
|
|
130
|
+
continue
|
|
131
|
+
|
|
99
132
|
page.append(dictionary)
|
|
100
133
|
current_items += 1
|
|
101
134
|
else:
|
|
@@ -109,6 +142,12 @@ class LocalCsvSource:
|
|
|
109
142
|
return dlt.resource(
|
|
110
143
|
csv_file,
|
|
111
144
|
merge_key=kwargs.get("merge_key"), # type: ignore
|
|
145
|
+
)(
|
|
146
|
+
incremental=dlt.sources.incremental(
|
|
147
|
+
kwargs.get("incremental_key", ""),
|
|
148
|
+
initial_value=kwargs.get("interval_start"),
|
|
149
|
+
end_value=kwargs.get("interval_end"),
|
|
150
|
+
)
|
|
112
151
|
)
|
|
113
152
|
|
|
114
153
|
|
|
@@ -118,6 +157,9 @@ class NotionSource:
|
|
|
118
157
|
def __init__(self, table_builder=notion_databases) -> None:
|
|
119
158
|
self.table_builder = table_builder
|
|
120
159
|
|
|
160
|
+
def handles_incrementality(self) -> bool:
|
|
161
|
+
return True
|
|
162
|
+
|
|
121
163
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
122
164
|
if kwargs.get("incremental_key"):
|
|
123
165
|
raise ValueError("Incremental loads are not supported for Notion")
|
|
@@ -134,12 +176,100 @@ class NotionSource:
|
|
|
134
176
|
)
|
|
135
177
|
|
|
136
178
|
|
|
179
|
+
class ShopifySource:
|
|
180
|
+
def handles_incrementality(self) -> bool:
|
|
181
|
+
return True
|
|
182
|
+
|
|
183
|
+
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
184
|
+
if kwargs.get("incremental_key"):
|
|
185
|
+
raise ValueError(
|
|
186
|
+
"Shopify takes care of incrementality on its own, you should not provide incremental_key"
|
|
187
|
+
)
|
|
188
|
+
|
|
189
|
+
# shopify://shop_url?api_key=private_app_password
|
|
190
|
+
|
|
191
|
+
source_fields = urlparse(uri)
|
|
192
|
+
source_params = parse_qs(source_fields.query)
|
|
193
|
+
api_key = source_params.get("api_key")
|
|
194
|
+
if not api_key:
|
|
195
|
+
raise ValueError("api_key in the URI is required to connect to Shopify")
|
|
196
|
+
|
|
197
|
+
date_args = {}
|
|
198
|
+
if kwargs.get("interval_start"):
|
|
199
|
+
date_args["start_date"] = kwargs.get("interval_start")
|
|
200
|
+
|
|
201
|
+
if kwargs.get("interval_end"):
|
|
202
|
+
date_args["end_date"] = kwargs.get("interval_end")
|
|
203
|
+
|
|
204
|
+
resource = None
|
|
205
|
+
if table in ["products", "orders", "customers"]:
|
|
206
|
+
resource = table
|
|
207
|
+
else:
|
|
208
|
+
raise ValueError(
|
|
209
|
+
f"Table name '{table}' is not supported for Shopify source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
return shopify_source(
|
|
213
|
+
private_app_password=api_key[0],
|
|
214
|
+
shop_url=f"https://{source_fields.netloc}",
|
|
215
|
+
**date_args,
|
|
216
|
+
).with_resources(resource)
|
|
217
|
+
|
|
218
|
+
|
|
219
|
+
class GorgiasSource:
|
|
220
|
+
def handles_incrementality(self) -> bool:
|
|
221
|
+
return True
|
|
222
|
+
|
|
223
|
+
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
224
|
+
if kwargs.get("incremental_key"):
|
|
225
|
+
raise ValueError(
|
|
226
|
+
"Gorgias takes care of incrementality on its own, you should not provide incremental_key"
|
|
227
|
+
)
|
|
228
|
+
|
|
229
|
+
# gorgias://domain?api_key=<api_key>&email=<email>
|
|
230
|
+
|
|
231
|
+
source_fields = urlparse(uri)
|
|
232
|
+
source_params = parse_qs(source_fields.query)
|
|
233
|
+
api_key = source_params.get("api_key")
|
|
234
|
+
if not api_key:
|
|
235
|
+
raise ValueError("api_key in the URI is required to connect to Gorgias")
|
|
236
|
+
|
|
237
|
+
email = source_params.get("email")
|
|
238
|
+
if not email:
|
|
239
|
+
raise ValueError("email in the URI is required to connect to Gorgias")
|
|
240
|
+
|
|
241
|
+
resource = None
|
|
242
|
+
if table in ["customers", "tickets", "ticket_messages", "satisfaction_surveys"]:
|
|
243
|
+
resource = table
|
|
244
|
+
else:
|
|
245
|
+
raise ValueError(
|
|
246
|
+
f"Resource '{table}' is not supported for Gorgias source yet, if you are interested in it please create a GitHub issue at https://github.com/bruin-data/ingestr"
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
date_args = {}
|
|
250
|
+
if kwargs.get("interval_start"):
|
|
251
|
+
date_args["start_date"] = kwargs.get("interval_start")
|
|
252
|
+
|
|
253
|
+
if kwargs.get("interval_end"):
|
|
254
|
+
date_args["end_date"] = kwargs.get("interval_end")
|
|
255
|
+
|
|
256
|
+
return gorgias_source(
|
|
257
|
+
domain=source_fields.netloc,
|
|
258
|
+
email=email[0],
|
|
259
|
+
api_key=api_key[0],
|
|
260
|
+
**date_args,
|
|
261
|
+
).with_resources(resource)
|
|
262
|
+
|
|
263
|
+
|
|
137
264
|
class GoogleSheetsSource:
|
|
138
265
|
table_builder: Callable
|
|
139
266
|
|
|
140
267
|
def __init__(self, table_builder=google_spreadsheet) -> None:
|
|
141
268
|
self.table_builder = table_builder
|
|
142
269
|
|
|
270
|
+
def handles_incrementality(self) -> bool:
|
|
271
|
+
return False
|
|
272
|
+
|
|
143
273
|
def dlt_source(self, uri: str, table: str, **kwargs):
|
|
144
274
|
if kwargs.get("incremental_key"):
|
|
145
275
|
raise ValueError("Incremental loads are not supported for Google Sheets")
|
ingestr/src/version.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__version__ = "0.
|
|
1
|
+
__version__ = "0.6.1"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"symbol","date","isEnabled","name"
|
|
2
|
+
"A","2024-04-19","True","AGILENT TECHNOLOGIES INC"
|
|
3
|
+
"AA","2024-04-19","True","ALCOA CORP"
|
|
4
|
+
"AAA","2024-04-19","True","ALTERNATIVE ACCESS FIRST PRI"
|
|
5
|
+
"AAAU","2024-04-19","True","GOLDMAN SACHS PHYSICAL GOLD"
|
|
6
|
+
"AACG","2024-04-19","True","ATA CREATIVITY GLOBAL - ADR"
|
|
7
|
+
"AACI","2024-04-19","True","ARMADA ACQUISITION CORP I"
|
|
8
|
+
"AACIU","2024-04-19","True","ARMADA ACQUISITION CORP I"
|
|
9
|
+
"AACIW","2024-04-19","True",""
|
|
10
|
+
"AACT","2024-04-19","True","ARES ACQUISITION CORP II"
|
|
11
|
+
"AACT+","2024-04-19","True",""
|
|
12
|
+
"AACT=","2024-04-19","True","ARES ACQUISITION CORP II"
|
|
13
|
+
"AADI","2024-04-19","True","AADI BIOSCIENCE INC"
|
|
14
|
+
"AADR","2024-04-19","True","ADVISORSHARES DORSEY WRIGHT"
|
|
15
|
+
"AAGR","2024-04-19","True","AFRICAN AGRICULTURE HOLDINGS"
|
|
16
|
+
"AAGRW","2024-04-19","True",""
|
|
17
|
+
"AAL","2024-04-19","True","AMERICAN AIRLINES GROUP INC"
|
|
18
|
+
"AAMC","2024-04-19","True","ALTISOURCE ASSET MANAGEMENT"
|
|
19
|
+
"AAME","2024-04-19","True","ATLANTIC AMERICAN CORP"
|
|
20
|
+
"AAN","2024-04-19","True","AARON'S CO INC/THE"
|
|
21
|
+
"AAOI","2024-04-19","True","APPLIED OPTOELECTRONICS INC"
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"symbol","date","isEnabled","name"
|
|
2
|
+
"A","2024-04-20","True","AGILENT TECHNOLOGIES INC____updated"
|
|
3
|
+
"AA","2024-04-19","True","ALCOA CORP____updated"
|
|
4
|
+
"AAA","2024-04-21","True","ALTERNATIVE ACCESS FIRST PRI____updated"
|
|
5
|
+
"AAAU","2024-04-22","True","GOLDMAN SACHS PHYSICAL GOLD____updated"
|
|
6
|
+
"B","2024-04-18","True","SOME TECHNOLOGIES INC"
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"symbol","date","isEnabled","name"
|
|
2
|
+
"A","2024-04-20","True","AGILENT TECHNOLOGIES INC____updated"
|
|
3
|
+
"AA","2024-04-19","True","ALCOA CORP____updated"
|
|
4
|
+
"AAA","2024-04-21","True","ALTERNATIVE ACCESS FIRST PRI____updated"
|
|
5
|
+
"AAAU","2024-04-22","True","GOLDMAN SACHS PHYSICAL GOLD____updated"
|
|
6
|
+
"BBB","2024-04-18","True","SOME CORP____updated"
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"symbol","date","isEnabled","name"
|
|
2
|
+
"A","2024-04-20","True","AGILENT TECHNOLOGIES INC____updated"
|
|
3
|
+
"AA","2024-04-19","True","ALCOA CORP"
|
|
4
|
+
"AAA","2024-04-21","True","ALTERNATIVE ACCESS FIRST PRI____updated"
|
|
5
|
+
"AAAU","2024-04-22","True","GOLDMAN SACHS PHYSICAL GOLD____updated"
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
"symbol","date","isEnabled","name"
|
|
2
|
+
"A","2024-04-20","True","AGILENT TECHNOLOGIES INC____updated"
|
|
3
|
+
"AA","2024-04-19","True","ALCOA CORP____updated"
|
|
4
|
+
"AAA","2024-04-21","True","ALTERNATIVE ACCESS FIRST PRI____updated"
|
|
5
|
+
"AAAU","2024-04-22","True","GOLDMAN SACHS PHYSICAL GOLD____updated"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: ingestr
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.6.1
|
|
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
|
|
@@ -16,7 +16,7 @@ Classifier: Topic :: Database
|
|
|
16
16
|
Requires-Python: >=3.9
|
|
17
17
|
Requires-Dist: cx-oracle==8.3.0
|
|
18
18
|
Requires-Dist: databricks-sql-connector==2.9.3
|
|
19
|
-
Requires-Dist: dlt==0.4.
|
|
19
|
+
Requires-Dist: dlt==0.4.12
|
|
20
20
|
Requires-Dist: duckdb-engine==0.11.5
|
|
21
21
|
Requires-Dist: duckdb==0.10.2
|
|
22
22
|
Requires-Dist: google-api-python-client==2.130.0
|
|
@@ -27,6 +27,7 @@ Requires-Dist: py-machineid==0.5.1
|
|
|
27
27
|
Requires-Dist: pymongo==4.6.3
|
|
28
28
|
Requires-Dist: pymysql==1.1.0
|
|
29
29
|
Requires-Dist: pyodbc==5.1.0
|
|
30
|
+
Requires-Dist: pyrate-limiter==3.6.1
|
|
30
31
|
Requires-Dist: redshift-connector==2.1.0
|
|
31
32
|
Requires-Dist: rich==13.7.1
|
|
32
33
|
Requires-Dist: rudder-sdk-python==2.1.0
|
|
@@ -180,6 +181,11 @@ Join our Slack community [here](https://join.slack.com/t/bruindatacommunity/shar
|
|
|
180
181
|
<td>✅</td>
|
|
181
182
|
<td>❌</td>
|
|
182
183
|
</tr>
|
|
184
|
+
<tr>
|
|
185
|
+
<td>Shopify</td>
|
|
186
|
+
<td>✅</td>
|
|
187
|
+
<td>❌</td>
|
|
188
|
+
</tr>
|
|
183
189
|
</table>
|
|
184
190
|
|
|
185
191
|
More to come soon!
|
|
@@ -1,17 +1,20 @@
|
|
|
1
|
-
ingestr/main.py,sha256=
|
|
2
|
-
ingestr/main_test.py,sha256=
|
|
3
|
-
ingestr/src/destinations.py,sha256=
|
|
1
|
+
ingestr/main.py,sha256=jok8jEPLCOXlhKyKzR2mWA36A9DauRc4DI4AY_r4ubM,14861
|
|
2
|
+
ingestr/main_test.py,sha256=MDV2Eo86W_CcxGgEkYYoBc6xIXjVMER4hMhgAdxXYMc,28464
|
|
3
|
+
ingestr/src/destinations.py,sha256=2SfPMjtTelPmzQmc3zNs8xGcKIPuGn_hoZFIBUuhjXI,6338
|
|
4
4
|
ingestr/src/destinations_test.py,sha256=rgEk8EpAntFbSOwXovC4prv3RA22mwq8pIO6sZ_rYzg,4212
|
|
5
|
-
ingestr/src/factory.py,sha256=
|
|
5
|
+
ingestr/src/factory.py,sha256=7skwetBXFIwAuKyTFfffGPgSo_PRRZ5uEnxOHUv28yQ,3517
|
|
6
6
|
ingestr/src/factory_test.py,sha256=X9sFkvNByWChIcyeDt1QiIPMIzGNKb7M5A_GUE0-nnI,664
|
|
7
|
-
ingestr/src/sources.py,sha256=
|
|
7
|
+
ingestr/src/sources.py,sha256=v0oFu-Pt_Zv06FypBb9_rHKP_iIMpkgm9MMaVpOUjPg,10313
|
|
8
8
|
ingestr/src/sources_test.py,sha256=t94u1lYAspxzfe-DkxVtq5vw6xrLWphipvwntrwrzqg,3930
|
|
9
|
-
ingestr/src/version.py,sha256=
|
|
9
|
+
ingestr/src/version.py,sha256=baAcEjLSYFIeNZF51tOMmA_zAMhN8HvKael-UU-Ruec,22
|
|
10
10
|
ingestr/src/google_sheets/README.md,sha256=wFQhvmGpRA38Ba2N_WIax6duyD4c7c_pwvvprRfQDnw,5470
|
|
11
11
|
ingestr/src/google_sheets/__init__.py,sha256=5qlX-6ilx5MW7klC7B_0jGSxloQSLkSESTh4nlY3Aos,6643
|
|
12
12
|
ingestr/src/google_sheets/helpers/__init__.py,sha256=5hXZrZK8cMO3UOuL-s4OKOpdACdihQD0hYYlSEu-iQ8,35
|
|
13
13
|
ingestr/src/google_sheets/helpers/api_calls.py,sha256=RiVfdacbaneszhmuhYilkJnkc9kowZvQUCUxz0G6SlI,5404
|
|
14
14
|
ingestr/src/google_sheets/helpers/data_processing.py,sha256=WYO6z4XjGcG0Hat2J2enb-eLX5mSNVb2vaqRE83FBWU,11000
|
|
15
|
+
ingestr/src/gorgias/__init__.py,sha256=el_rJOTurK3P2tw-CtwjTpTcc7q6w2nLlJPXCU0yEqY,21228
|
|
16
|
+
ingestr/src/gorgias/helpers.py,sha256=dQ56CpZJobBVZP-vCM56vKHZdrfCHqla5peUt0bVr1c,4905
|
|
17
|
+
ingestr/src/gorgias/helpers_test.py,sha256=kSR2nhB8U8HZ8pgDnd7HvXlzojmBnpOm8fTKHJvvKGY,1580
|
|
15
18
|
ingestr/src/mongodb/__init__.py,sha256=E7SDeCyYNkYZZ_RFhjCRDZUGpKtaxpPG5sFSmKJV62U,4336
|
|
16
19
|
ingestr/src/mongodb/helpers.py,sha256=80vtAeNyUn1iMN0CeLrTlKqYN6I6fHF81Kd2UuE8Kns,5653
|
|
17
20
|
ingestr/src/notion/__init__.py,sha256=36wUui8finbc85ObkRMq8boMraXMUehdABN_AMe_hzA,1834
|
|
@@ -19,6 +22,10 @@ ingestr/src/notion/settings.py,sha256=MwQVZViJtnvOegfjXYc_pJ50oUYgSRPgwqu7TvpeMO
|
|
|
19
22
|
ingestr/src/notion/helpers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
20
23
|
ingestr/src/notion/helpers/client.py,sha256=QXuudkf5Zzff98HRsCqA1g1EZWIrnfn1falPrnKg_y4,5500
|
|
21
24
|
ingestr/src/notion/helpers/database.py,sha256=gigPibTeVefP3lA-8w4aOwX67pj7RlciPk5koDs1ry8,2737
|
|
25
|
+
ingestr/src/shopify/__init__.py,sha256=EWjpvZz7K6Pms7uUoqqkM4Wj0XeE2NrDvVp4BNM8dPk,9163
|
|
26
|
+
ingestr/src/shopify/exceptions.py,sha256=BhV3lIVWeBt8Eh4CWGW_REFJpGCzvW6-62yZrBWa3nQ,50
|
|
27
|
+
ingestr/src/shopify/helpers.py,sha256=OO_Tw-HwVLnRhwT3vqUWEQEEcWIS9KWE6VDDe8BCC2w,4972
|
|
28
|
+
ingestr/src/shopify/settings.py,sha256=StY0EPr7wFJ7KzRRDN4TKxV0_gkIS1wPj2eR4AYSsDk,141
|
|
22
29
|
ingestr/src/sql_database/__init__.py,sha256=S5MVJr8juPSs61C2D7pInsTwNEHetChK6RjjhPAD0Lg,8845
|
|
23
30
|
ingestr/src/sql_database/helpers.py,sha256=tbn-GjjBIVu3hVVh5vrUSiZqQ32_Tp0oBP5Fvv_wY4E,8986
|
|
24
31
|
ingestr/src/sql_database/override.py,sha256=xbKGDztCzvrhJ5kJTXERal3LA56bEeVug4_rrTs8DgA,333
|
|
@@ -26,13 +33,15 @@ ingestr/src/sql_database/schema_types.py,sha256=foGHh4iGagGLfS7nF3uGYhBjqgX0jlrj
|
|
|
26
33
|
ingestr/src/telemetry/event.py,sha256=MpWc5tt0lSJ1pWKe9HQ11BHrcPBxSH40l4wjZi9u0tI,924
|
|
27
34
|
ingestr/src/testdata/fakebqcredentials.json,sha256=scc6TUc963KAbKTLZCfcmqVzbtzDCW1_8JNRnyAXyy8,628
|
|
28
35
|
ingestr/testdata/.gitignore,sha256=DFzYYOpqdTiT7S1HjCT-jffZSmEvFZge295_upAB0FY,13
|
|
29
|
-
ingestr/testdata/
|
|
30
|
-
ingestr/testdata/
|
|
31
|
-
ingestr/testdata/
|
|
32
|
-
ingestr/testdata/
|
|
33
|
-
ingestr/testdata/
|
|
34
|
-
ingestr
|
|
35
|
-
ingestr
|
|
36
|
-
ingestr-0.
|
|
37
|
-
ingestr-0.
|
|
38
|
-
ingestr-0.
|
|
36
|
+
ingestr/testdata/create_replace.csv,sha256=TQDbOSkRKq9ZZv1d68Qjwh94aIyUQ-oEwxpJIrd3YK8,1060
|
|
37
|
+
ingestr/testdata/delete_insert_expected.csv,sha256=wbj7uboVWwm3sNMh1n7f4-OKFEQJv1s96snjEHp9nkg,336
|
|
38
|
+
ingestr/testdata/delete_insert_part1.csv,sha256=mdLFGu6ZOU6zwAigLRq4hFkAbVgyIaoEE39UCeeRc7s,234
|
|
39
|
+
ingestr/testdata/delete_insert_part2.csv,sha256=B_KUzpzbNdDY_n7wWop1mT2cz36TmaySYCgtLsNqSrk,337
|
|
40
|
+
ingestr/testdata/merge_expected.csv,sha256=DReHqWGnQMsf2PBv_Q2pfjsgvikYFnf1zYcQZ7ZqYN0,276
|
|
41
|
+
ingestr/testdata/merge_part1.csv,sha256=Pw8Z9IDKcNU0qQHx1z6BUf4rF_-SxKGFOvymCt4OY9I,185
|
|
42
|
+
ingestr/testdata/merge_part2.csv,sha256=T_GiWxA81SN63_tMOIuemcvboEFeAmbKc7xRXvL9esw,287
|
|
43
|
+
ingestr-0.6.1.dist-info/METADATA,sha256=SzZWTcIS64RXkeC_qMSPRUrm_PzD9q7e-11bxF0j2F4,5699
|
|
44
|
+
ingestr-0.6.1.dist-info/WHEEL,sha256=1yFddiXMmvYK7QYTqtRNtX66WJ0Mz8PYEiEUoOUUxRY,87
|
|
45
|
+
ingestr-0.6.1.dist-info/entry_points.txt,sha256=oPJy0KBnPWYjDtP1k8qwAihcTLHSZokSQvRAw_wtfJM,46
|
|
46
|
+
ingestr-0.6.1.dist-info/licenses/LICENSE.md,sha256=cW8wIhn8HFE-KLStDF9jHQ1O_ARWP3kTpk_-eOccL24,1075
|
|
47
|
+
ingestr-0.6.1.dist-info/RECORD,,
|
ingestr/testdata/test_append.db
DELETED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
File without changes
|
|
File without changes
|