Commit 6df45e9
authored
feat: replace python-dateutil with stdlib datetime.fromisoformat (#1429)
## Summary
Drop the `python-dateutil` dependency from both the generator and all
generated client packages. Date/datetime parsing now uses Python's
built-in `datetime.fromisoformat()` instead of
`dateutil.parser.isoparse()`.
This removes one runtime dependency from every generated client,
reducing install size and eliminating a dependency that is [unmaintained
upstream and being deprecated by Fedora
45](https://fedoraproject.org/wiki/Changes/DeprecatePython-dateutil) (no
releases since March 2024).
## Changes
**Generator source** (`openapi_python_client/parser/properties/`):
- `datetime.py`: Validate defaults with
`datetime.datetime.fromisoformat()` instead of `isoparse()`. Normalize
`Z` to `+00:00` at generation time so the emitted Python code is clean.
- `date.py`: Validate defaults with `datetime.date.fromisoformat()`
instead of `isoparse().date()`.
- Both: Remove `"from dateutil.parser import isoparse"` from the import
set returned by `get_imports()`.
**Jinja templates**
(`openapi_python_client/templates/property_templates/`):
- `datetime_property.py.jinja`: `isoparse(x)` ->
`datetime.datetime.fromisoformat(x.replace("Z", "+00:00"))`
- `date_property.py.jinja`: `isoparse(x).date()` ->
`datetime.date.fromisoformat(x)`
**Dependency removal** (all 4 metadata formats):
- `pyproject_uv.toml.jinja`, `pyproject_poetry.toml.jinja`,
`pyproject_pdm.toml.jinja`, `setup.py.jinja`: Remove `python-dateutil`
from generated dependencies.
- `pyproject.toml` (generator): Remove `python-dateutil` from runtime
deps and `types-python-dateutil` from dev deps.
- `integration-tests/pyproject.toml`: Remove both as well.
**Tests & golden records**: All regenerated. Unit tests pass (283
passed, 4 skipped).
## Python 3.10 compatibility
`datetime.fromisoformat()` gained full ISO 8601 support (including the
`Z` suffix) in Python 3.11. On Python 3.10, the `Z` suffix raises a
`ValueError`:
```python
# Python 3.10
>>> datetime.datetime.fromisoformat("2024-01-15T10:30:00Z")
ValueError: Invalid isoformat string: '2024-01-15T10:30:00Z'
>>> datetime.datetime.fromisoformat("2024-01-15T10:30:00+00:00")
datetime.datetime(2024, 1, 15, 10, 30, tzinfo=datetime.timezone.utc) # works
```
```python
# Python 3.11+
>>> datetime.datetime.fromisoformat("2024-01-15T10:30:00Z")
datetime.datetime(2024, 1, 15, 10, 30, tzinfo=datetime.timezone.utc) # works natively
```
The generated datetime parsing code uses `.replace("Z", "+00:00")` to
normalize `Z` to an explicit UTC offset before calling
`fromisoformat()`, which works on both 3.10 and 3.11+. This is a no-op
on strings without `Z`. Date parsing does not need this since date
strings have no timezone component.
Default values in OpenAPI specs are normalized at generation time (Z ->
+00:00), so the emitted default expressions are clean
`datetime.datetime.fromisoformat("...")` calls.1 parent eeda8c5 commit 6df45e9
38 files changed
Lines changed: 616 additions & 748 deletions
File tree
- end_to_end_tests
- docstrings-on-attributes-golden-record
- golden-record
- my_test_api_client
- api/defaults
- models
- literal-enums-golden-record
- metadata_snapshots
- test-3-1-golden-record
- integration-tests
- integration_tests/models
- openapi_python_client
- parser/properties
- templates
- property_templates
- tests
- test_parser/test_properties
- test_templates/test_property_templates
- test_date_property
- test_datetime_property
Lines changed: 0 additions & 1 deletion
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | 16 | | |
18 | 17 | | |
19 | 18 | | |
| |||
Lines changed: 9 additions & 10 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | 6 | | |
8 | 7 | | |
9 | 8 | | |
| |||
17 | 16 | | |
18 | 17 | | |
19 | 18 | | |
20 | | - | |
| 19 | + | |
21 | 20 | | |
22 | 21 | | |
23 | 22 | | |
| |||
121 | 120 | | |
122 | 121 | | |
123 | 122 | | |
124 | | - | |
| 123 | + | |
125 | 124 | | |
126 | 125 | | |
127 | 126 | | |
| |||
138 | 137 | | |
139 | 138 | | |
140 | 139 | | |
141 | | - | |
| 140 | + | |
142 | 141 | | |
143 | 142 | | |
144 | 143 | | |
| |||
186 | 185 | | |
187 | 186 | | |
188 | 187 | | |
189 | | - | |
| 188 | + | |
190 | 189 | | |
191 | 190 | | |
192 | 191 | | |
| |||
203 | 202 | | |
204 | 203 | | |
205 | 204 | | |
206 | | - | |
| 205 | + | |
207 | 206 | | |
208 | 207 | | |
209 | 208 | | |
| |||
246 | 245 | | |
247 | 246 | | |
248 | 247 | | |
249 | | - | |
| 248 | + | |
250 | 249 | | |
251 | 250 | | |
252 | 251 | | |
| |||
263 | 262 | | |
264 | 263 | | |
265 | 264 | | |
266 | | - | |
| 265 | + | |
267 | 266 | | |
268 | 267 | | |
269 | 268 | | |
| |||
309 | 308 | | |
310 | 309 | | |
311 | 310 | | |
312 | | - | |
| 311 | + | |
313 | 312 | | |
314 | 313 | | |
315 | 314 | | |
| |||
326 | 325 | | |
327 | 326 | | |
328 | 327 | | |
329 | | - | |
| 328 | + | |
330 | 329 | | |
331 | 330 | | |
332 | 331 | | |
| |||
Lines changed: 5 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | 9 | | |
11 | 10 | | |
12 | 11 | | |
| |||
269 | 268 | | |
270 | 269 | | |
271 | 270 | | |
272 | | - | |
| 271 | + | |
273 | 272 | | |
274 | 273 | | |
275 | 274 | | |
276 | 275 | | |
277 | 276 | | |
278 | 277 | | |
279 | | - | |
| 278 | + | |
280 | 279 | | |
281 | 280 | | |
282 | 281 | | |
283 | 282 | | |
284 | 283 | | |
285 | | - | |
| 284 | + | |
286 | 285 | | |
287 | 286 | | |
288 | 287 | | |
289 | 288 | | |
290 | 289 | | |
291 | 290 | | |
292 | 291 | | |
293 | | - | |
| 292 | + | |
294 | 293 | | |
295 | 294 | | |
296 | 295 | | |
| |||
414 | 413 | | |
415 | 414 | | |
416 | 415 | | |
417 | | - | |
| 416 | + | |
418 | 417 | | |
419 | 418 | | |
420 | 419 | | |
| |||
Lines changed: 12 additions & 9 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
| |||
230 | 229 | | |
231 | 230 | | |
232 | 231 | | |
233 | | - | |
| 232 | + | |
234 | 233 | | |
235 | | - | |
| 234 | + | |
236 | 235 | | |
237 | 236 | | |
238 | 237 | | |
239 | 238 | | |
240 | 239 | | |
241 | 240 | | |
242 | | - | |
243 | | - | |
| 241 | + | |
| 242 | + | |
244 | 243 | | |
245 | 244 | | |
246 | 245 | | |
| |||
276 | 275 | | |
277 | 276 | | |
278 | 277 | | |
279 | | - | |
| 278 | + | |
| 279 | + | |
| 280 | + | |
280 | 281 | | |
281 | 282 | | |
282 | 283 | | |
283 | 284 | | |
284 | 285 | | |
285 | 286 | | |
286 | | - | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
287 | 290 | | |
288 | 291 | | |
289 | 292 | | |
| |||
310 | 313 | | |
311 | 314 | | |
312 | 315 | | |
313 | | - | |
| 316 | + | |
314 | 317 | | |
315 | | - | |
| 318 | + | |
316 | 319 | | |
317 | 320 | | |
318 | 321 | | |
| |||
Lines changed: 2 additions & 3 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
8 | 8 | | |
9 | 9 | | |
10 | 10 | | |
11 | | - | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
| |||
300 | 299 | | |
301 | 300 | | |
302 | 301 | | |
303 | | - | |
| 302 | + | |
304 | 303 | | |
305 | 304 | | |
306 | 305 | | |
307 | 306 | | |
308 | 307 | | |
309 | 308 | | |
310 | | - | |
| 309 | + | |
311 | 310 | | |
312 | 311 | | |
313 | 312 | | |
| |||
Lines changed: 5 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
| |||
276 | 275 | | |
277 | 276 | | |
278 | 277 | | |
279 | | - | |
| 278 | + | |
280 | 279 | | |
281 | 280 | | |
282 | 281 | | |
283 | 282 | | |
284 | 283 | | |
285 | 284 | | |
286 | | - | |
| 285 | + | |
287 | 286 | | |
288 | 287 | | |
289 | 288 | | |
290 | 289 | | |
291 | 290 | | |
292 | | - | |
| 291 | + | |
293 | 292 | | |
294 | 293 | | |
295 | 294 | | |
296 | 295 | | |
297 | 296 | | |
298 | 297 | | |
299 | 298 | | |
300 | | - | |
| 299 | + | |
301 | 300 | | |
302 | 301 | | |
303 | 302 | | |
| |||
421 | 420 | | |
422 | 421 | | |
423 | 422 | | |
424 | | - | |
| 423 | + | |
425 | 424 | | |
426 | 425 | | |
427 | 426 | | |
| |||
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | 9 | | |
11 | 10 | | |
12 | 11 | | |
| |||
44 | 43 | | |
45 | 44 | | |
46 | 45 | | |
47 | | - | |
| 46 | + | |
48 | 47 | | |
49 | 48 | | |
50 | 49 | | |
| |||
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | 9 | | |
11 | 10 | | |
12 | 11 | | |
| |||
81 | 80 | | |
82 | 81 | | |
83 | 82 | | |
84 | | - | |
| 83 | + | |
85 | 84 | | |
86 | 85 | | |
87 | 86 | | |
| |||
Lines changed: 1 addition & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
9 | | - | |
10 | 9 | | |
11 | 10 | | |
12 | 11 | | |
| |||
32 | 31 | | |
33 | 32 | | |
34 | 33 | | |
35 | | - | |
| 34 | + | |
36 | 35 | | |
37 | 36 | | |
38 | 37 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | 16 | | |
18 | 17 | | |
19 | 18 | | |
| |||
0 commit comments