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/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
- print("running resource")
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.5.1"
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,5 @@
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
+ "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,4 @@
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"
@@ -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.5.1
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.8
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=JkjNzsw-Leg0mws9lYNSn4NSFVJ_Svg7ZKvQkzDRE7o,14407
2
- ingestr/main_test.py,sha256=fXZw1qZd5CElrFSRnsI5003813LcIMGpGCMnGNFVhNI,19946
3
- ingestr/src/destinations.py,sha256=_PIoAU-_tDEyX_-vDOgGB5eqXoGhPwtCRApHufj1ae4,6350
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=ueoGtf6PNn1InyMLW5g-nNENEl6oJSZFKWABiCuOPkk,3257
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=fZlOpduijX2xIkqpx5f-tZpeJ7rKtqOt67ukVV-d65k,5552
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=eZ1bOun1DDVV0YLOBW4wj2FP1ajReLjbIrGmzN7ASBw,22
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/test_append.db,sha256=RubpUvWP7BlfMHAOkgeEiHhzPSMs6-Fc8f9SF9ZXwxA,798720
30
- ingestr/testdata/test_create_replace.db,sha256=hrAgcjYTnIzuGbJDpMB-txkKXhM_tn8H3sn0Go4G5uU,536576
31
- ingestr/testdata/test_delete_insert_with_timerange.db,sha256=a7ytHTvLj2P04lHNPxRgtPmkiSS_oUuw3Jo3EWVZ-GQ,1585152
32
- ingestr/testdata/test_delete_insert_without_primary_key.db,sha256=OaYWvAdrUTVbz3QzGf6e5W2Vk1nVf0n86UgxLhMQ73E,1847296
33
- ingestr/testdata/test_merge_with_primary_key.db,sha256=7zskkxks61uxsZYH8gNslNE35KyK0_r8UIGQtdph7zc,1585152
34
- ingestr-0.5.1.dist-info/METADATA,sha256=vX5T3KAA1Udi5qqgeZx5pdSx5WbYdfy0VysVrhEf_B4,5575
35
- ingestr-0.5.1.dist-info/WHEEL,sha256=zEMcRr9Kr03x1ozGwg5v9NQBKn3kndp6LSoSlVg-jhU,87
36
- ingestr-0.5.1.dist-info/entry_points.txt,sha256=oPJy0KBnPWYjDtP1k8qwAihcTLHSZokSQvRAw_wtfJM,46
37
- ingestr-0.5.1.dist-info/licenses/LICENSE.md,sha256=cW8wIhn8HFE-KLStDF9jHQ1O_ARWP3kTpk_-eOccL24,1075
38
- ingestr-0.5.1.dist-info/RECORD,,
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,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: hatchling 1.24.2
2
+ Generator: hatchling 1.25.0
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
Binary file
Binary file