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/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 auth_headers, json_headers
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: Union[Url, None] = None
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: Union[str, None] = None
23
- secret_access_key: Union[str, None] = None
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: Union[dict, None] = None
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: Union[int, None] = None
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: Union[GitRepo, None] = None
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: Union[int, None] = None
82
+ id: typing.Optional[int] = None
76
83
 
77
- organization_id: Union[int, None] = None
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: Union[StorageS3, None] = pydantic.Field(
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: Union[StorageGCP, None] = pydantic.Field(
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: Union[StorageAzure, None] = pydantic.Field(
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: Union[StorageGit, None] = pydantic.Field(
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.Union[int, None] = None) -> list[dict]:
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=auth_headers,
206
+ headers=get_auth_headers(),
200
207
  timeout=READ_TIMEOUT,
201
208
  )
202
- storage_integrations.raise_for_status()
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=auth_headers,
222
+ headers=get_auth_headers(),
216
223
  timeout=MODIFY_TIMEOUT,
217
224
  )
218
- storage_integration.raise_for_status()
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
- **auth_headers,
247
+ **get_auth_headers(),
240
248
  },
241
249
  timeout=MODIFY_TIMEOUT,
242
250
  )
243
- storage_integration.raise_for_status()
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (72.1.0)
2
+ Generator: setuptools (75.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -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`.
@@ -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,,