bookalimo 1.0.0__py3-none-any.whl → 1.0.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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bookalimo
3
- Version: 1.0.0
3
+ Version: 1.0.1
4
4
  Summary: Python wrapper for the Book-A-Limo API
5
5
  Author-email: Jonathan Oren <jonathan@bookalimo.com>
6
6
  Maintainer-email: Jonathan Oren <jonathan@bookalimo.com>
@@ -20,6 +20,7 @@ Classifier: Programming Language :: Python :: 3.9
20
20
  Classifier: Programming Language :: Python :: 3.10
21
21
  Classifier: Programming Language :: Python :: 3.11
22
22
  Classifier: Programming Language :: Python :: 3.12
23
+ Classifier: Programming Language :: Python :: 3.13
23
24
  Classifier: Topic :: Software Development :: Libraries :: Python Modules
24
25
  Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
25
26
  Requires-Python: >=3.9
@@ -33,6 +34,8 @@ Requires-Dist: airportsdata>=20230101
33
34
  Provides-Extra: places
34
35
  Requires-Dist: google-maps-places>=0.1.0; extra == "places"
35
36
  Requires-Dist: google-api-core>=2.0.0; extra == "places"
37
+ Requires-Dist: numpy>=2.0.0; extra == "places"
38
+ Requires-Dist: rapidfuzz>=3.0.0; extra == "places"
36
39
  Provides-Extra: dev
37
40
  Requires-Dist: pytest>=7.0.0; extra == "dev"
38
41
  Requires-Dist: pytest-asyncio>=0.21.0; extra == "dev"
@@ -59,21 +62,31 @@ Dynamic: license-file
59
62
  # Bookalimo Python SDK
60
63
 
61
64
  [![codecov](https://codecov.io/gh/asparagusbeef/bookalimo-python/branch/main/graph/badge.svg?token=H588J8Q1M8)](https://codecov.io/gh/asparagusbeef/bookalimo-python)
62
- [![Documentation Status](https://readthedocs.org/projects/bookalimo-python/badge/?version=latest)](https://bookalimo-python.readthedocs.io/en/latest/?badge=latest)
65
+ [![Docs](https://img.shields.io/github/deployments/asparagusbeef/bookalimo-python/github-pages?label=docs&logo=github)](https://asparagusbeef.github.io/bookalimo-python)
63
66
  [![PyPI version](https://badge.fury.io/py/bookalimo.svg)](https://badge.fury.io/py/bookalimo)
64
67
  [![Python Support](https://img.shields.io/pypi/pyversions/bookalimo.svg)](https://pypi.org/project/bookalimo/)
65
68
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
66
69
  [![Code style: ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff)
67
70
 
68
- Python client library for the Book-A-Limo transportation booking API with async/sync support, type safety, and Google Places integration.
71
+ A modern, fully-typed Python SDK for the Book-A-Limo transportation booking API with async/sync support, type safety, Google Places integration, and ergonomic resource management via context managers.
72
+
73
+ ## Important notes
74
+
75
+ - **Docs are in preview**: Many pages were AI-generated from the codebase and haven’t had a full manual review yet. In case of conflict, the code and docstrings are the source of truth. Please [report issues](https://github.com/asparagusbeef/bookalimo-python/issues) you find.
76
+ - **Terms & credentials**: Use of Book-A-Limo API and Google APIs are subject to their respective Terms of Service.
77
+
78
+ ## Design philosophy: IDE-first DX
79
+
80
+ The library is **comprehensively typed** and **richly documented** via docstrings. Most users can rely on IDE hints, docstrings, and autocomplete without reading the docs.
69
81
 
70
82
  ## Features
71
83
 
72
- - **Async & Sync Support** - Choose the right client for your use case
73
- - **Type Safety** - Full Pydantic models with validation
74
- - **Google Places Integration** - Location search and geocoding
75
- - **Automatic Retry** - Built-in exponential backoff for reliability
76
- - **Comprehensive Error Handling** - Detailed exceptions with context
84
+ - **Async & Sync Support** Choose the right client for your use case
85
+ - **Type Safety** Full Pydantic models with validation
86
+ - **Google Places Integration** Autocomplete, search, details, and geocoding
87
+ - **Automatic Retry** Built-in exponential backoff for reliability
88
+ - **Comprehensive Error Handling** Detailed exceptions with context
89
+ - **Resource Management** – Context managers for proper cleanup
77
90
 
78
91
  ## Installation
79
92
 
@@ -87,81 +100,101 @@ pip install bookalimo[places]
87
100
  ## Core API
88
101
 
89
102
  ### Clients
90
- - `AsyncBookalimo` - Async client for high-concurrency applications
91
- - `Bookalimo` - Sync client for simple scripts and legacy code
103
+
104
+ * `AsyncBookalimo` Async client for high-concurrency applications
105
+ * `Bookalimo` – Sync client for simple scripts and legacy code
92
106
 
93
107
  ### Services
94
- - `client.pricing` - Get quotes and update booking details
95
- - `client.reservations` - Book, list, modify, and cancel reservations
96
- - `client.places` - Google Places search and geocoding (optional)
108
+
109
+ * `client.pricing` Get quotes and update booking details
110
+ * `client.reservations` Book, list, modify, and cancel reservations
111
+ * `client.places` – Google Places search and geocoding (optional)
97
112
 
98
113
  ### Authentication
114
+
99
115
  SHA256-based credential system with automatic password hashing:
116
+
100
117
  ```python
101
118
  from bookalimo.transport.auth import Credentials
102
119
 
103
120
  # Agency account
104
- credentials = Credentials.create("AGENCY123", "password", is_customer=False)
121
+ agency = Credentials.create("AGENCY123", "password", is_customer=False)
105
122
 
106
123
  # Customer account
107
- credentials = Credentials.create("user@email.com", "password", is_customer=True)
124
+ customer = Credentials.create("user@email.com", "password", is_customer=True)
108
125
  ```
109
126
 
110
127
  ### Booking Flow
111
- 1. **Get Pricing** - `client.pricing.quote()` returns session token + vehicle options
112
- 2. **Update Details** - `client.pricing.update_details()` modifies booking (optional)
113
- 3. **Book Reservation** - `client.reservations.book()` confirms with payment
114
128
 
115
- ## Quick Example
129
+ 1. **Get Pricing** – `client.pricing.quote()` returns session token + vehicle options
130
+ 2. **Update Details** – `client.pricing.update_details()` finalize booking details
131
+ 3. **Book Reservation** – `client.reservations.book()` confirms with payment
132
+
133
+ ## Quick Examples
134
+
135
+ ### Async example
116
136
 
117
137
  ```python
118
138
  import asyncio
119
139
  from bookalimo import AsyncBookalimo
120
140
  from bookalimo.transport.auth import Credentials
121
- from bookalimo.schemas.booking import RateType, Location, LocationType, Address, City
141
+ from bookalimo.schemas.booking import (
142
+ RateType,
143
+ Location,
144
+ LocationType,
145
+ Address,
146
+ City,
147
+ Airport,
148
+ )
149
+
122
150
 
123
151
  async def book_ride():
124
- credentials = Credentials.create("your_id", "your_password")
152
+ credentials = Credentials.create("your_id", "your_password", is_customer=False)
125
153
 
126
- # Define locations
127
154
  pickup = Location(
128
155
  type=LocationType.ADDRESS,
129
156
  address=Address(
130
157
  place_name="Empire State Building",
131
- city=City(city_name="New York", country_code="US", state_code="NY")
132
- )
158
+ city=City(city_name="New York", country_code="US", state_code="NY"),
159
+ ),
133
160
  )
134
161
 
135
- dropoff = Location(
136
- type=LocationType.ADDRESS,
137
- address=Address(
138
- place_name="JFK Airport",
139
- city=City(city_name="New York", country_code="US", state_code="NY")
140
- )
141
- )
162
+ dropoff = Location(type=LocationType.AIRPORT, airport=Airport(iata_code="JFK"))
142
163
 
143
164
  async with AsyncBookalimo(credentials=credentials) as client:
144
- # 1. Get pricing
165
+ # 1) Get pricing
145
166
  quote = await client.pricing.quote(
146
167
  rate_type=RateType.P2P,
147
168
  date_time="12/25/2024 03:00 PM",
148
169
  pickup=pickup,
149
170
  dropoff=dropoff,
150
171
  passengers=2,
151
- luggage=2
172
+ luggage=2,
152
173
  )
153
174
 
154
- # 2. Book reservation
175
+ # 2) Book reservation
155
176
  booking = await client.reservations.book(
156
- token=quote.token,
157
- method="charge" # or credit_card=CreditCard(...)
177
+ token=quote.token, method="charge" # or credit_card=CreditCard(...)
158
178
  )
159
-
160
179
  return booking.reservation_id
161
180
 
181
+
162
182
  confirmation = asyncio.run(book_ride())
163
183
  ```
164
184
 
185
+ ### Sync example
186
+
187
+ ```python
188
+ from bookalimo import Bookalimo
189
+ from bookalimo.transport.auth import Credentials
190
+
191
+ credentials = Credentials.create("your_id", "your_password", is_customer=False)
192
+
193
+ with Bookalimo(credentials=credentials) as client:
194
+ quote = client.pricing.quote(...)
195
+ booking = client.reservations.book(token=quote.token, method="charge")
196
+ ```
197
+
165
198
  ## Rate Types & Options
166
199
 
167
200
  ```python
@@ -204,41 +237,61 @@ address_location = Location(
204
237
  address=Address(
205
238
  place_name="Empire State Building",
206
239
  street_name="350 5th Ave",
207
- city=City(city_name="New York", country_code="US", state_code="NY")
208
- )
240
+ city=City(city_name="New York", country_code="US", state_code="NY"),
241
+ ),
209
242
  )
210
243
 
211
244
  # Airport with flight details
212
245
  airport_location = Location(
213
246
  type=LocationType.AIRPORT,
214
- airport=Airport(
215
- iata_code="JFK",
216
- flight_number="UA123",
217
- terminal="4"
218
- )
247
+ airport=Airport(iata_code="JFK", flight_number="UA123", terminal="4"),
219
248
  )
220
249
  ```
221
250
 
222
- ## Google Places Integration
251
+ ## Google Places Integration (Recommended flow)
223
252
 
224
253
  ```python
225
254
  async with AsyncBookalimo(
226
- credentials=credentials,
227
- google_places_api_key="your-google-places-key"
255
+ credentials=credentials, google_places_api_key="your-google-places-key"
228
256
  ) as client:
229
257
  # Search locations
230
- results = await client.places.search("JFK Airport Terminal 4")
258
+ results = await client.places.search("Hilton Miami Beach")
259
+
260
+ # OR
261
+ # autocomplete = await client.places.autocomplete(input="Hilton Miami Beach")
262
+ # top_result = autocomplete.suggestions[0].place_prediction.place
263
+ # top_result_place_id = top_result.id
264
+
265
+ # OR
266
+ # resolve_airport = await client.places.resolve_airport(query="Hilton Miami Beach")
267
+ # top_result = resolve_airport[0]
268
+ # iata_code = top_result.iata_code
269
+
270
+ # Get the top result
271
+ top_result = results[0]
272
+
273
+ # Get the top result geocode
274
+
275
+ # By place_id
276
+ top_result_place_id = top_result.google_place.id
277
+ top_result_geocode = await client.places.geocode(place_id=top_result_place_id)
278
+
279
+ # By lat-lng
280
+ top_result_geocode = await client.places.geocode(
281
+ lat=top_result.lat, lng=top_result.lng
282
+ )
231
283
 
232
284
  # Convert to booking location
233
285
  location = Location(
234
286
  type=LocationType.ADDRESS,
235
287
  address=Address(
236
- google_geocode=results[0].google_place.model_dump(),
237
- place_name=results[0].formatted_address
238
- )
288
+ google_geocode=top_result_geocode, place_name=top_result.formatted_address
289
+ ),
239
290
  )
240
291
  ```
241
292
 
293
+ *(You can also search independent pickup/dropoff locations and feed them into the booking flow.)*
294
+
242
295
  ## Reservation Management
243
296
 
244
297
  ```python
@@ -250,22 +303,21 @@ details = await client.reservations.get("ABC123")
250
303
 
251
304
  # Modify reservation
252
305
  edit_result = await client.reservations.edit(
253
- confirmation="ABC123",
254
- passengers=3,
255
- pickup_date="12/26/2024"
306
+ confirmation="ABC123", passengers=3, pickup_date="12/26/2024"
256
307
  )
257
308
 
258
309
  # Cancel reservation
259
- cancel_result = await client.reservations.edit(
260
- confirmation="ABC123",
261
- is_cancel=True
262
- )
310
+ cancel_result = await client.reservations.edit(confirmation="ABC123", is_cancel=True)
263
311
  ```
264
312
 
265
313
  ## Error Handling
266
314
 
267
315
  ```python
268
- from bookalimo.exceptions import BookalimoHTTPError, BookalimoValidationError
316
+ from bookalimo.exceptions import (
317
+ BookalimoError, # base SDK error
318
+ BookalimoHTTPError, # HTTP/transport errors
319
+ BookalimoValidationError, # input/schema validation errors
320
+ )
269
321
 
270
322
  try:
271
323
  booking = await client.reservations.book(...)
@@ -278,17 +330,21 @@ except BookalimoHTTPError as e:
278
330
  print("Authentication failed")
279
331
  elif e.status_code == 400:
280
332
  print(f"Bad request: {e.payload}")
333
+ else:
334
+ print(f"API error: {e}")
335
+ except BookalimoError as e:
336
+ print(f"SDK error: {e}")
281
337
  ```
282
338
 
283
339
  ## Documentation
284
340
 
285
- **📖 [Complete Documentation](https://asparagusbeef.github.io/bookalimo-python)**
341
+ **📖 Complete Documentation:** [https://asparagusbeef.github.io/bookalimo-python](https://asparagusbeef.github.io/bookalimo-python)
286
342
 
287
- - [Quick Start Guide](https://asparagusbeef.github.io/bookalimo-python/guide/quickstart/)
288
- - [API Reference](https://asparagusbeef.github.io/bookalimo-python/api/)
289
- - [Examples](https://asparagusbeef.github.io/bookalimo-python/examples/basic/)
343
+ * Quick Start Guide: [https://asparagusbeef.github.io/bookalimo-python/guide/quickstart/](https://asparagusbeef.github.io/bookalimo-python/guide/quickstart/)
344
+ * API Reference: [https://asparagusbeef.github.io/bookalimo-python/api/](https://asparagusbeef.github.io/bookalimo-python/api/)
345
+ * Examples: [https://asparagusbeef.github.io/bookalimo-python/examples/basic/](https://asparagusbeef.github.io/bookalimo-python/examples/basic/)
290
346
 
291
- ## Environment Options
347
+ ## Environment
292
348
 
293
349
  ```bash
294
350
  export GOOGLE_PLACES_API_KEY="your_google_places_key"
@@ -297,11 +353,18 @@ export BOOKALIMO_LOG_LEVEL="DEBUG"
297
353
 
298
354
  ## Requirements
299
355
 
300
- - Python 3.9+
301
- - Book-A-Limo API credentials
302
- - Dependencies: httpx, pydantic, pycountry, us, airportsdata
303
- - Optional: google-maps-places (for Places integration)
356
+ * Python 3.9+
357
+ * Book-A-Limo API credentials
358
+ * Dependencies: httpx, pydantic, pycountry, us, airportsdata
359
+ - Optional: google-maps-places, google-api-core, numpy, rapidfuzz
360
+
361
+ ## Support & Resources
362
+
363
+ * GitHub: [https://github.com/asparagusbeef/bookalimo-python](https://github.com/asparagusbeef/bookalimo-python)
364
+ * PyPI: [https://pypi.org/project/bookalimo/](https://pypi.org/project/bookalimo/)
365
+ * Issues: [https://github.com/asparagusbeef/bookalimo-python/issues](https://github.com/asparagusbeef/bookalimo-python/issues)
366
+ * Changelog: [CHANGELOG.md](./CHANGELOG.md)
304
367
 
305
368
  ## License
306
369
 
307
- MIT License - see [LICENSE](LICENSE) for details.
370
+ MIT License see [LICENSE](LICENSE) for details.
@@ -1,23 +1,26 @@
1
1
  bookalimo/__init__.py,sha256=ZFDpnSOo5VQEgusbVAxyF-neFxBptPZANZ-eE1PeIsU,516
2
2
  bookalimo/_version.py,sha256=KcHRbOssHorjmpk3Xs1RTqGNSA-sw9tjYqwV19Zfa9c,259
3
3
  bookalimo/client.py,sha256=za9o_D1jkaq7atWpM5d3bguWO-rtMYr5StXrBZInsMg,10599
4
- bookalimo/config.py,sha256=LSbWIeTZYc4b3XSCmPSEU-jEcYmo7GWAyxdOmA69X6A,509
4
+ bookalimo/config.py,sha256=K3HlCj8v34kFM2MaG9evGFomU95hRmenRi1zqe4h8EY,456
5
5
  bookalimo/exceptions.py,sha256=pShnuvfMZEP_cChczWhNBLIqa7EOgr4ZNnWj6kphARU,4001
6
6
  bookalimo/logging.py,sha256=IF6RQRJvVHgmpXK1qMEGcd0BjU6GxvzbNUBrBKHe-v8,7409
7
7
  bookalimo/py.typed,sha256=8PjyZ1aVoQpRVvt71muvuq5qE-jTFZkK-GLHkhdebmc,26
8
8
  bookalimo/integrations/__init__.py,sha256=edmQP2Uo8JiNIVaeB4rxM8vagz7BQBhyGEJo70OVS0M,51
9
9
  bookalimo/integrations/google_places/__init__.py,sha256=A6jBfGk8ZLYgFiTCGBytBOsyzKVWHI_kjnuZOgdCONc,866
10
- bookalimo/integrations/google_places/client_async.py,sha256=6hfl3am2qtJLZHogPk57a-jFNqRzTJt3dyj58Mpt290,8956
11
- bookalimo/integrations/google_places/client_sync.py,sha256=uscvNJuUb6iF8q29f_ZgftGmPWv2Zog72t0E8PCBmFY,8840
12
- bookalimo/integrations/google_places/common.py,sha256=MphkEGarmM8AapjBrdsWRAg0yXyzMFZad_S8YB-esbI,7219
10
+ bookalimo/integrations/google_places/client_async.py,sha256=dSqM5iSG8YEEgb5J1c0vefge8a3wSzY3NZLVDoyJjCA,10981
11
+ bookalimo/integrations/google_places/client_sync.py,sha256=ixnZvfprbWb3sQaUUJdmD4yYlsjg0BWu0lYz7D4uI2M,10801
12
+ bookalimo/integrations/google_places/common.py,sha256=Y5xNTj58eHt1C9sKsZA8MB-1oeGSJQA7G0iA8yX-ywM,7051
13
13
  bookalimo/integrations/google_places/proto_adapter.py,sha256=XuVDr-PH9fopykRwNZxQTS_kIBCdwPwcNYBIHCZjmRo,6809
14
- bookalimo/schemas/__init__.py,sha256=vS9skyuk5WV472TKgBqAg5Qzwvb0Bh0n4ff9BDSl8aE,1919
14
+ bookalimo/integrations/google_places/resolve_airport.py,sha256=ZVaT0Q9wDgKFm6tZUu06oy6zCfO58VLcrR7G0FRmDTk,13553
15
+ bookalimo/integrations/google_places/transports.py,sha256=Flb317h5ESj6iOlI89giDu_40v9yK8kNcaiBpJTFn4w,3116
16
+ bookalimo/schemas/__init__.py,sha256=Zrl3MJev7XkVAydd-MderyCe-c-okdxw54PB4Jm499Y,2053
15
17
  bookalimo/schemas/base.py,sha256=XEe0Qg7p-LzTmUOJ8CLVDsrry2lKn8sWNin7zwBiw-U,2022
16
18
  bookalimo/schemas/booking.py,sha256=ll1usMa6Rfuz63LAWimWlz1UswWn26ZOPBpclN-8yGY,15861
17
- bookalimo/schemas/places/__init__.py,sha256=SkUR6EIvnetNWqhLOiuq0k5Zy5XA4yZp8F2U92qCPOI,713
18
- bookalimo/schemas/places/common.py,sha256=v39FpI3i7aDWRWsnb2zzSDddNE09XyQ5WVACBww3uC8,5425
19
- bookalimo/schemas/places/google.py,sha256=HbQHKTj9bk6q-KaFWNMkKTgQIvp3kZF8dSnPqguy4Ng,20050
20
- bookalimo/schemas/places/place.py,sha256=Y55QFhm7zjsqwjbPxHwNTl_02u30Yv2TqrhtBzgb6iM,10620
19
+ bookalimo/schemas/places/__init__.py,sha256=8dYqOZYDkGSdzTXXPRbWgUt59gh6vTLffxOIuED694E,1383
20
+ bookalimo/schemas/places/common.py,sha256=NjQKBabFlBytgkqgGABPTlZYkVW035GQRHo3qcTZxTs,10910
21
+ bookalimo/schemas/places/field_mask.py,sha256=tbHEFU2M_9R_lr-u4vIZy8YykBNfhPLfl6N0hmos4II,6816
22
+ bookalimo/schemas/places/google.py,sha256=4eXcesTk19A0ZnVQDlZtNrz6Bl1PBEtEe3ETffpIXZw,29264
23
+ bookalimo/schemas/places/place.py,sha256=5jBqMbPHbRTtXeoFaUtRoIUdzvJeCgMRdeyVt88Axe0,10681
21
24
  bookalimo/services/__init__.py,sha256=4wom7MpoeqKy5y99LYFKkl-CAJ7faDN9ZlXUhKVqlAg,303
22
25
  bookalimo/services/pricing.py,sha256=MIUVzdnZsmxEEyw9qUdjj71gt3MsckiVLgfXqnPHmNE,5873
23
26
  bookalimo/services/reservations.py,sha256=OsbVrVJRggjnifh1eER9PHGqt4PwxZ-Jq1-Dpo4wGKk,7147
@@ -28,8 +31,8 @@ bookalimo/transport/httpx_async.py,sha256=XbXbxcAdUc_CQh_XEYsL0WH6vvECP4fcZWfFCe
28
31
  bookalimo/transport/httpx_sync.py,sha256=SIlDfiIYKQgAvWsOVeEgxNxlqTKviN_LJX4r8i4Cl5M,7988
29
32
  bookalimo/transport/retry.py,sha256=YiJtcdNZUbkrLa1CtKsRtcFO273XJX8naKd8d6ht0LU,2688
30
33
  bookalimo/transport/utils.py,sha256=Yoj4P5AzuHbf6pzNPtiiswKab4nHZTCOpIff30-sgbw,1797
31
- bookalimo-1.0.0.dist-info/licenses/LICENSE,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- bookalimo-1.0.0.dist-info/METADATA,sha256=J_p8zz2sgot7msNBGa8dxLSDG-7nYXoLsGQrZcmggnw,9754
33
- bookalimo-1.0.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
34
- bookalimo-1.0.0.dist-info/top_level.txt,sha256=ZgYiDX2GfZCp4pevWn4X2qyEr-Dh7-cq5Y1j2jMhB1s,10
35
- bookalimo-1.0.0.dist-info/RECORD,,
34
+ bookalimo-1.0.1.dist-info/licenses/LICENSE,sha256=dW9UYOWGfs9eFlJvwSSkJBDhPRic2mrgFkg6aA0xkMM,1070
35
+ bookalimo-1.0.1.dist-info/METADATA,sha256=xW3rqcCFlQ-IKPfal1T6rgzAg9QmNruKnJPDi-IAlzI,12600
36
+ bookalimo-1.0.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
37
+ bookalimo-1.0.1.dist-info/top_level.txt,sha256=ZgYiDX2GfZCp4pevWn4X2qyEr-Dh7-cq5Y1j2jMhB1s,10
38
+ bookalimo-1.0.1.dist-info/RECORD,,
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Jonathan Oren
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
File without changes