diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index e6da8491..567b1655 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -1,6 +1,6 @@
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
- rev: v4.4.0
+ rev: v4.5.0
hooks:
- id: end-of-file-fixer
- id: requirements-txt-fixer
@@ -13,13 +13,13 @@ repos:
- id: debug-statements
- repo: https://github.com/psf/black
- rev: 23.7.0
+ rev: 23.10.1
hooks:
- id: black
language_version: python3
- repo: https://github.com/charliermarsh/ruff-pre-commit
- rev: "v0.0.282"
+ rev: "v0.1.1"
hooks:
- id: ruff
diff --git a/.readthedocs.yml b/.readthedocs.yml
index 3a40d135..2107520f 100644
--- a/.readthedocs.yml
+++ b/.readthedocs.yml
@@ -1,12 +1,16 @@
version: 2
+build:
+ os: ubuntu-22.04
+ tools:
+ python: "3.11"
+
sphinx:
configuration: docs/source/conf.py
python:
- version: 3.8
install:
- - method: pip
- path: .
- extra_requirements:
- - docs
+ - method: pip
+ path: .
+ extra_requirements:
+ - docs
diff --git a/CHANGELOG.MD b/CHANGELOG.MD
index d6efc472..1da35a8c 100644
--- a/CHANGELOG.MD
+++ b/CHANGELOG.MD
@@ -1,3 +1,10 @@
+## [Version 3.9.2] - 2023-10-24
+
+- Adjusted how user credentials are passed to the OAuth service.
+- Added `QUALITY_FLAGS` band to `S3_OLCI`
+- Batch statistical API now supports IAM role style credentials.
+- Various minor improvements
+
## [Version 3.9.1] - 2023-05-04
- The parameter `sh_auth_base_url` has been replaced with `sh_token_url` to allow authentication on endpoints with suffixes other than `oauth/token`. For the new parameter the address must be provided in full, e.g. `https://services.sentinel-hub.com/oauth/token` instead of `https://services.sentinel-hub.com`. The change only affects users who manually adjusted this field.
diff --git a/examples/utils.py b/examples/utils.py
index c752b2e2..a82dfe71 100644
--- a/examples/utils.py
+++ b/examples/utils.py
@@ -1,6 +1,7 @@
"""
Utilities used by example notebooks
"""
+
from __future__ import annotations
from typing import Any
diff --git a/sentinelhub/_version.py b/sentinelhub/_version.py
index 464122ba..1967ddbf 100644
--- a/sentinelhub/_version.py
+++ b/sentinelhub/_version.py
@@ -1,3 +1,3 @@
"""Version of the sentinelhub package."""
-__version__ = "3.9.1"
+__version__ = "3.9.2"
diff --git a/sentinelhub/api/__init__.py b/sentinelhub/api/__init__.py
index 6a0b6d58..62557596 100644
--- a/sentinelhub/api/__init__.py
+++ b/sentinelhub/api/__init__.py
@@ -1,6 +1,7 @@
"""
The part of the package that implements interface with Sentinel Hub services.
"""
+
from .batch import (
BatchCollection,
BatchRequest,
diff --git a/sentinelhub/api/base.py b/sentinelhub/api/base.py
index 7926e992..9911767d 100644
--- a/sentinelhub/api/base.py
+++ b/sentinelhub/api/base.py
@@ -1,6 +1,7 @@
"""
Module implementing some utility functions not suitable for other utility modules
"""
+
# ruff: noqa: FA100
# do not use `from __future__ import annotations`, it clashes with `dataclass_json`
from abc import ABCMeta, abstractmethod
diff --git a/sentinelhub/api/base_request.py b/sentinelhub/api/base_request.py
index 5a680563..f558c7be 100644
--- a/sentinelhub/api/base_request.py
+++ b/sentinelhub/api/base_request.py
@@ -1,6 +1,7 @@
"""
Implementation of base Sentinel Hub interfaces
"""
+
from __future__ import annotations
from abc import ABCMeta, abstractmethod
diff --git a/sentinelhub/api/batch/__init__.py b/sentinelhub/api/batch/__init__.py
index 5bc7bd8a..71dc7208 100644
--- a/sentinelhub/api/batch/__init__.py
+++ b/sentinelhub/api/batch/__init__.py
@@ -1,6 +1,7 @@
"""
The part of the package that implements interface with Sentinel Hub services.
"""
+
from .base import BatchRequestStatus, BatchUserAction
from .process import BatchCollection, BatchRequest, BatchTileStatus, SentinelHubBatch
from .statistical import BatchStatisticalRequest, SentinelHubBatchStatistical
diff --git a/sentinelhub/api/batch/base.py b/sentinelhub/api/batch/base.py
index 61cce22f..b770e0f4 100644
--- a/sentinelhub/api/batch/base.py
+++ b/sentinelhub/api/batch/base.py
@@ -1,6 +1,7 @@
"""
Module containing shared code of Batch Process API and Batch Statistical API
"""
+
# ruff: noqa: FA100
# do not use `from __future__ import annotations`, it clashes with `dataclass_json` (even through inheritance)
from abc import ABCMeta
diff --git a/sentinelhub/api/batch/process.py b/sentinelhub/api/batch/process.py
index bb2cce69..49e402cf 100644
--- a/sentinelhub/api/batch/process.py
+++ b/sentinelhub/api/batch/process.py
@@ -2,6 +2,7 @@
Module implementing an interface with
`Sentinel Hub Batch Processing API `__.
"""
+
# ruff: noqa: FA100
# do not use `from __future__ import annotations`, it clashes with `dataclass_json`
import datetime as dt
diff --git a/sentinelhub/api/batch/statistical.py b/sentinelhub/api/batch/statistical.py
index 8400afd4..41de655f 100644
--- a/sentinelhub/api/batch/statistical.py
+++ b/sentinelhub/api/batch/statistical.py
@@ -2,6 +2,7 @@
Module implementing an interface with
`Sentinel Hub Batch Processing API `__.
"""
+
# ruff: noqa: FA100
# do not use `from __future__ import annotations`, it clashes with `dataclass_json`
import datetime as dt
diff --git a/sentinelhub/api/batch/utils.py b/sentinelhub/api/batch/utils.py
index 0860786d..be841d2c 100644
--- a/sentinelhub/api/batch/utils.py
+++ b/sentinelhub/api/batch/utils.py
@@ -1,6 +1,7 @@
"""
Module implementing utilities for working with batch jobs.
"""
+
from __future__ import annotations
import logging
diff --git a/sentinelhub/api/byoc.py b/sentinelhub/api/byoc.py
index b46cbea2..b379dd29 100644
--- a/sentinelhub/api/byoc.py
+++ b/sentinelhub/api/byoc.py
@@ -2,6 +2,7 @@
Module implementing an interface with
`Sentinel Hub Bring Your Own COG API `__.
"""
+
# ruff: noqa: FA100
# do not use `from __future__ import annotations`, it clashes with `dataclass_json`
from dataclasses import dataclass, field
diff --git a/sentinelhub/api/catalog.py b/sentinelhub/api/catalog.py
index 450f3756..3c41da7a 100644
--- a/sentinelhub/api/catalog.py
+++ b/sentinelhub/api/catalog.py
@@ -1,6 +1,7 @@
"""
A client interface for `Sentinel Hub Catalog API `__.
"""
+
from __future__ import annotations
import datetime as dt
diff --git a/sentinelhub/api/fis.py b/sentinelhub/api/fis.py
index 9c7b42bc..e33005f6 100644
--- a/sentinelhub/api/fis.py
+++ b/sentinelhub/api/fis.py
@@ -1,6 +1,7 @@
"""
Module for working with Sentinel Hub FIS service
"""
+
from __future__ import annotations
import datetime
diff --git a/sentinelhub/api/ogc.py b/sentinelhub/api/ogc.py
index 47cbf9ba..b5d6a482 100644
--- a/sentinelhub/api/ogc.py
+++ b/sentinelhub/api/ogc.py
@@ -2,6 +2,7 @@
Module for working with Sentinel Hub OGC services
`Sentinel Hub OGC services `__.
"""
+
from __future__ import annotations
import datetime
diff --git a/sentinelhub/api/opensearch.py b/sentinelhub/api/opensearch.py
index c8bdbbe0..f5e1bf4b 100644
--- a/sentinelhub/api/opensearch.py
+++ b/sentinelhub/api/opensearch.py
@@ -4,6 +4,7 @@
For more search parameters check
`service description `__.
"""
+
from __future__ import annotations
import datetime as dt
diff --git a/sentinelhub/api/process.py b/sentinelhub/api/process.py
index 3404d911..87e196da 100644
--- a/sentinelhub/api/process.py
+++ b/sentinelhub/api/process.py
@@ -1,6 +1,7 @@
"""
Implementation of `Sentinel Hub Process API interface `__.
"""
+
from __future__ import annotations
from typing import Any, Iterable
diff --git a/sentinelhub/api/statistical.py b/sentinelhub/api/statistical.py
index 42164c27..5b034531 100644
--- a/sentinelhub/api/statistical.py
+++ b/sentinelhub/api/statistical.py
@@ -2,6 +2,7 @@
Implementation of
`Sentinel Hub Statistical API interface `__.
"""
+
from __future__ import annotations
from typing import Any, Sequence
diff --git a/sentinelhub/api/utils.py b/sentinelhub/api/utils.py
index 58266751..8a58ebf1 100644
--- a/sentinelhub/api/utils.py
+++ b/sentinelhub/api/utils.py
@@ -1,6 +1,7 @@
"""
Module implementing some common utility functions
"""
+
# ruff: noqa: FA100
# do not use `from __future__ import annotations`, it clashes with `dataclass_json`
from enum import Enum
diff --git a/sentinelhub/api/wfs.py b/sentinelhub/api/wfs.py
index 4d33535a..09124291 100644
--- a/sentinelhub/api/wfs.py
+++ b/sentinelhub/api/wfs.py
@@ -2,6 +2,7 @@
Interface of
`Sentinel Hub Web Feature Service (WFS) `__.
"""
+
from __future__ import annotations
import datetime as dt
diff --git a/sentinelhub/areas.py b/sentinelhub/areas.py
index c27f97ea..2580c599 100644
--- a/sentinelhub/areas.py
+++ b/sentinelhub/areas.py
@@ -1,6 +1,7 @@
"""
Module for working with large geographical areas
"""
+
from __future__ import annotations
import itertools
diff --git a/sentinelhub/aws/batch.py b/sentinelhub/aws/batch.py
index aa7360c6..9afbeeec 100644
--- a/sentinelhub/aws/batch.py
+++ b/sentinelhub/aws/batch.py
@@ -1,6 +1,7 @@
"""
Module implementing utilities for collecting data, produced with Sentinel Hub Statistical Batch API, from an S3 bucket.
"""
+
from typing import List, Optional, Sequence, Union
from ..api.batch.statistical import BatchStatisticalRequest, BatchStatisticalRequestType, SentinelHubBatchStatistical
diff --git a/sentinelhub/aws/client.py b/sentinelhub/aws/client.py
index 86383682..15c3ecaa 100644
--- a/sentinelhub/aws/client.py
+++ b/sentinelhub/aws/client.py
@@ -1,6 +1,7 @@
"""
Module implementing a download client that is adjusted to download from AWS
"""
+
import logging
import warnings
from typing import Any, Dict, Optional
diff --git a/sentinelhub/aws/commands.py b/sentinelhub/aws/commands.py
index 374d1e08..cab8863d 100644
--- a/sentinelhub/aws/commands.py
+++ b/sentinelhub/aws/commands.py
@@ -1,6 +1,7 @@
"""
Module that implements command line interface for AWS package functionalities
"""
+
from typing import Optional, Tuple
import click
diff --git a/sentinelhub/aws/constants.py b/sentinelhub/aws/constants.py
index 7d1d7fb6..3571abef 100644
--- a/sentinelhub/aws/constants.py
+++ b/sentinelhub/aws/constants.py
@@ -1,6 +1,7 @@
"""
Constants related to AWS functionalities of the package
"""
+
import itertools as it
from enum import Enum
diff --git a/sentinelhub/aws/request.py b/sentinelhub/aws/request.py
index eed78a30..bb6a09f4 100644
--- a/sentinelhub/aws/request.py
+++ b/sentinelhub/aws/request.py
@@ -1,6 +1,7 @@
"""
Data request interface for downloading satellite data from AWS
"""
+
import functools
from abc import abstractmethod
from typing import Any, Generic, List, Optional, Tuple, TypeVar, Union
diff --git a/sentinelhub/base.py b/sentinelhub/base.py
index 6adf05b6..e41dc52f 100644
--- a/sentinelhub/base.py
+++ b/sentinelhub/base.py
@@ -1,6 +1,7 @@
"""
Implementation of base interface classes of this package.
"""
+
from __future__ import annotations
import copy
diff --git a/sentinelhub/commands.py b/sentinelhub/commands.py
index 27fc77f2..519ba5db 100644
--- a/sentinelhub/commands.py
+++ b/sentinelhub/commands.py
@@ -1,6 +1,7 @@
"""
Module that implements command line interface for the package
"""
+
from __future__ import annotations
import json
diff --git a/sentinelhub/config.py b/sentinelhub/config.py
index e59a3fef..a40e4df0 100644
--- a/sentinelhub/config.py
+++ b/sentinelhub/config.py
@@ -1,6 +1,7 @@
"""
Module for managing configuration data from `config.toml`
"""
+
from __future__ import annotations
import copy
diff --git a/sentinelhub/constants.py b/sentinelhub/constants.py
index be4201d6..4397e398 100644
--- a/sentinelhub/constants.py
+++ b/sentinelhub/constants.py
@@ -1,6 +1,7 @@
"""
Module defining constants and enumerate types used in the package
"""
+
from __future__ import annotations
import functools
@@ -104,7 +105,7 @@ def _parse_crs(value: object) -> object: # noqa: C901
if isinstance(value, dict) and "init" in value:
value = value["init"]
if hasattr(value, "to_epsg"):
- if value == CRSMeta._UNSUPPORTED_CRS: # noqa: SLF001
+ if value == CRSMeta._UNSUPPORTED_CRS:
message = (
"sentinelhub-py supports only WGS 84 coordinate reference system with "
"coordinate order lng-lat. Given pyproj.CRS(4326) has coordinate order lat-lng. Be careful "
diff --git a/sentinelhub/data_collections.py b/sentinelhub/data_collections.py
index 9c89af21..661dc38d 100644
--- a/sentinelhub/data_collections.py
+++ b/sentinelhub/data_collections.py
@@ -1,6 +1,7 @@
"""
Module defining data collections
"""
+
from __future__ import annotations
from dataclasses import dataclass, field, fields
diff --git a/sentinelhub/data_collections_bands.py b/sentinelhub/data_collections_bands.py
index 0a7d6654..a2999428 100644
--- a/sentinelhub/data_collections_bands.py
+++ b/sentinelhub/data_collections_bands.py
@@ -1,4 +1,5 @@
""" Contains information about data collections used by SH """
+
from __future__ import annotations
from dataclasses import dataclass
diff --git a/sentinelhub/data_utils.py b/sentinelhub/data_utils.py
index fbcbd498..37bf2d8d 100644
--- a/sentinelhub/data_utils.py
+++ b/sentinelhub/data_utils.py
@@ -1,6 +1,7 @@
"""
Module with statistics to dataframe transformation.
"""
+
from __future__ import annotations
from typing import Any, Iterable
diff --git a/sentinelhub/decoding.py b/sentinelhub/decoding.py
index 511f5295..67da0ee8 100644
--- a/sentinelhub/decoding.py
+++ b/sentinelhub/decoding.py
@@ -1,6 +1,7 @@
"""
Module for data decoding
"""
+
from __future__ import annotations
import json
diff --git a/sentinelhub/download/client.py b/sentinelhub/download/client.py
index 9a07658a..f457f378 100644
--- a/sentinelhub/download/client.py
+++ b/sentinelhub/download/client.py
@@ -1,6 +1,7 @@
"""
Module implementing the main download client class
"""
+
from __future__ import annotations
import json
diff --git a/sentinelhub/download/handlers.py b/sentinelhub/download/handlers.py
index dae9ce67..6176b6d9 100644
--- a/sentinelhub/download/handlers.py
+++ b/sentinelhub/download/handlers.py
@@ -1,6 +1,7 @@
"""
Module implementing error handlers which can occur during download procedure
"""
+
from __future__ import annotations
import functools
diff --git a/sentinelhub/download/models.py b/sentinelhub/download/models.py
index 40aaecff..5c7038f1 100644
--- a/sentinelhub/download/models.py
+++ b/sentinelhub/download/models.py
@@ -1,6 +1,7 @@
"""
Module implementing model classes to store download-related parameters and data.
"""
+
from __future__ import annotations
import datetime as dt
diff --git a/sentinelhub/download/rate_limit.py b/sentinelhub/download/rate_limit.py
index 9e334aae..6efd5ebb 100644
--- a/sentinelhub/download/rate_limit.py
+++ b/sentinelhub/download/rate_limit.py
@@ -1,6 +1,7 @@
"""
Module implementing rate limiting logic for Sentinel Hub service
"""
+
import time
from enum import Enum
diff --git a/sentinelhub/download/sentinelhub_client.py b/sentinelhub/download/sentinelhub_client.py
index ea4f3c9b..e714eb40 100644
--- a/sentinelhub/download/sentinelhub_client.py
+++ b/sentinelhub/download/sentinelhub_client.py
@@ -1,6 +1,7 @@
"""
Module implementing a rate-limited multithreaded download client for downloading from Sentinel Hub service
"""
+
from __future__ import annotations
import logging
diff --git a/sentinelhub/download/sentinelhub_statistical_client.py b/sentinelhub/download/sentinelhub_statistical_client.py
index 451bc4a7..8fec0e35 100644
--- a/sentinelhub/download/sentinelhub_statistical_client.py
+++ b/sentinelhub/download/sentinelhub_statistical_client.py
@@ -1,6 +1,7 @@
"""
Download process for Sentinel Hub Statistical API
"""
+
from __future__ import annotations
import concurrent.futures
diff --git a/sentinelhub/download/session.py b/sentinelhub/download/session.py
index e7205a3b..d73ea9b9 100644
--- a/sentinelhub/download/session.py
+++ b/sentinelhub/download/session.py
@@ -1,14 +1,15 @@
"""
Module implementing Sentinel Hub session object
"""
+
from __future__ import annotations
import base64
import json
import logging
-import sys
import time
import warnings
+from multiprocessing.shared_memory import SharedMemory
from threading import Event, Thread
from typing import Any, ClassVar
@@ -25,12 +26,6 @@
from ..exceptions import SHUserWarning
from ..types import JsonDict
-if sys.version_info < (3, 8):
- from shared_memory import SharedMemory
-else:
- from multiprocessing.shared_memory import SharedMemory
-
-
LOGGER = logging.getLogger(__name__)
diff --git a/sentinelhub/evalscript.py b/sentinelhub/evalscript.py
index 4a126cb6..800ce4f7 100644
--- a/sentinelhub/evalscript.py
+++ b/sentinelhub/evalscript.py
@@ -1,6 +1,7 @@
"""
Module defining evalscript generation utilities
"""
+
from __future__ import annotations
import numpy as np
diff --git a/sentinelhub/exceptions.py b/sentinelhub/exceptions.py
index ff312f4d..0bb44264 100644
--- a/sentinelhub/exceptions.py
+++ b/sentinelhub/exceptions.py
@@ -1,4 +1,5 @@
"""Module defining custom package exceptions."""
+
from __future__ import annotations
import functools
diff --git a/sentinelhub/geo_utils.py b/sentinelhub/geo_utils.py
index 14f6dfcb..6c2cdaf0 100644
--- a/sentinelhub/geo_utils.py
+++ b/sentinelhub/geo_utils.py
@@ -1,6 +1,7 @@
"""
Module for manipulation of geographical information
"""
+
from __future__ import annotations
from typing import TYPE_CHECKING, Sequence, Tuple, cast
diff --git a/sentinelhub/geometry.py b/sentinelhub/geometry.py
index cd4ed818..ba44218c 100644
--- a/sentinelhub/geometry.py
+++ b/sentinelhub/geometry.py
@@ -1,4 +1,5 @@
"""Module implementing geometry classes."""
+
from __future__ import annotations
import contextlib
diff --git a/sentinelhub/geopedia/core.py b/sentinelhub/geopedia/core.py
index ef9f36a9..d39f6294 100644
--- a/sentinelhub/geopedia/core.py
+++ b/sentinelhub/geopedia/core.py
@@ -1,6 +1,7 @@
"""
The core module for Geopedia interactions
"""
+
from __future__ import annotations
import datetime
@@ -34,13 +35,11 @@ def __init__(self, config: SHConfig | None = None):
@overload
-def _parse_geopedia_layer(layer: int | str, return_wms_name: Literal[False] = False) -> int:
- ...
+def _parse_geopedia_layer(layer: int | str, return_wms_name: Literal[False] = False) -> int: ...
@overload
-def _parse_geopedia_layer(layer: int | str, return_wms_name: Literal[True]) -> str:
- ...
+def _parse_geopedia_layer(layer: int | str, return_wms_name: Literal[True]) -> str: ...
def _parse_geopedia_layer(layer: int | str, return_wms_name: bool = False) -> int | str:
@@ -200,8 +199,8 @@ def _start_new_session(self) -> None:
self._make_login(self._session_info)
if self.is_global:
- GeopediaSession._global_session_info = self._session_info # noqa: SLF001
- GeopediaSession._global_session_start = self._session_start # noqa: SLF001
+ GeopediaSession._global_session_info = self._session_info
+ GeopediaSession._global_session_start = self._session_start
def _make_login(self, session_info: dict) -> None:
"""Private method that makes login"""
diff --git a/sentinelhub/testing_utils.py b/sentinelhub/testing_utils.py
index 3b76450d..5ddbdafc 100644
--- a/sentinelhub/testing_utils.py
+++ b/sentinelhub/testing_utils.py
@@ -1,6 +1,7 @@
"""
Utility tools for writing unit tests for packages which rely on `sentinelhub-py`
"""
+
from __future__ import annotations
import os
diff --git a/sentinelhub/time_utils.py b/sentinelhub/time_utils.py
index 5fe32bc2..c4db8ace 100644
--- a/sentinelhub/time_utils.py
+++ b/sentinelhub/time_utils.py
@@ -1,6 +1,7 @@
"""
Module with useful time/date functions
"""
+
from __future__ import annotations
import datetime as dt
@@ -34,29 +35,25 @@ def parse_time(
force_datetime: Literal[False] = False,
allow_undefined: Literal[False] = False,
**kwargs: Any,
-) -> dt.date:
- ...
+) -> dt.date: ...
@overload
def parse_time(
time_input: RawTimeType, *, force_datetime: Literal[True], allow_undefined: Literal[False] = False, **kwargs: Any
-) -> dt.datetime:
- ...
+) -> dt.datetime: ...
@overload
def parse_time(
time_input: RawTimeType, *, force_datetime: Literal[False] = False, allow_undefined: bool = False, **kwargs: Any
-) -> dt.date | None:
- ...
+) -> dt.date | None: ...
@overload
def parse_time(
time_input: RawTimeType, *, force_datetime: Literal[True], allow_undefined: bool = False, **kwargs: Any
-) -> dt.datetime | None:
- ...
+) -> dt.datetime | None: ...
def parse_time(
@@ -140,13 +137,11 @@ def parse_time_interval(
@overload
-def serialize_time(timestamp_input: dt.date | None, *, use_tz: bool = False) -> str:
- ...
+def serialize_time(timestamp_input: dt.date | None, *, use_tz: bool = False) -> str: ...
@overload
-def serialize_time(timestamp_input: Iterable[dt.date | None], *, use_tz: bool = False) -> tuple[str, ...]:
- ...
+def serialize_time(timestamp_input: Iterable[dt.date | None], *, use_tz: bool = False) -> tuple[str, ...]: ...
def serialize_time(
diff --git a/sentinelhub/types.py b/sentinelhub/types.py
index fc5b527e..c6b38e5e 100644
--- a/sentinelhub/types.py
+++ b/sentinelhub/types.py
@@ -1,4 +1,5 @@
"""Module with custom types and utilities used in sentinelhub-py."""
+
import datetime as dt
from typing import Any, Dict, Tuple, Union
diff --git a/tests/api/batch/test_process.py b/tests/api/batch/test_process.py
index 3c8ef1fe..a1518905 100644
--- a/tests/api/batch/test_process.py
+++ b/tests/api/batch/test_process.py
@@ -1,6 +1,7 @@
"""
A module that tests an interface for Sentinel Hub Batch processing
"""
+
import datetime as dt
import itertools as it
diff --git a/tests/api/batch/test_statistical.py b/tests/api/batch/test_statistical.py
index 9dd69079..5d4232eb 100644
--- a/tests/api/batch/test_statistical.py
+++ b/tests/api/batch/test_statistical.py
@@ -1,6 +1,7 @@
"""
A module that tests an interface for Sentinel Hub Batch processing
"""
+
import pytest
from requests_mock import Mocker
diff --git a/tests/api/batch/test_utils.py b/tests/api/batch/test_utils.py
index 847c818d..ac67fc72 100644
--- a/tests/api/batch/test_utils.py
+++ b/tests/api/batch/test_utils.py
@@ -7,6 +7,7 @@
Because of that the tests are very strict. If you break them make sure to understand what is happening before either
changing the code or the tests.
"""
+
from __future__ import annotations
import random
diff --git a/tests/api/test_byoc.py b/tests/api/test_byoc.py
index bd0cf9e8..b6f8213d 100644
--- a/tests/api/test_byoc.py
+++ b/tests/api/test_byoc.py
@@ -1,6 +1,7 @@
"""
A module that tests an interface for Sentinel Hub Batch processing
"""
+
import os
from datetime import datetime
diff --git a/tests/api/test_catalog.py b/tests/api/test_catalog.py
index 272b84c8..bac4f104 100644
--- a/tests/api/test_catalog.py
+++ b/tests/api/test_catalog.py
@@ -1,6 +1,7 @@
"""
Tests for the module with Catalog API interface
"""
+
from __future__ import annotations
import datetime as dt
diff --git a/tests/api/test_opensearch.py b/tests/api/test_opensearch.py
index 6fcb4685..615f796e 100644
--- a/tests/api/test_opensearch.py
+++ b/tests/api/test_opensearch.py
@@ -1,6 +1,7 @@
"""
Tests for Sentinel Hub Opensearch service interface
"""
+
from sentinelhub import CRS, BBox, get_area_dates, get_tile_info
diff --git a/tests/api/test_process.py b/tests/api/test_process.py
index aa08bc20..7a52bb69 100644
--- a/tests/api/test_process.py
+++ b/tests/api/test_process.py
@@ -1,5 +1,6 @@
""" Tests for the Process API requests
"""
+
from __future__ import annotations
import json
diff --git a/tests/api/test_process_async.py b/tests/api/test_process_async.py
index 7f170a98..b5d4cdad 100644
--- a/tests/api/test_process_async.py
+++ b/tests/api/test_process_async.py
@@ -1,5 +1,6 @@
""" Tests for the Async Process API requests
"""
+
import datetime as dt
import pytest
diff --git a/tests/api/test_statistical.py b/tests/api/test_statistical.py
index 20f9f5ac..cf26d489 100644
--- a/tests/api/test_statistical.py
+++ b/tests/api/test_statistical.py
@@ -1,6 +1,7 @@
"""
Tests for the module with Statistical API
"""
+
from __future__ import annotations
from typing import Any
diff --git a/tests/api/test_wfs.py b/tests/api/test_wfs.py
index f522c573..820c73ad 100644
--- a/tests/api/test_wfs.py
+++ b/tests/api/test_wfs.py
@@ -1,6 +1,7 @@
"""
Test for Sentinel Hub WFS
"""
+
from __future__ import annotations
import datetime
diff --git a/tests/aws/test_batch.py b/tests/aws/test_batch.py
index 6976b117..04c576f0 100644
--- a/tests/aws/test_batch.py
+++ b/tests/aws/test_batch.py
@@ -1,6 +1,7 @@
"""
Tests for AWS batch module
"""
+
from __future__ import annotations
import json
diff --git a/tests/conftest.py b/tests/conftest.py
index ab84c53c..3f00d27d 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,6 +1,7 @@
"""
Module with global fixtures
"""
+
import logging
import os
import shutil
diff --git a/tests/download/test_client.py b/tests/download/test_client.py
index 4e6f949c..b9f0dc60 100644
--- a/tests/download/test_client.py
+++ b/tests/download/test_client.py
@@ -1,6 +1,7 @@
"""
Unit tests for download utilities
"""
+
import copy
import os
diff --git a/tests/download/test_handlers.py b/tests/download/test_handlers.py
index fe7f9776..6072db5a 100644
--- a/tests/download/test_handlers.py
+++ b/tests/download/test_handlers.py
@@ -1,6 +1,7 @@
"""
Unit tests for download handlers
"""
+
import pytest
from requests import Response
from requests.exceptions import ChunkedEncodingError, ConnectionError, HTTPError, InvalidJSONError, Timeout
diff --git a/tests/download/test_models.py b/tests/download/test_models.py
index 5da86078..786e328c 100644
--- a/tests/download/test_models.py
+++ b/tests/download/test_models.py
@@ -1,6 +1,7 @@
"""
Unit tests for DownloadRequest object
"""
+
from __future__ import annotations
import datetime as dt
diff --git a/tests/download/test_rate_limit.py b/tests/download/test_rate_limit.py
index 75d9c299..5f21a67f 100644
--- a/tests/download/test_rate_limit.py
+++ b/tests/download/test_rate_limit.py
@@ -1,6 +1,7 @@
"""
Tests for utilities that implement rate-limiting in the package
"""
+
from __future__ import annotations
import concurrent.futures
diff --git a/tests/download/test_sentinelhub_statistical_client.py b/tests/download/test_sentinelhub_statistical_client.py
index 8d496a08..1872d37c 100644
--- a/tests/download/test_sentinelhub_statistical_client.py
+++ b/tests/download/test_sentinelhub_statistical_client.py
@@ -1,6 +1,7 @@
"""
Tests for the module with a special download client for Statistical API
"""
+
import pytest
from requests_mock import Mocker
diff --git a/tests/test_base.py b/tests/test_base.py
index 22ac899e..9371bb51 100644
--- a/tests/test_base.py
+++ b/tests/test_base.py
@@ -1,6 +1,7 @@
"""
Tests for sh_utils.py module
"""
+
from __future__ import annotations
import math
diff --git a/tests/test_config.py b/tests/test_config.py
index 9e6644a2..fe4b7d34 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -1,6 +1,7 @@
"""
Unit tests for config.py module
"""
+
import os
import shutil
from typing import Generator
diff --git a/tests/test_constants.py b/tests/test_constants.py
index 736d59fb..e07f0479 100644
--- a/tests/test_constants.py
+++ b/tests/test_constants.py
@@ -17,7 +17,6 @@
(13, 46, CRS("32633")),
(13, 0, CRS("32633")),
(13, -45, CRS("32733")),
- (13, 0, CRS("32633")),
(13, -0.0001, CRS("32733")),
(13, -46, CRS("32733")),
],
diff --git a/tests/test_data_collections.py b/tests/test_data_collections.py
index e56348ae..380e701e 100644
--- a/tests/test_data_collections.py
+++ b/tests/test_data_collections.py
@@ -1,6 +1,7 @@
"""
Unit tests for data_collections module
"""
+
from __future__ import annotations
from typing import Any
diff --git a/tests/test_geo_utils.py b/tests/test_geo_utils.py
index fb215c1e..7b3f9857 100644
--- a/tests/test_geo_utils.py
+++ b/tests/test_geo_utils.py
@@ -1,6 +1,7 @@
"""
Test for geo_utils module and correctness of geographical transformations
"""
+
from __future__ import annotations
import pytest
diff --git a/tests/test_time_utils.py b/tests/test_time_utils.py
index bb3ae6dc..7c19dddc 100644
--- a/tests/test_time_utils.py
+++ b/tests/test_time_utils.py
@@ -1,6 +1,7 @@
"""
Unit tests for time utility functions
"""
+
from __future__ import annotations
import datetime as dt