Skip to content

Commit 9be333a

Browse files
authored
Merge pull request #1091 from nightcityblade/fix/issue-1082
chore: drop Python 3.8 and 3.9 support
2 parents 09b9418 + 90e65ae commit 9be333a

4 files changed

Lines changed: 72 additions & 60 deletions

File tree

CONTRIBUTING.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ Between April 2024 and July 2025 we use Hatch for managing development environme
7878

7979
We have dropped support of Python 3.6 since version 2.0.0 of CodeCarbon.
8080

81+
We have dropped support of Python 3.8 and 3.9 since version 3.2.4 of CodeCarbon.
82+
8183
Please install [UV](https://github.com/astral-sh/uv) following [installation instructions](https://docs.astral.sh/uv/getting-started/installation/#standalone-installer).
8284

8385
Then, clone the repository and create the environment with:
@@ -511,7 +513,7 @@ CC_PIP_REQUIREMENTS_FILE="requirements.txt"
511513
CC_POST_BUILD_HOOK="cd $APP_HOME/carbonserver && python3 -m alembic -c carbonserver/database/alembic.ini upgrade head"
512514
CC_PYTHON_BACKEND="uvicorn"
513515
CC_PYTHON_MODULE="main:app"
514-
CC_PYTHON_VERSION="3.8"
516+
CC_PYTHON_VERSION="3.13"
515517
DATABASE_URL="postgresql://secret_do_not_publish_this"
516518
PORT="8080"
517519
```
@@ -547,7 +549,7 @@ Config on CleverCloud:
547549
APP_FOLDER="dashboard"
548550
CC_PIP_REQUIREMENTS_FILE="requirements-dashboard.txt"
549551
CC_PYTHON_MODULE="carbon_board_API:server"
550-
CC_PYTHON_VERSION="3.8"
552+
CC_PYTHON_VERSION="3.13"
551553
CODECARBON_API_URL="https://api.codecarbon.io"
552554
PORT="8000"
553555
```

codecarbon/input.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,13 @@
88

99
import atexit
1010
import json
11-
import sys
1211
from contextlib import ExitStack
12+
from importlib.resources import as_file as importlib_resources_as_file
13+
from importlib.resources import files as importlib_resources_files
1314
from typing import Any, Dict
1415

1516
import pandas as pd
1617

17-
if sys.version_info >= (3, 9):
18-
from importlib.resources import as_file as importlib_resources_as_file
19-
from importlib.resources import files as importlib_resources_files
20-
else:
21-
from importlib_resources import as_file as importlib_resources_as_file
22-
from importlib_resources import files as importlib_resources_files
23-
24-
2518
_CACHE: Dict[str, Any] = {}
2619
_MODULE_NAME = "codecarbon"
2720

pyproject.toml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ build-backend = "setuptools.build_meta"
66
name = "codecarbon"
77
dynamic = ["version"]
88
readme = "README.md"
9-
requires-python = ">=3.8"
9+
requires-python = ">=3.10"
1010
license = "MIT"
1111
license-files = ["LICENSE"]
1212
authors = [
@@ -18,8 +18,6 @@ authors = [
1818
]
1919
classifiers = [
2020
"Natural Language :: English",
21-
"Programming Language :: Python :: 3.8",
22-
"Programming Language :: Python :: 3.9",
2321
"Programming Language :: Python :: 3.10",
2422
"Programming Language :: Python :: 3.11",
2523
"Programming Language :: Python :: 3.12",

tests/test_cpu.py

Lines changed: 65 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -353,24 +353,30 @@ def __init__(self):
353353
cpu_device = mock.Mock()
354354
cpu_device.get_model.return_value = "Mock CPU"
355355

356-
with mock.patch(
357-
"codecarbon.core.resource_tracker.cpu.TDP",
358-
side_effect=AssertionError(
359-
"TDP should not be instantiated when RAPL is active"
356+
with (
357+
mock.patch(
358+
"codecarbon.core.resource_tracker.cpu.TDP",
359+
side_effect=AssertionError(
360+
"TDP should not be instantiated when RAPL is active"
361+
),
362+
) as mocked_tdp,
363+
mock.patch(
364+
"codecarbon.core.resource_tracker.cpu.is_powergadget_available",
365+
return_value=False,
360366
),
361-
) as mocked_tdp, mock.patch(
362-
"codecarbon.core.resource_tracker.cpu.is_powergadget_available",
363-
return_value=False,
364-
), mock.patch(
365-
"codecarbon.core.resource_tracker.cpu.is_rapl_available",
366-
return_value=True,
367-
), mock.patch(
368-
"codecarbon.core.resource_tracker.powermetrics.is_powermetrics_available",
369-
return_value=False,
370-
), mock.patch(
371-
"codecarbon.core.resource_tracker.CPU.from_utils",
372-
return_value=cpu_device,
373-
) as mocked_from_utils:
367+
mock.patch(
368+
"codecarbon.core.resource_tracker.cpu.is_rapl_available",
369+
return_value=True,
370+
),
371+
mock.patch(
372+
"codecarbon.core.resource_tracker.powermetrics.is_powermetrics_available",
373+
return_value=False,
374+
),
375+
mock.patch(
376+
"codecarbon.core.resource_tracker.CPU.from_utils",
377+
return_value=cpu_device,
378+
) as mocked_from_utils,
379+
):
374380
resource_tracker.set_CPU_tracking()
375381

376382
mocked_tdp.assert_not_called()
@@ -400,22 +406,29 @@ def __init__(self):
400406
fake_tdp.tdp = 50
401407
fake_tdp.model = "Mock CPU"
402408

403-
with mock.patch(
404-
"codecarbon.core.resource_tracker.cpu.TDP", return_value=fake_tdp
405-
) as mocked_tdp, mock.patch(
406-
"codecarbon.core.resource_tracker.ResourceTracker._setup_cpu_load_mode",
407-
return_value=True,
408-
) as mocked_setup_cpu_load, mock.patch(
409-
"codecarbon.core.resource_tracker.ResourceTracker._setup_fallback_tracking"
410-
) as mocked_fallback, mock.patch(
411-
"codecarbon.core.resource_tracker.cpu.is_powergadget_available",
412-
return_value=False,
413-
), mock.patch(
414-
"codecarbon.core.resource_tracker.cpu.is_rapl_available",
415-
return_value=False,
416-
), mock.patch(
417-
"codecarbon.core.resource_tracker.powermetrics.is_powermetrics_available",
418-
return_value=False,
409+
with (
410+
mock.patch(
411+
"codecarbon.core.resource_tracker.cpu.TDP", return_value=fake_tdp
412+
) as mocked_tdp,
413+
mock.patch(
414+
"codecarbon.core.resource_tracker.ResourceTracker._setup_cpu_load_mode",
415+
return_value=True,
416+
) as mocked_setup_cpu_load,
417+
mock.patch(
418+
"codecarbon.core.resource_tracker.ResourceTracker._setup_fallback_tracking"
419+
) as mocked_fallback,
420+
mock.patch(
421+
"codecarbon.core.resource_tracker.cpu.is_powergadget_available",
422+
return_value=False,
423+
),
424+
mock.patch(
425+
"codecarbon.core.resource_tracker.cpu.is_rapl_available",
426+
return_value=False,
427+
),
428+
mock.patch(
429+
"codecarbon.core.resource_tracker.powermetrics.is_powermetrics_available",
430+
return_value=False,
431+
),
419432
):
420433
resource_tracker.set_CPU_tracking()
421434

@@ -440,19 +453,25 @@ def __init__(self):
440453
fake_tdp.tdp = 20
441454
fake_tdp.model = "Mock CPU"
442455

443-
with mock.patch(
444-
"codecarbon.core.resource_tracker.cpu.TDP", return_value=fake_tdp
445-
) as mocked_tdp, mock.patch(
446-
"codecarbon.core.resource_tracker.ResourceTracker._setup_fallback_tracking"
447-
) as mocked_fallback, mock.patch(
448-
"codecarbon.core.resource_tracker.cpu.is_powergadget_available",
449-
return_value=False,
450-
), mock.patch(
451-
"codecarbon.core.resource_tracker.cpu.is_rapl_available",
452-
return_value=False,
453-
), mock.patch(
454-
"codecarbon.core.resource_tracker.powermetrics.is_powermetrics_available",
455-
return_value=False,
456+
with (
457+
mock.patch(
458+
"codecarbon.core.resource_tracker.cpu.TDP", return_value=fake_tdp
459+
) as mocked_tdp,
460+
mock.patch(
461+
"codecarbon.core.resource_tracker.ResourceTracker._setup_fallback_tracking"
462+
) as mocked_fallback,
463+
mock.patch(
464+
"codecarbon.core.resource_tracker.cpu.is_powergadget_available",
465+
return_value=False,
466+
),
467+
mock.patch(
468+
"codecarbon.core.resource_tracker.cpu.is_rapl_available",
469+
return_value=False,
470+
),
471+
mock.patch(
472+
"codecarbon.core.resource_tracker.powermetrics.is_powermetrics_available",
473+
return_value=False,
474+
),
456475
):
457476
resource_tracker.set_CPU_tracking()
458477

0 commit comments

Comments
 (0)