Skip to content

Commit

Permalink
Merge pull request #654 from ungarj/deprecated_warnings
Browse files Browse the repository at this point in the history
add deprecation warnings for moved objects
  • Loading branch information
ungarj authored Oct 29, 2024
2 parents b5cbfa8 + 1f2798c commit fa25a2f
Show file tree
Hide file tree
Showing 5 changed files with 202 additions and 0 deletions.
6 changes: 6 additions & 0 deletions mapchete/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import os
from typing import Union

from mapchete.bounds import Bounds
from mapchete.config import MapcheteConfig
from mapchete.errors import Empty, MapcheteNodataTile
from mapchete.executor import Executor, MFuture
Expand All @@ -12,14 +13,18 @@
VectorInput,
VectorInputGroup,
)
from mapchete.grid import Grid
from mapchete.path import MPath
from mapchete.processing import Mapchete, MapcheteProcess
from mapchete.tile import count_tiles
from mapchete.timer import Timer
from mapchete.types import MPathLike
from mapchete.zoom_levels import ZoomLevels

__all__ = [
"Bounds",
"count_tiles",
"Grid",
"Mapchete",
"MapcheteProcess",
"Timer",
Expand All @@ -31,6 +36,7 @@
"RasterInputGroup",
"VectorInput",
"VectorInputGroup",
"ZoomLevels",
]
__version__ = "2024.10.0"

Expand Down
47 changes: 47 additions & 0 deletions mapchete/_deprecated.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import warnings
from functools import wraps
from typing import Callable, TypeVar, Any, cast, Type, Union

# Define a generic type for functions and classes
F = TypeVar("F", bound=Callable[..., Any])
C = TypeVar("C", bound=Type[Any])


def deprecated(reason: str = "") -> Callable[[Union[F, C]], Union[F, C]]:
"""Decorator to mark functions or classes as deprecated.
Args:
reason (str): Optional reason or guidance for deprecation.
Returns:
Callable[[Union[F, C]], Union[F, C]]: The decorated function or class that issues a DeprecationWarning.
"""

def decorator(obj: Union[F, C]) -> Union[F, C]:
message = f"{obj.__name__} is deprecated."
if reason:
message += f" {reason}"

if isinstance(obj, type): # Check if obj is a class
# Decorate a class to show warning on instantiation
original_init = obj.__init__

@wraps(original_init)
def new_init(self, *args: Any, **kwargs: Any) -> None: # pragma: no cover
warnings.warn(message, category=DeprecationWarning, stacklevel=2)
original_init(self, *args, **kwargs)

obj.__init__ = new_init # Replace the original __init__ with new_init
obj.__doc__ = f"DEPRECATED: {reason}\n\n{obj.__doc__}" # Update docstring
return cast(C, obj)

else:
# Decorate a function to show warning on call
@wraps(obj)
def wrapper(*args: Any, **kwargs: Any) -> Any: # pragma: no cover
warnings.warn(message, category=DeprecationWarning, stacklevel=2)
return obj(*args, **kwargs)

wrapper.__doc__ = f"DEPRECATED: {reason}\n\n{obj.__doc__}"
return cast(F, wrapper)

return decorator
6 changes: 6 additions & 0 deletions mapchete/bounds.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,3 +224,9 @@ def intersects(self, other: BoundsLike) -> bool:
or self.bottom <= other.bottom < other.top <= self.top
)
return horizontal and vertical


def bounds_intersect(
bounds1: BoundsLike, bounds2: BoundsLike
) -> bool: # pragma: no cover
return Bounds.from_inp(bounds1).intersects(bounds2)
59 changes: 59 additions & 0 deletions mapchete/io/vector/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
from typing import Any, Optional

from mapchete._deprecated import deprecated
from mapchete.io.vector.convert import convert_vector
from mapchete.io.vector.indexed_features import (
IndexedFeatures,
Expand All @@ -10,6 +13,7 @@
read_vector_window,
)
from mapchete.io.vector.write import fiona_write, write_vector_window
from mapchete.types import Geometry, GeometryLike, CRSLike, BoundsLike

__all__ = [
"fiona_read",
Expand All @@ -22,3 +26,58 @@
"read_vector",
"read_union_geometry",
]


@deprecated(
reason="mapchete.vector.io.to_shape has moved to mapchete.geometry.to_shape"
)
def to_shape(geometry: Any) -> Geometry: # pragma: no cover
from mapchete.geometry import to_shape

return to_shape(geometry)


@deprecated(
reason="mapchete.vector.io.reproject_geometry has moved to mapchete.geometry.reproject_geometry"
)
def reproject_geometry(
geometry: GeometryLike,
src_crs: CRSLike,
dst_crs: CRSLike,
clip_to_crs_bounds: bool = True,
error_on_clip: bool = False,
segmentize_on_clip: bool = False,
segmentize: bool = False,
segmentize_fraction: float = 100.0,
validity_check: bool = True,
antimeridian_cutting: bool = False,
retry_with_clip: bool = True,
fiona_env: Optional[dict] = None,
) -> Geometry: # pragma: no cover
from mapchete.geometry import reproject_geometry

return reproject_geometry(
geometry=geometry,
src_crs=src_crs,
dst_crs=dst_crs,
clip_to_crs_bounds=clip_to_crs_bounds,
error_on_clip=error_on_clip,
segmentize_on_clip=segmentize_on_clip,
segmentize=segmentize,
segmentize_fraction=segmentize_fraction,
validity_check=validity_check,
antimeridian_cutting=antimeridian_cutting,
retry_with_clip=retry_with_clip,
fiona_env=fiona_env,
)


@deprecated(
reason="mapchete.io.vector.bounds_intersect was removed, use the Bounds.intersect(other) method instead."
)
def bounds_intersect(
bounds1: BoundsLike, bounds2: BoundsLike
) -> bool: # pragma: no cover
from mapchete.bounds import bounds_intersect

return bounds_intersect(bounds1, bounds2)
84 changes: 84 additions & 0 deletions mapchete/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
runtime_checkable,
)

from mapchete._deprecated import deprecated

from fiona.crs import CRS as FionaCRS # type: ignore
from geojson_pydantic import Feature, FeatureCollection as GeoJSONGeometryType
from pydantic import BaseModel
Expand Down Expand Up @@ -86,3 +88,85 @@ def to_resampling(resampling: ResamplingLike) -> Resampling:
class Progress(BaseModel):
current: int = 0
total: Optional[int] = None


# below are deprecated classes once sitting in this module:
@deprecated("mapchete.types.Bounds has been moved to mapchete.bounds.Bounds")
class Bounds: # pragma: no cover
def __new__(cls, *args, **kwargs):
from mapchete.bounds import Bounds

# Redirect instantiation to the new class
return Bounds(*args, **kwargs)

@staticmethod
def from_inp(
inp: BoundsLike, strict: bool = True, crs: Optional[CRSLike] = None
): # pragma: no cover
from mapchete.bounds import Bounds

return Bounds.from_inp(inp=inp, strict=strict, crs=crs)

@staticmethod
def from_dict(
inp: dict, strict: bool = True, crs: Optional[CRSLike] = None
): # pragma: no cover
return Bounds(**inp, strict=strict, crs=crs)


@deprecated("mapchete.types.Grid has been moved to mapchete.grid.Grid")
class Grid: # pragma: no cover
def __new__(cls, *args, **kwargs):
from mapchete.grid import Grid

return Grid(*args, **kwargs)

@staticmethod
def from_obj(obj): # pragma: no cover
from mapchete.grid import Grid

return Grid.from_obj(obj)

@staticmethod
def from_bounds(
bounds: BoundsLike, shape: ShapeLike, crs: CRSLike
): # pragma: no cover
from mapchete.grid import Grid

return Grid.from_bounds(bounds=bounds, shape=shape, crs=crs)


@deprecated(
"mapchete.types.ZoomLevels has been moved to mapchete.zoom_levels.ZoomLevels"
)
class ZoomLevels: # pragma: no cover
def __new__(cls, *args, **kwargs): # pragma: no cover
from mapchete.zoom_levels import ZoomLevels

return ZoomLevels(*args, **kwargs)

@staticmethod
def from_inp(
min: ZoomLevelsLike, max: Optional[int] = None, descending: bool = False
): # pragma: no cover
from mapchete.zoom_levels import ZoomLevels

return ZoomLevels.from_inp(min=min, max=max, descending=descending)

@staticmethod
def from_int(inp: int, **kwargs): # pragma: no cover
from mapchete.zoom_levels import ZoomLevels

return ZoomLevels.from_int(inp=inp, **kwargs)

@staticmethod
def from_list(inp: List[int], **kwargs): # pragma: no cover
from mapchete.zoom_levels import ZoomLevels

return ZoomLevels.from_list(inp=inp, **kwargs)

@staticmethod
def from_dict(inp: dict, **kwargs): # pragma: no cover
from mapchete.zoom_levels import ZoomLevels

return ZoomLevels.from_dict(inp=inp, **kwargs)

6 comments on commit fa25a2f

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py320100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py780100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py820100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py80100% 
   reproject.py700100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py780100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1050100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1680100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1810100% 
   open.py150100% 
   read.py740100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73050100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py320100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py780100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py820100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py80100% 
   reproject.py700100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py780100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1050100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1680100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1810100% 
   open.py150100% 
   read.py740100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73050100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py320100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py780100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py820100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py80100% 
   reproject.py700100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py780100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1050100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1680100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1810100% 
   open.py150100% 
   read.py740100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73050100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py320100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py780100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py820100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py80100% 
   reproject.py700100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py780100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1050100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1680100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1810100% 
   open.py150100% 
   read.py740100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73050100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py320100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py780100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py820100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py80100% 
   reproject.py700100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py780100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1050100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1680100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1810100% 
   open.py150100% 
   read.py740100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73050100% 

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test Coverage

missing coverage
FileStmtsMissCoverMissing
__init__.py330100% 
_deprecated.py180100% 
bounds.py980100% 
enums.py310100% 
errors.py170100% 
grid.py350100% 
index.py1790100% 
log.py500100% 
path.py3850100% 
pretty.py160100% 
protocols.py140100% 
registered.py50100% 
settings.py320100% 
stac.py1470100% 
testing.py1010100% 
tile.py1970100% 
timer.py370100% 
types.py390100% 
validate.py650100% 
zoom_levels.py980100% 
cli
   __init__.py00100% 
   main.py90100% 
   mpath.py820100% 
   options.py1280100% 
   progress_bar.py370100% 
cli/default
   __init__.py00100% 
   convert.py630100% 
   cp.py330100% 
   create.py360100% 
   execute.py420100% 
   formats.py190100% 
   index.py420100% 
   processes.py180100% 
   rm.py250100% 
   serve.py690100% 
   stac.py600100% 
commands
   __init__.py60100% 
   convert.py780100% 
   cp.py650100% 
   execute.py700100% 
   index.py340100% 
   observer.py90100% 
   parser.py910100% 
   rm.py440100% 
config
   __init__.py40100% 
   base.py3570100% 
   models.py1800100% 
   parse.py780100% 
   process_func.py890100% 
executor
   __init__.py170100% 
   base.py770100% 
   concurrent_futures.py700100% 
   dask.py1050100% 
   future.py820100% 
   sequential.py330100% 
   types.py130100% 
formats
   __init__.py30100% 
   base.py1740100% 
   drivers.py00100% 
   loaders.py430100% 
   protocols.py130100% 
   tools.py1530100% 
formats/default
   __init__.py00100% 
   _fiona_base.py510100% 
   flatgeobuf.py140100% 
   geojson.py120100% 
   gtiff.py1950100% 
   mapchete_input.py160100% 
   png.py660100% 
   png_hillshade.py560100% 
   raster_file.py850100% 
   tile_directory.py1010100% 
   vector_file.py1170100% 
geometry
   __init__.py100100% 
   clip.py410100% 
   filter.py350100% 
   footprints.py390100% 
   latlon.py300100% 
   repair.py80100% 
   reproject.py700100% 
   segmentize.py230100% 
   shape.py120100% 
   transform.py280100% 
   types.py240100% 
io
   __init__.py70100% 
   _json.py60100% 
   _misc.py780100% 
   _path.py00100% 
   profiles.py60100% 
io/raster
   __init__.py80100% 
   array.py1050100% 
   convert.py230100% 
   mosaic.py1030100% 
   open.py140100% 
   read.py1680100% 
   referenced_raster.py970100% 
   write.py1000100% 
io/vector
   __init__.py90100% 
   convert.py260100% 
   indexed_features.py1810100% 
   open.py150100% 
   read.py740100% 
   types.py80100% 
   write.py980100% 
processes
   __init__.py170100% 
   clip.py160100% 
   contours.py520100% 
   convert.py380100% 
   hillshade.py490100% 
processes/examples
   __init__.py00100% 
   example_process.py60100% 
processing
   __init__.py30100% 
   base.py2710100% 
   execute.py710100% 
   mp.py260100% 
   tasks.py2910100% 
   types.py450100% 
processing/profilers
   __init__.py50100% 
   memory.py600100% 
   requests.py250100% 
   time.py220100% 
static
   __init__.py00100% 
   process_template.py10100% 
TOTAL73050100% 

Please sign in to comment.