hirundo 0.1.6__py3-none-any.whl → 0.1.8__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.
- hirundo/__init__.py +1 -1
- hirundo/_env.py +19 -5
- hirundo/_headers.py +8 -4
- hirundo/_http.py +14 -0
- hirundo/_iter_sse_retrying.py +2 -2
- hirundo/cli.py +80 -17
- hirundo/dataset_optimization.py +233 -53
- hirundo/git.py +17 -15
- hirundo/logger.py +10 -0
- hirundo/storage.py +57 -22
- hirundo-0.1.8.dist-info/METADATA +176 -0
- hirundo-0.1.8.dist-info/RECORD +20 -0
- {hirundo-0.1.6.dist-info → hirundo-0.1.8.dist-info}/WHEEL +1 -1
- hirundo-0.1.6.dist-info/METADATA +0 -117
- hirundo-0.1.6.dist-info/RECORD +0 -18
- {hirundo-0.1.6.dist-info → hirundo-0.1.8.dist-info}/LICENSE +0 -0
- {hirundo-0.1.6.dist-info → hirundo-0.1.8.dist-info}/entry_points.txt +0 -0
- {hirundo-0.1.6.dist-info → hirundo-0.1.8.dist-info}/top_level.txt +0 -0
hirundo/storage.py
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import typing
|
|
2
2
|
from enum import Enum
|
|
3
|
-
from typing import Union
|
|
4
3
|
|
|
5
4
|
import pydantic
|
|
6
5
|
import requests
|
|
@@ -9,24 +8,28 @@ from pydantic_core import Url
|
|
|
9
8
|
|
|
10
9
|
from hirundo._constraints import S3BucketUrl, StorageIntegrationName
|
|
11
10
|
from hirundo._env import API_HOST
|
|
12
|
-
from hirundo._headers import
|
|
11
|
+
from hirundo._headers import get_auth_headers, json_headers
|
|
12
|
+
from hirundo._http import raise_for_status_with_reason
|
|
13
13
|
from hirundo._timeouts import MODIFY_TIMEOUT, READ_TIMEOUT
|
|
14
14
|
from hirundo.git import GitRepo
|
|
15
|
+
from hirundo.logger import get_logger
|
|
16
|
+
|
|
17
|
+
logger = get_logger(__name__)
|
|
15
18
|
|
|
16
19
|
|
|
17
20
|
class StorageS3(BaseModel):
|
|
18
|
-
endpoint_url:
|
|
21
|
+
endpoint_url: typing.Optional[Url] = None
|
|
19
22
|
bucket_url: S3BucketUrl
|
|
20
23
|
region_name: str
|
|
21
24
|
# ⬆️ We could restrict this, but if we're allowing custom endpoints then the validation may be wrong
|
|
22
|
-
access_key_id:
|
|
23
|
-
secret_access_key:
|
|
25
|
+
access_key_id: typing.Optional[str] = None
|
|
26
|
+
secret_access_key: typing.Optional[str] = None
|
|
24
27
|
|
|
25
28
|
|
|
26
29
|
class StorageGCP(BaseModel):
|
|
27
30
|
bucket_name: str
|
|
28
31
|
project: str
|
|
29
|
-
credentials_json:
|
|
32
|
+
credentials_json: typing.Optional[dict] = None
|
|
30
33
|
|
|
31
34
|
|
|
32
35
|
# TODO: Azure storage integration is coming soon
|
|
@@ -37,12 +40,12 @@ class StorageGCP(BaseModel):
|
|
|
37
40
|
|
|
38
41
|
|
|
39
42
|
class StorageGit(BaseModel):
|
|
40
|
-
repo_id:
|
|
43
|
+
repo_id: typing.Optional[int] = None
|
|
41
44
|
"""
|
|
42
45
|
The ID of the Git repository in the Hirundo system.
|
|
43
46
|
Either `repo_id` or `repo` must be provided.
|
|
44
47
|
"""
|
|
45
|
-
repo:
|
|
48
|
+
repo: typing.Optional[GitRepo] = None
|
|
46
49
|
"""
|
|
47
50
|
The Git repository to link to.
|
|
48
51
|
Either `repo_id` or `repo` must be provided.
|
|
@@ -69,12 +72,16 @@ class StorageTypes(str, Enum):
|
|
|
69
72
|
GCP = "GCP"
|
|
70
73
|
# AZURE = "Azure" TODO: Azure storage integration is coming soon
|
|
71
74
|
GIT = "Git"
|
|
75
|
+
LOCAL = "Local"
|
|
76
|
+
"""
|
|
77
|
+
Local storage integration is only supported for on-premises installations.
|
|
78
|
+
"""
|
|
72
79
|
|
|
73
80
|
|
|
74
81
|
class StorageIntegration(BaseModel):
|
|
75
|
-
id:
|
|
82
|
+
id: typing.Optional[int] = None
|
|
76
83
|
|
|
77
|
-
organization_id:
|
|
84
|
+
organization_id: typing.Optional[int] = None
|
|
78
85
|
"""
|
|
79
86
|
The ID of the organization that the `StorageIntegration` belongs to.
|
|
80
87
|
If not provided, it will be assigned to your default organization.
|
|
@@ -84,7 +91,7 @@ class StorageIntegration(BaseModel):
|
|
|
84
91
|
"""
|
|
85
92
|
A name to identify the `StorageIntegration` in the Hirundo system.
|
|
86
93
|
"""
|
|
87
|
-
type: StorageTypes = pydantic.Field(
|
|
94
|
+
type: typing.Optional[StorageTypes] = pydantic.Field(
|
|
88
95
|
examples=[
|
|
89
96
|
StorageTypes.S3,
|
|
90
97
|
StorageTypes.GCP,
|
|
@@ -100,7 +107,7 @@ class StorageIntegration(BaseModel):
|
|
|
100
107
|
- `Azure` (coming soon)
|
|
101
108
|
- `Git`
|
|
102
109
|
"""
|
|
103
|
-
s3:
|
|
110
|
+
s3: typing.Optional[StorageS3] = pydantic.Field(
|
|
104
111
|
default=None,
|
|
105
112
|
examples=[
|
|
106
113
|
{
|
|
@@ -118,7 +125,7 @@ class StorageIntegration(BaseModel):
|
|
|
118
125
|
The Amazon Web Services (AWS) S3 storage integration details.
|
|
119
126
|
Use this if you want to link to an S3 bucket.
|
|
120
127
|
"""
|
|
121
|
-
gcp:
|
|
128
|
+
gcp: typing.Optional[StorageGCP] = pydantic.Field(
|
|
122
129
|
default=None,
|
|
123
130
|
examples=[
|
|
124
131
|
None,
|
|
@@ -148,7 +155,7 @@ class StorageIntegration(BaseModel):
|
|
|
148
155
|
Use this if you want to link to an GCS bucket.
|
|
149
156
|
"""
|
|
150
157
|
azure: None = None
|
|
151
|
-
# azure:
|
|
158
|
+
# azure: typing.Optional[StorageAzure] = pydantic.Field(
|
|
152
159
|
# default=None,
|
|
153
160
|
# examples=[
|
|
154
161
|
# None,
|
|
@@ -161,7 +168,7 @@ class StorageIntegration(BaseModel):
|
|
|
161
168
|
# None,
|
|
162
169
|
# ],
|
|
163
170
|
# ) TODO: Azure storage integration is coming soon
|
|
164
|
-
git:
|
|
171
|
+
git: typing.Optional[StorageGit] = pydantic.Field(
|
|
165
172
|
default=None,
|
|
166
173
|
examples=[
|
|
167
174
|
None,
|
|
@@ -184,7 +191,7 @@ class StorageIntegration(BaseModel):
|
|
|
184
191
|
"""
|
|
185
192
|
|
|
186
193
|
@staticmethod
|
|
187
|
-
def list(organization_id: typing.
|
|
194
|
+
def list(organization_id: typing.Optional[int] = None) -> list[dict]:
|
|
188
195
|
"""
|
|
189
196
|
Lists all the `StorageIntegration`'s created by user's default organization
|
|
190
197
|
Note: The return type is `list[dict]` and not `list[StorageIntegration]`
|
|
@@ -196,10 +203,10 @@ class StorageIntegration(BaseModel):
|
|
|
196
203
|
storage_integrations = requests.get(
|
|
197
204
|
f"{API_HOST}/storage-integration/",
|
|
198
205
|
params={"storage_integration_organization_id": organization_id},
|
|
199
|
-
headers=
|
|
206
|
+
headers=get_auth_headers(),
|
|
200
207
|
timeout=READ_TIMEOUT,
|
|
201
208
|
)
|
|
202
|
-
storage_integrations
|
|
209
|
+
raise_for_status_with_reason(storage_integrations)
|
|
203
210
|
return storage_integrations.json()
|
|
204
211
|
|
|
205
212
|
@staticmethod
|
|
@@ -212,10 +219,11 @@ class StorageIntegration(BaseModel):
|
|
|
212
219
|
"""
|
|
213
220
|
storage_integration = requests.delete(
|
|
214
221
|
f"{API_HOST}/storage-integration/{storage_integration_id}",
|
|
215
|
-
headers=
|
|
222
|
+
headers=get_auth_headers(),
|
|
216
223
|
timeout=MODIFY_TIMEOUT,
|
|
217
224
|
)
|
|
218
|
-
storage_integration
|
|
225
|
+
raise_for_status_with_reason(storage_integration)
|
|
226
|
+
logger.info("Deleted storage integration with ID: %s", storage_integration_id)
|
|
219
227
|
|
|
220
228
|
def delete(self) -> None:
|
|
221
229
|
"""
|
|
@@ -236,15 +244,42 @@ class StorageIntegration(BaseModel):
|
|
|
236
244
|
json=self.model_dump(),
|
|
237
245
|
headers={
|
|
238
246
|
**json_headers,
|
|
239
|
-
**
|
|
247
|
+
**get_auth_headers(),
|
|
240
248
|
},
|
|
241
249
|
timeout=MODIFY_TIMEOUT,
|
|
242
250
|
)
|
|
243
|
-
storage_integration
|
|
251
|
+
raise_for_status_with_reason(storage_integration)
|
|
244
252
|
storage_integration_id = storage_integration.json()["id"]
|
|
245
253
|
self.id = storage_integration_id
|
|
254
|
+
logger.info("Created storage integration with ID: %s", storage_integration_id)
|
|
246
255
|
return storage_integration_id
|
|
247
256
|
|
|
257
|
+
@model_validator(mode="after")
|
|
258
|
+
def validate_storage_type(self):
|
|
259
|
+
if self.type != StorageTypes.LOCAL and (
|
|
260
|
+
[self.s3, self.gcp, self.git].count(None) != 2
|
|
261
|
+
):
|
|
262
|
+
raise ValueError("Exactly one of S3, GCP, or Git must be provided")
|
|
263
|
+
if self.type == StorageTypes.S3 and self.s3 is None:
|
|
264
|
+
raise ValueError("S3 storage details must be provided")
|
|
265
|
+
elif self.type == StorageTypes.GCP and self.gcp is None:
|
|
266
|
+
raise ValueError("GCP storage details must be provided")
|
|
267
|
+
elif self.type == StorageTypes.GIT and self.git is None:
|
|
268
|
+
raise ValueError("Git storage details must be provided")
|
|
269
|
+
if not self.type and not any([self.s3, self.gcp, self.git]):
|
|
270
|
+
raise ValueError("Storage type must be provided")
|
|
271
|
+
elif not self.type:
|
|
272
|
+
self.type = (
|
|
273
|
+
StorageTypes.S3
|
|
274
|
+
if self.s3 is not None
|
|
275
|
+
else StorageTypes.GCP
|
|
276
|
+
if self.gcp is not None
|
|
277
|
+
else StorageTypes.GIT
|
|
278
|
+
if self.git is not None
|
|
279
|
+
else StorageTypes.LOCAL
|
|
280
|
+
)
|
|
281
|
+
return self
|
|
282
|
+
|
|
248
283
|
|
|
249
284
|
class StorageLink(BaseModel):
|
|
250
285
|
storage_integration: StorageIntegration
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: hirundo
|
|
3
|
+
Version: 0.1.8
|
|
4
|
+
Summary: This package is used to interface with Hirundo's platform. It provides a simple API to optimize your ML datasets.
|
|
5
|
+
Author-email: Hirundo <dev@hirundo.io>
|
|
6
|
+
License: MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (c) 2024, Hirundo
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
13
|
+
|
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
15
|
+
|
|
16
|
+
Project-URL: Homepage, https://github.com/Hirundo-io/hirundo-client
|
|
17
|
+
Keywords: dataset,machine learning,data science,data engineering
|
|
18
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
19
|
+
Classifier: Programming Language :: Python
|
|
20
|
+
Classifier: Programming Language :: Python :: 3
|
|
21
|
+
Requires-Python: >=3.9
|
|
22
|
+
Description-Content-Type: text/markdown
|
|
23
|
+
License-File: LICENSE
|
|
24
|
+
Requires-Dist: pyyaml>=6.0.1
|
|
25
|
+
Requires-Dist: types-PyYAML>=6.0.12
|
|
26
|
+
Requires-Dist: pydantic>=2.7.1
|
|
27
|
+
Requires-Dist: twine>=5.0.0
|
|
28
|
+
Requires-Dist: python-dotenv>=1.0.1
|
|
29
|
+
Requires-Dist: types-requests>=2.31.0
|
|
30
|
+
Requires-Dist: typer>=0.12.3
|
|
31
|
+
Requires-Dist: httpx>=0.27.0
|
|
32
|
+
Requires-Dist: stamina>=24.2.0
|
|
33
|
+
Requires-Dist: httpx-sse>=0.4.0
|
|
34
|
+
Requires-Dist: pandas>=2.2.2
|
|
35
|
+
Requires-Dist: tqdm>=4.66.5
|
|
36
|
+
Provides-Extra: dev
|
|
37
|
+
Requires-Dist: pyyaml>=6.0.1; extra == "dev"
|
|
38
|
+
Requires-Dist: types-PyYAML>=6.0.12; extra == "dev"
|
|
39
|
+
Requires-Dist: pydantic>=2.7.1; extra == "dev"
|
|
40
|
+
Requires-Dist: twine>=5.0.0; extra == "dev"
|
|
41
|
+
Requires-Dist: python-dotenv>=1.0.1; extra == "dev"
|
|
42
|
+
Requires-Dist: types-requests>=2.31.0; extra == "dev"
|
|
43
|
+
Requires-Dist: types-setuptools>=69.5.0; extra == "dev"
|
|
44
|
+
Requires-Dist: typer>=0.12.3; extra == "dev"
|
|
45
|
+
Requires-Dist: httpx>=0.27.0; extra == "dev"
|
|
46
|
+
Requires-Dist: stamina>=24.2.0; extra == "dev"
|
|
47
|
+
Requires-Dist: httpx-sse>=0.4.0; extra == "dev"
|
|
48
|
+
Requires-Dist: pytest>=8.2.0; extra == "dev"
|
|
49
|
+
Requires-Dist: pytest-asyncio>=0.23.6; extra == "dev"
|
|
50
|
+
Requires-Dist: uv; extra == "dev"
|
|
51
|
+
Requires-Dist: pre-commit>=3.7.1; extra == "dev"
|
|
52
|
+
Requires-Dist: ruff==0.6.5; extra == "dev"
|
|
53
|
+
Requires-Dist: bumpver; extra == "dev"
|
|
54
|
+
Provides-Extra: docs
|
|
55
|
+
Requires-Dist: sphinx>=7.4.7; extra == "docs"
|
|
56
|
+
Requires-Dist: sphinx-autobuild>=2024.4.16; extra == "docs"
|
|
57
|
+
Requires-Dist: sphinx-click>=5.0.1; extra == "docs"
|
|
58
|
+
Requires-Dist: autodoc-pydantic>=2.2.0; extra == "docs"
|
|
59
|
+
Requires-Dist: furo; extra == "docs"
|
|
60
|
+
Requires-Dist: sphinx-multiversion; extra == "docs"
|
|
61
|
+
|
|
62
|
+
# Hirundo
|
|
63
|
+
|
|
64
|
+
This package exposes access to Hirundo APIs for dataset optimization for Machine Learning.
|
|
65
|
+
|
|
66
|
+
Dataset optimization is currently available for datasets labelled for classification and object detection.
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
Support dataset storage integrations include:
|
|
70
|
+
- Google Cloud (GCP) Storage
|
|
71
|
+
- Amazon Web Services (AWS) S3
|
|
72
|
+
- Git LFS (Large File Storage) repositories (e.g. GitHub or HuggingFace)
|
|
73
|
+
|
|
74
|
+
Optimizing a classification dataset
|
|
75
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
76
|
+
|
|
77
|
+
Currently ``hirundo`` requires a CSV file with the following columns (all columns are required):
|
|
78
|
+
- ``image_path``: The location of the image within the dataset ``root``
|
|
79
|
+
- ``label``: The label of the image, i.e. which the class that was annotated for this image
|
|
80
|
+
|
|
81
|
+
And outputs a CSV with the same columns and:
|
|
82
|
+
- ``suspect_level``: mislabel suspect level
|
|
83
|
+
- ``suggested_label``: suggested label
|
|
84
|
+
- ``suggested_label_conf``: suggested label confidence
|
|
85
|
+
|
|
86
|
+
Optimizing an object detection (OD) dataset
|
|
87
|
+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
88
|
+
|
|
89
|
+
Currently ``hirundo`` requires a CSV file with the following columns (all columns are required):
|
|
90
|
+
- ``image_path``: The location of the image within the dataset ``root``
|
|
91
|
+
- ``bbox_id``: The index of the bounding box within the dataset. Used to indicate label suspects
|
|
92
|
+
- ``label``: The label of the image, i.e. which the class that was annotated for this image
|
|
93
|
+
- ``x1``, ``y1``, ``x2``, ``y2``: The bounding box coordinates of the object within the image
|
|
94
|
+
|
|
95
|
+
And outputs a CSV with the same columns and:
|
|
96
|
+
- ``suspect_level``: object mislabel suspect level
|
|
97
|
+
- ``suggested_label``: suggested object label
|
|
98
|
+
- ``suggested_label_conf``: suggested object label confidence
|
|
99
|
+
|
|
100
|
+
Note: This Python package must be used alongside a Hirundo server, either the SaaS platform, a custom VPC deployment or an on-premises installation.
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
## Installation
|
|
104
|
+
|
|
105
|
+
You can install the codebase with a simple `pip install hirundo` to install the latest version of this package. If you prefer to install from the Git repository and/or need a specific version or branch, you can simply clone the repository, check out the relevant commit and then run `pip install .` to install that version. A full list of dependencies can be found in `requirements.txt`, but these will be installed automatically by either of these commands.
|
|
106
|
+
|
|
107
|
+
## Usage
|
|
108
|
+
|
|
109
|
+
Classification example:
|
|
110
|
+
```
|
|
111
|
+
from hirundo.dataset_optimization import OptimizationDataset
|
|
112
|
+
from hirundo.enum import LabellingType
|
|
113
|
+
from hirundo.storage import StorageIntegration, StorageLink, StorageTypes
|
|
114
|
+
|
|
115
|
+
test_dataset = OptimizationDataset(
|
|
116
|
+
name="TEST-GCP cifar 100 classification dataset",
|
|
117
|
+
labelling_type=LabellingType.SingleLabelClassification,
|
|
118
|
+
dataset_storage=StorageLink(
|
|
119
|
+
storage_integration=StorageIntegration(
|
|
120
|
+
name="cifar100bucket",
|
|
121
|
+
type=StorageTypes.GCP,
|
|
122
|
+
gcp=StorageGCP(
|
|
123
|
+
bucket_name="cifar100bucket",
|
|
124
|
+
project="Hirundo-global",
|
|
125
|
+
credentials_json=json.loads(os.environ["GCP_CREDENTIALS"]),
|
|
126
|
+
),
|
|
127
|
+
),
|
|
128
|
+
path="/pytorch-cifar/data",
|
|
129
|
+
),
|
|
130
|
+
dataset_metadata_path="cifar100.csv",
|
|
131
|
+
classes=cifar100_classes,
|
|
132
|
+
)
|
|
133
|
+
|
|
134
|
+
test_dataset.run_optimization()
|
|
135
|
+
results = test_dataset.check_run()
|
|
136
|
+
print(results)
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
Object detection example:
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
from hirundo.dataset_optimization import OptimizationDataset
|
|
144
|
+
from hirundo.enum import LabellingType
|
|
145
|
+
from hirundo.storage import StorageIntegration, StorageLink, StorageTypes
|
|
146
|
+
|
|
147
|
+
test_dataset = OptimizationDataset(
|
|
148
|
+
name=f"TEST-HuggingFace-BDD-100k-validation-OD-validation-dataset{unique_id}",
|
|
149
|
+
labelling_type=LabellingType.ObjectDetection,
|
|
150
|
+
dataset_storage=StorageLink(
|
|
151
|
+
storage_integration=StorageIntegration(
|
|
152
|
+
name=f"BDD-100k-validation-dataset{unique_id}",
|
|
153
|
+
type=StorageTypes.GIT,
|
|
154
|
+
git=StorageGit(
|
|
155
|
+
repo=GitRepo(
|
|
156
|
+
name=f"BDD-100k-validation-dataset{unique_id}",
|
|
157
|
+
repository_url="https://git@hf.co/datasets/hirundo-io/bdd100k-validation-only",
|
|
158
|
+
),
|
|
159
|
+
branch="main",
|
|
160
|
+
),
|
|
161
|
+
),
|
|
162
|
+
path="/BDD100K Val from Hirundo.zip/bdd100k",
|
|
163
|
+
),
|
|
164
|
+
dataset_metadata_path="bdd100k.csv",
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
test_dataset.run_optimization()
|
|
168
|
+
results = test_dataset.check_run()
|
|
169
|
+
print(results)
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Note: Currently we only support the main CPython release 3.9, 3.10 and 3.11. PyPy support may be introduced in the future.
|
|
173
|
+
|
|
174
|
+
## Further documentation
|
|
175
|
+
|
|
176
|
+
To learn about mroe how to use this library, please visit the [http://docs.hirundo.io/](documentation) or see the Google Colab examples.
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
hirundo/__init__.py,sha256=EINZmdlmNjdW_dM85wksapRxGL-pPC49OYvKUBRtxQk,707
|
|
2
|
+
hirundo/__main__.py,sha256=wcCrL4PjG51r5wVKqJhcoJPTLfHW0wNbD31DrUN0MWI,28
|
|
3
|
+
hirundo/_constraints.py,sha256=-RAUV9GnCsaT9pLGSqYglKOeK0joPBBexGTo87j5nkI,425
|
|
4
|
+
hirundo/_env.py,sha256=dXUFPeEL1zPe-eBdWD4_WZvlgiY2cpWuVDzf41Qjuto,609
|
|
5
|
+
hirundo/_headers.py,sha256=ggTyBwVT3nGyPidCcmYMX6pv0idzMxCI2S1BJQE-Bbs,253
|
|
6
|
+
hirundo/_http.py,sha256=INrHX7ncpXS9vdyjrske3B5vUKL5ke9SIY6daffahtE,350
|
|
7
|
+
hirundo/_iter_sse_retrying.py,sha256=0u-jJe5vHCZegImKBB1rpI9O1BnN7oWJytdabl34ih4,3345
|
|
8
|
+
hirundo/_timeouts.py,sha256=IfX8-mrLp809-A_xSLv1DhIqZnO-Qvy4FcTtOtvqLog,42
|
|
9
|
+
hirundo/cli.py,sha256=4-pdV483zqRJl8d-R9p_9YOGlehOnoMJzb3XAAdPRb0,6634
|
|
10
|
+
hirundo/dataset_optimization.py,sha256=I2AzkSns_MLwlwI4mGGxaJB6OUG3pv7VJ5uFAtcJdTM,21825
|
|
11
|
+
hirundo/enum.py,sha256=-3w09g-_yRYIMiM8VA_Nb07WoQXf5IjyERTGonzNDs0,457
|
|
12
|
+
hirundo/git.py,sha256=Dbp0ALJYhLDgkmI_5u9iVyE_xEHIxoUTeZdpU8iau_4,4884
|
|
13
|
+
hirundo/logger.py,sha256=MUqrYp0fBlxWFhGl6P5t19_uqO7T_PNhrLN5bqY3i7s,275
|
|
14
|
+
hirundo/storage.py,sha256=xifT6xuFCJpVp5wB-ZZkzKz9HbVcMNrllj10vXlU1vU,9845
|
|
15
|
+
hirundo-0.1.8.dist-info/LICENSE,sha256=fusGGjqT2RGlU6kbkaOk7d-gDnsjk17wq67AO0mwBZI,1065
|
|
16
|
+
hirundo-0.1.8.dist-info/METADATA,sha256=heoP6t876hsxEih-RzaIjGtcLZl8UOpcwExnjQ8thU4,7841
|
|
17
|
+
hirundo-0.1.8.dist-info/WHEEL,sha256=GV9aMThwP_4oNCtvEC2ec3qUYutgWeAzklro_0m4WJQ,91
|
|
18
|
+
hirundo-0.1.8.dist-info/entry_points.txt,sha256=4ZtnA_Nl1Af8fLnHp3lwjbGDEGU1S6ujb_JwtuQ7ZPM,44
|
|
19
|
+
hirundo-0.1.8.dist-info/top_level.txt,sha256=cmyNqrNZOAYxnywJGFI1AJBLe4SkH8HGsfFx6ncdrbI,8
|
|
20
|
+
hirundo-0.1.8.dist-info/RECORD,,
|
hirundo-0.1.6.dist-info/METADATA
DELETED
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
Metadata-Version: 2.1
|
|
2
|
-
Name: hirundo
|
|
3
|
-
Version: 0.1.6
|
|
4
|
-
Summary: This package is used to interface with Hirundo's platform. It provides a simple API to optimize your ML datasets.
|
|
5
|
-
Author-email: Hirundo <dev@hirundo.io>
|
|
6
|
-
License: MIT License
|
|
7
|
-
|
|
8
|
-
Copyright (c) 2024, Hirundo
|
|
9
|
-
|
|
10
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
13
|
-
|
|
14
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
15
|
-
|
|
16
|
-
Project-URL: Homepage, https://github.com/Hirundo-io/hirundo-client
|
|
17
|
-
Keywords: dataset,machine learning,data science,data engineering
|
|
18
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
19
|
-
Classifier: Programming Language :: Python
|
|
20
|
-
Classifier: Programming Language :: Python :: 3
|
|
21
|
-
Requires-Python: >=3.9
|
|
22
|
-
Description-Content-Type: text/markdown
|
|
23
|
-
License-File: LICENSE
|
|
24
|
-
Requires-Dist: pyyaml>=6.0.1
|
|
25
|
-
Requires-Dist: types-PyYAML>=6.0.12
|
|
26
|
-
Requires-Dist: pydantic>=2.7.1
|
|
27
|
-
Requires-Dist: twine>=5.0.0
|
|
28
|
-
Requires-Dist: python-dotenv>=1.0.1
|
|
29
|
-
Requires-Dist: types-requests>=2.31.0
|
|
30
|
-
Requires-Dist: typer>=0.12.3
|
|
31
|
-
Requires-Dist: httpx>=0.27.0
|
|
32
|
-
Requires-Dist: stamina>=24.2.0
|
|
33
|
-
Requires-Dist: httpx-sse>=0.4.0
|
|
34
|
-
Requires-Dist: pandas>=2.2.2
|
|
35
|
-
Provides-Extra: dev
|
|
36
|
-
Requires-Dist: pyyaml>=6.0.1; extra == "dev"
|
|
37
|
-
Requires-Dist: types-PyYAML>=6.0.12; extra == "dev"
|
|
38
|
-
Requires-Dist: pydantic>=2.7.1; extra == "dev"
|
|
39
|
-
Requires-Dist: twine>=5.0.0; extra == "dev"
|
|
40
|
-
Requires-Dist: python-dotenv>=1.0.1; extra == "dev"
|
|
41
|
-
Requires-Dist: types-requests>=2.31.0; extra == "dev"
|
|
42
|
-
Requires-Dist: types-setuptools>=69.5.0; extra == "dev"
|
|
43
|
-
Requires-Dist: typer>=0.12.3; extra == "dev"
|
|
44
|
-
Requires-Dist: httpx>=0.27.0; extra == "dev"
|
|
45
|
-
Requires-Dist: stamina>=24.2.0; extra == "dev"
|
|
46
|
-
Requires-Dist: httpx-sse>=0.4.0; extra == "dev"
|
|
47
|
-
Requires-Dist: pytest>=8.2.0; extra == "dev"
|
|
48
|
-
Requires-Dist: pytest-asyncio>=0.23.6; extra == "dev"
|
|
49
|
-
Requires-Dist: uv; extra == "dev"
|
|
50
|
-
Requires-Dist: pre-commit>=3.7.1; extra == "dev"
|
|
51
|
-
Requires-Dist: ruff; extra == "dev"
|
|
52
|
-
Requires-Dist: bumpver; extra == "dev"
|
|
53
|
-
Provides-Extra: docs
|
|
54
|
-
Requires-Dist: sphinx>=7.4.7; extra == "docs"
|
|
55
|
-
Requires-Dist: sphinx-autobuild>=2024.4.16; extra == "docs"
|
|
56
|
-
Requires-Dist: sphinx-click>=5.0.1; extra == "docs"
|
|
57
|
-
Requires-Dist: autodoc-pydantic>=2.2.0; extra == "docs"
|
|
58
|
-
Requires-Dist: furo; extra == "docs"
|
|
59
|
-
Requires-Dist: sphinx-multiversion; extra == "docs"
|
|
60
|
-
|
|
61
|
-
# Hirundo client
|
|
62
|
-
|
|
63
|
-
This repo contains the source code for the Hirundo client library
|
|
64
|
-
|
|
65
|
-
## Usage:
|
|
66
|
-
|
|
67
|
-
To learn about how to use this library, please visit the [http://docs.hirundo.io/](documentation) or see the Google Colab examples.
|
|
68
|
-
|
|
69
|
-
Note: Currently we only support the main CPython release 3.9, 3.10 and 3.11. PyPy support may be introduced in the future.
|
|
70
|
-
|
|
71
|
-
## Development:
|
|
72
|
-
|
|
73
|
-
### Install dev dependencies
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
pip install -r dev-requirements.txt
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Note: You can install and use `uv` as a faster drop-in replacement for `pip`. We have it as part of our dev dependencies for this reason.
|
|
80
|
-
|
|
81
|
-
### Install `git` hooks (optional)
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
pre-commit install
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Check lint and apply formatting with Ruff (optional; pre-commit hooks run this automatically)
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
ruff check
|
|
91
|
-
ruff format
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Change packages
|
|
95
|
-
|
|
96
|
-
#### Update `requirements.txt` files
|
|
97
|
-
|
|
98
|
-
```bash
|
|
99
|
-
uv pip compile pyproject.toml
|
|
100
|
-
uv pip compile --extra dev -o dev-requirements.txt -c requirements.txt pyproject.toml
|
|
101
|
-
uv pip compile --extra docs -o docs-requirements.txt -c requirements.txt pyproject.toml
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
#### Sync installed packages
|
|
105
|
-
|
|
106
|
-
```bash
|
|
107
|
-
uv pip sync dev-requirements.txt
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### Build process
|
|
111
|
-
|
|
112
|
-
To build the package, run:
|
|
113
|
-
`python -m build`
|
|
114
|
-
|
|
115
|
-
### Publish documentation & releases
|
|
116
|
-
|
|
117
|
-
Documentation & releases are published via GitHub Actions on merges to `main`.
|
hirundo-0.1.6.dist-info/RECORD
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
hirundo/__init__.py,sha256=WeIIvtMy9ghxUKu1JyLcnVw1T1iQ9flQLDYpfqxb1g0,707
|
|
2
|
-
hirundo/__main__.py,sha256=wcCrL4PjG51r5wVKqJhcoJPTLfHW0wNbD31DrUN0MWI,28
|
|
3
|
-
hirundo/_constraints.py,sha256=-RAUV9GnCsaT9pLGSqYglKOeK0joPBBexGTo87j5nkI,425
|
|
4
|
-
hirundo/_env.py,sha256=aObkRVLo9NBZiByd2FcoLrk3m8tnswuYzP4Tnj3EE-o,268
|
|
5
|
-
hirundo/_headers.py,sha256=htxHRjtD91C5D0svyk-zqhKV9LwQCEZauIa4ZTAfe5k,188
|
|
6
|
-
hirundo/_iter_sse_retrying.py,sha256=WLp_lw8ycBuAxoJkkGBu4y74Ajhcu11r1X-vd5_571A,3352
|
|
7
|
-
hirundo/_timeouts.py,sha256=IfX8-mrLp809-A_xSLv1DhIqZnO-Qvy4FcTtOtvqLog,42
|
|
8
|
-
hirundo/cli.py,sha256=qj1Txt6lOU3V10SLtzH4uEWJ4DdkdOIEQaKn8wiJMss,3922
|
|
9
|
-
hirundo/dataset_optimization.py,sha256=aeEbd5J9Xo8l_keYXQ8v26JfYI-6VSZveRgCQN9H11E,14970
|
|
10
|
-
hirundo/enum.py,sha256=-3w09g-_yRYIMiM8VA_Nb07WoQXf5IjyERTGonzNDs0,457
|
|
11
|
-
hirundo/git.py,sha256=GtowxPL78KleVhSY3QISu7-cUPrFbWC4YWBAuzuzryw,4731
|
|
12
|
-
hirundo/storage.py,sha256=CxRdSnZGf4mtzNV2Ge_hwowd9pDP7NT9-xvWTbl187M,8185
|
|
13
|
-
hirundo-0.1.6.dist-info/LICENSE,sha256=fusGGjqT2RGlU6kbkaOk7d-gDnsjk17wq67AO0mwBZI,1065
|
|
14
|
-
hirundo-0.1.6.dist-info/METADATA,sha256=ILQyVMbnhMd7DuIw6RLldrxCbKI7pkrF46uE6TFesLQ,4530
|
|
15
|
-
hirundo-0.1.6.dist-info/WHEEL,sha256=R0nc6qTxuoLk7ShA2_Y-UWkN8ZdfDBG2B6Eqpz2WXbs,91
|
|
16
|
-
hirundo-0.1.6.dist-info/entry_points.txt,sha256=4ZtnA_Nl1Af8fLnHp3lwjbGDEGU1S6ujb_JwtuQ7ZPM,44
|
|
17
|
-
hirundo-0.1.6.dist-info/top_level.txt,sha256=cmyNqrNZOAYxnywJGFI1AJBLe4SkH8HGsfFx6ncdrbI,8
|
|
18
|
-
hirundo-0.1.6.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|